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的经验。
答案 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)
通过这样做,我可以得到我在细节中所得到的结果。页脚。
我希望这可以帮助别人。