【问题标题】:SSRS 2012. Replicate grouping results in report in Query DesignerSSRS 2012。在查询设计器中的报表中复制分组结果
【发布时间】:2016-04-08 03:51:07
【问题描述】:

SSRS 2012 新手,正在苦苦挣扎。

我有一份关于客户数据的报告 - 包含一个子报告。当与一个客户进行测试时(只是为了确保一切正常),它可以完美运行。
当过滤器被删除时,它会超时(实际上是说它已被用户取消,但它没有)。

显然包含子报表是问题所在(因为没有它主报表运行良好)。

我的子报表可以有效地为每个客户返回多条记录。子报表按 ClientId 分组。然后我有一个计算字段 - 比如说 HasIP - 连接两个字段(IC 和 PC )以产生 YesYes 或 YesNo。 tablix 按 HasIP 按 Z 到 A 排序。

ClientID 页脚中的信息就是我要显示的内容。

ClientID    HasIP
22          YesNo - has two records, but since it has a YesYes, I don't want this one
22          YesYes - has two records, but I want the this one
52          YesYes - may only have 1 record, I want this record
76          YesNo - may only have 1 record, I want this record

理论上,客户端不能拥有多个 HasIP=YesYes 的实例,并且不应拥有超过 2 条记录。如何在查询设计器中重新创建此效果?本质上如果 HasIP=yesyes,则使用该记录,否则使用其他记录

如果我能做到这一点,我可以完全删除子报表,将此数据集添加到我的主报表中并使用查找来获取数据。

但是,我们的报表方案的设置方式不允许我更改查询 [我必须单击数据集属性中的查询设计器按钮],并且我没有使用 MDX 的经验。

【问题讨论】:

    标签: reporting-services ssrs-2012


    【解决方案1】:

    已解决!!!:

    好的 - 这就是我想出的。

    为 IC 和 PC 值分配数字顺序

    我将 IC 和 PC 字段值连接在一起并分配了值,并在原始子报表中添加了记录的 ID。我将此字段称为 HasIP

    =Switch(Fields!IC.Value+Fields!PC.Value="YesYes", 1, 
    Fields!IC.Value+Fields!PC.Value="YesNo", 2,  
    Fields!IC.Value+Fields!PC.Value="NoNo", 3) & "-" & Fields!R_Name.Value
    

    这给我留下了 2-xxxx、1-yyyy 等。

    然后我向我的第二个数据集添加了一个过滤器:

    =Left(Fields!HasIP.Value, 1)
    

    排除“NoNo”的值

    在 Dataset2 中连接 HasIP 和其他字段(供 LookupSet 使用)

    此外还必须将文本值转换为输出代码(例如 Yes = 1、No = 2、Unknown = 3 等)。我通过在包含 HasIP 的 Dataset2(在报告中,而不是查询中)中创建一个计算字段来做到这一点。我使用美元符号将 HasIP 与值分隔开来。

    =Fields!HasIP.Value & "$" & 
    SWITCH(
        left(Fields!CoR.Value, 1)="C", 1, 
        Left(Fields!CoR.Value, 1)="N", 2, 
        True, ""
    )
    

    这给我留下了 2-xxxx$2、1-yyyy$1 等。

    对 LookupSet 结果进行排序

    LookupSet 创建一个数组(是的,现在你也知道了)。我需要对此进行排序,以便我追求的是返回的第一个值。这是通过将以下内容复制并粘贴到报告的自定义代码部分来实现的。 (我添加了代码,以便您在需要时进行反向排序)。

    Function JoinSorted(m_Array As Object()) As String()    
    System.Array.Sort(m_Array)
    ' Array.Reverse(m_Array) 'uncomment this line if you want to sort in reverse
    
        Dim k As Integer = 0
        For i As Integer = 0 To m_Array.Length - 1
            If i > 0 AndAlso m_Array(i).Equals(m_Array(i - 1)) Then
                Continue For
            End If
            m_Array(k) = m_Array(i)
            k += 1
        Next
        Dim fred As [String]() = New [String](k - 1) {}
        System.Array.Copy(m_Array, 0, fred, 0, k)
        Return fred
    End Function
    

    您可以通过在报告表达式中使用以下内容来调用它:

    Join(
        Code.JoinSorted(
            LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!YourField.Value,"Dataset2")
        ),""
    )
    

    所以,不管 LookupSet 想如何返回数组,我总是先得到 1-yyyy$1。

    处理报表上的 LookupSet 输出 - 包括无记录的默认值

    对于报告中的某些 LookupSet 结果,如果没有返回记录,我需要返回一个默认值。否则我需要返回分配的值(1、2、3 等)。如果找到两种方法来做到这一点。

    这将检查数组计数[是的,通过使用长度]是否大于零。如果是这样,则对数组结果使用 mid 函数返回第 14 个字符:

    =SWITCH(
        LookupSet(
            Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2"
        )
        .Length=0, 
       2, 
      LookupSet(
          Fields!Main_ID.Value, Fields!Main_ID.Value, Fields!Record_Name.Value, "Dataset2")
      .Length>0, 
    

    1)

    或 这是一样的:

    =iif(
        LookupSet(
            Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Main_ID.Value,"Dataset2"
       ).Length>0, 
        Mid(
            Split(
                Join(
                    Code.JoinSorted(
                        LookupSet(
                            Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Main_ID.Value,"Dataset2")
                        )
               ,";")
           ,";").GetValue(0)
        ,  'start point of mid
            InStr(
                Join(
                    Code.JoinSorted(
                        LookupSet(
                           Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Main_ID.Value,"Dataset2"
                        )
                     )
                ,";")
            ,"$")
         +1, 
      1), 
    "2"
    )
    

    在报告中处理 LookupSet 输出 - 在值长度变化时使用 MID

    在某些情况下,我需要返回的值的长度不同,例如 2 或 10。如果 LookupSet 没有返回任何结果,我也不需要返回任何内容。我不能像这样使用“普通”版本的 MID:

    Mid(
       Join(Code.JoinSorted(
            LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2")),
            ";"), 
        InStr(
            Join(
                Code.JoinSorted(
                 LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2")
                ),
            ";"),
       "$")+1, 
        (
            InStr(
                Join(
                    Code.JoinSorted(
                        LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2")
                        ),
                ";"),
            ";") 
        -
            InStr(
                Join(
                    Code.JoinSorted(
                        LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12d.Value,"Dataset2")
                    ),
                ";"),
            "$")
        - 1)
      )
    

    由于使用 -1(在末尾)使字符串对于某些记录的长度为负数而引发 #ERROR。

    所以,这是我可以使用的:

    =
    Mid(
        Split(
           Join(
                Code.JoinSorted(
                    LookupSet(Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12b.Value,"Dataset2")
                ),
           ";"),
        ";").GetValue(0)
    ,
        InStr(
            Join(
                Code.JoinSorted(
                    LookupSet(
                        Fields!Main_ID.Value,Fields!Main_ID.Value,Fields!Q12b.Value,"Dataset2")
                ),
            ";"),
        "$")
    +1, 
    1)
    

    通过这样做,我可以在细节和页脚中获得我想要的结果。

    我希望这可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      相关资源
      最近更新 更多