本帖最后由 Felix.Li 于 2024-3-18 12:23 编辑
我们做报表的时候,经常遇到需要排名排序的功能。
然而排序功能我们直接用组件自带的就可以,就可以实现字段的排序。但是当我们需要排名的狮虎,就发现没有办法直接做到。因为排名需要获取整组数据。并且有时候数据还是零散的,需要我们先将数据汇总,在做排名。这个就比较难搞。今天就给大家分享一个自定义函数实现排名的功能。这个表达式还需要配合另一个函数来做排名。话不多说,直接上东西。
示例数据:
我们需要根据rankValue的数据来对rankField进行排名。
报表自定义函数教程:点这里
自定义函数:
- ''' <function name="GetAggregatedRank">
- ''' <culture>
- ''' <label>GetAggregatedRank</label>
- ''' <syntax>GetAggregatedRank(当前字段,字段数组,排名字段数组)</syntax>
- ''' <description>获取字段排名</description>
- ''' <example>Code.GetAggregatedRank("field,ToArray(field),ToArray(rankFeilds)")</example>
- ''' </culture>
- ''' </function>
- Public Function GetAggregatedRank(targetId As String, idList As System.Collections.ArrayList, valueList As System.Collections.ArrayList) As Integer
- Dim myIdList As New System.Collections.ArrayList()
- Dim myvalueList As New System.Collections.ArrayList()
- ' Sum up values for each ID
- For i As Integer = 0 To idList.Count - 1
- If myIdList.IndexOf(idList(i)) = -1 Then
- myIdList.Add(idList(i))
- myvalueList.Add(valueList(i))
- Else
- Dim index As Integer = myIdList.IndexOf(idList(i))
- myvalueList(index) += CDbl(valueList(i))
- End If
- Next
- ' Find the index of the target ID
- Dim index1 As Integer = myIdList.IndexOf(targetId)
- If index1 = -1 Then
- Throw New ArgumentException("ID not found in the list")
- End If
- ' Get the sum of the target ID's values
- Dim value As Double = CDbl(myvalueList(index1))
- ' Determine the rank
- Dim rank As Integer = 1
- For Each val As Double In myvalueList
- If val > value Then
- rank += 1
- End If
- Next
-
- Return rank
- End Function
复制代码
可以看到,在示例里面出现了这个:Code.GetAggregatedRank(field,ToArray(field,<scope>),ToArray(rankFeilds,<scope>))
也就是ToArray函数,因为在排名过程中,我们不仅要知道当前值,还需要知道当前的数据的一组值以及当前排名字段的数组。所以就不仅仅只传递当前值。
- ToArray
- 返回包含指定表达式的值的数组。
- 语法
- ToArray(expression, [scope])
- 参数
- expression - 用于计算汇总值的表达式
- scope - 可选的计算范围
复制代码 我们看一下在报表的实现方法结果吧:
{Code.GetAggregatedRank(rankField, ToArray(rankField, "数据集1"), ToArray(rankValue, "数据集1"))}
实现效果:
实现Demo:
wyn-export-20240318122255.zip
(8.82 MB, 下载次数: 587)
|
|