如何创建包含全年每日空白行的SSRS Tablix
SSRS 365天库存台账Tablix实现方案
1. 生成基准日期数据集
首先做独立的日期基准数据集,生成从当日开始连续365天的日期序列,作为Tablix的行数据源,避免业务表缺日期导致行不全。SQL Server环境直接用以下查询即可:
WITH DateSequence AS ( SELECT CAST(GETDATE() AS DATE) AS dt UNION ALL SELECT DATEADD(DAY, 1, dt) FROM DateSequence WHERE dt < DATEADD(DAY, 364, CAST(GETDATE() AS DATE)) ) SELECT dt AS date FROM DateSequence OPTION (MAXRECURSION 365)
查询返回刚好365行日期,全部为DATE类型(不带时分秒),避免后续匹配时因为时间精度问题匹配失败。
2. 搭建Tablix基础结构
将上述日期数据集绑定到Tablix,保留4个数据列:
- 第1列:绑定
date字段,设置日期显示格式(如yyyy-MM-dd) - 第2列:列名设为
inbound(入库),暂不绑定字段 - 第3列:列名设为
outbound(出库),暂不绑定字段 - 第4列:列名设为
total(总计),暂不绑定字段
3. 匹配出入库数据
使用Lookup函数分别从两个独立业务数据集匹配对应日期的出入库数值,直接在对应单元格写入表达式即可:
注意:入库、出库数据集的日期字段请统一转为DATE类型,和基准日期格式保持一致
- inbound列单元格表达式:
=CDbl(Lookup(Fields!date.Value, Fields!inbound_date.Value, Fields!inbound_qty.Value, "ds_inbound")) + 0
上述表达式中ds_inbound替换为你自己的入库数据集名称,inbound_date为入库单日期字段,inbound_qty为入库数量字段,末尾+0是为了把匹配不到值的空单元格统一转为0,方便后续计算。
- outbound列单元格表达式逻辑一致,替换为出库数据集对应字段即可:
=CDbl(Lookup(Fields!date.Value, Fields!outbound_date.Value, Fields!outbound_qty.Value, "ds_outbound")) + 0
ds_outbound替换为你自己的出库数据集名称。
4. 计算累计结余
total列是从当日开始的累计库存结余,不要直接用当日入库减当日出库,要用RunningValue做逐行累计计算,表达式写在total列单元格:
=RunningValue( ReportItems!inbound.Value - ReportItems!outbound.Value, Sum, "Tablix1" )
表达式中Tablix1替换为你当前Tablix的实际控件名称,逻辑是从第一行(当日)开始逐行累加每日出入库差值,得到当日的实际库存结余。
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

