即时库存明细可用量排除弱预留计算二开案例
在【即时库存明细】查询中,涉及到库存量、可用量、预留量,以及各种单位:基本单位、主单位(库存单位)、库存辅单位,与之对应的数量有:
库存量(基本单位)、库存量(主单位)、库存量(库存辅单位)
可用量(基本单位)、可用量(主单位)、可用量(库存辅单位)
预留量(基本单位)、预留量(主单位)、可用量(库存辅单位)
数量&单位 | 基本单位 | 库存单位 | 库存辅单位 |
库存量 | 库存量(基本单位) | 库存量(库存单位) | 库存量(库存单位) |
可用量 | 可用量(基本单位) | 可用量(库存单位) | 可用量(库存单位) |
预留量 | 预留量(基本单位) | 预留量(库存单位) | 预留量(库存单位) |
结合即时库存表数据结构、插件处理逻辑以及单位和数量的一些关系需要理解:
1、即时库存表T_STK_INVENTORY,只有基本单位数量以及辅单位数量是能直接使用,其他单位数量以及可用量情况都需要经过单位换算、计算才能得到
2、即时库存中的预留量的计算,取数来源于预留表T_PLN_RESERVELINK、T_PLN_RESERVELINKENTRY,目前展示数据并未区分强预留和弱预留,即:可用量 = 库存量-强预留-弱预留
3、预留关系表头:T_PLN_RESERVELINK,字段FRESERVETYPE:1:弱预留 3:强预留
预留关系表体:T_PLN_RESERVELINKENTRY, 字段FSUPPLYFORMID: 供给类型
4、即时库存明细列表插件中,各单位数据的换算核心逻辑在BeforeGetDataForTempTableAccess方法,该方法中返回一个临时表,该表包含本次查询满足条件的
即时库存数据,以基本单位数量为基础,更新及换算该表的其他数量,最终展示到页面
当前的一个需求:即时库存明细中的可用量是否可以设置为 "库存量-强预留", 而不是"库存量-强预留-弱预留"?
通过对上述逻辑的理解,通过二开插件,重写取数和换算逻辑即可。
一、反编译标准插件的处理:
二、二开插件,核心逻辑
sql = '''MERGE INTO {0} IT USING(SELECT T2.FID,SUM(ISNULL(TKE.FBASEQTY,0)) AS FBASELOCKQTY,SUM(ISNULL(TKE.FSECQTY,0)) AS FSECLOCKQTY FROM T_PLN_RESERVELINKENTRY TKE INNER JOIN T_PLN_RESERVELINK TLKH ON TKE.FID = TLKH.FID RIGHT JOIN {0} T2 ON TKE.FSUPPLYINTERID = T2.FID AND TKE.FSUPPLYFORMID = 'STK_Inventory' AND TLKH.FRESERVETYPE = '3' AND TKE.FBASEQTY > 0 GROUP BY T2.FID) IT2 ON (IT.FID = IT2.FID) WHEN MATCHED THEN UPDATE SET IT.FBASELOCKQTY = IT2.FBASELOCKQTY;'''.format(str(e.TableName)) DBUtils.Execute(this.View.Context, sql) sql = '''UPDATE {0} SET FBASEAVBQTY = FBASEQTY - FBASELOCKQTY'''.format(str(e.TableName)) DBUtils.Execute(this.View.Context, sql) # <type 'List[ColumnField]'> selCols = this.ListModel.FilterParameter.ColumnInfo secQty = selCols.Exists(lambda p: p.Key == "FSecQty") or selCols.Exists(lambda p: p.Key == "FSecLockQty") or selCols.Exists(lambda p: p.Key == "FSecAVBQty") if secQty == True: sql = '''UPDATE {0} SET FSECAVBQTY = FSECQTY - FSECLOCKQTY'''.format(str(e.TableName)) DBUtils.Execute(this.View.Context, sql) sql = '''MERGE INTO {0} IT USING(SELECT To_decimal(CASE WHEN T2.FSTOREURNOM = 0 OR T2.FSTOREURNUM = 0 THEN T1.FBASEQTY ELSE To_decimal(T1.FBASEQTY * T2.FSTOREURNOM, 23, 10) / T2.FSTOREURNUM END, 23, 10) FQTY, To_decimal(CASE WHEN T2.FSTOREURNOM = 0 OR T2.FSTOREURNUM = 0 THEN T1.FBASEAVBQTY ELSE To_decimal(T1.FBASEAVBQTY * T2.FSTOREURNOM, 23, 10) / T2.FSTOREURNUM END, 23, 10) FAVBQTY, T1.FID FROM {0} T1 INNER JOIN T_BD_MATERIALSTOCK T2 ON T1.FMATERIALID_ID = T2.FMATERIALID) IT2 ON(IT.FID = IT2.FID) WHEN MATCHED THEN UPDATE SET IT.FQTY = IT2.FQTY, IT.FAVBQTY = IT2.FAVBQTY;'''.format(str(e.TableName)) DBUtils.Execute(this.View.Context, sql);
三、结果
1、物料由"MRP运算产生",确认该条锁库数据为弱预留
2、查询即时库存,可用量 = 库存量-强预留,排除弱预留数据
说明:
1、该二开只适用于即时库存明细,即时库存的处理逻辑完全不同,不可通用
2、该方案的各数量的准确性需要结合具体账套业务数据验证,确认无误再使用
3、插件可随时取消,还原到系统标准的处理方式
参考:
1、【即时库存二开字段方案整理】
2、【即时库存查询WebApi接口(使用自定义接口封装)调用示例】
即时库存明细可用量排除弱预留计算二开案例
本文2024-09-16 19:05:04发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-26288.html