找回密码
 立即注册

QQ登录

只需一步,快速开始

Felix.Li Wyn认证

超级版主

108

主题

2923

帖子

5531

积分

超级版主

Rank: 8Rank: 8

积分
5531

Wyn高级认证Wyn认证

Felix.Li Wyn认证
超级版主   /  发表于:2024-3-18 11:44  /   查看:1729  /  回复:0
本帖最后由 Felix.Li 于 2024-3-18 12:23 编辑

我们做报表的时候,经常遇到需要排名排序的功能。
然而排序功能我们直接用组件自带的就可以,就可以实现字段的排序。但是当我们需要排名的狮虎,就发现没有办法直接做到。因为排名需要获取整组数据。并且有时候数据还是零散的,需要我们先将数据汇总,在做排名。这个就比较难搞。今天就给大家分享一个自定义函数实现排名的功能。这个表达式还需要配合另一个函数来做排名。话不多说,直接上东西。
示例数据:
image.png901416931.png
我们需要根据rankValue的数据来对rankField进行排名。
报表自定义函数教程:点这里
自定义函数:
  1. ''' <function name="GetAggregatedRank">
  2. ''' <culture>
  3. ''' <label>GetAggregatedRank</label>
  4. ''' <syntax>GetAggregatedRank(当前字段,字段数组,排名字段数组)</syntax>
  5. ''' <description>获取字段排名</description>
  6. ''' <example>Code.GetAggregatedRank("field,ToArray(field),ToArray(rankFeilds)")</example>
  7. ''' </culture>
  8. ''' </function>
  9. Public Function GetAggregatedRank(targetId As String, idList As System.Collections.ArrayList, valueList As System.Collections.ArrayList) As Integer

  10.     Dim myIdList As New System.Collections.ArrayList()
  11.     Dim myvalueList As New System.Collections.ArrayList()

  12.     ' Sum up values for each ID
  13.     For i As Integer = 0 To idList.Count - 1
  14.         If myIdList.IndexOf(idList(i)) = -1 Then
  15.             myIdList.Add(idList(i))
  16.             myvalueList.Add(valueList(i))
  17.         Else
  18.             Dim index As Integer = myIdList.IndexOf(idList(i))
  19.             myvalueList(index) += CDbl(valueList(i))
  20.         End If
  21.     Next

  22.     ' Find the index of the target ID
  23.     Dim index1 As Integer = myIdList.IndexOf(targetId)

  24.     If index1 = -1 Then
  25.         Throw New ArgumentException("ID not found in the list")
  26.     End If

  27.     ' Get the sum of the target ID's values
  28.     Dim value As Double = CDbl(myvalueList(index1))

  29.     ' Determine the rank
  30.     Dim rank As Integer = 1
  31.     For Each val As Double In myvalueList
  32.         If val > value Then
  33.             rank += 1
  34.         End If
  35.     Next
  36.    

  37.     Return rank
  38. End Function
复制代码

可以看到,在示例里面出现了这个:Code.GetAggregatedRank(field,ToArray(field,<scope>),ToArray(rankFeilds,<scope>))
也就是ToArray函数,因为在排名过程中,我们不仅要知道当前值,还需要知道当前的数据的一组值以及当前排名字段的数组。所以就不仅仅只传递当前值。
  1. ToArray
  2. 返回包含指定表达式的值的数组。
  3. 语法
  4. ToArray(expression, [scope])
  5. 参数
  6. expression - 用于计算汇总值的表达式
  7. scope - 可选的计算范围
复制代码
我们看一下在报表的实现方法结果吧:
{Code.GetAggregatedRank(rankField, ToArray(rankField, "数据集1"), ToArray(rankValue, "数据集1"))}
实现效果:
image.png641439208.png

实现Demo:
wyn-export-20240318122255.zip (8.82 MB, 下载次数: 587)

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部