如何在PXProcessing的ProcessBatch方法中获取过滤器的Usrdatefin值
解决静态方法中获取过滤器字段值的方案
针对你在Acumatica开发中遇到的静态ProcessBatch方法无法访问实例级过滤器变量的问题,提供以下两种可行方案:
方案一:通过传入的图实例获取过滤器当前值
ProcessBatch方法的pg参数是当前运行的图实例,你可以直接通过它访问过滤器视图的当前记录:
public static void ProcessBatch(PostGraph pg, Customer un_record) { try { PX.SM.Branch un_etab = PXSelect<PX.SM.Branch, Where<PX.SM.Branch.branchID, Equal<Current<AccessInfo.branchID>>>>.Select(pg); // 将pg转换为ATTGEN图类型,获取过滤器当前值 ATTGEN graph = pg as ATTGEN; if (graph?.filter?.Current != null) { DateTime oDate = Convert.ToDateTime(graph.filter.Current.Usrdatefin); // 后续业务逻辑 } ... } }
如果PostGraph是通用图类型,也可以直接通过视图名称获取:
// 直接通过视图名称获取过滤器记录 atFilter currentFilter = pg.Views["filter"]?.Current as atFilter; if (currentFilter != null) { DateTime oDate = Convert.ToDateTime(currentFilter.Usrdatefin); }
方案二:通过闭包在委托设置时传递过滤器值
如果过滤器值在设置委托时已确定且不会中途修改,可以在构造函数中捕获当前值,通过闭包传递给静态方法:
首先修改ProcessBatch方法,添加过滤器参数:
public static void ProcessBatch(PostGraph pg, Customer un_record, atFilter filter) { try { PX.SM.Branch un_etab = PXSelect<PX.SM.Branch, Where<PX.SM.Branch.branchID, Equal<Current<AccessInfo.branchID>>>>.Select(pg); DateTime oDate = Convert.ToDateTime(filter.Usrdatefin); ... } }
然后在构造函数中设置委托时传入过滤器值:
public ATTGEN() { atFilter currentFilter = this.filter.Current; // 用闭包捕获currentFilter并传递给ProcessBatch ListProcess.SetProcessDelegate<PostGraph>((pg, un_record) => ProcessBatch(pg, un_record, currentFilter)); ListProcess.SetProcessCaption("Process"); ListProcess.SetProcessAllCaption("Process All"); }
注意:此方案仅适用于过滤器值不会在委托设置后变更的场景,若用户在触发处理前修改过滤器,闭包会保留旧值,此时方案一更稳妥。
额外注意事项
- 禁止将实例过滤器变量改为静态:静态变量全局共享,会导致多用户场景下数据混乱。
- 类型转换和访问视图时必须做null检查:避免因视图未初始化或无当前记录引发空引用异常。
内容的提问来源于stack exchange,提问作者Xavier LARTEM
相关产品推荐
相关产品推荐

