主题:急求VFP中自动排名次代码,并列名次能自动跳过,如1,2,2,4,5,6,7,7,7,10.....
fdxxhjc
[专家分:0] 发布于 2008-01-14 09:45:00
急求VFP中自动排名次代码,并列名次能自动跳过,如1,2,2,4,5,6,7,7,7,10.....
回复列表 (共16个回复)
沙发
homayzh [专家分:7040] 发布于 2008-01-14 11:55:00
记录号 名次 总分
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
板凳
homayzh [专家分:7040] 发布于 2008-01-14 12:00:00
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 楼
岭上有云 [专家分:10] 发布于 2008-01-16 17:29:00
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 楼
zjdragon [专家分:0] 发布于 2009-05-18 17:14:00
请教,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 楼
sywzs [专家分:5650] 发布于 2009-05-19 08:12:00
把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 楼
qjbzjp [专家分:8830] 发布于 2009-05-19 11:01:00
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 楼
zjdragon [专家分:0] 发布于 2009-05-19 14:54:00
多谢sywzs的回复。不好意思,我想表达的是有两个字段需同时判定,不是平均分的意思,如果字段1不同就直接名次加一,如果字段1相同,再判断字段2,都相同就并列,字段2不相同就加一。
名次排列还是1,2,2,3,4,5,5,6,7,7,8,9,9,10.....
请赐教!
8 楼
sywzs [专家分:5650] 发布于 2009-05-21 15:14:00
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 楼
zjdragon [专家分:0] 发布于 2009-05-25 15:06:00
测试结果正确,多谢sywzs.
10 楼
zfh630528 [专家分:130] 发布于 2009-05-25 16:34:00
我来回复