You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:26:23