0

目标是获取从 AP Bill 页面生成的 Journal Transaction 并在 GLTran 中添加 2 个额外的行。

第一次尝试

首先,我从 Journal Transactions 图表中扩展了 Release 操作,以包括 2 条新行:

        public class JournalEntryExt : PXGraphExtension<JournalEntry>
{
    public delegate IEnumerable ReleaseDelegate(PXAdapter adapter);
    [PXOverride]
    public IEnumerable Release(PXAdapter adapter, ReleaseDelegate baseMethod)
    {
        baseMethod(adapter);

        //new code
        GLTran tranRow = new GLTran();
        tranRow = this.Base.GLTranModuleBatNbr.Insert(tranRow);

        tranRow.AccountID = 2713;
        tranRow.SubID = 467;
        tranRow.CuryDebitAmt = 100;
        this.Base.GLTranModuleBatNbr.Update(tranRow);


        tranRow = new GLTran();
        tranRow = this.Base.GLTranModuleBatNbr.Insert(tranRow);

        tranRow.AccountID = 1514;
        tranRow.SubID = 467;
        tranRow.CuryCreditAmt = 100;
        this.Base.GLTranModuleBatNbr.Update(tranRow);

        this.Base.Actions.PressSave();


        return adapter.Get();
    }

结果:创建和发布批次,正确输入了 2 个新行。

在此之后,我认为发布 AP Bill 也会从 GL Page 触发这个扩展逻辑。然而,这并没有发生——Bill 的发布似乎没有重用GL 页面中定义的Release逻辑。

第二次尝试

然后,我回到 GL 页面并将逻辑包含在 RowPersisted 事件中,以便在保存文档后立即创建 2 个新行:

    public class JournalEntryExt : PXGraphExtension<JournalEntry>
    {
        protected virtual void Batch_RowPersisted(PXCache sender, PXRowPersistedEventArgs e)
    {
        if (e.Row == null)
        {
            return;
        }

        Batch batchRow = (Batch)e.Row;

        if (batchRow != null
                && e.Operation == PXDBOperation.Insert
                && e.TranStatus == PXTranStatus.Completed)
        {
            ////new code
            GLTran tranRow = new GLTran();
            tranRow = this.Base.GLTranModuleBatNbr.Insert(tranRow);

            tranRow.AccountID = 2713;
            tranRow.SubID = 467;
            tranRow.CuryDebitAmt = 102;
            this.Base.GLTranModuleBatNbr.Update(tranRow);


            tranRow = new GLTran();
            tranRow = this.Base.GLTranModuleBatNbr.Insert(tranRow);

            tranRow.AccountID = 1514;
            tranRow.SubID = 467;
            tranRow.CuryCreditAmt = 102;
            this.Base.GLTranModuleBatNbr.Update(tranRow);

        }
    }

结果:创建和保存批次正确输入了 2 个新行。

在此之后,我认为发布 AP 账单会触发这个扩展事件,因为应该从账单页面创建和使用日记帐分录图,但在这种情况下,同样发布 AP 账单,并没有添加 2 个新行在生成的批次中。

第三次尝试

然后我想我可以扩展 Bill 的 Release 操作并使用 Search<> 方法控制生成的 Journal Entry。但是,在这种情况下,扩展逻辑似乎在事务中执行,因为 Document.Current.BatchNbr 仍然为 NULL:

当前批次Nbr Null

第四次尝试

最后,我尝试扩展 APReleaseProcess 的 Persist() 方法,类似于它在指南 T300 中的完成方式,但是没有列出任何方法(版本 17.207.0029):

在此处输入图像描述

关于如何输入这些 GL 行的任何其他想法?

谢谢!

4

1 回答 1

4

希望您不会永远经历这 4 次尝试……但我不得不说,您问题中的努力和细节数量令人印象深刻,绝对非常感谢!

在为 AP 帐单生成的批次中插入 2 个额外的 GL 交易需要两步自定义:

  1. 要插入额外的 GL 事务,您需要在JournalEntry BLC 扩展中覆盖Persist方法,并仅在自定义ModifyBatchFromAP布尔标志值等于True时调用插入额外 GLTrans 的逻辑:

    using PX.Data;
    using System;
    
    namespace PX.Objects.GL
    {
        public class JournalEntry_Extension : PXGraphExtension<JournalEntry>
        {
            private bool modifyBatchFromAP = false;
    
            public bool ModifyBatchFromAP
            {
                get
                {
                    return modifyBatchFromAP;
                }
                set
                {
                    modifyBatchFromAP = value;
                }
            }
    
            [PXOverride]
            public void Persist(Action del)
            {
                if (ModifyBatchFromAP)
                {
                    var glTran = Base.GLTranModuleBatNbr.Insert();
                    Base.GLTranModuleBatNbr.SetValueExt<GLTran.accountID>(glTran, "20000");
                    glTran = Base.GLTranModuleBatNbr.Update(glTran);
                    Base.GLTranModuleBatNbr.SetValueExt<GLTran.subID>(glTran, "000000");
                    glTran.CuryDebitAmt = 100;
                    glTran.TranDesc = "Additional Debit Transaction for AP Doc";
                    Base.GLTranModuleBatNbr.Update(glTran);
    
                    glTran = Base.GLTranModuleBatNbr.Insert();
                    Base.GLTranModuleBatNbr.SetValueExt<GLTran.accountID>(glTran, "20200");
                    glTran = Base.GLTranModuleBatNbr.Update(glTran);
                    Base.GLTranModuleBatNbr.SetValueExt<GLTran.subID>(glTran, "000000");
                    glTran.CuryCreditAmt = 100;
                    glTran.TranDesc = "Additional Credit Transaction for AP Doc";
                    Base.GLTranModuleBatNbr.Update(glTran);
                }
    
                del();
            }
        }
    }
    
  2. 之后,在APInvoiceEntry_Extension中覆盖的Release操作中,您将订阅JournalEntry BLC 类型的InstanceCreated事件,以将ModifyBatchFromAP标志值设置为True,从而允许您的步骤 1 中的逻辑为仅为 AP 文档生成的批处理执行:

    using PX.Data;
    using PX.Objects.GL;
    using System.Collections;
    
    namespace PX.Objects.AP
    {
        public class APInvoiceEntry_Extension : PXGraphExtension<APInvoiceEntry>
        {
            public delegate IEnumerable ReleaseDelegate(PXAdapter adapter);
    
            [PXOverride]
            public IEnumerable Release(PXAdapter adapter, ReleaseDelegate baseMethod)
            {
                PXGraph.InstanceCreated.AddHandler<JournalEntry>((JournalEntry graph) =>
                {
                    graph.GetExtension<JournalEntry_Extension>().ModifyBatchFromAP = true;
                });
    
                return baseMethod(adapter);
            }
        }
    }
    

PS 由于应用了 PXHiddenAttribute,目前无法将 Select Method to Override 对话框与APReleaseProcess类一起使用。让我将此转发给我们的工程团队,以引起他们对此事的关注。

于 2018-03-10T17:04:40.707 回答