我打算将带有Progress / ABL代码的Epicor V9系统迁移到具有C#代码的v10。我已经完成了大部分工作,但我需要一种在BPM前后处理之间保持数据的方法。原始ABL代码中的注释说明:


  说明:该函数存储来自BPM预处理操作的数据,它通过在调用程序上使用私有数据(存储属性)来完成此操作。
     在BPM之前和BPM后继到过程调用期间,这仍然在范围内


Epicor v9系统的设置使得Quote表单在.p文件中调用BPM的前/后处理。 .p文件反过来会调用我要迁移到.i文件中的代码。它看起来像是一个简单的字符串堆栈或数组。

Epicor 10将使用什么来在BPM之前/之后的处理之间保留数据,就像V9中的.i代码一样?

最佳答案

您可以为此使用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);


要使用此功能,您的类需要继承自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中,您可以在其中放入任何对象,因此,如果您有字符串数组,则无需使用tilde〜separated〜values的旧技巧。

关于c# - Epicor 10如何在BPM前后处理之间存储数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39297632/

10-09 18:26