SSRS 2012.在查询设计器

时间:2016-04-08 03:51:08

标签: reporting-services ssrs-2012

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,请使用该记录,否则使用其他记录

如果我可以这样做,我可以完全删除子报告,将此数据集添加到我的主报告&使用Lookup获取数据。

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

1 个答案:

答案 0 :(得分:0)

<强>解决!!!:

好的 - 这就是我的想法。

为IC和PC值分配数字顺序

我连接IC&amp; 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)

排除&#34; NoNo&#34;

的值

连接HasIP和Dataset2中的其他字段(由LookupSet使用)

此外还必须将文本值转换为输出代码(例如,Yes = 1,No = 2,Unknown = 3等)。我通过在Dataset2(在报告中,而不是查询中)创建包含HasIP的计算字段来完成此操作。我使用美元符号从值中划分了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美元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)

OR 这是一样的:

=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没有返回任何结果,我还需要返回任何内容。我无法正常使用&#34;正常&#34; 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变为#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)

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

我希望这可以帮助别人。