如何使用 SSRS 中的 LookUpSet 对 Join 函数中的值进行排序?
How to sort values in a Join function with LookUpSet in SSRS?
如何对从 Join 函数中的 LookUpSet 函数返回的值进行排序?
示例数据:
TransNo MasterTran Item Category ModifierLevel
1001000 1001000 ItemA CategoryB 0
1002000 1001000 ItemB CategoryC 1
1003000 1001000 ItemC CategoryC 1
我想得到的最终结果是 "CategoryB ItemB ItemC"。当我使用以下 Join 和 LookUpSet 组合时,我最终得到 "ItemB CategoryB ItemC".
=Join(LookUpSet(Fields!MasterTransNo.Value, Fields!MasterTransNo.Value, Iif(Fields!ModifierLevel.Value > 0, Trim(Fields!ItemDescription.Value), Trim(Fields!CategoryDescription.Value)), "LineItemDetails"), " ")
这是 table 中单元格的表达式。 Row Group 设置为 Group on TransNo,按 TransNo 排序。我尝试了多种不同的方法来对组进行排序,但总是得到相同的结果。
关于如何强制 LookUpSet 中的数据顺序以使其按我想要的顺序加入的任何想法?
我最终通过查看其他问题来解决这个问题,这些问题希望仅从 Join(LookUpSet()) 函数中提取不同的值并对其进行修改。此代码基于 this other SO question 的有用答案。
- 转到报表属性
进入代码编辑器并将以下函数粘贴到自定义代码框中:
Public Function JoinSortAlpha(arr As Object(), delimiter As String) As String
System.Array.Sort(arr)
Dim result As String = String.Empty
For i As Integer = 0 To arr.Length - 1
If Not arr(i) Is Nothing And arr(i) <> String.Empty Then
If result = String.Empty Then
result = arr(i)
Else
result = result + delimiter + arr(i)
End If
End If
Next
Return result End Function
转到您的表达式并通过调用 JoinSortAlpha() 将 Join() 函数替换为您的新函数。我的新表达式如下所示:
=JoinSortAlpha(LookUpSet(Fields!MasterTransNo.Value, Fields!MasterTransNo.Value, Iif(Fields!ModifierLevel.Value > 0, Trim(Fields!ItemDescription.Value), Trim(Fields!CategoryDescription.Value)), "LineItemDetails"), " ")
以下是该函数的功能细分:
- 创建一个名为 JoinSortAlpha 的新函数,它将从表达式中传递值。在这种情况下,来自 LookUpSet() 函数的值。
- 对从函数参数传递的数组进行排序。默认情况下,正是这种类型使其按字母顺序排列。
- 创建一个名为 result 的字符串对象以将最终值传递给。
- 计算数组 arr 并为 arr 数组中包含的每个值将一个值写入结果字符串。数组中的值被赋予一个从 0 开始并递增 1 的数值。在这里,我们告诉数组从数组中的第一个值(0)到数组中的最后一个值继续填充结果字符串由数组的长度减去 1 确定(因为数组从 0 而不是 1 开始)。
- 如果您的 LookUpSet() 函数没有 return 任何值,如果我们没有在这个 JoinSortAlpha 函数中考虑到这一点,SSRS 将显示错误。为了处理任何可能被 return 编辑的空白,我们使用 If 语句来确定字符串是否为空,在这种情况下它只是 return 什么都没有。否则,它将 return 值加上函数末尾的定界符(在我的例子中是 space " ")。
如何对从 Join 函数中的 LookUpSet 函数返回的值进行排序?
示例数据:
TransNo MasterTran Item Category ModifierLevel
1001000 1001000 ItemA CategoryB 0
1002000 1001000 ItemB CategoryC 1
1003000 1001000 ItemC CategoryC 1
我想得到的最终结果是 "CategoryB ItemB ItemC"。当我使用以下 Join 和 LookUpSet 组合时,我最终得到 "ItemB CategoryB ItemC".
=Join(LookUpSet(Fields!MasterTransNo.Value, Fields!MasterTransNo.Value, Iif(Fields!ModifierLevel.Value > 0, Trim(Fields!ItemDescription.Value), Trim(Fields!CategoryDescription.Value)), "LineItemDetails"), " ")
这是 table 中单元格的表达式。 Row Group 设置为 Group on TransNo,按 TransNo 排序。我尝试了多种不同的方法来对组进行排序,但总是得到相同的结果。
关于如何强制 LookUpSet 中的数据顺序以使其按我想要的顺序加入的任何想法?
我最终通过查看其他问题来解决这个问题,这些问题希望仅从 Join(LookUpSet()) 函数中提取不同的值并对其进行修改。此代码基于 this other SO question 的有用答案。
- 转到报表属性
进入代码编辑器并将以下函数粘贴到自定义代码框中:
Public Function JoinSortAlpha(arr As Object(), delimiter As String) As String System.Array.Sort(arr) Dim result As String = String.Empty For i As Integer = 0 To arr.Length - 1 If Not arr(i) Is Nothing And arr(i) <> String.Empty Then If result = String.Empty Then result = arr(i) Else result = result + delimiter + arr(i) End If End If Next Return result End Function
转到您的表达式并通过调用 JoinSortAlpha() 将 Join() 函数替换为您的新函数。我的新表达式如下所示:
=JoinSortAlpha(LookUpSet(Fields!MasterTransNo.Value, Fields!MasterTransNo.Value, Iif(Fields!ModifierLevel.Value > 0, Trim(Fields!ItemDescription.Value), Trim(Fields!CategoryDescription.Value)), "LineItemDetails"), " ")
以下是该函数的功能细分:
- 创建一个名为 JoinSortAlpha 的新函数,它将从表达式中传递值。在这种情况下,来自 LookUpSet() 函数的值。
- 对从函数参数传递的数组进行排序。默认情况下,正是这种类型使其按字母顺序排列。
- 创建一个名为 result 的字符串对象以将最终值传递给。
- 计算数组 arr 并为 arr 数组中包含的每个值将一个值写入结果字符串。数组中的值被赋予一个从 0 开始并递增 1 的数值。在这里,我们告诉数组从数组中的第一个值(0)到数组中的最后一个值继续填充结果字符串由数组的长度减去 1 确定(因为数组从 0 而不是 1 开始)。
- 如果您的 LookUpSet() 函数没有 return 任何值,如果我们没有在这个 JoinSortAlpha 函数中考虑到这一点,SSRS 将显示错误。为了处理任何可能被 return 编辑的空白,我们使用 If 语句来确定字符串是否为空,在这种情况下它只是 return 什么都没有。否则,它将 return 值加上函数末尾的定界符(在我的例子中是 space " ")。