【问题标题】:Change color based on a difference of value from previous value to current value SSRS根据从先前值到当前值的值差异更改颜色 SSRS
【发布时间】:2017-10-05 13:20:49
【问题描述】:

我正在尝试将当前行值与前一行值进行比较,但仅限于同一组内。

我有 Group1 (Plant), ChildGroup1 (DeviceTag), Details Group, 我已经在 Fill 属性中尝试过这段代码,但它不起作用,它似乎只是每次每组都会更改第一行的颜色,而不管前一行的值如何。

=IIf(Fields!DeviceTag.Value <> Previous(Fields!DeviceTag.Value), "Yellow", "White")

所以我的数据集是这样的:

工厂设备标签描述位置

  A Tag1 ABCD 西
               Tag1 WXYZ West DeviceTag 组 1
_____________________________________________
  A Tag2 EFGH 东
               Tag2 IJKL 东 DeviceTag 组 2
               Tag2 IJKL 西

在这两个 DeviceTag 组中,描述都发生了变化,因此我想将 ABCD 的颜色更改为黄色,将 EFGH 的颜色更改为黄色,但不是 WXYZ,因为它与 EFGH 不在同一个组中。第二行说东应该是黄色,因为它与之前的西位置不同。

在 Crystal Reports 中你会这样做:

if {#ChangeCounter}=1 then nocolor else
if currentfieldvalue <> previous({DataSet.Field}) then cryellow else nocolor

公式#ChangeCounter 只是 1

清如泥??

【问题讨论】:

  • =IIF(RUNNINGVALUE(Fields!Description.Value, COUNTDISTINCT,"DataSetName") MOD 2 = 0, "Yellow", "White") 不确定这是否是您所追求的.....相应地更改数据集名称
  • “DataSetName”从何而来,在哪里指定?那是 Tablix 的名字吗?
  • 无论您在哪里构建报表,都应该有一些报表数据,这将有一个数据源文件夹和一个数据集文件夹。您的数据集的名称将在那里。通常默认为 DataSet1
  • 我的是默认的 DataSet1,但是,这似乎是随机给值着色,有时是为了更改,有时是在没有更改的情况下。似乎也与组无关。
  • 试试=IIf(Fields!DeviceTag.Value = Previous(Fields!DeviceTag.Value), Nothing, "Yellow")

标签: visual-studio reporting-services


【解决方案1】:

我总是发现这种事情在数据集查询中更容易做(假设你可以控制数据集中的查询)。

操作您的最终数据集(SSRS 将接收到的那个)以获得另一列,该列告诉 SSRS 是否为单元格着色。并将您的业务逻辑保留在数据库查询中。

您可以使用row_number() 为每一行(每个组内)编号,然后在新的行号列上将表格重新连接到自身。

也许是这样的?我不确定我是否 100% 遵循您的单元格着色逻辑,并且我确信您的数据集比您提供的要大,但您可以调整它以满足您的需求。

;数据为 ( 选择“A”作为工厂,“Tag1”作为 DeviceTag,“ABCD”作为描述,“West”作为 Location union all 选择“A”作为工厂,“Tag1”作为 DeviceTag,“WXYZ”作为描述,“West”作为 Location union all 选择“A”作为工厂,选择“Tag2”作为 DeviceTag,选择“EFGH”作为描述,选择“East”作为 Location union all 选择“A”作为工厂,选择“Tag2”作为 DeviceTag,选择“IJKL”作为描述,选择“East”作为 Location union all 选择“A”作为工厂,“Tag2”作为 DeviceTag,“IJKL”作为描述,“West”作为位置 ), DataWithRowNumbers 为 ( 选择 *, row_number() over(按 DeviceTag order by Description 分区)作为 DeviceTagGroupRowNumber 从 数据 ) 选择 一种。*, 如果 a.Description != b.Description 然后 'Yellow' 否则 'Transparent' 以 CellColor 结尾 从 DataWithRowNumbers 在 a.DeviceTag = b.DeviceTag 和 a.DeviceTagGroupRowNumber = b.DeviceTagGroupRowNumber - 1 上左加入 DataWithRowNumbers b

然后您可以将单元格中的背景(在 SSRS 中)设置为 Fields!CellColor.Value 的表达式。

【讨论】:

  • 我可以完全控制数据集中的查询。你能给我一个例子,说明我如何在 SSRS 中添加一列来为单元格着色?
  • 用一个例子更新了答案 - 不是 100% 确定你的业务逻辑
  • 这基本上连接了整行列,然后对整个前一行进行比较(如果我正确地查看结果)。我真正需要的是像您一样比较行,但只将已更改为黄色的列变为黄色。
  • 我认为您将需要多个 CellColor 列 - 一个用于您希望将业务逻辑应用于的每个字段。
  • 所以你说的只是添加多个case语句:case when a.CyberAssetDesc != b.CyberAssetDesc then 'Yellow' else 'Transparent' end as CyberAssetDescCellColor, case when a.DeviceLoc != b.DeviceLoc then 'Yellow' else 'Transparent' end as DeviceLocCellColor
【解决方案2】:

您需要使用 Previous 函数的 Scope 参数,提供您的 ChildGroup1 (DeviceTag) 的名称。例如

=IIf(Fields!DeviceTag.Value Previous(Fields!DeviceTag.Value , "ChildGroup1" ), "Yellow", "White")

这是文档:

https://docs.microsoft.com/en-us/sql/reporting-services/report-design/report-builder-functions-previous-function

【讨论】:

  • 该语法似乎不正确,它强调了 Previous(Fields!DeviceTag.Value , "DeviceTag") 当我应用它时,它会将所有 DeviceTag 条目着色为黄色。
  • 不幸的是,语法检查经常滞后于语法的变化。请注意,第二个参数应该是行组名称,而不是字段名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多