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

Acumatica库存验证界面仅显示活跃库存项的实现难题

库存验证界面INItemList视图仅显示活跃库存项的实现方案

需求

在库存验证(Inventory Validation)界面的INItemList视图中添加额外Where子句,仅对活跃(Active)状态的库存项进行验证。

已尝试方案及问题

1. 重写PXFilteredProcessingJoin视图

  • 问题:实现了过滤,但未执行基类的initemlist()逻辑,且未选中仓库时仍显示所有库存
  • 代码:
[PXFilterable]
public PXFilteredProcessingJoin<InventoryItem, INSiteFilter,
    LeftJoin<INSiteStatusSummary,
        On<INSiteStatusSummary.inventoryID, Equal<InventoryItem.inventoryID>,
        And<INSiteStatusSummary.siteID, Equal<Current<INSiteFilter.siteID>>>>>,
    Where<InventoryItem.itemStatus, NotEqual<InventoryItemStatus.unknown>,
        And<InventoryItem.isTemplate, Equal<False>,
        And<InventoryItem.itemStatus, Equal<InventoryItemStatus.active>>>>,
    OrderBy<
        Asc<InventoryItem.inventoryCD>>>
    INItemList;

2. 重写IEnumerable方法

  • 问题:实现了过滤,但界面加载速度大幅变慢,加载时间增加8秒
  • 代码:
protected virtual IEnumerable initemlist()
{
    INSiteFilter iNSiteFilter = Base.Filter.Current;
    INSiteFilterExt iNSiteFilterExt = iNSiteFilter.GetExtension<INSiteFilterExt>();

    var list = new ArrayList();

    foreach (var item in Base.INItemList.Select())
    {
        if (iNSiteFilterExt.UsrOnlyActive == true)
        {
            InventoryItem inventoryItem = item;

            if (inventoryItem.ItemStatus == "AC")
            {
                list.Add(item);
            }
        }
        else
        {
            list.Add(item);
        }
    }
    return list;
}

3. 在INSiteFilter_RowSelected中使用WhereAnd

  • 问题:未生效,疑似用法错误
  • 代码:
protected virtual void INSiteFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
   Base.INItemList.WhereAnd<Where<InventoryItem.itemStatus, Equal<InventoryItemStatus.active>>>();
}

正确实现方式

方案一:扩展视图并动态添加过滤条件(推荐)

通过扩展原视图,在RowSelected事件中动态添加Where子句,保留基类所有逻辑,避免性能损耗:

public class InventoryValidationExtension : PXGraphExtension<INInventoryStatus>
{
    protected virtual void INSiteFilter_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
    {
        INSiteFilter filter = e.Row as INSiteFilter;
        if (filter == null) return;

        PXView view = Base.INItemList.View;
        var query = view.BqlSelect;

        // 添加活跃库存过滤条件,避免重复添加
        var activeCondition = Where<InventoryItem.itemStatus, Equal<InventoryItemStatus.active>>.Create();
        if (!query.Where.Exists(w => w.ToString() == activeCondition.ToString()))
        {
            query.WhereAnd(activeCondition);
            view.BqlSelect = query;
        }
    }
}

方案二:正确重写视图并继承基类逻辑

重写视图时包含基类所有Where条件,同时处理仓库为空的场景,并显式调用基类方法:

[PXFilterable]
public PXFilteredProcessingJoin<InventoryItem, INSiteFilter,
    LeftJoin<INSiteStatusSummary,
        On<INSiteStatusSummary.inventoryID, Equal<InventoryItem.inventoryID>,
        And<INSiteStatusSummary.siteID, Equal<Current<INSiteFilter.siteID>>>>>,
    Where<InventoryItem.itemStatus, NotEqual<InventoryItemStatus.unknown>,
        And<InventoryItem.isTemplate, Equal<False>,
        And<InventoryItem.itemStatus, Equal<InventoryItemStatus.active>>,
        // 匹配基类仓库为空时的过滤逻辑
        And<Where<Current<INSiteFilter.siteID>, IsNull,
            Or<INSiteStatusSummary.siteID, IsNotNull>>>>>,
    OrderBy<Asc<InventoryItem.inventoryCD>>>
    INItemList;

// 确保调用基类initemlist方法
protected override IEnumerable initemlist()
{
    foreach (var item in base.initemlist())
    {
        yield return item;
    }
}

方案说明

  • 方案一通过动态修改视图BQL查询,既保留基类原有功能,又实现过滤需求,性能与原视图一致。
  • 方案二通过重写视图补充仓库空值处理逻辑,同时显式调用基类方法,确保所有原有功能正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:24:29