我如何获得 Acumatica AR 文档版本的挂钩?

How do I get a hook into the Acumatica AR Document release?

浏览了各种文章,none似乎“工作”了。特别是 2021r1,在输出中没有得到任何 PXTrace 语句

挑战: 图的静态方法直接从 ARPaymentEntry 调用,以及 4-5 个重载(来自 .\App_Data\CodeRepository\PX.Objects\AR\ARDocumentRelease.cs) 最终最终调用该图中的单个方法,从“public static void ReleaseDoc(”开始 没有明确的地方可以添加委托,尽管这似乎是“最正确”的方法(例如问题 37262565,来自 cbetabeta 的评论)——但初始化事件似乎没有触发(可能是 JIT 优化?直接调用静态方法不会真的不需要实例化 class,我猜)

还需要一个完整的解决方案 - 例如必须处理来自付款输入以及来自 AR 文档发布过程的调用

示例代码:

using PX.Data;
using PX.Objects.AR;
using PX.Objects.GL;
using System.Collections;
using System.Collections.Generic;
using static PX.Objects.AR.ARDocumentRelease;

namespace Test.GraphExtensions
{
    public class ARDocumentReleaseTestABC : PXGraphExtension<ARDocumentRelease>
    {
        // Tries include:
        // https://html.developreference.com/article/11055300/How+to+customize+the+Process+button+on+the+AP505200+screen.+Acumatica
        // 
        // 
        // https://living-sun.com/es/acumatica/2179-extend-arpaymententry-release-action-acumatica.html
        #region IsActive - Turn off if no setup record

        public static bool IsActive()
        {
            return true;
        }

        #endregion IsActive - Turn off if no setup record
        public virtual void BalancedARDocument_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "dc1703c7-f8b7-4ce1-b838-d51475f4d477"));
            
        }
        public override void Initialize()
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8ecc4f83-9ac8-4bb6-bad7-ac2aabc5b58e"));
          
        }
        public static void ReleaseDocRBRR(ARRegister ardoc, bool isAborted)
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0} {1} {2}", "20ae0d5e-44eb-42f2-ad15-0b9e307d2a86", isAborted, (ardoc == null)));
        }

        [PXUIField(DisplayName = "Release", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Update)]
        [PXProcessButton]
    //    [PXOverride]
        public virtual IEnumerable Release(PXAdapter adapter)
        {
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "0ccff0b7-7702-4083-b717-17b031e27be5"));
            List<ARRegister> list = new List<ARRegister>();
            return list;
        }
    }
}

我认为问题出在名称空间上:

namespace PX.Objects.AR
{
  public class ARDocumentRelease_Extension : PXGraphExtension<ARDocumentRelease>
  {
    #region Event Handlers
        public override void Initialize()
    {
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8ecc4f83-9ac8-4bb6-bad7-ac2aabc5b58e"));
      
    }
    #endregion
  }
}

如果您需要在发布代码之前触发代码,则覆盖的正确位置是 ARReleaseProcess.OnBeforeReleaseARReleaseProcess.ReleaseDocProc

此外,如果您只是需要在发布后运行您的代码,建议您将您的代码添加到onreleasecomplete Delegate in ARReleaseProcess.ReleaseDocProc.

此外,如果您只需要在文档发布后 运行 您的代码,而您不一定需要 运行 完全在同一个事务中,请考虑添加一个单独的进程拾取已发布的文档并进一步处理它们。您可以每分钟在后台安排该进程 ti 运行,或者使用 Business Events 设置触发器。

我似乎遇到了各种各样的问题,尤其是对错误图表的扩展。结合 Dmitrii 的回答,我至少指出了一些被击中的事件,以便其他人将来可以使用

根据@dmitrii-naumov 的回答修改代码:

using PX.Data;
using PX.Objects.AR;
using PX.Objects.GL;
using System.Collections.Generic;

namespace Test.ABCD
{
    public class ARDocumentReleaseTestABCD : PXGraphExtension<ARReleaseProcess>
    {
        #region IsActive - Turn off if no setup record

        public static bool IsActive()
        {
            return true;
        }

        #endregion IsActive - Turn off if no setup record

        public override void Initialize()
        {
            // Hit
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8ecc4f83-9ac8-4bb6-bad7-ac2aabc5b58e"));
        }

        public delegate List<ARRegister> ReleaseDocProcDelegate(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete);

        [PXOverride]
        public List<ARRegister> ReleaseDocProc(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete, ReleaseDocProcDelegate del)
        {
            // Hit
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "8f153b0b-dd57-4893-aa8c-d29ea69528e4"));
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "9b1caa30-5abf-4f21-8c45-a55c4047441a"));
            return null;
        }

        [PXOverride]
        public virtual ARRegister OnBeforeRelease(ARRegister ardoc)
        {
            // Hit
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "741a01ad-5a37-40a8-ad10-a1fcd6659f7e"));
            PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "9b1caa30-5abf-4f21-8c45-a55c4047441a"));
            return ardoc;
        }
    }
}

这个版本实现了 OnReleaseComplete,来自 Dmitrii 提供给我的代码(我会承担错误的责任,但他正确地连接了事件,所以一定要在日志中显示 OnComplete 事件):

public class ARDocumentReleaseTESTABC : PXGraphExtension<ARReleaseProcess>
{
    #region IsActive 

    public static bool IsActive()
    {
        return true;
    }

    #endregion IsActive

    public void OnReleaseComplete(ARRegister doc)
    {
        ///code
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "7d22cef8-c14d-4111-bcc5-405be006ea6b"));
    }

    #region ReleaseDocProc
    public delegate List<ARRegister> ReleaseDocProcDelegate(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete);

    [PXOverride]
    public List<ARRegister> ReleaseDocProc(JournalEntry je, ARRegister ardoc, List<Batch> pmBatchList, ARDocumentRelease.ARMassProcessReleaseTransactionScopeDelegate onreleasecomplete, ReleaseDocProcDelegate del)
    {
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "d508b521-976c-452b-9765-57f532a0a513"));
        onreleasecomplete += OnReleaseComplete;
        PXTrace.WriteVerbose(string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}", "309e2e6b-6fb8-4c75-ab8a-40e56c173562"));
        return del(je, ardoc, pmBatchList, onreleasecomplete);
    }
    #endregion
}