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
我一直在尝试读取矩阵 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