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

通过BLC代码创建ARInvoice时无法生成序列编号的问题

问题

尝试通过BLC代码在Invoice and Memo / ARInvoiceEntry Graph中创建ARInvoice,使用的代码如下:

ARInvoiceEntry arinventry = PXGraph.CreateInstance<ARInvoiceEntry>();
ARInvoice arinvoice = new ARInvoice();

arinvoice.DocType = "Invoice";
arinvoice.DocDate = DateTime.Now;

//Get the customer ID...
var cust = (Customer)PXSelect<Customer, Where<Customer.acctCD, Equal<Required<Customer.acctCD>>>>.Select(Base, CustomerCode); //"ABARTENDE");
if (cust != null)
     arinvoice.CustomerID = cust.BAccountID;

//Get the project ID...
var proj = (PMProject)PXSelect<PMProject, Where<PMProject.contractCD, Equal<Required<PMProject.contractCD>>>>.Select(Base, JobNbr);
if (proj != null)
     arinvoice.ProjectID = proj.ContractID;

//Insert the record...
arinventry.Document.Insert(arinvoice);
arinventry.Persist()

每次执行该代码都会报错:无法生成序列的下一个编号。但手动录入相同数据时无此问题,且编号序列已确认配置正确。错误追踪信息如下:

3/14/2023 2:36:41 PM Error:
CS Error: Cannot generate the next number for the  sequence.
at PX.Objects.CS.AutoNumberAttribute.RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
at PX.Data.PXCache.OnRowPersisting(Object item, PXDBOperation operation)
at PX.Data.PXCache`1.PersistInserted(Object row, Boolean bypassInterceptor)
at PX.Data.PXCache`1.Persist(PXDBOperation operation)
at PX.Data.PXGraph.Persist()
at PX.Objects.AR.ARInvoiceEntry.Persist()
at HELInvoicesAndMemos.ARInvoiceEntryExt.GetInvoiceRecordsToIntegrate() in D:\Acumatica     Customization projects\HELInvoicesAndMemos 22.112.0018\ARInvoiceEntryExt.cs:line 185
at HELInvoicesAndMemos.ARInvoiceEntryExt.b__4_0() in D:\Acumatica Customization projects\HELInvoicesAndMemos 22.112.0018\ARInvoiceEntryExt.cs:line 38
at PX.Data.PXLongOperation.<>c__DisplayClass18_0.b__0() 

此前多次编写类似BLC代码均无问题,请问遗漏了什么?

解决方案

你遗漏了以下关键步骤:

  • 未设置BranchID:Acumatica的自动编号序列与分支(Branch)绑定,手动录入时系统会自动获取当前会话的分支ID,但代码中创建的ARInvoiceEntry实例没有关联分支,导致自动编号逻辑无法找到对应序列。需要从当前上下文(比如Base图)获取BranchID并赋值给ARInvoice:

    arinvoice.BranchID = Base.Accessinfo.BranchID;
    
  • 直接调用Persist()跳过了业务逻辑:ARInvoiceEntry的自动编号生成逻辑通常在Save按钮的事件处理中触发,直接调用Persist()会跳过这些前置逻辑。应该调用图的Save.Press()方法来触发完整的保存流程:

    arinventry.Save.Press();
    

    替代原来的arinventry.Persist()。

  • 硬编码DocType存在风险:建议使用Acumatica内置的常量ARDocType.Invoice代替字符串"Invoice",避免拼写错误或后续系统更新导致的兼容性问题:

    arinvoice.DocType = ARDocType.Invoice;
    

修改后的完整代码示例:

ARInvoiceEntry arinventry = PXGraph.CreateInstance<ARInvoiceEntry>();
ARInvoice arinvoice = new ARInvoice();

arinvoice.DocType = ARDocType.Invoice;
arinvoice.DocDate = DateTime.Now;
// 新增:绑定分支ID
arinvoice.BranchID = Base.Accessinfo.BranchID;

//Get the customer ID...
var cust = (Customer)PXSelect<Customer, Where<Customer.acctCD, Equal<Required<Customer.acctCD>>>>.Select(Base, CustomerCode);
if (cust != null)
     arinvoice.CustomerID = cust.BAccountID;

//Get the project ID...
var proj = (PMProject)PXSelect<PMProject, Where<PMProject.contractCD, Equal<Required<PMProject.contractCD>>>>.Select(Base, JobNbr);
if (proj != null)
     arinvoice.ProjectID = proj.ContractID;

//Insert the record...
arinventry.Document.Insert(arinvoice);
// 替换为Save.Press()触发完整业务逻辑
arinventry.Save.Press();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:07:08