Felix.Li 发表于 2024-3-18 11:44:23

报表排名函数

本帖最后由 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]
查看完整版本: 报表排名函数