Epicor 10 如何在 BPM 预处理和 post 处理之间存储数据?

Epicor 10 How to store data between BPM pre and post processing?

我打算将使用 Progress/ABL 代码的 Epicor V9 系统迁移到使用 C# 代码的 v10。我已经完成了大部分工作,但我需要一种方法来将数据保存在 BPM 预处理和 post 处理之间。原ABL代码中的注释状态:

Description : This function stores data from a BPM pre processing action, it does this by using a private-data (storage attribute) on the calling program... this remains in scope during both the BPM pre and BPM post forward to procedure calls

Epicor v9 系统的设置使得报价表调用 .p 文件中的 BPM pre/post 处理。 .p 文件转而调用我尝试在 .i 文件中迁移的代码。它看起来是一个简单的堆栈或字符串数​​组。

Epicor 10 中将使用什么来在 pre/post BPM 处理之间保留数据,就像 V9 中的 .i 代码所做的那样?

我不知道如何使用 E9 中的 .i 文件,但我知道如何在 E10 中的 pre 和 post 方法指令之间保留数据。希望这对您有所帮助。

有几种不同的方法可以做到这一点。如果在创建预处理 bpm 时选择了 "Execute Custom Code" 选项。您可以使用 callContextBpmData 在您的代码中直接执行此操作。几乎所有的字段名称都与 E9 使用的用户字段的名称相似(即 Number01、Chracter01、Date01)。

在您的代码中,如果您要设置文本,您只需键入:

callContextBpmData.Character01 = "some text";

或者,您可以直接在 bpm 设计器中进行设置,无需任何代码。在设计器左侧 window 窗格中,一直滚动到底部,您应该会看到名为 "Set BPM Data Field" 的内容。将其拖入设计区域。将其拖入设计器区域后,您应该会在底部 window 窗格中看到用于设置字段及其值的选项。 Select 字段,然后当您 select "value" 时,您将被带到一个类似于 baq 计算字段设计器的 window。您可以使用静态数据或使用业务对象中的数据来计算一个值。

您可以为此使用 CallContext.Properties。

在 E10.0 中,CallContext.Properties 的类型为 Epicor.Utilities.PropertyBag,项目将按如下方式访问:

//Add
CallContext.Properties.Add("LineRef", LineRef);
// Get
var LineRef = (string)CallContext.Properties["LineRef"];
// Remove
CallContext.Properties.Remove("LineRef");

E10.1 CallContext.Properties 现在属于 System.Collections.Concurrent.ConcurentDictionary 类型,这是一个 .Net 内置类型并且有更好的文档记录。但是,从中添加和删除条目的方法有如下变化:

//Add
bool added = CallContext.Properties.TryAdd("LineRef", LineRef);
// Get
var LineRef = (string)CallContext.Properties["LineRef"];  //Note: Do not use .ToString() this converts instead of unboxing.
// Remove
object dummy;
bool foundAndRemoved = CallContext.Properties.TryRemove("LineRef", out dummy);

要使用它,您的 class 需要继承自 ContextBoundBase 并实现唯一的上下文绑定构造函数,否则您将获得 'Ice.ContextBoundBase<Erp.ErpContext>.ContextBoundBase()' is obsolete: 'Use the constructor that takes a data context'

public partial class MyInvokeExternalMethodThing : ContextBoundBase<ErpContext>
{
    public MyInvokeExternalMethodThing(ErpContext ctx) : base(ctx)
    {

    }

在 E10.1 中,您可以将任何类型的对象放入其中,因此如果您有一个字符串数组,则无需使用波浪号~分隔~值的老技巧。