取数逻辑
主数据:已审核,未完工,未指定完工的工单单身需领数量=需领数量-已领数量,以及工单状态未已完工对应自动领料单未审核(可能是批次库存问题需要人为干预)
待验数量:进货单与委外进货单未检验
预计入库:采购订单(未交)与委外工单(已审核,未结案)
安全库存:只考虑原材料仓安全存量
库存数量:根据企业具体情况抓取指定仓库数据
其它辅助:产品/供应商等
计算逻辑:
按品号,预计开工日期排序
按品号分组,进行组内排序,组内第一行欠料数量=库存数量+待验数量-需领数量-安全库存
组内第二行开始:欠料数量=上一行的结果减去本行的需领数量
递归循环直到结束
自定义库存函数
-- =============================================
-- Author:
-- Create date: <2017-02-04>
-- Description: <欠料表库存>
-- =============================================
ALTER FUNCTION [dbo].[DZ_QianLiaoInvQty](
@ITEM AS VARCHAR(20)
)RETURNS DECIMAL(15,2)
AS
BEGIN
DECLARE @Qty DECIMAL(15,2)
--统计指定仓库库存数量
SELECT @Qty=SUM(MC007) FROM INVMC
WHERE MC001=@ITEM and MC002 in('01','02','03','04','05','07','10')
GROUP BY MC001
RETURN @Qty
END
主要SQL
with CT AS(
SELECT TB003 品号,TB012 品名,TB013 规格,TB004-TB005 as 需领数量,TA009 预计开工日期,TA001 工单别,TA002 工单单号,'工单' as 来源,TA006 产品品号,TA034 产品品名
FROM MOCTA inner join MOCTB ON TA001=TB001 AND TA002=TB002
WHERE TA013='Y' AND TA011 NOT IN ('Y','y')
--and TA009<='20170228'
--and TA009<='${DateEnd}'
${if(len(DateEnd)==0,"","and TA009<='"+DateEnd+"'")}
UNION ALL
SELECT TOP 1000 TE004 品号,TE017 品名,TE018 规格,TE005 AS 需领数量, TC003 预计开工日期 ,TE011 工单别,TE012 工单单号,'自动领料' as 来源,TA006 产品品号,TA034 产品品名
FROM MOCTC INNER JOIN MOCTE ON TC001=TE001 AND TC002=TE002
INNER JOIN MOCTA ON TE011=TA001 AND TE012=TA002
WHERE TC001='5403' --自动扣料单
AND TA011 in ('Y','y') --工单已完工
AND TC009='N' --未审核
),
CT1 AS
(
--待验数量:进货单与委外进货单未审核
SELECT 品号,SUM(待验数量) 待验数量 FROM (
SELECT TH004 品号,SUM(TH007) 待验数量 FROM PURTH
WHERE TH028='1'
GROUP BY TH004
UNION ALL
SELECT TI004 品号,SUM(TI007) 待验数量 FROM MOCTI
WHERE TI035='1'
GROUP BY TI004
) A
GROUP BY 品号
),
CT2 AS(
--预计入库
SELECT 品号,SUM(预计入库) 预计入库 FROM (
SELECT TD004 品号,SUM(TD008-TD015) as 预计入库 FROM PURTD
WHERE TD016='N'--未结束
GROUP BY TD004
UNION ALL
SELECT TB003 品号,SUM(TB004-TB005) as 预计入库 FROM MOCTA INNER JOIN MOCTB ON TA001=TB001 AND TA002=TB002
WHERE TA013='Y' AND UPPER(TA011)<>'Y'--未结束
GROUP BY TB003
) B
GROUP BY B.品号
)
, CT3 AS (
SELECT
CT.品号,
品名,
规格,
dbo.[DZ_QianLiaoInvQty](CT.品号) as 库存数量,
需领数量,
ISNULL(CT1.待验数量,0) 待验数量,
ISNULL(A.MC004,0) 安全库存,
ISNULL(CT2.预计入库,0) 预计入库,
预计开工日期,
工单别,
工单单号,
产品品号,
产品品名,
来源,
MA001 as 供应商编码,
MA003 as 供应商名称
FROM CT LEFT JOIN CT1 ON CT.品号=CT1.品号
LEFT JOIN CT2 ON CT.品号=CT2.品号
LEFT JOIN (SELECT MC001,MC004 FROM INVMC WHERE MC002='01' ) as A ON CT.品号=A.MC001
LEFT JOIN (SELECT MB001,MB032 FROM INVMB ) B ON CT.品号=B.MB001
LEFT JOIN (SELECT MA001,MA003 FROM PURMA) C ON B.MB032=C.MA001
)
SELECT * FROM CT3 ORDER BY 品号,预计开工日期 asc
--SELECT *,Case when Rank='1' then 库存数量+待验数量-需领数量-安全库存 else 0 end 欠料数量 FROM (
--SELECT *,
-- RANK() OVER(PARTITION BY 品号 ORDER BY 品号,预计开工日期 asc) AS Rank
-- FROM CT3)
-- C
处理组内“递归式”错行计算的FineReport方法
(1)第一列必须是分组列
(2)选定X字段设置左父格为第一列A2
(3)公式计算字段错行X字段-1
设置第一列分组字段:
设置左父格为A2
计算公式
在此感谢cherishdqy美女的帮助。