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
解决这个阻塞问题花了一段时间,但这是对我有用的解决方案:
- 我使用了上面 URL 中 David Speck 提供的 VB 脚本和
对其进行了一些修改以使其在 VB.net 中工作,我在上面的 link 中发布了我的完整脚本和修改。
- 我 运行 脚本,发现我能够毫无问题地新建一个 AR_Customer_bus 对象。
- 再次根据 David Speck 在 URL 中提供的建议,我再次重新测试了我的 C# 应用程序,发现它有效。
备选方案
- 我相信按照 Sage100User 提供的建议也可以解决问题。 Link here本文向您展示了如何手动注册 .dll 文件。
原因
原因可能有以下几点:
- Sage 在 Windows 2012 机器上 运行(这有时会导致 BOI 出现问题)。
- 我们公司使用 Avatax,众所周知它也会导致 BOI 问题。
- 这很可能是我无法更新 AR_Customer_bus 的实际原因,我不相信 .dll 已在我的工作站上正确注册。
我真的希望这能帮助遇到同样问题的其他人,据我所知,这是一个相当普遍的问题,而且需要很长时间才能解决。
这是一个 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 解决这个阻塞问题花了一段时间,但这是对我有用的解决方案:
- 我使用了上面 URL 中 David Speck 提供的 VB 脚本和 对其进行了一些修改以使其在 VB.net 中工作,我在上面的 link 中发布了我的完整脚本和修改。
- 我 运行 脚本,发现我能够毫无问题地新建一个 AR_Customer_bus 对象。
- 再次根据 David Speck 在 URL 中提供的建议,我再次重新测试了我的 C# 应用程序,发现它有效。
备选方案
- 我相信按照 Sage100User 提供的建议也可以解决问题。 Link here本文向您展示了如何手动注册 .dll 文件。
原因 原因可能有以下几点:
- Sage 在 Windows 2012 机器上 运行(这有时会导致 BOI 出现问题)。
- 我们公司使用 Avatax,众所周知它也会导致 BOI 问题。
- 这很可能是我无法更新 AR_Customer_bus 的实际原因,我不相信 .dll 已在我的工作站上正确注册。
我真的希望这能帮助遇到同样问题的其他人,据我所知,这是一个相当普遍的问题,而且需要很长时间才能解决。