Sage BOI - 在 AR_Customer_bus 上调用 NewObject 时出现错误 200。我的目标是使用 C# 通过 BOI 创建一个新客户

Sage BOI - Error 200 when invoking NewObject on AR_Customer_bus. I'm aiming to create a new customer via the BOI using C#

这是一个 Sage cloud 2019 业务对象接口问题。

我在尝试新建 AR_Customer_bus 对象时遇到问题,我的最终目标是能够使用 BOI 创建新客户。我收到的错误是 200 错误。

全面披露;我是 Sage BOI 的新手,虽然我是一个经验丰富的开发人员并且我没有 Sage 背景,但我确实有 Sage BOI 教学材料。我还在 Sage 论坛上发布了这个问题,但是论坛上的 activity 非常低,所以我覆盖了我的基础: https://www.sagecity.com/support_communities/sage100_erp/f/sage-100-business-object-interface/146142/unable-to-newobject-the-ar_customer_bus

非常感谢对此问题的任何帮助,它甚至不必是一个精确的解决方案,非常感谢可以帮助促进解决方案的一般指导。

到目前为止,这是我的代码,另请注意,我已经在我发现的几个示例的后面写下了它:

/// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {

            // Instantiate a ProvidexX.Script object and initialize with the path to MAS90\Home
            using (DispatchObject pvx = new DispatchObject("ProvideX.Script"))
            {
                // Replace the text "*PATH TO MAS90\HOME*" with the correct MAS90\Home path in the line below
                pvx.InvokeMethod("Init", @"[Correct path]");

                // Instantiate a new Session object and initialize the session
                // by setting the user, company, date and module
                using (DispatchObject oSS = new DispatchObject(pvx.InvokeMethod("NewObject", "SY_Session")))
                {
                    oSS.InvokeMethod("nLogon");
                    oSS.InvokeMethod("nSetUser", new object[] {"[Username]", "[Password]"});
                    oSS.InvokeMethod("nSetCompany", "[CompanyName]");
                    oSS.InvokeMethod("nSetDate", "A/R", "05312006");
                    oSS.InvokeMethod("nSetModule", "A/R");

                    // Get the Task ID for the AR_Customer_ui program
                    int TaskID = (int) oSS.InvokeMethod("nLookupTask", "AR_Customer_ui");
                    //int TaskID = (int)oSS.InvokeMethod("nLookupTask", "AR_Invoice_ui");
                    oSS.InvokeMethod("nSetProgram", TaskID);

                    CreateCustomer(pvx, oSS, out var customerNumber);
                    GetCustomerList(pvx, oSS, out var bob);

                }
            }


        }

        private static string CreateCustomer(DispatchObject pvx, DispatchObject oSS, out string customerNumber)
        {
            customerNumber = "";


            using (DispatchObject oARCustomerEntry = new DispatchObject(pvx.InvokeMethod("NewObject", "AR_Customer_bus", oSS.GetObject()))) //Error 200 throw here.
            {
                try
                {
                    object[] nextCustomerNumber = new object[] { "CustomerNo$" };

                    //Getting Next Customer Number
                    oARCustomerEntry.InvokeMethodByRef("nGetNextCustomerNo", nextCustomerNumber);

                    Console.WriteLine(nextCustomerNumber[0].ToString());

                    object retVal = 0;

                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetKeyValue", new object[] { "ARDivisionNo$", "01" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetKeyValue", new object[] { "CustomerNo$", nextCustomerNumber[0].ToString() });
                    retVal = oARCustomerEntry.InvokeMethod("nSetKey");

                    Console.WriteLine(retVal.ToString());

                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "CustomerName$", "ROSE DAWSON" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "AddressLine1$", "1234 LONG DREAM ST" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "AddressLine2$", "" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "AddressLine3$", "" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "City$", "CITRUS HEIGHTS" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "State$", "CA" });

                    Console.WriteLine(retVal.ToString());

                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "ZipCode$", "95621" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "CountryCode$", "USA" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "SalespersonDivisionNo$", "01" });
                    retVal = oARCustomerEntry.InvokeMethodByRef("nSetValue", new object[] { "SalespersonNo$", "RAP" });
                    Console.WriteLine(retVal.ToString());

                    retVal = oARCustomerEntry.InvokeMethod("nWrite");

                    if (retVal.ToString() == "0")
                    {
                        object errorMsg = oARCustomerEntry.GetProperty("sLastErrorMsg");
                        Console.WriteLine(errorMsg.ToString());
                        Console.Read();
                    }

                    customerNumber = nextCustomerNumber[0].ToString();

                    Console.WriteLine(retVal.ToString());

                    Console.Read();
                }
                catch (Exception ex)
                {
                    object errorMsg = oARCustomerEntry.GetProperty("sLastErrorMsg");

                    Console.WriteLine(errorMsg.ToString());
                    Console.WriteLine(ex.Message);
                    Console.Read();
                }
                finally
                {
                    oARCustomerEntry.Dispose();
                }
            }

            return customerNumber;
        }

下面是抛出错误的行:

public object GetObject() 
    {
        return m_object;
    }

然后它调用如下所示的 InvokeMethod,这正是抛出错误 200 的地方:

public object InvokeMethod(string sMethodName, params object[] aryParams)
    {
        return m_object.GetType().InvokeMember(sMethodName, m_flgMethod, null, m_object, aryParams);
    }

我的第一个想法是这是一个权限问题(因为我之前遇到过,但是我设置的用户具有角色 "Full Administrator",在查看 sage 的角色维护部分时我可以查看该角色已分配所有安全权限。

请注意:我已经能够毫无问题地更新其他业务对象,例如 AR_DepositHistory_bus,而且我还设法更新了 AR_Customer_ui 和 AR_Customer_svc,所以我不知道为什么这是个问题。

Here's the solution that worked for me

解决方案 1 解决这个阻塞问题花了一段时间,但这是对我有用的解决方案:

  1. 我使用了上面 URL 中 David Speck 提供的 VB 脚本和 对其进行了一些修改以使其在 VB.net 中工作,我在上面的 link 中发布了我的完整脚本和修改。
  2. 我 运行 脚本,发现我能够毫无问题地新建一个 AR_Customer_bus 对象。
  3. 再次根据 David Speck 在 URL 中提供的建议,我再次重新测试了我的 C# 应用程序,发现它有效。

备选方案

  1. 我相信按照 Sage100User 提供的建议也可以解决问题。 Link here本文向您展示了如何手动注册 .dll 文件。

原因 原因可能有以下几点:

  1. Sage 在 Windows 2012 机器上 运行(这有时会导致 BOI 出现问题)。
  2. 我们公司使用 Avatax,众所周知它也会导致 BOI 问题。
  3. 这很可能是我无法更新 AR_Customer_bus 的实际原因,我不相信 .dll 已在我的工作站上正确注册。

我真的希望这能帮助遇到同样问题的其他人,据我所知,这是一个相当普遍的问题,而且需要很长时间才能解决。