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

如何根据采购订单网格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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:34:51