我正在将带有进度/ABL代码的Epicor V9系统迁移到带有C#代码的v10。我已经完成了大部分工作,但是我需要一种在BPM前后处理之间保存数据的方法。原始ABL代码状态中的注释:
描述:此函数存储来自BPM预处理操作的数据,它通过在调用程序上使用私有数据(存储属性)来实现.在BPM pre和BPM转发到过程调用期间,这仍然在范围内。
Epicor v9系统的设置使得Quote表单在.p文件中调用BPM前后处理。转进来的.p文件调用我试图在.i文件中迁移的代码。它看起来是一个简单的堆栈或字符串数组。
在Epicor 10中将使用什么来在BPM前后处理之间持久化数据,就像.i代码在V9中所做的那样?
发布于 2016-09-08 14:21:48
为此您可以使用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现在是System.Collections.Concurrent.ConcurentDictionary,类型的CallContext.Properties,它是一个内置于类型中的.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~分离的~值。
发布于 2016-09-04 00:36:05
我不知道如何使用来自.i的E9文件,但我知道如何在E10中的pre和post方法指令之间持久化数据。希望这能帮上忙。
有几种不同的方法可以做到这一点。如果在创建预处理bpm时,您选择了“执行自定义代码”选项。您可以使用callContextBpmData直接在代码中执行此操作。几乎所有字段名都类似于E9使用的用户字段(即Number01、Chracter01、Date01)。
在代码中,如果设置文本,只需键入:
callContextBpmData.Character01 = "some text";或者,您可以直接在bpm设计器中设置它,而不需要任何代码。在designer左窗口窗格中,一直滚动到底部,您应该会看到所谓的“设置BPM数据字段”。把它拖到设计区。将其拖动到designer区域后,应在底部窗口窗格中看到设置字段及其值的选项。选择该字段,然后当您选择“值”时,您将被带到类似于baq计算字段设计器的窗口。可以使用静态数据或使用业务对象中的数据来计算值。
https://stackoverflow.com/questions/39297632
复制相似问题