/*--1、创建BOM单级展开视图z_view_SingleStageBOM,代码如下:*/
create view [dbo].[z_view_SingleStageBOM]
as
select a.FItemID FParentID, --BOM表.物料内码
b.FItemID, --BOM分录表.子项物料内码
b.FUnitID, --BOM分录表.单位内码
b.FAuxQty, --BOM分录表.显示用量
b.FQty * a.FQty FQty --BOM分录表.用量 * BOM表.数量
from ICBOM a --BOM表
inner join ICBOMChild b --BOM分录表
on a.FInterID = b.FInterID --BOM表.BOM内码 = BOM分录表.所属BOM内码
where a.FUseStatus = 1072
/*--2、创建存储过程zp_z_HGWIP2019_FU,代码如下:*/
create procedure [dbo].[zp_z_HGWIP2019_FU]
as
set nocount on
create table #WIP --创建临时表:在制品
(
FInterID int, --生产任务单内码
FBillNo varchar(255), --生产任务单编号
FItemIDfx int, --生产任务单物料代码
FAusQtyfx decimal(18,6), --生产任务单计划生产数量
FAuxStockQtyfx decimal(18,6), --生产任务单入库数量
FUnitIDfx int, --生产任务单单位
FSupplyID int, --生产任务单加工单位
FItemIDzz int, --投料单物料代码
FErpClsIDzz int, --物料属性
FUnitIDzz int, --投料单单位
FAuxQtyMust decimal(18,6), --计划投料数量
FAuxQtyPick decimal(18,6), --应发数量
FAuxQtyScrap decimal(18,6), --单位用量
FBomInputAuxQty decimal(18,6), --标准用量
FAuxStockQty decimal(18,6), --已领数量
FAuxQtyConsume decimal(18,6), --消耗数量
FWIPAuxQTY decimal(18,6), --在制品数量
)
create table #Product --创建临时表:产品
(
FInterID int, --生产任务单内码
FBillNo varchar(255), --生产任务单编号
FItemIDfx int, --生产任务单物料代码
FAusQtyfx decimal(18,6), --生产任务单计划生产数量
FAuxStockQtyfx decimal(18,6), --生产任务单入库数量
FUnitIDfx int, --生产任务单单位
FSupplyID int, --生产任务单加工单位
FItemIDzz int, --投料单物料代码
FErpClsIDzz int, --投料物料属性
FUnitIDzz int, --投料单单位
FAuxQtyMust decimal(18,6), --计划投料数量
FAuxQtyPick decimal(18,6), --应发数量
FAuxQtyScrap decimal(18,6), --单位用量
FBomInputAuxQty decimal(18,6), --标准用量
FAuxStockQty decimal(18,6), --已领数量
FAuxQtyConsume decimal(18,6), --消耗数量
FWIPAuxQTY decimal(18,6), --在制品数量
FItemID int, --底层物料内码
FUnitID int, --底层单位
FAuxqty decimal(18,6), --底层基本单位用量
FQty decimal(18,6), --底层用量
)
create table #ProductEntry --创建临时表:产品分录
(
FInterID int, --生产任务单内码
FBillNo varchar(255), --生产任务单编号
FItemIDfx int, --生产任务单物料代码
FAusQtyfx decimal(18,6), --生产任务单计划生产数量
FAuxStockQtyfx decimal(18,6), --生产任务单入库数量
FUnitIDfx int, --生产任务单单位
FSupplyID int, --生产任务单加工单位
FItemIDzz int, --投料单物料代码
FErpClsIDzz int, --物料属性
FUnitIDzz int, --投料单单位
FAuxQtyMust decimal(18,6), --计划投料数量
FAuxQtyPick decimal(18,6), --应发数量
FAuxQtyScrap decimal(18,6), --单位用量
FBomInputAuxQty decimal(18,6), --标准用量
FAuxStockQty decimal(18,6), --已领数量
FAuxQtyConsume decimal(18,6), --消耗数量
FWIPAuxQTY decimal(18,6), --在制品数量
FItemID int, --底层物料内码
FUnitID int, --底层单位
FAuxqty decimal(18,6), --底层基本单位用量
FQty decimal(18,6), --底层用量
)
insert into #WIP --向临时表:在制品插入记录
(
FInterID, --生产任务单内码
FBillNo, --生产任务单编号
FItemIDfx, --生产任务单物料代码
FAusQtyfx, --生产任务单计划生产数量
FAuxStockQtyfx, --生产任务单入库数量
FUnitIDfx, --生产任务单单位
FSupplyID, --生产任务单加工单位
FItemIDzz, --投料单物料代码
FErpClsIDzz, --投料物料属性
FUnitIDzz, --投料单单位
FAuxQtyMust, --计划投料数量
FAuxQtyPick, --应发数量
FAuxQtyScrap, --单位用量
FBomInputAuxQty, --标准用量
FAuxStockQty, --已领数量
FAuxQtyConsume, --消耗数量
FWIPAuxQTY --在制品数量
)
select
u1.FInterID, --生产任务单内码
u1.FBillNo, --生产任务单编号
u1.FItemID, --生产任务单物料代码
u1.FAuxQty, --生产任务单计划生产数量
u1.FAuxStockQty, --生产任务单入库数量
u1.FUnitID, --生产任务单单位
u1.FSupplyID, --生产任务单加工单位
u2.FItemID, --投料单物料代码
u3.FErpClsID, --投料物料属性
u2.FUnitID, --投料单单位
u2.FAuxQtyMust, --计划投料数量
u2.FAuxQtyPick, --应发数量
u2.FAuxQtyScrap, --单位用量
u2.FBomInputAuxQty, --标准用量
u2.FAuxStockQty, --已领数量
u2.FAuxQtyConsume, --消耗数量
u2.FWIPAuxQTY --在制品数量
from
ICMO u1 --生产任务单
inner join
PPBOMEntry u2 --生产投料单分录
on u1.FInterID = u2.FICMOInterID --生产任务单内码 = 投料单.生产任务单内码
inner join
t_ICItem u3 --物料表
on u2.FItemID = u3.FItemID --投料单分录表.投料单物料代码 = 物料表.物料内码
where u1.FStatus = '1' --生产任务单.单据状态 = 下达
and u2.FWIPAuxQTY > 0 --投料单分录.在制品数量 > 0
insert into #Product --向临时表:产品插入记录
(
FInterID, --生产任务单内码
FBillNo, --生产任务单编号
FItemIDfx, --生产任务单物料代码
FAusQtyfx, --生产任务单计划生产数量
FAuxStockQtyfx, --生产任务单入库数量
FUnitIDfx, --生产任务单单位
FSupplyID, --生产任务单加工单位
FItemIDzz, --投料单物料代码
FErpClsIDzz, --投料物料属性
FUnitIDzz, --投料单单位
FAuxQtyMust, --计划投料数量
FAuxQtyPick, --应发数量
FAuxQtyScrap, --单位用量
FBomInputAuxQty, --标准用量
FAuxStockQty, --已领数量
FAuxQtyConsume, --消耗数量
FWIPAuxQTY, --在制品数量
FItemID, --底层物料内码
FUnitID, --底层单位
FAuxqty, --底层基本单位用量
FQty --底层用量
)
select
u1.FInterID, --生产任务单内码
u1.FBillNo, --生产任务单编号
u1.FItemIDfx, --生产任务单物料代码
u1.FAusQtyfx, --生产任务单计划生产数量
u1.FAuxStockQtyfx, --生产任务单入库数量
u1.FUnitIDfx, --生产任务单单位
u1.FSupplyID, --生产任务单加工单位
u1.FItemIDzz, --投料单物料代码
u1.FErpClsIDzz, --投料物料属性
u1.FUnitIDzz, --投料单单位
u1.FAuxQtyMust, --计划投料数量
u1.FAuxQtyPick, --应发数量
u1.FAuxQtyScrap, --单位用量
u1.FBomInputAuxQty, --标准用量
u1.FAuxStockQty, --已领数量
u1.FAuxQtyConsume, --消耗数量
u1.FWIPAuxQTY, --在制品数量
u2.FItemID, --底层物料内码
u2.FUnitID, --底层单位
u2.FAuxqty, --底层基本单位用量
u2.FQty --底层用量
from
#WIP u1
left outer join --左连接
z_view_SingleStageBOM u2 --BOM单级展开
on u1.FItemIDzz = u2.FParentID --子项内码 = BOM单级展开.父项内码
where u1.FErpClsIDzz > 1
DECLARE @ENTRY varchar(200);
SET @ENTRY = 1
while ( ISNULL(@ENTRY, 'A') <> 'A')
--WHILE 循环 当@ENTRY 等于'A'时跳出循环
--ISNULL判断@ENTRY是否为空,为空则返回函数里的第二个参数的值'A'
BEGIN --控制流关键字
insert into #ProductEntry --向临时表:产品插入记录
(
FInterID, --生产任务单内码
FBillNo, --生产任务单编号
FItemIDfx, --生产任务单物料代码
FAusQtyfx, --生产任务单计划生产数量
FAuxStockQtyfx, --生产任务单入库数量
FUnitIDfx, --生产任务单单位
FSupplyID, --生产任务单加工单位
FItemIDzz, --投料单物料代码
FErpClsIDzz, --投料物料属性
FUnitIDzz, --投料单单位
FAuxQtyMust, --计划投料数量
FAuxQtyPick, --应发数量
FAuxQtyScrap, --单位用量
FBomInputAuxQty, --标准用量
FAuxStockQty, --已领数量
FAuxQtyConsume, --消耗数量
FWIPAuxQTY, --在制品数量
FItemID, --底层物料内码
FUnitID, --底层单位
FAuxqty, --底层基本单位用量
FQty --底层用量
)
select
u1.FInterID, --生产任务单内码
u1.FBillNo, --生产任务单编号
u1.FItemIDfx, --生产任务单物料代码
u1.FAusQtyfx, --生产任务单计划生产数量
u1.FAuxStockQtyfx, --生产任务单入库数量
u1.FUnitIDfx, --生产任务单单位
u1.FSupplyID, --生产任务单加工单位
u1.FItemIDzz, --投料单物料代码
u1.FErpClsIDzz, --投料物料属性
u1.FUnitIDzz, --投料单单位
u1.FAuxQtyMust, --计划投料数量
u1.FAuxQtyPick, --应发数量
u1.FAuxQtyScrap, --单位用量
u1.FBomInputAuxQty, --标准用量
u1.FAuxStockQty, --已领数量
u1.FAuxQtyConsume, --消耗数量
u1.FWIPAuxQTY, --在制品数量
(CASE when u2.FItemID is null then u1.FItemID else u2.FItemID end) FItemID,
--判断:BOM单级展开.子项物料内码 如果为空值 则用 u1.FItemID 替代
(CASE when u2.FUnitID is null then u1.FUnitID else u2.FUnitID end) FUnitID,
(CASE when u2.FAuxQty is null then u1.FAuxQty else u2.FAuxQty end) FAuxQty,
(CASE when u2.FQty is null then u1.FQty else u1.FQty*u2.FQty end) FQty
----判断:BOM单级展开.用量 如果为空值 则用 u1.FQty 替代
from #Product u1
left outer join --左连接
z_view_SingleStageBOM u2 --BOM单级展开
on u1.FItemID = u2.FParentID --子项内码 = BOM单级展开.父项内码
select @ENTRY = MAX(u2.FItemID)
from #Product u1
left outer join --左连接
z_view_SingleStageBOM u2 --BOM单级展开
on u1.FItemID = u2.FParentID --子项内码 = BOM单级展开.父项内码
delete #Product ---清空产品表
insert into #Product
select * from #ProductEntry
delete #ProductEntry ---清空产品分录表
END
/*
select *
From #Product U1 --产品表
left outer join ICMO U2 --生产在制
on U1.FInterID = U2.FInterID --产品表.任务单内码 = 在制表.任务单内码
select * from #Product
select * from #WIP
select * from z_view_SingleStageBOM
drop table #WIP
drop table #Product
drop table #ProductEntry
*/
select
U1.FBillNo 任务单编号, --生产任务单编号
F1.FNumber 任务单物料代码, --任务单物料代码
F1.FName 任务单物料名称, --任务单物料名称
D1.FName 任务单单位, --任务单单位
U1.FAusQtyfx 计划生产数量, --任务单计划生产数量
U1.FAuxStockQtyfx 入库数量, --任务单入库数量
F2.FNumber 投料单物料代码, --投料单物料代码
F2.FName 投料单物料名称, --投料单物料名称
case U1.FErpClsIDzz when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件' end as 投料物料属性, --投料物料属性
D2.FName 投料单单位, --投料单单位
U1.FAuxQtyMust 计划投料数量, --计划投料数量
U1.FAuxQtyPick 应发数量, --应发数量
U1.FAuxQtyScrap 单位用量, --单位用量
U1.FBomInputAuxQty 标准用量, --标准用量
U1.FAuxStockQty 已领数量, --已领数量
U1.FAuxQtyConsume 消耗数量, --消耗数量
U1.FWIPAuxQTY 在制品数量, --在制品数量
F3.FNumber 底层物料代码, --底层物料代码
F3.FName 底层物料名称, --底层物料名称
(CASE F3.FErpClsID when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件'end) as 底层物料属性,
D3.FName 底层单位, --底层单位
ISNULL(F3.F_120,'') 底层海关编码,--底层海关编码
ISNULL(F3.F_124,'') 底层海关名称,--底层海关名称
U1.FQty 底层用量, --底层用量
U1.FAuxQty 底层基本单位用量, --底层基本单位用量
CONVERT(VarChar(200), u1.FQty) 底层物料单位含量, --底层物料单位含量
U1.FWIPAuxQTY * u1.FQty 底层物料在制量, --底层物料在制量
F3.FNetWeight 单重, --单重
(CASE F3.FNetWeight When 0 Then U1.FWIPAuxQTY * u1.FQty Else u1.FWIPAuxQTY * u1.FQty * F3.FNetWeight End) 底层物料海关在制数量
--判断:单重是否为0,如果为0则不取单重
from
--任务单信息
#Product U1 --产品表
left outer join t_ICItem F1 --物料表
on U1.FItemIDfx = F1.FItemID --产品表.物料内码 = 物料表.物料内码
left outer join t_MeasureUnit D1 --计量单位表
on U1.FUnitIDfx = D1.FMeasureUnitID --产品表.单位 = 单位表.单位内码
--投料单信息
left outer join t_ICItem F2 --物料表
on u1.FItemIDzz = F2.FItemID --产品表.物料内码 = 物料表.物料内码
left outer join t_MeasureUnit D2 --计量单位表
on U1.FUnitIDzz = D2.FMeasureUnitID --产品表.单位 = 单位表.单位内码
--底层信息
left outer join t_ICItem F3 --物料表
on u1.FItemID = F3.FItemID --产品表.子项物料内码 = 物料表.物料内码
left outer join t_MeasureUnit D3 --计量单位表
on U1.FUnitID = D3.FMeasureUnitID --产品表.单位 = 单位表.单位内码
union all
select
U1.FBillNo 任务单编号, --生产任务单编号
F1.FNumber 任务单物料代码, --任务单物料代码
F1.FName 任务单物料名称, --任务单物料名称
D1.FName 任务单单位, --任务单单位
U1.FAusQtyfx 计划生产数量, --任务单计划生产数量
U1.FAuxStockQtyfx 入库数量, --任务单入库数量
F2.FNumber 投料单物料代码, --投料单物料代码
F2.FName 投料单物料名称, --投料单物料名称
case U1.FErpClsIDzz when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件' end as 投料物料属性, --投料物料属性
D2.FName 投料单单位, --投料单单位
U1.FAuxQtyMust 计划投料数量, --计划投料数量
U1.FAuxQtyPick 应发数量, --应发数量
U1.FAuxQtyScrap 单位用量, --单位用量
U1.FBomInputAuxQty 标准用量, --标准用量
U1.FAuxStockQty 已领数量, --已领数量
U1.FAuxQtyConsume 消耗数量, --消耗数量
U1.FWIPAuxQTY 在制品数量, --在制品数量
F2.FNumber 底层物料代码, --底层物料代码
F2.FName 底层物料名称, --底层物料名称
(CASE F2.FErpClsID when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件'end) as 底层物料属性,
D2.FName 底层单位, --底层单位
ISNULL(F2.F_120,'') 底层海关编码,--底层海关编码
ISNULL(F2.F_124,'') 底层海关名称,--底层海关名称
'1' 底层用量, --底层用量
'1' 底层基本单位用量, --底层基本单位用量
'1' 底层物料单位含量, --底层物料单位含量
U1.FWIPAuxQTY 底层物料在制量, --底层物料在制量
F2.FNetWeight 单重, --单重
(CASE F2.FNetWeight When 0 Then U1.FWIPAuxQTY Else u1.FWIPAuxQTY * F2.FNetWeight End) 底层物料海关在制数量
--判断:单重是否为0,如果为0则不取单重
from
--任务单信息
#WIP U1 --在制表
left outer join t_ICItem F1 --物料表
on U1.FItemIDfx = F1.FItemID --在制表.物料内码 = 物料表.物料内码
left outer join t_MeasureUnit D1 --计量单位表
on U1.FUnitIDfx = D1.FMeasureUnitID --在制表.单位 = 单位表.单位内码
--投料单信息
left outer join t_ICItem F2 --物料表
on u1.FItemIDzz = F2.FItemID --在制表.物料内码 = 物料表.物料内码
left outer join t_MeasureUnit D2 --计量单位表
on U1.FUnitIDzz = D2.FMeasureUnitID --在制表.单位 = 单位表.单位内码
where U1.FErpClsIDzz = 1 --物料属性:1-外购,2-自制,3-委外
order by 任务单编号, 投料单物料代码, 底层物料代码
drop table #WIP --删除 在制表
drop table #Product --删除 产品表
drop table #ProductEntry --删除产品分录表
/*--K3查询分析工具调用存储过程,代码如下:*/
exec zp_z_HGWIP2019_FU
drop procedure zp_z_HGWIP2019_FU
来源:https://blog.csdn.net/fu863129/article/details/101348979