如何从发布 AR 文档屏幕中的发布/发布所有按钮执行代码
How can I execute code from the Release / Release All buttons in the Release AR Documents screen
我对发票和备忘录屏幕进行了自定义,当发布操作被激活时,我会在其中执行一些自定义代码(Web 服务调用)。这工作正常 - 我知道如何替换 PXAction 代码并从那里开始。现在我想使用 Release AR Documents 处理屏幕来做同样的事情,但我无法理解在哪里/覆盖什么,或者在哪里放置我的代码。
我在源代码中看到了带有 SetProcessDelegate 的 ARDocumentRelease 图构造函数,但我不确定如何继续 - 这是否是我需要查看的地方。我需要为发布的每一行执行我的代码,在我的代码中使用 RefNbr。
我认为是函数
public static void ReleaseDoc(List<ARRegister> list, bool isMassProcess, List<Batch> externalPostList, ARMassProcessDelegate onsuccess)
在 ARDocumentRelease 业务逻辑下。
因为它是一个静态方法,所以你不能覆盖它。此外,你不能像在 T300 中那样做,因为你在处理图形中,你不能用你自己的按钮覆盖释放按钮。我能够通过为每个已处理的 AR 文档传递回调来实现它。
您可以调用ARDocumentRelease
图的Initialize
方法来覆盖您所说的逻辑。在您只需要调用 ReleaseDoc
之后,它使用回调参数而不是使用默认参数。
这是我附带的代码:
public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
{
public override void Initialize()
{
ARSetup setup = Base.arsetup.Current;
Base.ARDocumentList.SetProcessDelegate(
delegate (List<BalancedARDocument> list)
{
List<ARRegister> newlist = new List<ARRegister>(list.Count);
foreach (BalancedARDocument doc in list)
{
newlist.Add(doc);
}
AddAdditionalLogicToRelease(newlist);
}
);
Base.ARDocumentList.SetProcessCaption("Release");
Base.ARDocumentList.SetProcessAllCaption("Release All");
}
public delegate void PostPorcessing(ARRegister ardoc, bool isAborted);
private void AddAdditionalLogicToRelease(List<ARRegister> newlist)
{
ARDocumentRelease.ReleaseDoc(newlist, true, null, delegate(ARRegister ardoc, bool isAborted) {
//Add your logic to handle each document
//Test to check if it was not aborted
});
}
}
请注意,您必须始终从长 运行 进程中调用静态方法并在那里创建必要的对象。
处理委托逻辑的实现与创建工作线程以执行处理逻辑的长 运行 进程相同。
您有 AddAdditionalLogicToRelease() 方法,该方法需要对象实例才能调用,并且在线程上下文切换期间会失败,因此会出现问题。因此,您必须在线程上下文中创建对象实例,然后调用实例方法。
一般来说,从长 运行 进程调用的方法被声明为静态的,需要 objects/graphs 在此静态方法中创建以完成一些工作。请参阅下面的示例,了解如何为此目的正确覆盖 ARDocumentRelease 图:
public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
{
public override void Initialize()
{
Base.ARDocumentList.SetProcessDelegate(
delegate (List<BalancedARDocument> list)
{
List<ARRegister> newlist = new List<ARRegister>(list.Count);
foreach (BalancedARDocument doc in list)
{
newlist.Add(doc);
}
// use override that allows to specify onsuccess routine
ARDocumentRelease.ReleaseDoc(newlist, true, null, (ardoc, isAborted) =>
{
//Custom code here, such as create your GL
});
}
);
}
}
我对发票和备忘录屏幕进行了自定义,当发布操作被激活时,我会在其中执行一些自定义代码(Web 服务调用)。这工作正常 - 我知道如何替换 PXAction 代码并从那里开始。现在我想使用 Release AR Documents 处理屏幕来做同样的事情,但我无法理解在哪里/覆盖什么,或者在哪里放置我的代码。
我在源代码中看到了带有 SetProcessDelegate 的 ARDocumentRelease 图构造函数,但我不确定如何继续 - 这是否是我需要查看的地方。我需要为发布的每一行执行我的代码,在我的代码中使用 RefNbr。
我认为是函数
public static void ReleaseDoc(List<ARRegister> list, bool isMassProcess, List<Batch> externalPostList, ARMassProcessDelegate onsuccess)
在 ARDocumentRelease 业务逻辑下。
因为它是一个静态方法,所以你不能覆盖它。此外,你不能像在 T300 中那样做,因为你在处理图形中,你不能用你自己的按钮覆盖释放按钮。我能够通过为每个已处理的 AR 文档传递回调来实现它。
您可以调用ARDocumentRelease
图的Initialize
方法来覆盖您所说的逻辑。在您只需要调用 ReleaseDoc
之后,它使用回调参数而不是使用默认参数。
这是我附带的代码:
public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
{
public override void Initialize()
{
ARSetup setup = Base.arsetup.Current;
Base.ARDocumentList.SetProcessDelegate(
delegate (List<BalancedARDocument> list)
{
List<ARRegister> newlist = new List<ARRegister>(list.Count);
foreach (BalancedARDocument doc in list)
{
newlist.Add(doc);
}
AddAdditionalLogicToRelease(newlist);
}
);
Base.ARDocumentList.SetProcessCaption("Release");
Base.ARDocumentList.SetProcessAllCaption("Release All");
}
public delegate void PostPorcessing(ARRegister ardoc, bool isAborted);
private void AddAdditionalLogicToRelease(List<ARRegister> newlist)
{
ARDocumentRelease.ReleaseDoc(newlist, true, null, delegate(ARRegister ardoc, bool isAborted) {
//Add your logic to handle each document
//Test to check if it was not aborted
});
}
}
请注意,您必须始终从长 运行 进程中调用静态方法并在那里创建必要的对象。
处理委托逻辑的实现与创建工作线程以执行处理逻辑的长 运行 进程相同。
您有 AddAdditionalLogicToRelease() 方法,该方法需要对象实例才能调用,并且在线程上下文切换期间会失败,因此会出现问题。因此,您必须在线程上下文中创建对象实例,然后调用实例方法。
一般来说,从长 运行 进程调用的方法被声明为静态的,需要 objects/graphs 在此静态方法中创建以完成一些工作。请参阅下面的示例,了解如何为此目的正确覆盖 ARDocumentRelease 图:
public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
{
public override void Initialize()
{
Base.ARDocumentList.SetProcessDelegate(
delegate (List<BalancedARDocument> list)
{
List<ARRegister> newlist = new List<ARRegister>(list.Count);
foreach (BalancedARDocument doc in list)
{
newlist.Add(doc);
}
// use override that allows to specify onsuccess routine
ARDocumentRelease.ReleaseDoc(newlist, true, null, (ardoc, isAborted) =>
{
//Custom code here, such as create your GL
});
}
);
}
}