同分同名次示例
程序代码:
* VFP9代码 SET SAFETY OFF SET COLLATE TO "MACHINE" =SYS(3099,70) cStr="班级,总分,语文,数学,英语,物理,化学,生物,历史,地理,政治" =ALINES(azdm,cStr,",") nbj=50 CREATE CURSOR cj (bjh c(2),xh c(6),km c(4),kmbh n(2),cj n(4)) && bjh:班级编号,xh:学号,km:科目,kmbh:科目编号 排序时用 * 生成测试数据 =RAND(-1) FOR i=1 TO nbj && 班级 FOR ii=3 TO ALEN(azdm,1) && 科目 FOR iii=1 TO 60 && 每个班60人 INSERT INTO cj VALUES (PADL(i,2,"0"),PADL(i,2,"0")+PADL(iii,4,"0"),azdm[ii],ii-1,RAND()*IIF(BETWEEN(ii,3,5),150,60)) ENDFOR ENDFOR ENDFOR *!* 数据处理 t1=SECONDS() SELECT *,0000 bjmc,00000 njmc FROM cj ORDER BY bjh,kmbh,cj DESC INTO CURSOR mc READWRITE *!* 按照bjh、kmbh排班级名次 nbj="" && 记录班级号 ckm="" && 记录km(科目)名称 mc=1 && 记录班级名次 ncj=0 && 记录上条记录的cj nrs=1 && 记录班级单科人数 *BROWSE SCAN IF bjh!=nbj STORE 1 TO nrs,mc ELSE IF km!=ckm STORE 1 TO nrs,mc ENDIF IF cj!=ncj mc=nrs ENDIF ENDIF REPLACE bjmc WITH mc nrs=nrs+1 ncj=cj nbj=bjh ckm=km ENDSCAN *BROWSE *!* 按照km(科目)、cj(成绩)排年级名次 INDEX ON km+str(cj) Tag px descending mc=0 && 记录KM年级名次 ncj=0 && 记录上条记录成绩 nrs=1 && 记录单科科目的人数 ckm="" && 记录上条记录的科目 SCAN IF km!=ckm STORE 1 TO nrs,mc ELSE IF cj!=ncj mc=nrs ENDIF ENDIF REPLACE njmc WITH mc nrs=nrs+1 ncj=cj ckm=km ENDSCAN SET ORDER TO MESSAGEBOX(TRANSFORM(RECCOUNT("mc"))+" 条记录共运行:"+TRANSFORM(SECONDS()-t1)+"秒") GO TOP BROWSE