Foxtable(狐表)用户栏目专家坐堂 → [求助]如何进行多层次排名?


  共有7723人关注过本帖树形打印复制链接

主题:[求助]如何进行多层次排名?

帅哥哟,离线,有人找我吗?
狐狸爸爸
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/11 11:56:00 [显示全部帖子]

直接在命令窗口执行:

 

For Each zw As String  In DataTables("笔试成绩").GetValues("职位代码")
    Dim drs As List(of DataRow) = DataTables("笔试成绩").Select("职位代码 = '" & zw & "'","总成绩 DESC, 笔试总成绩 DESC,行测成绩 Desc")
    If drs.count > 0 Then
        drs(0)("排名") = 1
        For i As Integer = 1 To drs.count -1
            If drs(i)("总成绩") < drs(i-1)("总成绩") OrElse drs(i)("笔试总成绩") < drs(i-1)("笔试总成绩") OrElse drs(i)("行测成绩") < drs(i-1)("行测成绩") Then
                drs(i)("排名") = i + 1
            Else
                drs(i)("排名") = drs(i-1)("排名")
            End If
        Next
    End If
Next

这个代码针对主表,如果你要针对窗口中的表,改一下表名就行。

[此贴子已经被作者于2013-11-11 12:16:05编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/11 12:07:00 [显示全部帖子]

呵呵,从代码逻辑来说,没有道理会不正确啊

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/11 12:18:00 [显示全部帖子]

这样就对了,忘记加1:

 

For Each zw As String  In DataTables("笔试成绩").GetValues("职位代码")
    Dim drs As List(of DataRow) = DataTables("笔试成绩").Select("职位代码 = '" & zw & "'","总成绩 DESC, 笔试总成绩 DESC,行测成绩 Desc")
    If drs.count > 0 Then
        drs(0)("排名") = 1
        For i As Integer = 1 To drs.count -1
            If drs(i)("总成绩") < drs(i-1)("总成绩") OrElse drs(i)("笔试总成绩") < drs(i-1)("笔试总成绩") OrElse drs(i)("行测成绩") < drs(i-1)("行测成绩") Then
                drs(i)("排名") = i +1
            Else
                drs(i)("排名") = drs(i-1)("排名")
            End If
        Next
    End If
Next


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/11 16:03:00 [显示全部帖子]

用我15楼的代码

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/12 8:30:00 [显示全部帖子]

我测试没事,不过为了可靠,四舍五入后比较:

 

For Each zw As String  In DataTables("笔试成绩").GetValues("职位代码")
    Dim drs As List(of DataRow) = DataTables("笔试成绩").Select("职位代码 = '" & zw & "'","总成绩 DESC, 笔试总成绩 DESC,行测成绩 Desc")
    If drs.count > 0 Then
        drs(0)("排名") = 1
        For i As Integer = 1 To drs.count -1
            If round2(drs(i)("总成绩"),3) < round2(drs(i-1)("总成绩"),3) OrElse round2(drs(i)("笔试总成绩"),3) < round2(drs(i-1)("笔试总成绩"),3) OrElse round2(drs(i)("行测成绩"),3) < round2(drs(i-1)("行测成绩"),3) Then
                drs(i)("排名") = i +1
            Else
                drs(i)("排名") = drs(i-1)("排名")
            End If
        Next
    End If
Next


 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/12 9:35:00 [显示全部帖子]

我测试也没有问题,记得我的代码是直接排序主表的,在主表查看结果:

 


图片点击可在新窗口打开查看此主题相关图片如下:001.jpg
图片点击可在新窗口打开查看

 

为便于比较,你删除排名列原来的数据看看。

[此贴子已经被作者于2013-11-12 9:37:14编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/12 10:26:00 [显示全部帖子]

28楼

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/12 10:38:00 [显示全部帖子]

你有两个排名列,我们计算的是排名,不是面试排名,你不要看错了。

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47448 积分:251060 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/11/12 14:51:00 [显示全部帖子]

标识列可以用逻辑型,排名的代码改为:
 
For Each zw As String  In DataTables("笔试成绩").GetValues("职位代码")
    Dim drs As List(of DataRow) = DataTables("笔试成绩").Select("职位代码 = '" & zw & "'","总成绩 DESC, 笔试总成绩 DESC,行测成绩 Desc")
    If drs.count > 0 Then
        drs(0)("排名") = 1
        drs(0)("标识") = False
        For i As Integer = 1 To drs.count -1
            If drs(i)("总成绩") < drs(i-1)("总成绩") OrElse drs(i)("笔试总成绩") < drs(i-1)("笔试总成绩") OrElse drs(i)("行测成绩") < drs(i-1)("行测成绩") Then
                drs(i)("排名") = i +1
            Else
                drs(i)("排名") = drs(i-1)("排名")
            End If
            If drs(i)("总成绩") = drs(i-1)("总成绩")  Then
                drs(i)("标识") = True
                drs(i-1)("标识") = True
            Else
                drs(i)("标识") = False
            End If
        Next
    End If
Next
 
这样标识列等于True,标识存在相同的总分,DrawCell事件设置为:
 
if e.row("标识")= Tru" then
        if e.col.name="总成绩" then
               e.Style = "样式名"
        end if
end if

 回到顶部