如何从Release AR Documents屏幕中的Release / Release All按钮执行代码

时间:2016-05-16 20:17:44

标签: acumatica

我已经定制了Invoice&备注屏幕,我在激活释放操作时执行一些自定义代码(Web服务调用)。这很好 - 我知道如何替换PXAction代码并从那里开始。现在我想使用Release AR Documents处理屏幕来做同样的事情,但是我无法理解覆盖的位置/内容,或者放置代码的位置。

我在源代码中看到了带有SetProcessDelegate的ARDocumentRelease图构造函数,但我不知道如何继续 - 这是否是我需要查看的位置。我需要在我的代码中使用RefNbr为每个被释放的行执行我的代码。

3 个答案:

答案 0 :(得分:2)

由于它是静态方法,因此无法覆盖它。此外,您无法在T300中完成它,因为您正在处理图形,并且您无法使用自己的图标覆盖释放按钮。我能够通过为每个已处理的AR文档传递回调来实现它。

您可以调用Initialize图表的ARDocumentRelease方法来覆盖您所说的逻辑。在您必须使用回调参数而不是使用默认参数调用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
        });
    }
}

答案 1 :(得分:0)

我认为这是功能

public static void ReleaseDoc(List<ARRegister> list, bool isMassProcess, List<Batch> externalPostList, ARMassProcessDelegate onsuccess)

ARDocumentRelease 业务逻辑。

答案 2 :(得分:0)

请注意,您必须始终在长时间运行的过程中调用静态方法并在其中创建必要的对象。

处理委托逻辑是作为长时间运行的过程实现的,该过程创建工作线程来执行处理逻辑。

您具有AddAdditionalLogicToRelease()方法,该方法需要对象实例才能调用,并且在线程上下文切换期间会失败,因此会出现问题。因此,您必须在线程上下文内创建对象实例,然后调用实例方法。

通常,从长时间运行的进程中调用的方法被声明为静态,并且在此静态方法内部创建了所需的对象/图形以完成某些工作。请参见以下示例,如何为此目的正确覆盖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
                });
            }
        );

    }
}