SSRS 2012。在查询设计器的报告中复制分组结果

SSRS 2012. Replicate grouping results in report in Query Designer

SSRS 2012 的新手和挣扎。

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

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

我的子报表可以有效地为每个客户 return 多条记录。子报表按 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,则使用该记录,否则使用其他记录

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

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

已解决!!!:

好的 - 这就是我的想法。

为 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 创建一个数组(是的,现在您也知道了)。我需要对其进行排序,以便我之后的那个是第一个值 returned。这是通过将以下内容复制并粘贴到报告的自定义代码部分来实现的。 (我已经添加了代码以允许您在需要时进行反向排序)。

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 如何 return 数组,我总是首先得到 1-yyyy$1。

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

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

这会检查数组计数[是的,通过使用长度] 是否大于零。如果是这样,则对数组结果使用中间函数 return 第 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

在某些情况下,我需要 return 的值的长度各不相同,例如 2 或 10。如果 LookupSet 没有 return 任何结果,我还需要 return 什么都不用.我不能像这样使用 "normal" 版本的 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)

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

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