drop view [dbo].[z_view_SingleStageBOM] --删除视图
/*--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_HGBOM2019_FU,代码如下:*/
create procedure [dbo].[zp_z_HGBOM2019_FU]
@fyear int, --会计年度
@fperiod int, --会计期间
@fsn varChar(200), --库房代码
@FNUMBGER varChar(200) --物料代码
as
set nocount on
create table #Product --创建临时表:产品
(
FParentID int , --父项物料内码
FNumber varchar(80), --库房代码
FUnitIDfx int, --父项单位
FEndQty decimal (18,6), --期末结存数量
FItemID int, --底层物料内码
FUnitID int, --底层单位
FAuxqty decimal(18,6), --底层基本单位用量
FQty decimal(18,6), --底层用量
)
create table #ProductEntry --创建临时表:产品分录
(
FParentID int , --父项物料内码
FNumber varchar(80), --库房代码
FUnitIDfx int, --父项单位
FEndQty decimal (18,6), --期末结存数量
FItemID int, --底层物料内码
FUnitID int, --底层单位
FAuxqty decimal(18,6), --底层基本单位用量
FQty decimal(18,6), --底层用量
)
insert into #Product --向临时表:产品插入记录
(
FParentID, --父项内码
FNumber, --库房代码
FUnitIDfx, --父项单位
FEndQty, --期末结存数量
FItemID, --底层内码
FUnitID, --底层单位
FAuxqty, --底层基本单位用量
FQty --底层用量
)
select
U1.FParentID, --父项内码
u3.FNumber, --库房代码
u3.FUnitID, --单位内码
u3.FEndQty, --期末结存数量
U1.FItemID, --底层内码
U1.FUnitID, --底层单位
U1.FAuxQty, --底层基本单位用量
U1.FQty --底层用量
from z_view_SingleStageBOM U1 --BOM单级展开视图
inner join
( --自制期末库存
select
c.FItemID, --物料内码
c.FUnitID, --单位内码
b.FNumber, --仓库代码
b.FName, --仓库名称
a.FEndQty --期末结存
from ICInvBal a --库房存货余额表
inner join t_Stock b --仓库表
on a.FStockID = b.FItemID --库房存货余额表.库房内码 = 仓库表.库房内码
inner join t_ICItem c --物料表
on a.FItemID = c.FItemID --库房存货余额表.物料内码 = 物料表.物料内码
where a.FYear = @fyear --会计年度
AND a.FPeriod = @fperiod --会计期间
AND a.FEndQty <> 0 --期末结存数量
AND C.FErpClsID > 1 --物料属性:1-外购,2-自制,3-委外
AND b.FNumber LIKE @fsn --库房代码
AND c.FNumber LIKE @FNUMBGER --物料代码
) u3 --期末结存
on u1.FParentID = u3.FItemID --BOM表.物料内码 = U3.物料内码
/*
select * from #Product --调试代码
select * from #ProductEntry --调试代码
delete #Product --调试代码
delete #ProductEntry --调试代码
drop table #Product --调试代码
drop table #ProductEntry --调试代码
*/
DECLARE @ENTRY varchar(200);
SET @ENTRY = 1
while ( ISNULL(@ENTRY, 'A') <> 'A')
--WHILE 循环 当@ENTRY 等于'A'时跳出循环
--ISNULL判断@ENTRY是否为空,为空则返回函数里的第二个参数的值'A'
BEGIN --控制流关键字
insert into #ProductEntry --向临时表:产品插入记录
(
FParentID, --父项内码
FNumber, --库房代码
FUnitIDfx, --父项单位
FEndQty, --期末结存数量
FItemID, --底层内码
FUnitID, --底层单位
FAuxqty, --底层基本单位用量
FQty --底层用量
)
select
u1.FParentID, --父项物料内码
u1.FNumber, --库房代码
u1.FUnitIDfx, --父项单位
u1.FEndQty, --期末结存数量
(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
C1.FName 库位,
F1.FNumber 库存物料代码,
(CASE F1.FErpClsID when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件'end) as 物料属性,
F1.FName 库存物料名称,
D1.FName 单位,
u1.FEndQty 期末结存数量,
F2.FNumber 底层物料代码,
F2.FName 底层物料名称,
(CASE F2.FErpClsID when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件'end) as 底层物料属性,
ISNULL(F2.F_120,'') 底层海关编码,
ISNULL(F2.F_124,'') 底层海关名称,
u1.FAuxQty 底层基本单位用量,
CONVERT(VarChar(200), u1.FQty) 底层物料单位含量,
D2.FName 单位,
u1.FEndQty * u1.FQty 底层物料库存量,
F2.FNetWeight 单重,
(CASE F2.FNetWeight when 0 then u1.FEndQty * u1.FQty else u1.FEndQty * u1.FQty * F2.FNetWeight end) 底层物料海关库存数量
--判断:单重是否为0,如果为0 则不取单重
from
#Product U1 --产品表
left outer join t_ICItem F1 --物料表
on u1.FParentID = F1.FItemID --产品表.父项内码 = 物料表.物料内码
left outer join t_Stock C1 --仓库表
on u1.FNumber = C1.FNumber --仓库内码 = 仓库内码
left outer join t_MeasureUnit D1 --计量单位表
on U1.FUnitIDfx = D1.FMeasureUnitID --产品表.单位 = 单位表.单位内码
left outer join t_ICItem F2 --物料表
on u1.FItemID = F2.FItemID --产品表.底层内码 = 物料表.物料内码
left outer join t_MeasureUnit D2 --计量单位表
on U1.FUnitID = D2.FMeasureUnitID --产品表.单位 = 单位表.单位内码
where F2.FErpClsID = 1 --物料属性为 1-外购
union all
select
C1.FName 库位,
F1.FNumber 库存物料代码,
(CASE F1.FErpClsID when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件'end) as 物料属性,
F1.FName 库存物料名称,
D1.FName 单位,
u1.FEndQty 期末结存数量,
F1.FNumber 底层物料代码,
F1.FName 底层物料名称,
(CASE F1.FErpClsID when 1 then '外购' when 2 then '自制' when 3 then '委外加工' when 5 then '虚拟件'end) as 底层物料属性,
ISNULL (F1.F_120, '') 底层海关编码,
ISNULL (F1.F_124, '') 底层海关名称,
'1'底层基本单位用量,
'1' 底层物料单位含量,
D1.FName 单位,
u1.FEndQty 底层物料库存数量,
F1.FNetWeight 单重,
(CASE F1.FNetWeight when 0 then u1.FEndQty else u1.FEndQty * F1.FNetWeight end) 底层物料海关库存数量
--判断:单重是否为0,如果为0 则不取单重
from ICInvBal u1 --库房存货余额表
left outer join t_ICItem F1 --物料表
on u1.FItemID = F1.FItemID --库房余额.物料内码 = 物料表.内码
left outer join t_Stock C1 --仓库表
on u1.FStockID = C1.FItemID --仓库内码 = 仓库内码
left outer join t_MeasureUnit D1 --计量单位表
on F1.FUnitID = D1.FMeasureUnitID --单位内码
where F1.FErpClsID = 1 --物料属性:1-外购,2-自制,3-委外
and u1.FEndQty <> 0 --期末结存数量
AND C1.FNumber like @fsn --库房代码
AND F1.FNumber like @FNUMBGER --物料代码
AND u1.FYear = @fyear --会计年度
AND u1.FPeriod = @fperiod --会计期间
order by 库位, 库存物料代码, 底层物料代码
drop table #Product --删除 产品表
drop table #ProductEntry --删除产品分录表
/*--K3查询分析工具调用存储过程,代码如下:*/
exec zp_z_HGBOM2019_FU @Year@,@MONTH@,'%@FStockNo@%','%@@ItemNumber@@%'
drop procedure zp_z_HGBOM2019_FU
来源:https://blog.csdn.net/fu863129/article/details/101349197