一种通过创建SQL视图实现WebAPI接口查询库存可用量的方案
当前云星空系统提供的标准即时库存WebAPI接口不能直接查询可用量、库存单位数量、启用了批号附属信息的生产日期、有效期至等数据,即便有的能通过换算可以取到,但用起来也不太方便,这里通过SQL视图方式重新封装下数据源,在视图中计算好可用量、各单位数量以及生产日期、有效期至等数据,然后以二开单据绑定视图方式提供新的WebAPI接口,此方式优点主要有:
1)可用量、库存单位数量等数据直接可用,不用自己在换算;
2)不用写插件,简单配置即可,容易上手;
3)没有是否是多租户的限制,通用性较强;
4)较强可扩展性,可以根据需要在BOS中给二开单据添加基础资料属性字段;
二开实现步骤
1、创建SQL视图(这里以SQL SERVER为例)
CREATE VIEW V_STK_INVENTORY_CUS AS SELECT a.FID , a.FSTOCKORGID , a.FKEEPERTYPEID , a.FKEEPERID , a.FOWNERTYPEID , a.FOWNERID , a.FSTOCKID , a.FSTOCKLOCID , a.FAUXPROPID , a.FSTOCKSTATUSID , a.FLOT , a.FBOMID , a.FMTONO , a.FPROJECTNO , (CASE WHEN d.FISEXPPARTOFLOT='1' THEN e.FPRODUCEDATE ELSE a.FPRODUCEDATE END) FPRODUCEDATE , (CASE WHEN d.FISEXPPARTOFLOT='1' THEN e.FEXPIRYDATE ELSE a.FEXPIRYDATE END) FEXPIRYDATE , a.FBASEUNITID , a.FBASEQTY , a.FSECQTY , a.FSTOCKUNITID , a.FMATERIALID , (CASE WHEN d.FSTOREURNUM=0 THEN a.FBASEQTY ELSE a.FBASEQTY*d.FSTOREURNOM/d.FSTOREURNUM END) FQTY , (CASE WHEN d.FSTOREURNUM=0 THEN ISNULL(b.FBASELOCKQTY, 0) ELSE ISNULL(b.FBASELOCKQTY, 0)*d.FSTOREURNOM/d.FSTOREURNUM END) FLOCKQTY , a.FSECUNITID , 'STK_INVENTORYCUS' AS FOBJECTTYPEID , (CASE WHEN d.FSTOREURNUM=0 THEN (a.FBASEQTY - ISNULL(b.FBASELOCKQTY, 0)) ELSE (a.FBASEQTY - ISNULL(b.FBASELOCKQTY, 0))*d.FSTOREURNOM/d.FSTOREURNUM END) FAVBQTY , a.FUPDATETIME , a.FISEFFECTIVED, ISNULL(b.FBASELOCKQTY, 0) FBASELOCKQTY , ISNULL(b.FSECLOCKQTY, 0) FSECLOCKQTY , ( a.FBASEQTY - ISNULL(b.FBASELOCKQTY, 0) ) FBASEAVBQTY , ( a.FSECQTY - ISNULL(b.FSECLOCKQTY, 0) ) FSECAVBQTY FROM T_STK_INVENTORY a INNER JOIN T_BD_MATERIAL c ON c.FMASTERID=a.FMATERIALID and c.FUSEORGID=a.FSTOCKORGID INNER JOIN T_BD_MATERIALSTOCK d ON d.FMATERIALID=c.FMATERIALID LEFT JOIN T_BD_LOTMASTER e on e.FLOTID=a.FLOT LEFT JOIN ( SELECT TKE.FSUPPLYINTERID , SUM(ISNULL(TKE.FBASEQTY, 0)) AS FBASELOCKQTY , SUM(ISNULL(TKE.FSECQTY, 0)) AS FSECLOCKQTY FROM T_PLN_RESERVELINKENTRY TKE WHERE TKE.FSUPPLYFORMID = 'STK_Inventory' AND TKE.FBASEQTY > 0 AND (( TKE.FLINKTYPE = '4' AND 1= ( SELECT COUNT(1) FROM T_BAS_SYSPARAMETER WHERE fparameterobjid='MFG_PLNParam' AND fparameters.exist('/BillHead[IsEnableReserve="True"]')=0) ) OR (1=1 AND 0=(SELECT COUNT(1) FROM T_BAS_SYSPARAMETER WHERE fparameterobjid='MFG_PLNParam' AND fparameters.exist('/BillHead[IsEnableReserve="True"]')=0)) ) GROUP BY TKE.FSUPPLYINTERID ) b ON b.FSUPPLYINTERID = a.FID;
2、新建二开即时库存单据
新增的二开单据字段与【即时库存】保持一致,所以可以直接用复制方式新增,这里需要注意单据编号的问题,需要与视图中的FOBJECTTYPEID一致,如下图所示:
3、绑定视图
4、发布到主控台
5、测试效果
查询时可直接使用 FQTY、FAVBQTY等字段作为最终查询结果使用。
*注:由于这种方式是基于视图的查询,性能方面与基于表的查询是存在区别的,如出现二开接口查询性能与标准接口查询性能差别较大情况,可尝试创建索引视图(SQL SERVER)\物化视图(Oracle)
太牛了
话说,我会自定义接口封装,我把SQL视图封装成自定义接口也可以吧。
这个通过物料获取物料的属性等,比如FMATERIALID.FMNEMONICCODE助记码,取到的是创建组织的,找了一下原因,是即时库存T_STK_INVENTORY表里存的FMATERIALID的值是创建组织的即它的FMASTERID,这个如何解决啊?
ORACLE数据库关于是否启用预留的SQL写法:
SELECT CASE WHEN extractvalue(fparameters,'/BillHead/IsEnableReserve/text()')='True' THEN 0 ELSE 1 END EnableReserve FROM T_BAS_SYSPARAMETER WHERE fparameterobjid='MFG_PLNParam',替换SQL SERVER 示例SELECT COUNT(1) FROM T_BAS_SYSPARAMETER WHERE fparameterobjid='MFG_PLNParam' AND fparameters.exist('/BillHead[IsEnableReserve="True"]')=0部分
谢谢大佬,刚好需要这个,您给我降下了及时雨。
一种通过创建SQL视图实现WebAPI接口查询库存可用量的方案
本文2024-09-16 19:03:56发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-26167.html