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

本文关键字:对象 UD 字段 业务 Epicor10 Epicor 访问 | 更新日期: 2023-09-27 18:17:48

在Epicor 9中,打开Visual Studio并创建一个项目并使用Epicor库访问其业务对象(BOs)是相当容易的。因此,例如,可以通过包含库epicor . mf .Part并更新一个Part对象来访问Part。然后,通过调用Part.GetByID("partnum");,可以很容易地获取部件的信息。这将返回一个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";

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

这仍然是相当容易的,调用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,但不可访问,因为它是Ice.IceRow的内部属性,Erp.Tablesets.QuoteHedRow继承自。

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

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

如果你需要取出一个值,那么你必须将其解析为它需要的任何类型,因为它们是作为对象存储的。