作者在 2015-03-19 19:30:35 发布以下内容
Clear
Clear All
Close Databases
Set Collate To "MACHINE"
T1=Seconds()
Local Akm[6]
Akm[1]="语文"
Akm[2]="数学"
Akm[3]="英语"
Akm[4]="物理"
Akm[5]="化学"
Akm[6]="总成绩"
Use Cjb In 0
Create Cursor 前N名 (准考证号 C (10),语文 N(6),数学 N(6),英语 N(6),物理 N(6),化学 N(6),总成绩 N(6))
Append From Cjb Fields 准考证号
Index On 准考证号 Tag Zkzh
Select Cjb
For lnI=1 To Alen(Akm,1)
Sort To Tkmb On &Akm[lnI] /D Fields 准考证号,(Akm[lnI])
Select 0
Use Tkmb
Select Tkmb
If Type("Tkmb.Mc")="U"
Alter Table Tkmb Add Mc N(6)
EndIf
Go Top
lnMc=1
lnCj=Evaluate(Akm[lnI])
Scan
Replace Mc With Iif(Evaluate(Akm[lnI])=lnCj,lnMc,Recno()) && 相同成绩名次相同,如:12245558
lnMc=Mc
lnCj=Evaluate(Akm[lnI])
EndScan
Set Relation To 准考证号 Into 前N名
Scan
If Found("前N名")
Replace (Akm[lnI]) With Tkmb.Mc In 前N名
EndIf
EndScan
Use In Tkmb
Select Cjb
EndFor
MessageBox(Transform(Seconds()-T1))
lnNum=200 && 前N名,查询所有课程名次都在N名前的记录
Select * From 前N名 Where 语文<=lnNum and 数学<=lnNum and 英语<=lnNum and 物理<=lnNum and 化学<=lnNum and 总成绩<=lnNum
Close Databases
Clear All
Erase Tkmb.Dbf
方法二(合理利用VFP中的SQL命令,代码简洁易懂,运行时间较前一种方法有所减少,仅0.7秒左右)
T1=Seconds()
Local Akm[6]
Akm[1]="语文"
Akm[2]="数学"
Akm[3]="英语"
Akm[4]="物理"
Akm[5]="化学"
Akm[6]="总成绩"
Select 准考证号,语文,数学,英语,物理,化学,总成绩,000000 语文名次,000000 数学名次,000000 英语名次,000000 物理名次,000000 化学名次,000000 总成绩名次 From Cjb Into Cursor Tcjb READWRITE
For lnI=1 To Alen(Akm,1)
Index On &Akm[lnI] Tag Km Descending
Go Top
lnMc=1
lnCj=Evaluate(Akm[lnI])
lnCnt=0 && 记录名次情况
Scan
lnCnt=lnCnt+1
If !Evaluate(Akm[lnI])=lnCj
lnMc=lnCnt
EndIf
Replace (Akm[lnI]+"名次") With lnMc && 相同成绩名次相同,如:12245558
lnMc=Evaluate(Akm[lnI]+"名次")
lnCj=Evaluate(Akm[lnI])
EndScan
EndFor
MessageBox(Transform(Seconds()-T1))
Go Top
Browse
Close Databases