You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Reverse及Reverse and Apply Memo流程中填充发票与备忘录用户字段

解决方案:Acumatica反向发票/备忘录时自动带入自定义字段

方式一:利用RowInserting事件(简洁推荐)

这种方式无需重写核心反向方法,通过单据/明细插入时的事件自动复制自定义字段,适配Reverse和Reverse and Apply Memo两种操作。

处理表头自定义字段

如果自定义字段在发票/备忘录表头(ARInvoice DAC):

public class ARInvoiceEntryExt : PXGraphExtension<ARInvoiceEntry>
{
    protected void _(Events.RowInserting<ARInvoice> e)
    {
        ARInvoice reversedDoc = e.Row;
        if (reversedDoc == null) return;

        // 判断当前单据是反向生成的贷项通知单
        if (reversedDoc.DocType == ARDocType.CreditMemo && !string.IsNullOrEmpty(reversedDoc.OrigRefNbr))
        {
            // 查询原发票/备忘录
            ARInvoice originalDoc = PXSelect<ARInvoice, 
                Where<ARInvoice.docType, Equal<Required<ARInvoice.docType>>, 
                And<ARInvoice.refNbr, Equal<Required<ARInvoice.refNbr>>>>>
                .Select(Base, reversedDoc.OrigDocType, reversedDoc.OrigRefNbr);
            
            if (originalDoc != null)
            {
                // 复制自定义字段(替换成你的实际字段名)
                reversedDoc.UsrYourHeaderCustomField = originalDoc.UsrYourHeaderCustomField;
            }
        }
    }
}

处理明细自定义字段

如果自定义字段在网格明细(ARTran DAC):

public class ARInvoiceEntryExt : PXGraphExtension<ARInvoiceEntry>
{
    protected void _(Events.RowInserting<ARTran> e)
    {
        ARTran reversedTran = e.Row;
        if (reversedTran == null) return;

        // 判断当前明细来自反向操作
        if (!string.IsNullOrEmpty(reversedTran.OrigTranType) && 
            !string.IsNullOrEmpty(reversedTran.OrigRefNbr) && 
            reversedTran.OrigLineNbr != null)
        {
            // 查询原明细行
            ARTran originalTran = PXSelect<ARTran, 
                Where<ARTran.tranType, Equal<Required<ARTran.tranType>>, 
                And<ARTran.refNbr, Equal<Required<ARTran.refNbr>>, 
                And<ARTran.lineNbr, Equal<Required<ARTran.lineNbr>>>>>
                .Select(Base, reversedTran.OrigTranType, reversedTran.OrigRefNbr, reversedTran.OrigLineNbr);
            
            if (originalTran != null)
            {
                // 复制自定义字段(替换成你的实际字段名)
                reversedTran.UsrYourLineCustomField = originalTran.UsrYourLineCustomField;
            }
        }
    }
}

方式二:重写反向流程方法(进阶控制)

如果需要更深度介入反向逻辑,可以通过PXOverride重写ARReleaseProcess中的InsertReversedTransactionDetails方法,在生成反向明细后补充自定义字段:

public class ARReleaseProcessExt : PXGraphExtension<ARReleaseProcess>
{
    [PXOverride]
    public virtual void InsertReversedTransactionDetails(ARInvoice doc, ARInvoice reversedDoc, PXResultset<ARTran> details)
    {
        // 先执行基类的核心逻辑生成反向明细
        Base.InsertReversedTransactionDetails(doc, reversedDoc, details);

        // 遍历反向明细,复制自定义字段
        foreach (ARTran reversedTran in reversedDoc.Transactions)
        {
            if (reversedTran.OrigLineNbr == null) continue;
            
            ARTran originalTran = PXSelect<ARTran, 
                Where<ARTran.tranType, Equal<Required<ARTran.tranType>>, 
                And<ARTran.refNbr, Equal<Required<ARTran.refNbr>>, 
                And<ARTran.lineNbr, Equal<Required<ARTran.lineNbr>>>>>
                .Select(Base, doc.DocType, doc.RefNbr, reversedTran.OrigLineNbr);
            
            if (originalTran != null)
            {
                reversedTran.UsrYourLineCustomField = originalTran.UsrYourLineCustomField;
            }
        }
    }
}

注意事项

  1. 替换代码中UsrYourHeaderCustomField/UsrYourLineCustomField为你实际定义的自定义字段名。
  2. 确保自定义字段已正确添加到对应DAC(ARInvoice/ARTran)和UI布局中。
  3. 两种方式都能覆盖Reverse和Reverse and Apply Memo操作的场景。

内容的提问来源于stack exchange,提问作者pmfith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 04:32:46