[FineReport]组内序号与公式实现组内“递归式”错行计算

在企业中通常会使用一方法去实现欠料分析:已考虑截止预计开工日期为止,企业内部的缺料情况:

取数逻辑
主数据:已审核,未完工,未指定完工的工单单身需领数量=需领数量-已领数量,以及工单状态未已完工对应自动领料单未审核(可能是批次库存问题需要人为干预)
待验数量:进货单与委外进货单未检验
预计入库:采购订单(未交)与委外工单(已审核,未结案)
安全库存:只考虑原材料仓安全存量
库存数量:根据企业具体情况抓取指定仓库数据
其它辅助:产品/供应商等
计算逻辑:
按品号,预计开工日期排序
按品号分组,进行组内排序,组内第一行欠料数量=库存数量+待验数量-需领数量-安全库存
组内第二行开始:欠料数量=上一行的结果减去本行的需领数量
递归循环直到结束
自定义库存函数

-- =============================================      
-- 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
设置第一列分组字段:
[FineReport]组内序号与公式实现组内“递归式”错行计算_第1张图片
设置左父格为A2
[FineReport]组内序号与公式实现组内“递归式”错行计算_第2张图片
计算公式
[FineReport]组内序号与公式实现组内“递归式”错行计算_第3张图片

报表展示:
[FineReport]组内序号与公式实现组内“递归式”错行计算_第4张图片

在此感谢cherishdqy美女的帮助。

你可能感兴趣的:(报表-FineReport)