本文介绍了系统的即时库存查询功能,包含“即时库存”和“即时库存明细”两个入口。即时库存可汇总数据并设置显示隐藏列,即时库存明细则显示最明细数据,且两者在BOS设计器中的业务对象不同。系统通过不同表展示这两种数据,并说明了查询过程中的数据取数、更新和异常处理机制。文章还探讨了通过二次开发增加字段的两种场景及实现方法,包括在即时库存和即时库存明细中增加实体字段的具体步骤和注意事项。
系统的即时库存查询有2个入口,分为"即时库存"和"即时库存明细", 即时库存和即时库存明细的差别主要有:
1、即时库存会按照显示隐藏列进行汇总,也可以设置分级汇总,还能在同一页面联查汇总行的相关明细,即时库存明细就是显示最明细数据,性能应该也会更好一些
2、后者显示的列(维度)多一点
3、两个在BOS设计器中的业务对象也不一样
系统查看库存分为“即时库存”、“即时库存明细”。对于即时库存表的数据是以系统“即时库存明细”列表形式展示,而“即时库存”则是以设置的显示维度来汇总合计库存数量的列表形式展示。每次打开“即时库存”则会根据条件从即时库存表取数合计插入到T_STK_INVSUMQUERY表,界面再次查询会清除上次数据,界面关闭则会清除本次数据,针对异常关闭单据(关闭浏览器、注销、重启iis等)而异常的数据,也仅保留一天,大于一天的数据 下次查询时即会清理。
比如:
这里即时库存页面只显示物料、仓库、批号、库存组织这四个维度数据,其余维度不显示,那么页面的库存量是根据4个维度做的汇总,比如库存量=200, 实际200的数量 可能涉及不同的"库存状态"、"货主"、"保管者"等, 这些数据只有即时库存明细才能做区分。相应的T_STK_INVSUMQUERY表中"库存状态"、"货主"、"保管者"等都是空值(实际即时库存不可能是这样的数据)
系统查询入口 | 业务对象 | FormId | 物理表 |
即时库存 | 即时库存汇总数据查询 | STK_InvSumQuery | T_STK_INVSUMQUERY |
即时库存明细 | 即时库存 | STK_Inventory | T_STK_INVENTORY |
4、列表插件取数的实现逻辑有很大差异
综合以上两者的差别,如果有业务需求需要二开字段,那么两者的处理方式也有很大差异,具体可参考【即时库存查询自定义】
普遍的二开场景有两种情况:
1、增加基础资料属性字段
2、增加非基础资料属性字段,即:添加实体字段,存在复杂的关联更新逻辑
针对第1种扩展场景比较简单,参考【即时库存明细增加字段】
对于第2种扩展场景,需要通过二开插件处理,参考
两种二开插件的处理方式如下:
一、即时库存,添加实体字段
1、BOS扩展文本字段
2、新增列表插件,继承原插件类InvSumQueryList(添加组件引用:Kingdee.K3.SCM.Stock.Business.PlugIn.dll),重写 PrepareFilterParameter方法
using Kingdee.BOS.App.Data; using Kingdee.BOS.Core.List.PlugIn.Args; namespace Kingdee.K3.SCM.Stock.Business.PlugIn.Inventory { public class InvSumQueryListEx : InvSumQueryList { public override void PrepareFilterParameter(FilterArgs e) { base.PrepareFilterParameter(e); var transId = this.TransactionID; string sqlText = string.Format("UPDATE T_STK_INVSUMQUERY SET FExtText = '扩展文本' WHERE FTRANSID = '{0}'", transId); DBUtils.Execute(this.Context, sqlText); } } }
3、注册新插件,禁用原插件
4、实现效果
【注意点】
二、即时库存明细,添加实体字段
1、BOS扩展文本字段
2、新增列表插件,继承列表插件抽象类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.SCM.Stock.Business.PlugIn.Inventory { public class InventoryListExt : AbstractListPlugIn { public override void BeforeGetDataForTempTableAccess(BOS.Core.List.PlugIn.Args.BeforeGetDataForTempTableAccessArgs e) { string sqlText = string.Format(@"MERGE INTO {0} IT USING ( SELECT FID FROM {0} ) IT2 ON IT.FID=IT2.FID WHEN MATCHED THEN UPDATE SET IT.FExtText= '扩展文本';", e.TableName); DBUtils.Execute(this.Context, sqlText); } } }
3、添加注册新插件,原插件继续保留
4、实现效果
推荐阅读