ALTER PROCEDURE [dbo].[PXJT_INV_MtrlRequire]@projName nvarchar(30)=null,--@orgFilter varchar(60)=null,@isRpt bit=0,@rptTmpTableName varchar(60)=nullASBEGINSET NOCOUNT ON;if OBJECT_ID(N'tempdb..#proj',N'U') is not nulldrop table #projif OBJECT_ID(N'tempdb..#moList',N'U') is not null --未完工单drop table #moListif OBJECT_ID(N'tempdb..#poList',N'U') is not null --未完采购drop table #poListif OBJECT_ID(N'tempdb..#rqList',N'U') is not null --未完请购drop table #rqListif OBJECT_ID(N'tempdb..#itemList',N'U') is not null --主料列表drop table #itemListif OBJECT_ID(N'tempdb..#itemList_sub',N'U') is not null --辅料列表drop table #itemList_subif OBJECT_ID(N'#tempdb..#stock',N'U') is not null --库存统计drop table #stock--if isnull(@orgFilter,'')=''-- select @orgFilter=stuff((select CONCAT(',',FORGID) from T_ORG_ORGANIZATIONS where FORGFUNCTIONS like '%104%' for xml path('')),1,1,'')select p.FID proj_id,p.FNUMBER proj_no,pl.FNAME proj_nameinto #projfrom PXJT_t_ProJect pleft join PXJT_t_ProJect_L pl on p.FID= pl.FIDif ISNULL(@projName,'')<>''delete #proj where proj_name not like '%'+@projName+'%'declare @currWeekend dateselect @currWeekend=dateadd(wk,datediff(wk,0,GETDATE()),6)begin --1、统计数据;/*未完工单*/;with moList as(select 'MO' billType,mo.FBILLNO,moEntry.FMATERIALID product_id,pbom.FMATERIALID mtrl_id,m.FNUMBER mtrl_no,moEntry.F_PXJT_PROJECTID proj_id,pbom_q.FNOPICKEDQTY qty_noPickUp,moq.FNOSTOCKINQTY qty_noStockIn,cast((pbom.FNUMERATOR/pbom.FDENOMINATOR) as float) unitUsage,pbom.FNEEDDATE FDATE,'F'+convert(varchar(12), case when FNEEDDATE<dateadd(D,1,@currWeekend) then @currWeekend else dateadd(wk,datediff(wk,0,FNEEDDATE),6) end,112) wkDatefrom T_PRD_MO mo with(nolock)join T_PRD_MOENTRY moEntry with(nolock) on mo.FID=moEntry.FIDjoin T_PRD_MOENTRY_A moa with(nolock) on mo.FID=moa.FID and moa.FENTRYID=moEntry.FENTRYIDjoin #proj p on p.proj_id=moEntry.F_PXJT_PROJECTIDjoin T_PRD_PPBOMENTRY pbom with(nolock) on moEntry.FID=pbom.FMOID and moEntry.FENTRYID=pbom.FMOENTRYIDjoin T_PRD_PPBOMENTRY_Q pbom_q with(nolock) on pbom.FID=pbom_q.FID and pbom.FENTRYID=pbom_q.FENTRYID --用料清单数量控制join T_BD_MATERIAL m on m.FMATERIALID=pbom.FMATERIALIDleft join T_PRD_MOENTRY_Q moq with(nolock) on moEntry.FID=moq.FID and moEntry.FENTRYID=moq.FENTRYID and moq.FNOSTOCKINQTY>0where mo.FDOCUMENTSTATUS ='C' and moa.FSTATUS in ('1','2','3','4') and pbom_q.FNOPICKEDQTY>0-- and mo.FPRDORGID in(@orgFilter))select *,0 mtrl_markinto #moListfrom moList where mtrl_no not like '127-%'union allselect *,1 from moList where mtrl_no like '127-%'/*已审核未完采购单*/;with poList as(select 'PO' billType,po.FBILLNO,po_entry.FMATERIALID mtrl_id,m.FNUMBER mtrl_no,po_entry.F_PXJT_PROJECTID proj_id,po_r.FREMAINRECEIVEQTY qty,FDATE,'F'+convert(varchar(12), case when FDATE<dateadd(D,1,@currWeekend) then @currWeekend else dateadd(wk,datediff(wk,0,FDATE),6) end,112) wkDatefrom T_PUR_POORDER po with(nolock)join T_PUR_POORDERENTRY po_entry with(nolock) on po.FID=po_entry.FIDjoin T_PUR_POORDERENTRY_R po_r with(nolock) on po_entry.FID=po_r.FID and po_entry.FENTRYID=po_r.FENTRYIDjoin T_BD_MATERIAL m with(nolock) on po_entry.FMATERIALID= m.FMATERIALIDwhere po.FDOCUMENTSTATUS='C' and FMRPCLOSESTATUS='A' and FMRPTerminateStatus='A' and po.FCLOSESTATUS='A' and FMRPFreezeStatus='A' and po_r.FREMAINRECEIVEQTY>0)select p.*,0 mtrl_markinto #poListfrom poList p join #proj pj on p.proj_id=pj.proj_idwhere mtrl_no not like '127-%'union allselect poList.*,1from poListjoin (select distinct mtrl_id from #moList where mtrl_mark=1)t on poList.mtrl_id=t.mtrl_id/*请购单未下推数量*/;with rqList as(select 'RQ' billType,req.FBILLNO,reqEntry.FMATERIALID mtrl_id,m.FNUMBER mtrl_no,reqEntry.F_PXJT_PROJECT proj_id,reqR.FREMAINQTY qty,reqEntry.FSUGGESTPURDATE FDATE,'F'+convert(varchar(12), case when FSUGGESTPURDATE<dateadd(D,1,@currWeekend) then @currWeekend else dateadd(wk,datediff(wk,0,FSUGGESTPURDATE),6) end,112) wkDatefrom T_PUR_REQUISITION req with(nolock)join T_PUR_REQENTRY reqEntry with(nolock) on req.FID=reqEntry.FIDjoin T_PUR_REQENTRY_R reqR with(nolock) on req.FID=reqR.FID and reqEntry.FENTRYID=reqR.FENTRYIDjoin T_BD_MATERIAL m with(nolock) on reqEntry.FMATERIALID= m.FMATERIALIDwhere req.FDOCUMENTSTATUS in('C') and req.FCLOSESTATUS='A' and req.FCancelStatus='A' and reqEntry.FMRPTerminateStatus='A' and reqEntry.FMRPCLOSESTATUS='A' and reqR.FREMAINQTY>0)select r.*,0 mtrl_markinto #rqListfrom rqList rjoin #proj pj on r.proj_id=pj.proj_id where mtrl_no not like '127-%'union allselect r.*,1from rqList r join (select distinct mtrl_id from #moList where mtrl_mark=1)t on r.mtrl_id=t.mtrl_id/*主料列表*/select t.*,0 mtrl_mark,m.FNUMBER mtrl_no,ml.FNAME mtrl_name,ml.FDESCRIPTION mtrl_desc,m.FMASTERID mtrl_mid,mp.FFIXLEADTIME mtrl_LT,mp.FMINPOQTY mtrl_moqinto #itemListfrom(select distinct mtrl_id,proj_id from #poList where mtrl_mark=0unionselect distinct mtrl_id,proj_id from #moList where mtrl_mark=0unionselect distinct mtrl_id,proj_id from #rqList where mtrl_mark=0)tjoin T_BD_MATERIAL m with(nolock) on t.mtrl_id=m.FMATERIALIDleft join T_BD_MATERIAL_L ml with(nolock) on ml.FMATERIALID=t.mtrl_id and ml.FLOCALEID=2052left join t_BD_MaterialPlan mp with(nolock) on mp.FMATERIALID=t.mtrl_iddeclare @_sql varchar(500)select @_sql='create unique index '+ '_'+replace(NEWID(),'-','') +' on #itemList(mtrl_id,proj_id)'execute(@_sql)/*辅料列表*/select t.*,1 mtrl_mark,m.FNUMBER mtrl_no,ml.FNAME mtrl_name,ml.FDESCRIPTION mtrl_desc,m.FMASTERID mtrl_mid,mp.FFIXLEADTIME mtrl_LT,mp.FMINPOQTY mtrl_moqinto #itemList_subfrom(select distinct mtrl_id from #poList where mtrl_mark=1unionselect distinct mtrl_id from #moList where mtrl_mark=1unionselect distinct mtrl_id from #rqList where mtrl_mark=1)tjoin T_BD_MATERIAL m with(nolock) on t.mtrl_id=m.FMATERIALIDleft join T_BD_MATERIAL_L ml with(nolock) on ml.FMATERIALID=t.mtrl_id and ml.FLOCALEID=2052left join t_BD_MaterialPlan mp with(nolock) on mp.FMATERIALID=t.mtrl_idselect @_sql='create unique index '+ '_'+replace(NEWID(),'-','') +' on #itemList_sub(mtrl_id)'execute(@_sql)/*即时库存统计*/select mtrl_id,proj_id,sum(stk.FBASEQTY) qty_mtrlStock --主料into #stockfrom #itemList itmjoin T_STK_INVENTORY stk with(nolock) on (stk.FMATERIALID=mtrl_mid or stk.FMATERIALID=mtrl_id)join T_BD_STOCK wh with(nolock) on stk.FSTOCKID=wh.FSTOCKIDgroup by mtrl_id,proj_idunion allselect mtrl_id,0,sum(stk.FBASEQTY) qty_mtrlStock --辅料from #itemList_sub itm join T_STK_INVENTORY stk with(nolock) on (stk.FMATERIALID=mtrl_mid or stk.FMATERIALID=mtrl_id)join T_BD_STOCK wh with(nolock) on stk.FSTOCKID=wh.FSTOCKIDgroup by mtrl_idend/*创建临时表,及横向日期列*/declare @sql1 varchar(1000)declare @cols varchar(500) --日期列,@cols_sum varchar(500) --按日期汇总列,@fieldStr varchar(100) --模板,@cols_up varchar(500) --更新列select distinct wkDate wkDate into #temp from #moListunionselect distinct wkDate from #poListunionselect distinct wkDate from #rqListset @fieldStr='[$1]'select @cols= SUBSTRING((select ','+replace(@fieldStr,'$1', wkDate) from #temp for xml path('')),2,1000)set @fieldStr='alter table #rpt add [$1] numeric(20,3);'select @sql1=(select replace(@fieldStr,'$1',wkDate) from #temp for xml path(''))set @fieldStr='sum(isnull([$1],0)) [$1]'select @cols_sum= (select ','+REPLACE(@fieldStr,'$1',wkDate) from #temp for xml path(''))set @cols_sum=SUBSTRING(@cols_sum,2,1000)set @fieldStr='0-[$1] [$1]'select @cols_up=(select ','+REPLACE(@fieldStr,'$1',wkDate) from #temp for xml path(''))set @cols_up=SUBSTRING(@cols_up,2,1000)/*创建报表结构#rpt*/select *,cast('' as nvarchar(max)) infor,cast(0 as decimal(20,3)) qty_noStockIn,cast(0 as decimal(10,6)) unitUsage,cast(0 as decimal(20,3)) qty_stock,cast(0 as decimal(20,3)) qty_receiveStay,cast('' as char(2)) billType,GETDATE() as FDATE,99 as groupId,99 sortIdinto #rptfrom #itemList where 1=2execute(@sql1)begin --2、将数据插入报表临时表 #rpt*/;/*将未完工单插入报表*/declare @sql2 nvarchar(max)set @sql2='insert into #rptselect * from(select mo.mtrl_id,mo.proj_id,mo.mtrl_mark,mo.mtrl_no,mtrl_name,mtrl_desc,itm.mtrl_mid,mtrl_LT,mtrl_moq,FBILLNO+''[''+m.FNAME+'']''+''[''+m.FDESCRIPTION+'']'' infor,qty_noStockIn,unitUsage,qty_mtrlStock,qty_noPickUp,0 as qty_receiceStay,billType,mo.FDATE,1 groupId,ROW_NUMBER() over(partition by mtrl_mid,mo.proj_id order by FDATE) sortId,mo.wkDatefrom #moList mojoin T_BD_MATERIAL_L m with(nolock) on m.FMATERIALID=product_idjoin #itemList itm on itm.mtrl_id=mo.mtrl_idleft join #stock s on s.mtrl_id=mo.mtrl_id and s.proj_id=mo.proj_id and s.proj_id>0where mo.mtrl_mark=0)p pivot(sum(qty_noPickUp) for wkDate in('+@cols+')) as pvt'execute(@sql2)set @sql2='insert into #rptselect * from(select mo.mtrl_id,mo.proj_id,mo.mtrl_mark,mo.mtrl_no,mtrl_name,mtrl_desc,itm.mtrl_mid,mtrl_LT,mtrl_moq,FBILLNO+''[''+m.FNAME+'']''+''[''+m.FDESCRIPTION+'']'' infor,qty_noStockIn,unitUsage,qty_mtrlStock,qty_noPickUp,0 as qty_receiceStay,billType,mo.FDATE,1 groupId,ROW_NUMBER() over(partition by mtrl_mid order by FDATE) sortId,mo.wkDatefrom #moList mojoin T_BD_MATERIAL_L m with(nolock) on m.FMATERIALID=product_idjoin #itemList_sub itm on itm.mtrl_id=mo.mtrl_idleft join #stock s on s.mtrl_id=mo.mtrl_id and s.proj_id=0where mo.mtrl_mark=1)p pivot(sum(qty_noPickUp) for wkDate in('+@cols+')) as pvt'execute(@sql2)/*将未完采购单插入报表*/set @sql2='insert into #rpt(mtrl_mid,mtrl_id,proj_id,mtrl_mark,mtrl_no,mtrl_name,mtrl_desc,mtrl_LT,mtrl_moq,infor,qty_stock,billType,FDATE,groupId,sortId,'+@cols+') select * from(select itm.mtrl_mid,po.mtrl_id,po.proj_id,po.mtrl_mark,po.mtrl_no,mtrl_name,mtrl_desc,mtrl_LT,mtrl_moq,FBILLNO,s.qty_mtrlStock,billType,po.FDATE,2 groupId,ROW_NUMBER() over(partition by mtrl_mid,po.proj_id order by FDATE) sortId,po.wkDate,po.qtyfrom #poList pojoin #itemList itm on itm.mtrl_id=po.mtrl_id and itm.proj_id=po.proj_idleft join #stock s on s.mtrl_id=po.mtrl_id and s.proj_id=s.proj_idwhere po.mtrl_mark=0)p pivot(sum(qty) for wkDate in('+@cols+')) as pvt'execute(@sql2)set @sql2='insert into #rpt(mtrl_mid,mtrl_id,proj_id,mtrl_mark,mtrl_no,mtrl_name,mtrl_desc,mtrl_LT,mtrl_moq,infor,qty_stock,billType,FDATE,groupId,sortId,'+@cols+') select * from(select itm.mtrl_mid,po.mtrl_id,po.proj_id,po.mtrl_mark,po.mtrl_no,mtrl_name,mtrl_desc,mtrl_LT,mtrl_moq,FBILLNO,s.qty_mtrlStock,billType,po.FDATE,2 groupId,ROW_NUMBER() over(partition by mtrl_mid order by FDATE) sortId ,po.wkDate,po.qtyfrom #poList pojoin #itemList_sub itm on itm.mtrl_id=po.mtrl_idleft join #stock s on s.mtrl_id=po.mtrl_id and s.proj_id=0where po.mtrl_mark=1)p pivot(sum(qty) for wkDate in('+@cols+')) as pvt'execute(@sql2)/*请购单未下推数量,插入报表*/set @sql2='insert into #rpt(mtrl_mid,mtrl_id,proj_id,mtrl_mark,mtrl_no,mtrl_name,mtrl_desc,mtrl_LT,mtrl_moq,infor,qty_stock,billType,FDATE,groupId,sortId,'+@cols+') select * from (select itm.mtrl_mid,rq.mtrl_id,rq.proj_id,rq.mtrl_mark,rq.mtrl_no,itm.mtrl_name,itm.mtrl_desc,itm.mtrl_LT,itm.mtrl_moq,FBILLNO,s.qty_mtrlStock,billType,rq.FDATE,3 groupId,ROW_NUMBER() over(partition by mtrl_mid,rq.proj_id order by FDATE) sortId,rq.wkDate,rq.qtyfrom #rqList rqjoin #itemList itm on rq.mtrl_id=itm.mtrl_id and rq.proj_id=itm.proj_idleft join #stock s on s.mtrl_id=rq.mtrl_id and s.proj_id=rq.proj_idwhere rq.mtrl_mark=0)p pivot(sum(qty) for wkDate in('+@cols+')) as pvt'execute(@sql2)set @sql2='insert into #rpt(mtrl_mid,mtrl_id,proj_id,mtrl_mark,mtrl_no,mtrl_name,mtrl_desc,mtrl_LT,mtrl_moq,infor,qty_stock,billType,FDATE,groupId,sortId,'+@cols+') select * from (select itm.mtrl_mid,rq.mtrl_id,rq.proj_id,rq.mtrl_mark,rq.mtrl_no,itm.mtrl_name,itm.mtrl_desc,itm.mtrl_LT,itm.mtrl_moq,FBILLNO,s.qty_mtrlStock,billType,rq.FDATE,3 groupId,ROW_NUMBER() over(partition by mtrl_mid order by FDATE) sortId,rq.wkDate,rq.qtyfrom #rqList rqjoin #itemList_sub itm on rq.mtrl_id=itm.mtrl_idleft join #stock s on s.mtrl_id=rq.mtrl_id and s.proj_id=0where rq.mtrl_mark=1)p pivot(sum(qty) for wkDate in('+@cols+')) as pvt'execute(@sql2)/*插入汇总行*/set @sql2=';with temp as(select mtrl_mid,mtrl_mark,proj_id,mtrl_no,groupId,999 sortId,min(qty_stock) qty_stock,'+'case groupId when 1 then ''需求汇总'' when 2 then ''PO汇总'' when 3 then ''RQ汇总'' end infor,''1979-01-01 00:00:00'' FDATE,'+@cols_sum+' from #rptgroup by mtrl_mid,mtrl_mark,proj_id,mtrl_no,groupId)insert into #rpt(mtrl_mid,mtrl_mark,proj_id,mtrl_no,groupId,sortId,qty_stock,infor,FDATE,'+@cols+') select * from temp'execute(@sql2)endbegin --3、插入余量行alter table #rpt drop column FDATEdeclare @index varchar(30)declare @field table(FID varchar(20),id int)/*为报表添加索引*/select @_sql='create NONCLUSTERED index $1 on #rpt([mtrl_mid],[sortId],[groupId])'select @index='_'+REPLACE(newid(),'-','')set @_sql=REPLACE(@_sql,'$1',@index)execute(@_sql)insert into @field select *,ROW_NUMBER() over(order by FID) id from dbo.fn_StrSplit(@cols,',') /*将【周】(2020/01/01,2020/01/08)字符串用逗号分隔到表函数*/declare @mtrl_mid int,@proj_id int,@mtrl_mark bit,@mtrl_no varchar(30),@qty_stock numeric(20,3),@qty numeric(20,3),@qty_last numeric(20,3),@fieldCount int,@seed tinyintdeclare @currentWeek varchar(20),@sql_temp varchar(1000),@val varchar(1000),@sql_insert varchar(2000),@sql_temp1 nvarchar(2000),@qty_temp numeric(20,3)declare @rowCount int,@seed_out int=1select @fieldCount=count(*) from @field/*将汇总行抽出插入临时表*/select * into #rpt_summary from #rpt where sortId=999select @_sql='create NONCLUSTERED index $1 on #rpt_summary([mtrl_mid],[sortId],[groupId])'set @index='_'+REPLACE(newid(),'-','')set @_sql=REPLACE(@_sql,'$1',@index)execute(@_sql)set @sql_temp='insert into #rpt(mtrl_mid,mtrl_mark,proj_id,mtrl_no,groupId,sortId,infor,'+@cols+') select 'select *,ROW_NUMBER() over(order by mtrl_mid,proj_id) rid into #temp1from(select distinct mtrl_mid,mtrl_mark,proj_id,mtrl_no from #rpt where sortId<999)tselect @rowCount=count(*) from #temp1while @seed_out<=@rowCountbeginselect @mtrl_mid=mtrl_mid,@mtrl_mark=mtrl_mark,@proj_id=proj_id,@mtrl_no=mtrl_no from #temp1 where rid=@seed_outset @seed=1set @qty_last=0set @val=''select top 1 @qty_stock=isnull(qty_stock,0) from #rpt where sortId=999 and mtrl_mid=@mtrl_mid and proj_id=@proj_idwhile @seed<=@fieldCountbeginset @qty=0set @qty_temp=0if @seed=1set @qty=@qty+@qty_stockset @qty=@qty+@qty_lastselect @currentWeek=FID from @field WHERE id=@seedset @qty_temp=0set @sql_temp1='select @qty='+@currentWeek+' from #rpt_summary with(index='+@index+') where mtrl_mid=@mtrl_mid and groupId=1 and sortId=999'exec sp_executesql @sql_temp1,N'@mtrl_mid int,@qty numeric(20,3) output',@mtrl_mid,@qty_temp outputset @qty=@qty-isnull(@qty_temp,0)set @qty_temp=0set @sql_temp1='select @qty=sum('+@currentWeek+') from #rpt_summary with(index='+@index+') where mtrl_mid=@mtrl_mid and groupId>1 and sortId=999 group by mtrl_mid,proj_id'exec sp_executesql @sql_temp1,N'@mtrl_mid int,@qty numeric(20,3) output',@mtrl_mid,@qty_temp outputset @qty=@qty+isnull(@qty_temp,0)set @val=CONCAT(@val,',',@qty)set @qty_last=@qtyset @seed+=1endif @val<>''beginset @sql_insert=@sql_temp +CONCAT( @mtrl_mid,',',@mtrl_mark,',',@proj_id,',''',@mtrl_no,''',',999,',',1,',''余量''',@val)--select @sql_insertexecute(@sql_insert)endset @seed_out=@seed_out+1endendif @isRpt=1 and isnull(@rptTmpTableName,'')<>''beginexecute('select mtrl_no 物料,p.proj_name 项目,mtrl_name 物料名称,mtrl_desc 物料规格,mtrl_LT LT,mtrl_moq MOQ,infor 机型单号,qty_stock 即时库存,qty_noStockIn 待生产量,unitUsage 单位用量,qty_receiveStay 待入库,billType,'+@cols+',mtrl_mid,mtrl_id,groupId,sortId,r.proj_id,mtrl_mark,ROW_NUMBER() OVER(ORDER BY r.mtrl_mid,r.proj_id,groupId,sortId) FIDENTITYID into '+@rptTmpTableName+' from #rpt r left join #proj p on r.proj_id=p.proj_id and r.proj_id>0 and r.mtrl_mark=0 ORDER BY mtrl_mid,r.proj_id,groupId,sortId')endelseselect r.*,p.proj_name from #rpt r left join #proj p on r.proj_id=p.proj_id and r.proj_id>0 and r.mtrl_mark=0 ORDER BY mtrl_mid,proj_id,groupId,sortIdEND

文章转载自不想做程序员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




