Acumatica中Material Wizard 1(AM300010)自定义仓库选择器过滤失效求助
修复Acumatica Material Wizard 1仓库过滤失效问题
核心问题排查与修复步骤
1. 统一字段名(关键错误)
代码中同时出现UsrWarehouseSelector和UsrWarehouseSelector2两个字段名,导致过滤逻辑无法正确读取仓库选择值。需将所有引用统一为DAC扩展中实际定义的字段名(假设正确字段名为UsrWarehouse):
修复后处理委托代码:
public override void Initialize() { base.Initialize(); Base.OpenOrders.SetProcessDelegate(list => { var filter = Base.filter.Current; if (filter != null) { var warehouseFilter = filter.GetExtension<WizFilterExt>(); if (warehouseFilter?.UsrWarehouse != null) { // 直接取PXInt字段的Value,无需字符串转int var warehouseID = warehouseFilter.UsrWarehouse.Value; list = list.Where(item => item.SiteID == warehouseID).ToList(); } } MatlWizard1.FillMatlWrk(list, filter); }); }
2. 优化视图委托(保留原查询逻辑)
原视图委托直接替换整个查询,会丢失OpenOrders视图的默认过滤、排序及其他用户筛选条件。正确做法是在原查询基础上追加仓库过滤:
修复后视图委托代码:
[PXOverride] protected virtual IEnumerable openOrders(PXSelectBase<AMProdItem> baseSelect) { var filter = Base.filter.Current; if (filter == null) { return baseSelect.Select(); } var warehouseFilter = filter.GetExtension<WizFilterExt>(); if (warehouseFilter?.UsrWarehouse == null) { return baseSelect.Select(); } // 在原查询基础上追加仓库过滤条件 var filteredSelect = baseSelect.WhereAnd<Where<AMProdItem.siteID, Equal<Required<AMProdItem.siteID>>>>(); return filteredSelect.Select(warehouseFilter.UsrWarehouse.Value); }
3. 验证DAC扩展定义
确保WizFilterExt DAC扩展中字段定义与页面选择器一致,示例如下:
public class WizFilterExt : PXCacheExtension<MatlWizardFilter> { #region UsrWarehouse [PXInt] [PXSelector( typeof(Search<INSite.siteID>), typeof(INSite.siteCD), typeof(INSite.descr), SubstituteKey = typeof(INSite.siteCD))] [PXUIField(DisplayName = "Warehouse", CommitChanges = true)] public virtual int? UsrWarehouse { get; set; } public abstract class usrWarehouse : PX.Data.BQL.BqlInt.Field<usrWarehouse> { } #endregion }
4. 触发视图自动刷新
在仓库选择器字段的PXUIField特性中添加CommitChanges = true,确保选择值变化时自动刷新OpenOrders视图(已包含在上述DAC扩展代码中)。
额外验证点
- 确认用户拥有对应仓库的访问权限(Acumatica站点权限会影响数据可见性)
- 测试时选择存在生产订单的仓库,验证过滤结果是否符合预期
内容的提问来源于stack exchange,提问作者Tharidhi P
相关产品推荐
相关产品推荐

