VFP中成绩排名前N名问题

作者在 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 





数据表问题 | 阅读 3356 次
文章评论,共0条
游客请输入验证码
浏览406180次