SSRS需求:获取最大DateModified对应的最大TimeModified作为报表版本号
看来你卡在了SSRS里聚合函数嵌套的问题上,我来给你几个可行的解决方案,优先满足你在SSRS里实现的需求,也给你数据集层面的优化方案:
方案一:SSRS表达式直接实现
方法1:嵌套聚合+IIF判断
你之前用LOOKUP报错是因为LOOKUP的参数不支持嵌套聚合,但我们可以用MAX配合IIF来筛选出最大日期对应的最大时间,直接在报表文本框里用下面的表达式:
="v" & Format(MAX(Fields!DateModified.Value, "ShopOrders"), "MMdd") & "." & Format(MAX(IIF(Fields!DateModified.Value = MAX(Fields!DateModified.Value, "ShopOrders"), Fields!TimeModified.Value, Nothing)), "HHmm")
解释:
MAX(Fields!DateModified.Value, "ShopOrders"):指定数据集范围ShopOrders,获取所有返回订单里的最大修改日期IIF(...):筛选出所有修改日期等于这个最大值的行,保留它们的TimeModified,其他行返回Nothing- 外层的
MAX:从筛选后的时间值里取最大的那个,最后格式化拼接成你要的vMMDD.HHMM格式
方法2:自定义代码遍历数据集
如果觉得嵌套表达式不够直观,可以在SSRS里写自定义代码来实现:
- 打开报表属性 → 代码选项卡,粘贴以下VB代码:
Public Function GetLatestVersion(ByVal dateList As Object(), ByVal timeList As Object()) As String Dim latestDate As Date = Date.MinValue Dim latestTime As TimeSpan = TimeSpan.MinValue ' 遍历所有订单的日期和时间 For i As Integer = 0 To dateList.Length - 1 ' 处理可能的空值 If dateList(i) Is Nothing Or timeList(i) Is Nothing Then Continue For Dim currentDate As Date = CDate(dateList(i)) Dim currentTime As TimeSpan = TimeSpan.Parse(timeList(i).ToString()) ' 更新最新日期和对应时间 If currentDate > latestDate Then latestDate = currentDate latestTime = currentTime ElseIf currentDate = latestDate AndAlso currentTime > latestTime Then latestTime = currentTime End If Next ' 格式化输出版本号 Return "v" & latestDate.ToString("MMdd") & "." & latestTime.ToString("HHmm") End Function
- 在报表顶部的版本号文本框里调用这个函数:
=Code.GetLatestVersion(LookupSet(1, 1, Fields!DateModified.Value, "ShopOrders"), LookupSet(1, 1, Fields!TimeModified.Value, "ShopOrders"))
解释:
LookupSet(1,1,...):返回整个ShopOrders数据集里对应字段的所有值组成的数组,相当于把所有日期和时间传给自定义函数- 函数会遍历所有行,找到最大的修改日期,再找到该日期下的最大修改时间,最后拼接成目标格式
方案二:调整AS400数据集查询
如果允许修改数据集,直接在查询里计算出版本号会更高效,也避免SSRS里的复杂表达式。针对AS400的SQL,你可以这样写:
WITH MaxModifiedDate AS ( -- 先获取当前筛选条件下的最大修改日期 SELECT MAX(DateModified) AS LatestDate FROM YourShopOrdersTable WHERE PackingDate = ? -- 替换成你的PackingDate参数 ), MaxModifiedTime AS ( -- 基于最大日期,获取对应的最大修改时间 SELECT MAX(TimeModified) AS LatestTime FROM YourShopOrdersTable JOIN MaxModifiedDate ON DateModified = LatestDate WHERE PackingDate = ? ) -- 查询原有订单数据,同时带上计算好的版本号 SELECT t.*, -- 拼接成vMMDD.HHMM格式:处理AS400日期时间的格式转换 'v' || RIGHT('00' || CHAR(MONTH(LatestDate)), 2) || RIGHT('00' || CHAR(DAY(LatestDate)), 2) || '.' || SUBSTR(CHAR(LatestTime, 8), 1, 2) || SUBSTR(CHAR(LatestTime, 8), 4, 2) AS ReportVersion FROM YourShopOrdersTable t CROSS JOIN MaxModifiedDate CROSS JOIN MaxModifiedTime WHERE t.PackingDate = ?
解释:
- 先用两个CTE分别计算最大修改日期和对应最大时间
- 最后通过
CROSS JOIN把版本号附加到每一行数据上 - 报表里直接取
First(Fields!ReportVersion.Value)就能显示版本号,非常简单
注意事项
- 如果你的
TimeModified在AS400里是其他存储格式(比如数字型),需要调整CHAR和SUBSTR的参数来匹配 - SSRS表达式里一定要指定数据集范围
"ShopOrders",否则会默认用当前分组的聚合值,导致结果错误 - 自定义代码里加了空值判断,避免因为某行日期/时间为空导致报错
内容的提问来源于stack exchange,提问作者Crazy Cucumber
相关产品推荐
相关产品推荐

