You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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里写自定义代码来实现:

  1. 打开报表属性 → 代码选项卡,粘贴以下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
  1. 在报表顶部的版本号文本框里调用这个函数:
=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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:47:41