Acumatica:为采购订单创建用于总重量计算的自定义Usr字段
解决Acumatica采购订单(PO301000)自定义字段无法存储到数据库的问题
我来帮你梳理下这个自定义重量总数字段存库失败的常见原因和解决步骤,都是Acumatica自定义开发里容易踩的坑:
确认字段的数据库存储配置
首先回到自定义字段的设置界面,一定要勾选「存储到数据库」选项——有时候通过「新建字段」按钮创建时,这个选项默认是未启用的,直接导致字段不会写入数据库。
另外代码层面要注意命名规范:自定义字段必须以Usr开头,否则Acumatica的框架不会自动在数据库表中生成对应字段。你的代码可以调整成更规范的形式:public class POOrderExtension : PXCacheExtension<POOrder> { #region UsrWeightTotal [PXDBDecimal(2)] // 指定小数精度,按需调整 [PXDefault(TypeCode.Decimal, "0.0")] [PXUIField(DisplayName = "Weight Total")] public virtual decimal? UsrWeightTotal { get; set; } public abstract class usrWeightTotal : PX.Data.BQL.BqlDecimal.Field<usrWeightTotal> { } #endregion }验证数据库表结构是否同步
发布自定义项目后,去数据库里检查POOrder表是否存在UsrWeightTotal字段。如果没有,大概率是发布过程出了问题:- 重新发布你的自定义项目,确保发布日志里没有报错;
- 进入维护屏幕(SM205050),运行「验证数据库」功能,强制同步表结构。
检查计算逻辑的正确性
既然这个字段是用来计算总重量的,你需要确保赋值逻辑是正确触发的,并且正确标记缓存更新:
比如在RowSelected事件里汇总明细行重量的示例代码:protected void POOrder_RowSelected(PXCache cache, PXRowSelectedEventArgs e) { POOrder order = e.Row as POOrder; if (order == null) return; POOrderExtension orderExt = cache.GetExtension<POOrderExtension>(order); decimal totalWeight = 0m; // 遍历当前订单的所有明细行汇总重量 foreach (POOrderDetail detail in PXSelect<POOrderDetail, Where<POOrderDetail.orderNbr, Equal<Current<POOrder.orderNbr>>>>.Select(Base)) { totalWeight += detail.Weight.GetValueOrDefault(); } // 赋值并标记缓存为脏数据,确保能写入数据库 orderExt.UsrWeightTotal = totalWeight; cache.SetValueExt<POOrderExtension.usrWeightTotal>(order, totalWeight); }这里要注意,绝对不能给字段加
PXUnbound属性,那会让字段变成内存级别的临时字段,不会存储到数据库——你的PXDBDecimal属性是正确的绑定属性,这点没问题。检查屏幕布局和权限
最后确认这个字段已经添加到PO301000屏幕的布局中,并且当前操作的用户有该字段的读写权限。有时候字段本身配置正确,但没加到屏幕上或者权限不足,会造成“没存储成功”的错觉。
内容的提问来源于stack exchange,提问作者Dane
相关产品推荐
相关产品推荐

