You need to enable JavaScript to run this app. 如何不执行PXSelect获取DAC字段PXSelector的SubstituteKey/Description值
优惠活动
大模型
产品
解决方案
定价
更多

如何不执行PXSelect获取DAC字段PXSelector的SubstituteKey/Description值

无需手动查表获取Selector关联值的实现方案

存在完全不需要主动对Customer表执行PXSelect操作,即可拿到SubstituteKey与Description值的实现路径,核心依托Acumatica框架内置的选择器缓存与字段关联机制,全程以内存匹配为主,无额外手写查询逻辑。

框架自动生效的无查询场景

你在SOOrder.customerID上配置的PXSelector规则本身已经内置了对应逻辑,不需要额外开发即可完成关联值的获取:

  • 页面加载订单列表时,框架会自动对所有订单行的customerID值做去重,基于当前图上下文中已经加载的Customer选择器缓存,批量匹配对应的Customer.acctCD(也就是规则里配置的SubstituteKey),直接把值绑定到选择器控件的显示位置,整个过程不会触发手写的Customer表查询
  • 当用户在选择器弹窗中选定客户行时,框架会自动把匹配到的Customer.acctName(也就是规则里配置的Description)填充到字段旁的描述标签位置,取值完全来自已加载的选择器缓存
  • 所有和customerID字段绑定的选择器控件,在渲染显示时都会优先从全局会话缓存中匹配值,不会针对单条记录单独发起数据库查询。

代码层面的无查询取值方法

如果需要在业务逻辑、事件代码中直接获取对应值,不需要手写PXSelect<Customer, Where<Customer.bAccountID, Equal<Required<Customer.bAccountID>>>>这类查询,可以直接调用PXSelectorAttribute内置的公开API:

// 获取customerID对应的SubstituteKey(客户编码acctCD)
string customerCD = (string)PXSelectorAttribute.Select<SOOrder.customerID>(
    order.Cache, 
    order, 
    order.CustomerID
)?.Result;

// 获取customerID对应的Description(客户名称acctName)
string customerName = PXSelectorAttribute.GetItemDescription<SOOrder.customerID>(
    order.Cache, 
    order, 
    order.CustomerID
);

上述两个API的取值逻辑完全以内存缓存匹配为优先:只有当缓存中完全不存在当前customerID的映射关系时,框架才会自动批量补全缺失的缓存条目,这个补全过程是框架内置的缓存维护逻辑,不属于开发者主动执行的PXSelect操作。同一张图实例下所有复用Customer选择器的字段,都会共享同一份缓存,不会重复产生数据库交互。

常见认知误区

不少开发者会误以为上面提到的两个API每次调用都会触发数据库查询,实际上从Acumatica 2020R2版本开始,框架已经对选择器关联值的查询做了全链路缓存优化:只要客户信息已经在当前会话的任意选择器弹窗、字段渲染流程中加载过,后续所有同customerID的取值操作都是纯内存匹配,完全不产生数据库交互。


内容的提问来源于stack exchange,提问作者Kyle Vanderstoep

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.06 23:06:08