SQL版本的库龄分析报表，使用存储过程实现，同时支持分支是否启用。 CREATE PROCEDURE "IPS_Report_StockAge" ( @BPLId NVARCHAR(50), -- 分支ID（筛选指定分支，为空时不限制） @ItmsGrpCod NVARCHAR(20), -- 物料组编码（筛选指定物料组，为空时不限制） @EndDate DATE -- 统计结束日期（所有数据的时间截止点） ) AS BEGIN SET NOCOUNT ON; -- 关闭计数消息输出，提升执行效率 ---01 临时表#StockList：筛选截止日期前库存数量不为0的物料清单 SELECT T0."ItemCode", -- 物料编码 SUM(T0."InQty"-T0."OutQty") AS "Qty" -- 净库存数量（入库数量 - 出库数量） INTO #StockList -- 存入临时表，用于后续筛选有效库存物料 FROM OIVL T0 -- OIVL：库存交易主表（存储所有库存进出记录） INNER JOIN OITM T1 ON T0."ItemCode"= T1."ItemCode" -- 关联物料主表(OITM)，获取物料组信息 INNER JOIN OWHS T2 ON T0."LocCode"= T2."WhsCode" -- 关联仓库表(OWHS)，获取仓库所属分支信息 WHERE 1=1 AND T0."DocDate"0 -- 仅保留入库记录（排除出库记录） AND T0."TransType"'67' -- 排除交易类型为67的记录（通常为无效或冲销交易） AND T0."DocDate"=T0."Qty" -- 累计入库量>=当前库存（找到覆盖库存的所有入库记录） GROUP BY T0."ItemCode"; -- 临时表#DATA：计算每个入库批次对应的有效库龄库存（AgaQty）及关键日期 SELECT T0."ItemCode", -- 物料编码 T0."DocDate", -- 入库日期 T0."TransType", -- 交易类型 T0."CreatedBy", -- 制单人 T0."BASE_REF", -- 源单据编号 T0."DocLineNum", -- 单据行号 T0."InQty", -- 本次入库数量 T0."Qty", -- 当前总库存 T0."SumQty", -- 累计入库量 T0."ID", -- 入库记录序号（倒序） T1."ID" AS "MinID", -- 覆盖库存的最小分界点ID -- 有效库龄库存计算： -- 1. 序号
在实施交付的项目上，难免会存在一些物料没有启动批次管理，但是需要进行库龄分析，所以需要单独写SQL语句，如下为：HANA版本，非批次管理的库龄分析报表是SQL语句执行的结果。存储过程的SQL语句为：后面再使用CALL语法进行调用此存储过程即可。 CREATE PROCEDURE "IPS_MM_StockAge" ( in BPLId nvarchar(50), --分支 in ItmsGrpCod NVARCHAR(20), -- 开始日期 in EndDate Date -- 结束日期 ) LANGUAGE SQLSCRIPT AS BEGIN ---01 查询库存不为0的数据 StockList= SELECT T0."ItemCode",SUM(T0."InQty"-T0."OutQty") AS "Qty" FROM OIVL T0 INNER JOIN OITM T1 ON T0."ItemCode"= T1."ItemCode" INNER JOIN OWHS T2 ON T0."LocCode"= T2."WhsCode" WHERE T0."DocDate"0 AND T0."TransType"'67' AND T0."DocDate"=T0."Qty" GROUP BY T0."ItemCode"; DATA= SELECT T0."ItemCode",T0."DocDate",T0."TransType",T0."CreatedBy",T0."BASE_REF",T0."DocLineNum",T0."InQty",T0."Qty", T0."SumQty",T0."ID",T1."ID" AS "MinID", CASE WHEN T0."ID"