如何从发布 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
                });
            }
        );

    }
}