【业务背景】单独打开库存锁库列表设置过滤条件按照预留产生类型过滤是有效的,但是从即时库存明细中点击锁库列表,设置的过滤条件没有效果。
【需求分析】系统中的联查数据一般都是后台插件根据一定的条件,构造参数,传入到联查的单据列表或者报表页面,在联查目标页的插件中获取到具体条件参数,拼接(或覆盖查询条件,一般都是采用覆盖的方式)相关的过滤条件获取数据。
基于这一套的处理逻辑,就能解释为什么联查的页面设置新的过滤条件不生效了,只要是联查的场景,插件总是获取到源页面传递过来的参数,覆盖当前设置的过滤条件去筛选数据。
个人理解:联查的场景设计更多的考虑基于当前页的数据,快速查找关联数据集合,而不是在联查的基础上再扩展其他的查询条件, 如果要加入更多的查询条件,建议直接打开页面设置过滤条件进行查询。
【变通实现】如果一定要在联查页面数据的基础上添加更多的过滤条件,需要具体分析系统标准插件的处理逻辑,看通过二开插件能否干预组合查询条件的过程。
分析BOS组件得知,获取页面定制参数的方法this.View.OpenParameter.GetCustomParameter提供两个重载参数:
object GetCustomParameter(string key):获取定制参数
object GetCustomParameter(string key, bool remove): 获取定制参数,是否从参数集合中移除
所以在目标页面进行过滤条件拼接前获取到定制参数,存入到临时变量中,让系统标准插件无法读取到参数,二开插件再进行条件参数整合,这样就变相的绕过了系统的处理过程,过滤的逻辑转移到二开插件去控制。
对于"即时库存明细"联查"锁库列表"的处理:
二开插件,重写OnInitialize(e)方法,页面初始化的时候,通过方法GetCustomParameter(string key, bool remove)获取到即时库存ID参数:InvDetailIds存入全局的变量,并移除,后续标准插件在PrepareFilterParameter(e)方法中,由于初始化已经删除了传递的参数,所以联查的过滤逻辑就失效了,二开插件重写PrepareFilterParameter(e)方法,拿到全局存储的变量InvDetailIds,拼接组合过滤界面的自定义查询条件,从而实现联查的场景加入新的查询条件
import clr clr.AddReference("System") clr.AddReference("System.Core") clr.AddReference("Kingdee.BOS") clr.AddReference("Kingdee.BOS.Core") from System import * from Kingdee.BOS.Core import * from Kingdee.BOS.Core.List.PlugIn.Args import * from Kingdee.BOS.Core.DynamicForm import * from System import StringComparison def OnInitialize(e): detailIds_param = this.View.OpenParameter.GetCustomParameter("InvDetailIds") if detailIds_param is not None: global detailIds InvDetailIds = e.Paramter.GetCustomParameter("InvDetailIds", True) if InvDetailIds is not None: detailIds = str(InvDetailIds) else: detailIds = '' def PrepareFilterParameter(e): if detailIds is not None and detailIds != '': filter = e.FilterString if filter is not None and filter != '': e.FilterString = str(filter) + " AND FINVDETAILID IN ('" + str(detailIds) + "')" else: e.FilterString = " FINVDETAILID IN ('{0}')".format(str(detailIds))
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Core.List.PlugIn; using Kingdee.BOS.Util; using System; namespace Kingdee.K3.SCM.Stock.Business.PlugIn.LockStock { public class LockStockListEx : AbstractListPlugIn { public string detailIds; public override void OnInitialize(InitializeEventArgs e) { detailIds = this.View.OpenParameter.GetCustomParameter("InvDetailIds", true).GetString(); } public override void PrepareFilterParameter(BOS.Core.List.PlugIn.Args.FilterArgs e) { if (!string.IsNullOrEmpty(detailIds)) { if (!string.IsNullOrEmpty(e.FilterString)) { e.FilterString = e.FilterString + String.Format(" AND FINVDETAILID IN ('{0}')", detailIds); } else { e.FilterString = String.Format("FINVDETAILID IN ('{0}')", detailIds); } } } } }
1、选中即时库存联查锁库列表
2、联查页面的基础上添加过滤条件
3、直接进入锁库列表页面(非联查方式,正常过滤筛选)
说明:以上只是提供一种解决问题的思路和一些二开的分享,联查的场景不建议去做二开改动,页面上没有标识当前页是否联查跳转来的,避免对数据查询产生误解。
推荐阅读