通过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
相关产品推荐
相关产品推荐

