如何在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; } } } }
注意事项
- 替换代码中
UsrYourHeaderCustomField/UsrYourLineCustomField为你实际定义的自定义字段名。 - 确保自定义字段已正确添加到对应DAC(ARInvoice/ARTran)和UI布局中。
- 两种方式都能覆盖Reverse和Reverse and Apply Memo操作的场景。
内容的提问来源于stack exchange,提问作者pmfith
相关产品推荐
相关产品推荐

