我想将带有Progress / ABL代码的Epicor V9系统迁移到带有C#代码的v10。我已经完成了大部分工作,但我需要一种方法来保持BPM在处理前和处理之间的数据。原始ABL代码状态中的注释:
描述:此函数存储来自BPM预处理操作的数据,它通过在调用程序上使用私有数据(存储属性)来完成此操作... 在BPM pre和BPM post转发到过程调用期间,这仍然在范围内
Epicor v9系统的设置使得Quote表单在.p文件中调用BPM前/后处理。转到的.p文件调用我试图在.i文件中迁移的代码。它看起来像是一个简单的堆栈或字符串数组。
在Epicor 10中使用什么来在BPM前后处理之间保存数据,就像V9中的.i代码一样?
答案 0 :(得分:3)
您可以使用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~corted~值的旧技巧。
答案 1 :(得分:2)
我不知道如何使用E9中的.i文件,但我知道如何在E10中的pre和post方法指令之间保留数据。希望这会有所帮助。
有几种不同的方法可以做到这一点。如果在创建预处理bpm时选择了&#34;执行自定义代码&#34;选项。您可以使用callContextBpmData直接在代码中执行此操作。几乎所有字段名称都与E9使用的用户字段类似(即Number01,Chracter01,Date01)。
在您的代码中,如果您要设置文本,只需键入:
即可callContextBpmData.Character01 = "some text";
或者你可以直接在bpm设计器中设置它而不需要任何代码。在设计器左窗口窗格中,一直滚动到底部,你应该看到一个名为&#34;设置BPM数据字段&#34;的东西。将其拖动到设计区域。将其拖入设计器区域后,您应该会看到在底部窗口窗格中设置字段及其值的选项。选择字段,然后选择&#34; value&#34;你被带到一个类似于baq计算的现场设计师的窗口。您可以使用静态数据或使用业务对象中的数据来计算值。