SSRS - 矩阵 Table 读取前一行值

SSRS - Matrix Table Reading Previous Row Values

我一直在尝试读取矩阵 table 上的前一行值(显示每小时数量)以将其与当前行值进行比较,如果它们之间的差异是,则将背景颜色突出显示为黄色超出可接受的公差范围。

矩阵 table 具有按列和行分组的组合(仅用于每小时信息),如图所示。

尝试使用自定义代码来实现此目的,但我得到的结果不正确。

我附上了报告设计图像、结果以及客户代码。

请帮我看看逻辑上有什么问题。

图片: 结果: 代码:在报表属性下编写的自定义代码->代码

Public Shared previous as Object 
Public Shared current as Object = Nothing

Public Shared Function GetCurrent(Item as Object) as Object
    previous=current
    current=Item
    return current
End Function

Public Shared Function GetPrevious()
    return previous
End Function


public Shared Function IsHourlyDiffAboveTolerance(previousValue as Integer, currentValue as Integer, variantPercent as Decimal, variantVolume as Decimal, sortOrder as Integer) As Object

    If previousValue = Nothing Then
        Return Nothing
    Else
        Dim diff as Integer
        diff = abs(currentValue - previousValue)

        Dim tolerance as decimal
        tolerance = 0.0

        If variantPercent <> 0 Then
            tolerance = previousValue * (variantPercent/100)
        Else If variantVolume <> 0 Then
            tolerance = variantVolume
        End If

        If diff >= 0 And diff <= tolerance Then
            return Nothing
        Else
            return 1
        End If
    End If
End Function

调用方表达式:

=IIF(
IsNothing(Code.IsHourlyDiffAboveTolerance(Code.GetPrevious(), Code.GetCurrent(Fields!ExpectedQty.Value), 
    Fields!VariantPercent.Value, Fields!VariantVolume.Value, Fields!SortOrder.Value)), 
"No Color", 
"Yellow")

更新:变量体积或数量可以存在,但不能同时存在。

谢谢

我会为 SQL Server 2012 使用新的分析函数 LEAD() and LAG()。这些函数从同一结果集中的后续行(领先)和前一行(滞后)访问数据不使用 self-join。要将这些函数与矩阵一起使用,您可能需要在分组子句中使用 PARTITION BY

示例SQL:

USE AdventureWorks
GO

SELECT 
      s.SalesOrderID
    , s.SalesOrderDetailID,s.OrderQty
    , LeadValue = LEAD(SalesOrderDetailID) OVER (ORDER BY SalesOrderDetailID) 
    , LagValue = LAG(SalesOrderDetailID) OVER (ORDER BY SalesOrderDetailID) 
FROM 
    Sales.SalesOrderDetail s
WHERE 
    SalesOrderID IN (43670, 43669, 43667, 43663)
ORDER BY 
      s.SalesOrderID
    , s.SalesOrderDetailID
    , s.OrderQty
GO

Reference Article