已解决!!!:
好的 - 这就是我想出的。
为 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)
通过这样做,我可以在细节和页脚中获得我想要的结果。
我希望这可以帮助其他人。