declare @moBillNo varchar(100) ,@salesBillNo varchar(100) ,@startMaterialId int ,@endMaterialId int ,@FSDate varchar (30) ,@FEDate varchar (30) ,@FSNumber varchar (50) ,@FENumber varchar (50) ,@FSStock varchar (max) SET @moBillNo ='' SET @salesBillNo ='' SET @moBillNo = 0 SET @moBillNo = 0 SET @FSDate = '2024-01-05' SET @FEDate = '2024-02-05' SET @FSNumber = '1.01' SET @FENumber = '1.01' --SET @FSNumber = 'TSH182H000208O' --SET @FENumber = 'TSH182H000208O' SET @FSStock ='' declare @FCloseBALDate varchar (30) declare @FClosedate varchar (30) --查询起始日期最近一期的期末结存日期 If NOT Exists( SELECT FORGID, MAX(FCLOSEDATE) fclosedate FROM T_STK_CLOSEPROFILE WHERE FORGID IN (1) AND FCATEGORY = 'STK' AND (FCLOSEDATE < @FSDate) GROUP BY FORGID) BEGIN SET @FClosedate='2020-01-01' SET @FCloseBALDate='2020-01-01' --print @FClosedate END ELSE BEGIN --SET @FClosedate='2019-07-01' SELECT @FClosedate= CONVERT(varchar (30), DATEADD(D, 1,MAX(FCLOSEDATE)),23) FROM T_STK_CLOSEPROFILE WHERE ((FORGID IN (1) AND FCATEGORY = 'STK') AND (FCLOSEDATE < @FSDate)) GROUP BY FORGID SET @FCloseBALDate=CONVERT(varchar (30), DATEADD(D, -1,@FClosedate),23) --print @FClosedat END DECLARE @FSWL varchar (50) DECLARE @FEWL varchar (50) SET @FSWL='' SET @FEWL='' IF @FSNumber<>'' and @FENumber<>'' BEGIN SET @FSWL= @FSNumber SET @FEWL= @FENumber END IF @FSNumber<>'' and @FENumber='' BEGIN SET @FSWL= @FSNumber SELECT @FEWL=MAX(FNUMBER) FROM T_BD_MATERIAL END IF @FSNumber='' and @FENumber<>'' BEGIN SET @FEWL= @FENumber SELECT @FSWL=MIN(FNUMBER) FROM T_BD_MATERIAL END IF @FSNumber='' and @FENumber='' BEGIN SELECT @FSWL=MIN(FNUMBER) FROM T_BD_MATERIAL SELECT @FEWL=MAX(FNUMBER) FROM T_BD_MATERIAL END --生成临时选取仓库 IF EXISTS(select * FROM tempdb..SYSOBJECTS WHERE id=OBJECT_ID('tempdb..#tmpStockID')) BEGIN DROP TABLE #tmpStockID print '存在' END Create Table #tmpStockID ( FID INT IDENTITY(1,1) ,FStockID INT ) DECLARE @Strsql varchar(max) SET @Strsql= 'insert into #tmpStockID select distinct FSTOCKID from T_BD_STOCK where 1=1 ' +@FSStock EXEC(@Strsql) --库存状态报表 if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#Stock_Status_temp')) begin drop table #Stock_Status_temp print '存在' end Create Table #Stock_Status_temp ( 序号 INT IDENTITY(1,1), 物料内码 INT , 物料代码 varchar(100) null , 物料名称 varchar(255) null , 规格型号 varchar(255) null , 旧编码 varchar(100) null , --单位 varchar(30) null , 上期结存 DECIMAL (18, 2) Null , 本期采购入库 DECIMAL (18, 2) Null , 本期耗用 DECIMAL (18, 2) Null , 期末结存 DECIMAL (18, 2) Null , 在途量 DECIMAL (18, 2) Null , 在制数 DECIMAL (18, 2) Null , 进检量 DECIMAL (18, 2) Null , 未发量 DECIMAL (18, 2) Null , 领料数量 DECIMAL (18, 2) Null , 销售出库数量 DECIMAL (18, 2) Null , 仓库拨出数量 DECIMAL (18, 2) Null , 仓库拨入数量 DECIMAL (18, 2) Null , 申购未转数 DECIMAL (18, 2) Null, 受订量 DECIMAL (18, 2) Null , 占用量 DECIMAL (18, 2) Null , 可用库存 DECIMAL (18, 2) Null , 仓库内码 INT , 仓库代码 varchar(100) null , 仓库名称 varchar(255) null , 包装内码 INT , 包装方式 varchar(255) null ) if exists(select * from tempdb..sysobjects where id=object_id('tempdb..#TMP')) begin drop table #TMP print '存在' end CREATE TABLE #TMP ( FID INT IDENTITY(1,1), FSTOCKORGID INT NOT NULL DEFAULT 0, FBILLENTRYID INT NOT NULL DEFAULT 0, FORDERBY INT NOT NULL DEFAULT 0, FSTOCKIO CHAR (1) NULL, FMATERIALID INT NOT NULL DEFAULT 0, FAUXPROPID INT NOT NULL DEFAULT 0, FDATE DATETIME NULL, FSTOCKID INT NOT NULL DEFAULT 0, FSTOCKLOCID INT NOT NULL DEFAULT 0, FSTOCKSTATUSID INT NOT NULL DEFAULT 0, FBILLNAME NVARCHAR (100) NULL, FBILLID INT NOT NULL DEFAULT 0, FBILLSEQID INT NULL, FBILLNO NVARCHAR (100) NULL, FBASEQCQTY DECIMAL (23, 10) NOT NULL DEFAULT 0, FBASEINQTY DECIMAL (23, 10) NOT NULL DEFAULT 0, FBASEOUTQTY DECIMAL (23, 10) NOT NULL DEFAULT 0 ) --分析BOM层级物料 IF EXISTS(SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB..#YC_T_MRP')) BEGIN DROP TABLE #YC_T_MRP END CREATE TABLE #YC_T_MRP( FID INT IDENTITY(1,1), FBOMNumber NVARCHAR(255), FMATERIALID INT, 物料编码 NVARCHAR(255), 物料名称 NVARCHAR(255), 成品率 DECIMAL(28,10) DEFAULT (0), 分子 DECIMAL(28,10),--BOM分子 分母 DECIMAL(28,10),--BOM分母 FQty DECIMAL(28,10),--用量 FLevle INT , FERPCLSID INT, FOrderNum NVARCHAR(255), FBOMID INT, BOM层级 NVARCHAR(200) NULL, FSEQ1 INT, FSEQ2 INT, FSEQ3 INT, FSEQ4 INT, FSEQ5 INT, FSEQ6 INT, FParentNumber NVARCHAR(255) ) IF EXISTS(SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB..#BOMTMP')) BEGIN DROP TABLE #BOMTMP END /*取出所有审核状态的BOM,放入临时表中*/ SELECT ID=IDENTITY(INT,1,1) ,T0.FID ,T0.FNUMBER ,T0.FMATERIALID ,ROW_NUMBER() OVER(PARTITION BY T0.FMATERIALID ORDER BY t0.FID DESC) AS ROWID INTO #BOMTmp FROM T_ENG_BOM T0 INNER JOIN T_BD_MATERIAL TM ON t0.FMATERIALID=TM.FMATERIALID --物料表 WHERE (t0.FDOCUMENTSTATUS = 'C') and (t0.FFORBIDSTATUS='A') AND (TM.FNUMBER >= @FSWL AND TM.FNUMBER <=@FEWL) ORDER BY FMATERIALID,FNUMBER --/*在临时表中,同一个物料代码只保留一个最新版本的BOM*/ --DELETE FROM #BOMTmp WHERE id NOT IN (SELECT max(id) FROM #BOMTmp GROUP BY FMATERIALID) DELETE FROM #BOMTmp WHERE ROWID > 1 IF EXISTS(SELECT * FROM TEMPDB..SYSOBJECTS WHERE ID=OBJECT_ID('TEMPDB..#TMP_TOP_BOM_SET')) BEGIN DROP TABLE #TMP_TOP_BOM_SET END CREATE TABLE #TMP_TOP_BOM_SET( FID int ,FNUMBER varchar(80) ,FMATERIALID int ,FSEQ int ,BOMLEVEL int ,TOPID int ,showlevel varchar(80) ,BOMID int ,FERPCLSID int ) CREATE INDEX [#TMP_TOP_BOM_SET_FID] ON #TMP_TOP_BOM_SET(FID); INSERT INTO #TMP_TOP_BOM_SET SELECT t0.FID ,t1.FNUMBER ,t0.FMATERIALID ,ROW_NUMBER() over(partition BY t0.FID order by t0.fid) ,1 'BOMLEVEL' ,t0.FID AS 'TOPID' ,'' ,t0.FID AS 'BOMID' ,t2.FERPCLSID FROM T_ENG_BOM t0 INNER JOIN T_BD_MATERIAL t1 on t0.FMATERIALID = t1.FMATERIALID LEFT OUTER JOIN t_BD_MaterialBase t2 ON t1.FMATERIALID = t2.FMATERIALID INNER JOIN #BOMTmp t3 on t3.FNUMBER = t0.FNUMBER AND t3.FMATERIALID = t0.FMATERIALID WHERE 1 = 1 AND (t0.FDOCUMENTSTATUS = 'C') DECLARE @num INT,@level int,@LoopCount int SET @num = 1 SET @level =1 SET @LoopCount = 0; WHILE (@num > 0 AND @LoopCount < 10) BEGIN INSERT INTO #TMP_TOP_BOM_SET SELECT t3.FID ,t2.FNUMBER ,t1.FMATERIALID ,ROW_NUMBER() over(partition BY t0.TOPID,t0.bomid order by t0.fseq) 'FSEQ' ,@level + 1 AS 'BOMLEVEL' ,t0.TOPID ,CONCAT(t0.showlevel,'-',CAST(dense_rank() over(partition BY t0.topid,t0.bomid,t0.fid order by t1.fseq) as VARCHAR)) 'showLevel' ,0 'OID' ,t4.FERPCLSID FROM #TMP_TOP_BOM_SET t0 LEFT JOIN T_ENG_BOMCHILD t1 on t0.BOMID = t1.FID INNER JOIN T_BD_MATERIAL t2 on t2.FMATERIALID = t1.FMATERIALID LEFT JOIN T_BD_MATERIAL_L t1_l on t1_l.FMATERIALID = t1.FMATERIALID AND t1_l.FLOCALEID = 2052 LEFT JOIN T_ENG_BOM t3 on t1.FID = t3.FID--t1.FMATERIALID = t3.FMATERIALID LEFT JOIN T_BD_MATERIALBASE t4 on t4.FMATERIALID = t1.FMATERIALID WHERE 1 = 1 --AND (t2.FERPCLSID = 2 OR t2.FERPCLSID = 5 ) AND t0.FERPCLSID >= 2 AND t0.BOMLEVEL = @level AND t3.FDOCUMENTSTATUS = 'C' AND t2.FFORBIDSTATUS = 'A' SET @num = @@ROWCOUNT SET @level += 1 SET @LoopCount += 1 END SELECT * FROM #TMP_TOP_BOM_SET