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)
通过这样做,我可以在细节和页脚中得到我想要的结果。
我希望这可以帮助其他人。
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)
通过这样做,我可以在细节和页脚中得到我想要的结果。
我希望这可以帮助其他人。