如何不执行PXSelect获取DAC字段PXSelector的SubstituteKey/Description值
存在完全不需要主动对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

