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
相关产品推荐
相关产品推荐

