如何在 Epicor 外部访问 Epicor10 业务对象中的 UD 字段?

How can I access UD fields in Epicor10 business objects outside of Epicor?

在 Epicor 9 中,打开 Visual Studio 并创建项目并使用 Epicor 库访问其业务对象 (BO) 相当容易。因此,例如可以通过包含库 Epicor.Mfg.Part 并新建一个 Part 对象来访问 Part。然后通过调用 Part.GetByID("partnum"); 很容易获得零件的信息。这将 return 一个 PartDataSet。

在 Epicor 10 中做同样的事情是不同的,但并不那么困难。但是,我注意到 PartDataSet 不包含任何 UD 字段,即使是在 Epicor10 中已正确设置的 UD 字段。

通过业务对象进入 Epicor 10 时如何访问 UD 字段?

编辑:

using Erp.BO;
using Erp.Proxy.BO;

// ...

var binding = Epicor.ServiceModel.StandardBindings.NetTcp.UsernameWindowsChannel();

var cc = new ClientCredentials();
var cred = cc.UserName;
cred.UserName = "****";
cred.Password = "****";
DnsEndpointIdentity ep = new DnsEndpointIdentity("****");

var quoteBo = new QuoteImpl(binding, new Uri("net.tcp://****/Erp/BO/Quote.svc"), cc, ep);

var qds = new QuoteDataSet();
var hed = qds.QuoteHed.NewQuoteHedRow(); // type: QuoteDataSet.QuoteHedRow

// I am not getting UserDefinedColumns as a member of hed.
// This gives me a compiler error.
qds.QuoteHed[0].UserDefinedColumns["Custom_c"] = "value";

当您找到要查找的特定记录并拥有一个包含该记录的所有列的对象时,您应该会看到一个名为 UserDefinedColumns 的附加对象。它的工作方式类似于 <string, object> 类型的字典。因此,例如要设置一个值,您可以这样做:

myPartDs.Part[0].UserDefinedColumns["MyUdColumn_c"] = "some value";

如果您需要提取一个值,则必须将其解析为所需的任何类型,因为它们存储为对象。

还是比较简单的,调用BO返回的DS会在客户端和服务端的合约DLL中定义,因为这个文件需要分发到客户端机器的UD字段没有添加到它。这会导致过多的客户端更新。

这意味着 Visual Studio 无法查看合同程序集来确定字段名称。相反,您使用 columnName 索引器访问该字段,即:

class Program
{
    static void Main(string[] args)
    {
        // Hard-coded LogOn method 
        // Reference: Ice.Core.Session.dll
        Ice.Core.Session session = new Ice.Core.Session("manager", "manager", "net.tcp://AppServer/MyCustomerAppserver-99999-10.0.700.2");

        // References: Epicor.ServiceModel.dll, Erp.Contracts.BO.ABCCode.dll
        var abcCodeBO = Ice.Lib.Framework.WCFServiceSupport.CreateImpl<Erp.Proxy.BO.ABCCodeImpl>(session, Erp.Proxy.BO.ABCCodeImpl.UriPath);

        // Call the BO methods
        var ds = abcCodeBO.GetByID("A");
        var row = ds.ABCCode[0];

        System.Console.WriteLine("CountFreq is {0}", row.CountFreq);
        System.Console.WriteLine("CustomField_c is {0}", row["CustomField_c"]);
        System.Console.ReadKey();
    }
}

UserDefinedColumns 在 Epicor.ServiceModel 中定义但不可访问,因为它是 Erp.Tablesets.QuoteHedRow 继承自 Ice.IceRow 的内部 属性。