Reporting services 如何在SSRS报表生成器中按子组值分组和循环

Reporting services 如何在SSRS报表生成器中按子组值分组和循环,reporting-services,ssrs-2008,ssrs-2008-r2,Reporting Services,Ssrs 2008,Ssrs 2008 R2,我正在将SSRS报表生成器与SharePoint列表一起使用。我在报表生成器中创建了一个矩阵,该矩阵按组织对站点评估状态进行分组。我希望能够设置组织名称所在单元格的背景色,这取决于属于该组织的网站的总体评估状态 我的网站评估状态值为“未启动”、“进行中”、“完成”。如果组织的任何站点的状态为“未启动”,则组织单元格的背景色为红色。只要组织的所有站点都处于“进行中”状态,则组织的背景单元格为黄色。最后,只要所有的组织站点都有一个值“complete”,那么组织的背景色就是绿色 Excel中的示例

我正在将SSRS报表生成器与SharePoint列表一起使用。我在报表生成器中创建了一个矩阵,该矩阵按组织对站点评估状态进行分组。我希望能够设置组织名称所在单元格的背景色,这取决于属于该组织的网站的总体评估状态

我的网站评估状态值为“未启动”、“进行中”、“完成”。如果组织的任何站点的状态为“未启动”,则组织单元格的背景色为红色。只要组织的所有站点都处于“进行中”状态,则组织的背景单元格为黄色。最后,只要所有的组织站点都有一个值“complete”,那么组织的背景色就是绿色

Excel中的示例


我知道如何使用表达式调用代码来更改单元格的背景颜色,但不知道如何传递所需的值或循环这些值。我想我必须在“自定义代码”部分用VB编写一些东西,但不确定如何使用报表生成器在组中循环

尝试在组织的“背景色”属性中使用此表达式:

=Switch(
Array.IndexOf(LookupSet(Fields!Organization.Value,Fields!Organization.Value,Fields!Status.Value,"DataSet2"),"Not Started")>-1,"Red",
Array.IndexOf(LookupSet(Fields!Organization.Value,Fields!Organization.Value,Fields!Status.Value,"DataSet2"),"In Progress")>-1,"Yellow",
Array.IndexOf(LookupSet(Fields!Organization.Value,Fields!Organization.Value,Fields!Status.Value,"DataSet2"),"Complete")>-1,"Green"
)
它产生了以下结果:

更新1:

该函数将评估每种情况:

  • 状态列包含
    未启动
  • 状态列包含进行中的
  • 状态列包含
    Complete
    值)
  • 为了检查状态列中是否有
    未启动
    值,我使用了和函数。lookupper将给我一个数组,其中包含每个组织的状态,因此使用IndexOf I search Not start、In Progress或Complete值。如果找到一个值,它将返回存储在数组中的索引,否则返回-1

    更新2:基于用户评论的版本

    首先,您必须了解开关功能如何在SSRS中工作。实际上,它非常简单,每一行都是根据Switch函数的每一个case表达式计算的。当一行与条件匹配时,存在一个
    未启动
    值,即根据开关功能中的每个条件对下一行进行评估,依此类推

    请注意,案例是按照编写顺序进行评估的。所以在我们的 场景每一行首先根据其所在的条件进行评估 包含
    未启动
    值如果条件为
    false
    ,则 继续到下一个条件,如果为
    false
    则继续到下一个条件 下一个条件等,直到一个条件为真或所有条件 进行评估


    请告诉我这是否有帮助。

    尝试在组织的“背景色”属性中使用此表达式:

    =Switch(
    Array.IndexOf(LookupSet(Fields!Organization.Value,Fields!Organization.Value,Fields!Status.Value,"DataSet2"),"Not Started")>-1,"Red",
    Array.IndexOf(LookupSet(Fields!Organization.Value,Fields!Organization.Value,Fields!Status.Value,"DataSet2"),"In Progress")>-1,"Yellow",
    Array.IndexOf(LookupSet(Fields!Organization.Value,Fields!Organization.Value,Fields!Status.Value,"DataSet2"),"Complete")>-1,"Green"
    )
    
    它产生了以下结果:

    更新1:

    该函数将评估每种情况:

  • 状态列包含
    未启动
  • 状态列包含进行中的
  • 状态列包含
    Complete
    值)
  • 为了检查状态列中是否有
    未启动
    值,我使用了和函数。lookupper将给我一个数组,其中包含每个组织的状态,因此使用IndexOf I search Not start、In Progress或Complete值。如果找到一个值,它将返回存储在数组中的索引,否则返回-1

    更新2:基于用户评论的版本

    首先,您必须了解开关功能如何在SSRS中工作。实际上,它非常简单,每一行都是根据Switch函数的每一个case表达式计算的。当一行与条件匹配时,存在一个
    未启动
    值,即根据开关功能中的每个条件对下一行进行评估,依此类推

    请注意,案例是按照编写顺序进行评估的。所以在我们的 场景每一行首先根据其所在的条件进行评估 包含
    未启动
    值如果条件为
    false
    ,则 继续到下一个条件,如果为
    false
    则继续到下一个条件 下一个条件等,直到一个条件为真或所有条件 进行评估


    如果有帮助,请告诉我。

    Alejandro,谢谢!这是一件艺术作品,它是有效的:)现在我需要弄清楚所有不同的组件都做了什么。SSRS报表生成器文档在这方面对我帮助不大。@M_66,我已经更新了我的答案,添加了简短的解释和参考。是的,这很有帮助。我还有一个问题想不通。我了解lookupper()和Array.IndexOf()方法是如何工作的,但我不太了解在循环遍历每个集合时发生了什么,集合中的一些值的状态为“未启动”,而另一些值的状态为“正在进行”。那么,当它循环通过时,它为什么不根据列表中的最后一项分配组织状态颜色?它如何知道为组织分配适当的状态?希望这个问题有意义。@M_66,检查我的更新2。我很高兴你想知道它是如何工作的。一般来说,OP在根据答案解决问题后不会恢复到原来的状态,即使他们不明白答案是如何解决问题的。Alejandro,谢谢!这是一件艺术作品,它是有效的:)现在我需要弄清楚所有不同的组件都做了什么。SSRS报表生成器文档在这方面对我帮助不大。@M_66,我已经更新了我的答案,添加了简短的解释和参考。是的,这很有帮助。我还有一个问题想不通。我了解lookupper()和Array.IndexOf()方法是如何工作的,但我不太明白当您循环遍历每个集合时会发生什么,集合中的一些值的状态为Not Started,而另一些值的状态为sta