即时库存按使用组织的字段进行过滤的实现案例
一、【业务需求】
即时库存明细里面新增了物料自定义字段,可以显示使用组织下的对应字段,但是无法按使用组织的字段进行过滤。创建组织下该字段为空,过滤出来的数据也是空
二、【分析实现】
由于跨组织查询的需要,即时库存表中物料的ID都是保存的创建组织下的ID,即FMASTERID,列表无法获取分配后使用组织下修改后的属性
关于即时库存显示使用组织下的物料属性,实现参考:
系统查询入口 | 业务对象 | FormId | 物理表 |
即时库存 | 即时库存汇总数据查询 | STK_InvSumQuery | T_STK_INVSUMQUERY |
即时库存明细 | 即时库存 | STK_Inventory | T_STK_INVENTORY |
通过上面两个帖子配置实现了显示效果,但是还是无法支持使用字段过滤数据,这里采用二开变通实现方案:
以物料档案上"规格型号"为例,
1、"即时库存"和"即时库存明细"分别扩展文本字段(字段名必须相同),命名为"规格型号"
2、二开即时库存明细列表插件,更新规格型号字段数据到即时库存表T_STK_INVENTORY
新增列表插件,继承列表插件抽象类AbstractListPlugIn,重写 BeforeGetDataForTempTableAccess方法,添加注册新插件,原插件继续保留
using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.List.PlugIn; using Kingdee.BOS.ServiceHelper; using Kingdee.K3.SCM.ServiceHelper; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace Kingdee.K3.InventoryDemo { public class InventoryListExt : AbstractListPlugIn { public override void BeforeGetDataForTempTableAccess(BOS.Core.List.PlugIn.Args.BeforeGetDataForTempTableAccessArgs e) { string sqlText = string.Format(@"MERGE INTO T_STK_INVENTORY IT USING(SELECT T1.FID,T2.FMATERIALID, T1.FMATERIALID FMASTERID, T3.FSPECIFICATION FROM {0} T1 INNER JOIN T_BD_MATERIAL T2 ON T1.FMATERIALID = T2.FMASTERID AND T1.FSTOCKORGID = T2.FUSEORGID INNER JOIN T_BD_MATERIAL_L T3 ON T3.FMATERIALID = T2.FMATERIALID AND T3.FLocaleID = 2052 where T3.FSPECIFICATION != '') IT1 ON (IT.FID = IT1.FID) WHEN MATCHED THEN UPDATE SET IT.FModelText= IT1.FSPECIFICATION;", e.TableName); DBUtils.Execute(this.Context, sqlText); } } }
3、二开即时库存列表插件,更新表T_STK_INVSUMQUERY中"规格型号"字段。新增列表插件,继承原插件类InvSumQueryList(添加组件引用:Kingdee.K3.SCM.Stock.Business.PlugIn.dll),重写 PrepareFilterParameter方法,注册新插件,禁用原插件
using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.List.PlugIn.Args; namespace Kingdee.K3.InventoryDemo { public class InvSumQueryListEx : InvSumQueryList { public override void PrepareFilterParameter(FilterArgs e) { base.PrepareFilterParameter(e); var transId = this.TransactionID; string sqlText = string.Format("MERGE INTO T_STK_INVSUMQUERY IT USING(SELECT T1.FID,T2.FMATERIALID, T1.FMATERIALID FMASTERID, T3.FSPECIFICATION FROM T_STK_INVSUMQUERY T1 INNER JOIN T_BD_MATERIAL T2 ON T1.FMATERIALID = T2.FMASTERID AND T1.FSTOCKORGID = T2.FUSEORGID INNER JOIN T_BD_MATERIAL_L T3 ON T3.FMATERIALID = T2.FMATERIALID AND T3.FLocaleID = 2052 WHERE FTRANSID = '{0}' AND T3.FSPECIFICATION != '' ) IT1 ON (IT.FID = IT1.FID) WHEN MATCHED THEN UPDATE SET IT.FModelText= IT1.FSPECIFICATION;", transId); DBUtils.Execute(this.Context, sqlText); } } }
4、原系统预置的基础资料属性类型的"规格型号"都设置为不可见,将文本类型的"规格型号"字段显示可见,
通过以上步骤实现了将物料上的规格型号数据更新到即时库存表的实体字段,从而达到在使用组织下显示和过滤的效果
推荐阅读