代码在不同系统抛RowSelected异常原因及PXFormula查询使用方法
问题一:RowSelected异常的可能原因
咱们先拆解这个异常场景:两台系统数据库同源,但一台正常一台抛出RowSelected异常,结合你贴的代码,我梳理了几个最可能的原因:
- 事件绑定错误:如果这段代码是放在
INItemSite的RowSelected事件里,那大概率是这里出了问题。Acumatica的RowSelected事件是用来配置UI状态的(比如控件显隐、是否禁用),不是用来修改DAC字段值的。在这个事件里修改字段会触发缓存更新,进而可能重复触发RowSelected,形成循环调用或者状态冲突,最终抛出异常。两台系统的版本差异或缓存配置不同,可能导致一台没触发这个问题,另一台触发了。 - 自定义扩展部署不一致:虽然数据库是从故障系统恢复的,但代码部署可能没同步。比如异常系统没正确部署包含
S.INItemSiteExt的自定义项目,或者这个扩展的UsrVendorLastCost字段在代码里的定义和数据库不匹配(比如字段类型、长度不一样),导致获取扩展或赋值时触发异常。 - 异常状态记录:故障系统备份的数据库里,有些
INItemSite记录处于Deleted、Pending Delete这类特殊状态。在异常系统处理这些记录时,缓存不允许修改其扩展字段,从而抛出异常;而正常系统可能已经自动过滤了这些异常状态的记录。 - 权限差异:当前操作的用户在异常系统里没有
INItemSite记录(包括自定义字段UsrVendorLastCost)的编辑权限,赋值时触发了权限相关的RowSelected异常。
问题二:在PXFormula中使用指定查询的方法
要在PXFormula里调用查询获取POVendorInventory的LastPrice,你需要用PXSelectSubQuery构建子查询(PXFormula支持子查询语法,且要求子查询返回单个值)。下面给你几个实用的示例:
基础示例:按InventoryID取最新供应商价格
如果只需要根据当前INItemSite的InventoryID获取对应的供应商最新价格,直接用聚合函数取最大值(对应最新价格)即可:
public class INItemSiteExt : PXCacheExtension<PX.Objects.IN.INItemSite> { #region UsrVendorLastCost [PXDBDecimal(6)] [PXUIField(DisplayName = "Vendor Last Cost")] // 用PXSelectSubQuery构建子查询,按InventoryID匹配,取最大的LastPrice [PXFormula(typeof( PXSelectSubQuery<POVendorInventory, Where<POVendorInventory.inventoryID, Equal<Current<INItemSite.inventoryID>>>, Aggregate<Max<POVendorInventory.lastPrice>>>))] public virtual decimal? UsrVendorLastCost { get; set; } #endregion }
进阶示例:关联首选供应商
如果需要匹配INItemSite的首选供应商,只需要在Where子句里加个条件:
[PXFormula(typeof( PXSelectSubQuery<POVendorInventory, Where<POVendorInventory.inventoryID, Equal<Current<INItemSite.inventoryID>>, And<POVendorInventory.vendorID, Equal<Current<INItemSite.preferredVendorID>>>>, Aggregate<Max<POVendorInventory.lastPrice>>>))]
处理空值场景
如果查询结果可能为null,你可以用PXCoalesce设置默认值(比如0):
[PXFormula(typeof( PXCoalesce< PXSelectSubQuery<POVendorInventory, Where<POVendorInventory.inventoryID, Equal<Current<INItemSite.inventoryID>>>, Aggregate<Max<POVendorInventory.lastPrice>>>, decimal0>))]
需要注意的是,PXFormula要求子查询必须返回单个值,所以一定要用Aggregate(Max/Min/First等)来确保结果唯一,否则会触发异常。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

