注册 登录
编程论坛 VFP论坛

根据数值大小(前5名,数值相同排名相同)对数据表中的每条记录的字段名进行动态排序

王咸美 发布于 2025-03-12 10:55, 633 次点击
现有表文件tt.dbf ,对每个学生学科成绩前5名进行排名,并将学科名写入学段pm中。请高手赐教,万分感谢!!!
排名规则:
1、动态排名:字段名可增加或减少,个数不固定;
2、数值相同,排名相同;
3、名次排列:① 1、1、3、4、5
           ② 1、2、2、4、5
           ③ 1、2、3、3、3、6
4、不同名次之间用分号(;)隔开,相同名次之间用顿号(、)隔开。
只有本站会员才能查看附件,请 登录

原始表Tt.dbf格式如下:
只有本站会员才能查看附件,请 登录

结果表格式如下:
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2025-3-12 10:59编辑过]

5 回复
#2
wengjl2025-03-12 13:12
只有本站会员才能查看附件,请 登录

部分已解决,供参考!
#3
王咸美2025-03-12 13:52
谢谢!!!
#4
星光悠蓝2025-03-13 18:13
增加字段测试也可以,是不是这样?
只有本站会员才能查看附件,请 登录

程序代码:
SET TALK OFF
USE d:\tt\tt.dbf
REPLACE PM WITH ''
ZDMC=''
Q1= AFIELDS(TTArray)  && 创建数组。
FOR i = 2 TO Q1-1   
    ZDMC=ZDMC+IIF(i#2,',','')+TTArray(i,1)  && 取字段名列表
ENDFOR
SCAN
    Q1= AFIELDS(TTArray)  && 创建数组。
    DIMENSION ME(Q1-2)
    FOR i = 2 TO Q1-1
       ME(i-1)= TTArray(i,1)  && 赋字段名用于排序
    ENDFOR
    *SCATTER FIELDS 语文,数学,外语,物理,化学,政治,历史,地理,生物,信息,艺术,体育 TO SArray
    SCATTER FIELDS &ZDMC. TO SArray
    FOR i=1 TO Q1-3
        FOR j=1 TO Q1-2-i
            IF SArray(j)<SArray(j+1)
                Mel=SArray(j)
                SArray(j)=SArray(j+1)
                SArray(j+1)=Mel
                Nel=ME(j)
                ME(j)=ME(j+1)
                ME(j+1)=Nel            
            ENDIF
        ENDFOR
    ENDFOR
    ss=1
    AM=ME(1)
    FOR j =1 TO Q1-3
        ss=ss+1
        IF SArray(j)=SArray(j+1)
            AM=AM+"、"+ME(j+1)
        ELSE
            IF ss>5
                EXIT
            ENDIF
            AM=AM+","+ME(j+1)
        ENDIF  
    ENDFOR
    REPLACE PM WITH AM
ENDSCAN
BROWSE


#5
王咸美2025-03-13 21:01
谢谢!!!
#6
nybdx2025-03-27 10:55
这个好
1