如何根据采购订单网格Project Task值动态过滤Account选择器?
Acumatica采购订单科目选择器按项目任务筛选的实现方案
需求与问题背景
- 已在科目组界面(PM201000)表头添加自定义字段(char 32),字段值与采购订单界面(PO301000)网格的Project Task字段值一致,用于关联两者。
- 核心需求:采购订单网格的Account选择器需根据当前行Project Task字段值,筛选出科目组中对应自定义字段匹配的科目;若Project Task为空,则使用默认的Account选择器逻辑。
- 现有尝试:创建了自定义选择器属性,但存在问题——原Account字段使用
[Account]属性而非PXSelector,且不清楚科目组DAC的默认选择逻辑,无法正确实现默认分支的逻辑。
正确实现方案
1. 理解[Account]属性的底层逻辑
[Account]属性封装了标准科目选择器的逻辑,会调用AccountAttribute内部的查询逻辑,默认返回符合当前公司、科目类型及权限控制的科目列表。要复用默认逻辑,需直接调用该属性的查询方法。
2. 替换POLine的Account字段属性
通过扩展POLine DAC,用自定义属性替换原有的[Account]属性,同时整合两种筛选逻辑:
public class POLineExt : PXCacheExtension<POLine> { [PXRemoveBaseAttribute(typeof(AccountAttribute))] [CustomAccountSelector] public int? AccountID { get; set; } public abstract class accountID : PX.Data.BQL.BqlInt.Field<accountID> { } } public class CustomAccountSelectorAttribute : AccountAttribute { public CustomAccountSelectorAttribute() : base() { // 保留Account属性的默认配置 } public override IEnumerable GetRecords() { POLine currentLine = Base.Caches[typeof(POLine)].Current as POLine; if (currentLine?.TaskID != null) { // 根据Project Task筛选科目组关联的科目 var taskID = currentLine.TaskID; // 关联科目组与科目表,筛选匹配自定义字段的科目 var accountGroups = PXSelectJoin<PMAccountGroup, InnerJoin<Account, On<Account.accountID, Equal<PMAccountGroup.accountID>>>, Where<PMAccountGroupExt.usrProjectTask, Equal<Required<PMAccountGroupExt.usrProjectTask>>>> .Select(Base, taskID); foreach (PXResult<PMAccountGroup, Account> result in accountGroups) { Account account = result; yield return account; } } else { // 调用Account属性的默认查询逻辑 foreach (var item in base.GetRecords()) { yield return item; } } } }
3. 关键说明
- 使用
[PXRemoveBaseAttribute]移除原有的[Account]属性,替换为继承自AccountAttribute的自定义属性,直接复用默认的科目验证、权限控制等逻辑。 - 当
TaskID不为空时,通过PXSelectJoin关联科目组(PMAccountGroup)和科目表(Account),筛选出自定义字段匹配当前TaskID的科目;为空时直接调用base.GetRecords()返回默认科目列表。 PMAccountGroup是Acumatica的临时DAC(未关联物理表),数据来自科目组界面的配置,需确保自定义字段usrProjectTask已正确赋值并保存。
4. 验证逻辑说明
无需重写FieldVerifying方法,继承自AccountAttribute会自动沿用其原有验证规则,确保科目合法性。
内容的提问来源于stack exchange,提问作者pmfith
相关产品推荐
相关产品推荐

