回 帖 发 新 帖 刷新版面

主题:急求VFP中自动排名次代码,并列名次能自动跳过,如1,2,2,4,5,6,7,7,7,10.....

急求VFP中自动排名次代码,并列名次能自动跳过,如1,2,2,4,5,6,7,7,7,10.....

回复列表 (共16个回复)

沙发

记录号             名次            总分
        1                1              96
        2                2              90
        3                3              78
       13                4              71
        8                5              68
       12                5              68
       14                5              68
        4                8              65
       16                8              65
        9               10              62
        5               11              59
        7               11              59
       10               11              59
        6               14              56
       11               14              56
       15               14              56
************
USE 表文件名
INDEX on -总分 TO sy_zf
GO TOP 
n名次 = 1
n总分 = 0
DO whil !EOF()
    IF n总分 = 表文件名.总分 
        REPLACE 表文件名.名次 WITH yzh_mc
    ELSE
        REPLACE 表文件名.名次 WITH n名次
    ENDIF 
    yzh_mc = 表文件名.名次
    n总分 = 表文件名.总分
    n名次 = n名次 +1
    SKIP
ENDDO 


板凳

USE 表文件名 &&打开文件 
INDEX on -总分 TO sy_zf  &&总分从大到小排列
GO TOP &&定位到第一第
n名次 = 1 &&名次,记号,从1 到 N 不重复
n总分 = 0 &&用来存上一条记录的总分,
DO whil !EOF()
    IF n总分 = 表文件名.总分 &&判断与上一条的总分是否一样
        REPLACE 表文件名.名次 WITH yzh_mc &&如果一样,用上次条记录的名次 替换这条记录的名次
    ELSE
        REPLACE 表文件名.名次 WITH n名次  &&否则 用 '名次,记号,从1 到 N 不重复' 来替换
    ENDIF 
    yzh_mc = 表文件名.名次 &&存下这条记录的名次,
    n总分 = 表文件名.总分  &&和总分 ,用于下条记录的判断
    n名次 = n名次 +1 &&'名次,记号,从1 到 N 不重复'  +1
    SKIP &&下一条
ENDDO

3 楼

accept "请输入要处理的表名:" to yuan
accept "请输入要保存的文件名:" to wj

sele 2
use &yuan
SORT to &wj on zf /d
CLOSE ALL

SELECT 1
use &wj 

GO top 
f=1
m=1

do while !EOF()

IF zf=f then
REPLACE mc with m
ELSE 
replace mc with RECNO()
ENDIF
f=zf
m=mc
skip
ENDDO

CLOSE ALL

4 楼

请教,VFP中自动排名次代码,两个字段同时判定并列名次能自动跳过,如1,2,2,3,4,5,5,6,7,7,8,9,9,10.....
怎么处理?谢谢!
例如:
记录号             名次            总分         平均分
        1                1              96         95
        2                2              90         90
        3                3              78         75
       13                4              71         70
        8                5              68         65
       12                5              68         65
       14                6              68         63
        4                7              65         62
       16                7              65         62   
        9                8              62         61
        5                9              59         58
        7                9              59         58
       10               10              59         57
       

5 楼

把1楼的代码稍作修改。 

USE 表文件名
INDEX ON -总分 TO sy_zf
GO TOP
I=1
n名次 = 1
n总分 = 表文件名.总分
DO WHIL !EOF()
    IF n总分 <> 表文件名.总分
        n总分 = 表文件名.总分
        n名次 = I
    ENDIF
    REPLACE 表文件名.名次 WITH n名次
    I=I+1
    SKIP
ENDDO

******************

4楼提出的总分和平均分,其实是一码事,只不过是倍数关系,不可能出现总分相同而平均分不同的情况。

6 楼

n=0
cjbak=200
USE 表
INDEX ON 总分 to cj
SET ORDER TO 总分 DESCENDING
GO top
FOR i=1 to RECCOUNT()
    REPLACE pm with IIF(总分=cjbak,n,i)
    cjbak=总分
    n=pm
    skip
NEXT

7 楼

多谢sywzs的回复。不好意思,我想表达的是有两个字段需同时判定,不是平均分的意思,如果字段1不同就直接名次加一,如果字段1相同,再判断字段2,都相同就并列,字段2不相同就加一。
名次排列还是1,2,2,3,4,5,5,6,7,7,8,9,9,10.....
请赐教!

8 楼

7楼,看看是否你要的结果。

SET SAFE OFF
SELE A
USE 表文件名
INDEX ON  -平均分 TO SY_PJF
GO TOP
COPY TO ARRAY ARR
CREATE CURSOR ABC(记录号 n(4),名次 N(4),总分 N(4),平均分 N(4)) &&此表结构必须与 "表文件名.DBF" 的表结构和顺序相同
SELE ABC
APPEND FROM ARRAY ARR
INDEX ON -总分 TO SY_ZF
I=1
GO TOP
n总分 = 总分
n分 = 平均分
DO WHIL !EOF()
    IF n总分 <> 总分 OR n分 <> 平均分
        n总分 = 总分
        n分 = 平均分
        I = I + 1
    ENDIF
    REPLACE 名次 WITH I
    SKIP
ENDDO
GO TOP
DO WHIL !EOF()
    n总分 = 总分
    n分 = 平均分
    n名次=名次
    SELE A
    REPLACE 名次 WITH n名次 FOR 总分 = n总分 AND 平均分 = n分
    SELE ABC
    SKIP
ENDDO
USE

9 楼

测试结果正确,多谢sywzs.

10 楼


我来回复

您尚未登录,请登录后再回复。点此登录或注册