自定义DAC的BQL引用SOOrder.orderNbr无法获取当前订单号咨询
解决SOOrder_RowSelecting中无法获取当前订单号的问题
我来帮你搞定这个问题,先看看代码里几个容易踩坑的点:
1. DAC名称要统一
你提到测试DAC叫UsrNonRelatedScanField,但代码里写的是NonRelatedScanField——这大概率是笔误!BQL会严格匹配DAC类名,名称不对应直接查不到数据,先把BQL里的类名改成UsrNonRelatedScanField再说。
2. 调整订单号的获取方式
在SOOrder_RowSelecting事件里,虽然你传了row.OrderNbr当参数,但有时候因为事件触发时机(比如行还没完全加载进缓存),或者参数绑定的小问题,会导致查询失效。给你两种靠谱的调整方案:
方案一:直接用缓存里的当前订单号
不用手动传参数,让BQL直接从Base缓存里拿当前SOOrder的订单号,这样更稳妥:
// 修正DAC名称,用Current直接绑定缓存中的订单号 UsrNonRelatedScanField lastScan = PXSelect<UsrNonRelatedScanField, Where<UsrNonRelatedScanField.orderNbr, Equal<Current<SOOrder.orderNbr>>>>.Select(Base); if(lastScan != null) { var rowExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(row); rowExt.UsrNonRelatedScanField = lastScan.ScanStatus; }
方案二:确保参数传递和空值判断
如果坚持要用Required,一定要加空值判断,同时确认参数顺序和BQL里的Required完全对应:
// 先判断row不为空,避免空引用 if (row == null) return; UsrNonRelatedScanField lastScan = PXSelect<UsrNonRelatedScanField, Where<UsrNonRelatedScanField.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base, row.OrderNbr); if(lastScan != null) { var rowExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(row); rowExt.UsrNonRelatedScanField = lastScan.ScanStatus; }
3. 检查事件触发时机
RowSelecting是在行加载到缓存之前触发的,如果你的逻辑需要依赖行完全加载后的状态,可以试试换成RowSelected事件(这个是行加载完成后触发的)。当然如果你的需求就是在加载时赋值,RowSelecting没问题,但要先确认数据库里确实存在对应订单号的UsrNonRelatedScanField记录哦!
最后别忘了清一下Acumatica的缓存,有时候缓存会把旧代码留住,导致调试白忙活~
内容的提问来源于stack exchange,提问作者JB90
相关产品推荐
相关产品推荐

