Acumatica 2022R1升级后代码创建套件失败:财务期间指定异常
问题
我们有一个用于创建套件装配的自定义处理界面,升级至Acumatica 2022R1后停止工作。以下是尝试设置交易日期和财务期间的代码(日期已设置但财务期间相关代码无效果):
protected virtual void GenerateKitAssembly(KitAssemblyEntry kitGraph, ProcessKitAssemblyItemInfoPX soline) { kitGraph.Clear(); INKitRegister doc = PXCache<INKitRegister>.CreateCopy(kitGraph.Document.Insert(new INKitRegister())); doc.InventoryID = soline.InventoryID; doc.KitRevisionID = soline.KitRevisionID; doc.Qty = soline.AssemblyQty; doc.UOM = soline.UOM; doc.Hold = true; doc.Status = INDocStatus.Hold; doc.BranchID = soline.BranchID; doc.TranBranchID = soline.BranchID; doc.TranDate = DateTime.Now; doc.TranTranDate = DateTime.Now; doc.FinPeriodID = DateTime.Now.ToString("yyyyMM"); doc.TranFinPeriodID = DateTime.Now.ToString("yyyyMM"); doc.TranPeriodID = DateTime.Now.ToString("yyyyMM"); doc.TranTranPeriodID = DateTime.Now.ToString("yyyyMM"); doc.SiteID = soline.SiteID; doc.GetExtension<INKitRegisterExt>().UsrManualProcess = soline.RoboticsFulfill == null ? true : !soline.RoboticsFulfill; doc = kitGraph.Document.Update(doc); }
抛出的错误信息如下:
PX.Data.PXFieldValueProcessingException HResult=0x80131500 Message=Error: An error occurred during processing of the field Post Period value 07-2022 GL Error: The financial period cannot be specified because the branch has not been specified in the Branch box. Source=PX.Data StackTrace: at PX.Data.PXCache`1.FillWithValues(TNode item, TNode copy, TNode newitem) at PX.Data.PXCache`1.Update(Object data, Boolean bypassinterceptor) at PX.Data.PXCache`1.Update(Object data, Boolean bypassinterceptor) at PX.Data.PXSelectBase`1.Update(Table item) at PX.CreateKitAssemblyFromSO.Ext.ProcessKitAssemblyItemsPX.GenerateKitAssembly(KitAssemblyEntry kitGraph, ProcessKitAssemblyItemInfoPX soline) in C:\Apps\Acumatica\AcumaticaUpgrade\App_Data\Projects\IntegraOptics\IntegraOptics\IN\ProcessKitAssemblyItemsPX.cs:line 143 This exception was originally thrown at this call stack: [External Code] Inner Exception 1: PXSetPropertyException: GL Error: The financial period cannot be specified because the branch has not been specified in the Branch box.
通过字段更新处理器查看套件时,发现所有财务期间相关字段均为空,但抛出异常的代码属于Acumatica底层代码。已确认登录用户设置了默认分支,且GUI中已选择公司分支,请求识别版本升级后的变更点及解决方法。
解决方案
1. 版本变更点说明
Acumatica 2022R1强化了财务期间字段的校验逻辑,要求必须先完成分支字段的设置并让缓存确认分支值生效,才能设置或推导财务期间。旧版本允许先设置期间再补分支,新版本会触发严格的依赖校验,导致分支未生效时设置期间直接报错。
2. 代码调整方案
修改代码执行顺序,先确认分支生效,再设置交易日期(让系统自动推导财务期间,避免手动硬编码):
protected virtual void GenerateKitAssembly(KitAssemblyEntry kitGraph, ProcessKitAssemblyItemInfoPX soline) { kitGraph.Clear(); // 第一步:先初始化文档并设置分支,提交让缓存确认分支生效 INKitRegister doc = kitGraph.Document.Insert(new INKitRegister()); doc.BranchID = soline.BranchID; doc.TranBranchID = soline.BranchID; doc = kitGraph.Document.Update(doc); // 第二步:创建副本并设置其余业务字段 INKitRegister docCopy = PXCache<INKitRegister>.CreateCopy(doc); docCopy.InventoryID = soline.InventoryID; docCopy.KitRevisionID = soline.KitRevisionID; docCopy.Qty = soline.AssemblyQty; docCopy.UOM = soline.UOM; docCopy.Hold = true; docCopy.Status = INDocStatus.Hold; docCopy.SiteID = soline.SiteID; // 第三步:设置交易日期,系统会自动匹配对应分支的财务期间 docCopy.TranDate = DateTime.Now; docCopy.TranTranDate = DateTime.Now; // 第四步:设置自定义字段 docCopy.GetExtension<INKitRegisterExt>().UsrManualProcess = soline.RoboticsFulfill == null ? true : !soline.RoboticsFulfill; // 第五步:最终更新文档 doc = kitGraph.Document.Update(docCopy); }
3. 关键优化细节
- 移除手动硬编码财务期间:Acumatica会根据
TranDate和BranchID自动匹配对应的财务期间,手动设置FinPeriodID等字段容易引发分支不匹配的校验错误,尤其是多分支期间配置不同的场景。 - 分支优先设置:确保分支字段先被缓存处理,后续的期间推导和校验才能基于正确的分支上下文执行。
- 删除冗余字段赋值:
TranFinPeriodID、TranPeriodID、TranTranPeriodID等字段会由系统自动同步,无需手动赋值。
4. 额外排查点
- 确认
soline.BranchID不为空:如果数据源的分支ID为空,即使用户有默认分支,系统也无法自动填充,需提前校验分支值的有效性。 - 检查财务期间配置:确保目标分支下对应日期的财务期间已正确创建并处于打开状态。
内容的提问来源于stack exchange,提问作者June B
相关产品推荐
相关产品推荐

