报表排名函数
本帖最后由 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, )
参数
expression - 用于计算汇总值的表达式
scope - 可选的计算范围我们看一下在报表的实现方法结果吧:
{Code.GetAggregatedRank(rankField, ToArray(rankField, "数据集1"), ToArray(rankValue, "数据集1"))}
实现效果:
实现Demo:
页:
[1]