2

我有一个荒谬的情况(不要怪我,它是第三方软件),我需要有两个引用(Erp.Contracts.BO.Quote 和 Erp.Contracts.BO.SalesOrder),但类型是 Erp.Tablesets。 QuoteQtyRow 在两个程序集中都定义了!

如何在代码中使用它们?

void Absurdity()
{
    Erp.Tablesets.QuoteQtyRow qqr_Quote = null; //<-- my intention is to use the one from the quote assembly here.
    Erp.Tablesets.QuoteQtyRow qqr_SO = null; //<-- my intention is to use the one from the sales order assembly here.
}

编译器抛出错误。即:“'Erp.Tablesets.QuoteQtyRow' 类型存在于两个程序集中。”

编辑:限制:

  1. 我没有使用此答案中提供的外部别名的灵活性Class with same name in two assembly (intentionally)。我受到第三方软件提供的环境的限制。我本质上需要一种方法来区分方法的主体。

  2. 我知道我可以通过使用 dynamic 关键字完全避免这个问题,但我正在寻找一种可能的强类型解决方案。

  3. 可能没有解决方案,但我想在我放弃这个问题之前耗尽我所有的资源。

4

1 回答 1

2

Epicor ERP 使用一种工具将数据库中的表组合成数据集,然后再组合成业务对象。此业务对象在合同程序集中进行了描述,但正如您所发现的,当您使用两个引用同一个表的业务对象时会遇到问题。这通常是 SerialNumber 表的问题。

我从您的注释中了解到,您在 Epicor ERP 应用程序中的方法指令或数据指令中提供方法主体代码。这是在客户端输入并存储在数据库中,但在服务器上的 Deployment\Server\BPM\Sources\BO 文件夹中生成代码,并编译到 Deployment\Server\Customization\BO 文件夹中。

无法在 BPM 设计器的“执行自定义代码”工作流项中为引用的 DLL 指定别名。在 SCR 148549 中请求修复。没有可供您编辑的项目文件,即使每次启用和禁用 BPM 也会重新生成。

但是,如果您使用“调用外部方法”工作流项,则可以构建自己的 dll 并将其放在 Deployment\Server\Customization\Externals 文件夹中。要做到这一点:

  • 在您的 BPM 的方法指令维护中单击操作 > 为您的方法创建编程接口并复制代码。
  • 在 Visual Studio 中创建一个新的类库项目
  • 将复制的代码粘贴到 .cs 文件中
  • 添加程序集 - 框架参考:
    • 系统.数据.实体
    • 系统.服务模型
    • 系统事务
  • 将文件引用添加到
    • Bin\Epicor.ServiceModel.dll
    • 程序集\Epicor.Ice.dll
    • 程序集\Epicor.System.dll
    • 程序集\Ice.Data.Model.dll
    • 程序集\Erp.Data.910100.dll
  • 并为 BPM 的 BO 添加参考,即
    • 程序集\Erp.Contracts.BO.Quote.dll
  • 确保所有引用都将 Copy Local 设置为 false。
  • 继承自Ice.ContextBoundBase<Erp.ErpContext>
  • 添加一个接受上下文的构造函数public MyQuote (Erp.ErpContext ctx) : base(ctx){ }

您无法完全复制并粘贴“执行自定义代码”正文,因为您无法访问 tt 行变量,这些都在 ds.

于 2017-01-20T10:39:55.130 回答