| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 498 人关注过本帖
标题:学生各科成绩排名代码的讨论
收藏  订阅  推荐  打印 
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14
学生各科成绩排名代码的讨论

*我把学生成绩排名程序代码帖出来,供参考(只需稍加修改,就可以排名所有科目成绩)。希望有高手能用更简便高效的SQL查询替代。

*数据表student有字段:准考证号,sx,yw,yy,wl,hx(数学、语文、英语、物理、化学),sxmc,ywmc,yymc,wlmc,hxmc(各科相应名次)
*各科排名完成后,最终得到PMK.DBF
IF !USED("student")
    USE student
ENDIF
COPY TO pmk
USE in student
FOR ii=1 to 5
    USE pmk
    km=SUBSTR("sxywyyhxwl",2*ii-1,2) &&科名
    zfs=km-"mc"  &&各科名次
    SORT  ON &km /D to studentpm
    USE studentpm
    REPLACE all &zfs with RECNO()
    DO dpm    with km,zfs
    COPY TO pmk
    BROWSE fields &km,语文名次,&zfs,数学名次,英语名次,物理名次,化学名次
    use
NEXT
retu
PROCEDURE dpm
    PARAMETER cj,pm
n=0
nbak=0
cjbak=0
GO top
FOR i=1 to RECCOUNT()
    n=IIF(&cj=cjbak,n,i)
    REPLACE &pm with n
    cjbak=&cj
    nbak=n
    skip
next
ENDPROC

[ 本帖最后由 qjbzjp 于 2008-9-26 13:39 编辑 ]
搜索更多相关主题的帖子: 学生  代码  排名  
2008-9-22 15:51
Tiger5392
Rank: 12Rank: 12Rank: 12
等级:版主
威望:44
帖子:2011
积分:21496
注册:2006-5-17

试建议:(1)用Index命令代替Sort命令;(2)m.km=Field(ii+1)取出科目字段名,m.mc=Field(ii+6)取出对应名次字段名;(3)连续名次或间断名次考虑其一

感言:学以致用。 博客:http://www.bc-cn.net/blog/user14/65009/index.shtml email:Tiger5392@tom.com
2008-9-22 15:58
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14

我试过许多方法,也用过将A数据表文件 index on ....to X, 然后Copy to B文件,将B文件排序结果放入到B文件的字段中。然后试过许多网上发的关于SQL语句、UPdate、Scan等,但没办法将这个排序结果字段更新到A文件中了,所以用了DOS下常用的笨办法来达到目的。
2008-9-22 21:18
ibmlang_002
Rank: 12Rank: 12Rank: 12
来自:浙江-嘉兴
等级:版主
威望:6
帖子:304
积分:3735
注册:2008-8-30

alter table A add column 排序 n(4)
update A set a.排序=B.排序 from b where a.姓名=b.姓名

谁说VFP没用
2008-9-23 07:42
Tiger5392
Rank: 12Rank: 12Rank: 12
等级:版主
威望:44
帖子:2011
积分:21496
注册:2006-5-17

Set Safety Off
Close All
Use cj1
For ii=1 To 5
  c科目=Field(m.ii+1)
  c名次=Field(m.ii+6)
  Index on -&c科目 Tag Temp
  Go Top
  n成绩=&c科目
  nIndex=1
  nOrder=1
  Scan
    If n成绩#&c科目
      nIndex=nOrder
    EndIf
    nOrder=nOrder+1
    Replace &c名次 With nIndex
  EndScan
EndFor
set index to
Browse

感言:学以致用。 博客:http://www.bc-cn.net/blog/user14/65009/index.shtml email:Tiger5392@tom.com
2008-9-23 09:14
Tiger5392
Rank: 12Rank: 12Rank: 12
等级:版主
威望:44
帖子:2011
积分:21496
注册:2006-5-17

上述程序所用的表结构可能是这样的:姓名,5个科目的成绩,5个科目的名次

感言:学以致用。 博客:http://www.bc-cn.net/blog/user14/65009/index.shtml email:Tiger5392@tom.com
2008-9-23 15:13
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14

三楼ibmlang_002的代码,运行时提示错误,去掉“ from b ”后,可以运行,但“a.排序”字段中置换了相同的数据。
以往我见到的排序代码,理论上应该没有问题,但实际运行总有问题,大多是字段中置换了同一个数据,又找不到问题所在。

四楼Tiger5392 的代码非常简练,排序正确。如果再把同分者并列名次考虑进去就更好了。

[ 本帖最后由 qjbzjp 于 2008-9-24 09:42 编辑 ]
2008-9-23 21:18
ibmlang_002
Rank: 12Rank: 12Rank: 12
来自:浙江-嘉兴
等级:版主
威望:6
帖子:304
积分:3735
注册:2008-8-30

qjbzjp 在 2008-9-23 21:18 的发言:

三楼ibmlang_002的代码,运行时提示错误,去掉“ form b ”后,可以运行,但“a.排序”字段中置换了相同的数据。
以往我见到的排序代码,理论上应该没有问题,但实际运行总有问题,大多是字段中置换了同一个数据,又 ...
你的什么版本?我在7.0上可以运行,结果正确。

谁说VFP没用
2008-9-24 07:35
qjbzjp
Rank: 12Rank: 12Rank: 12
来自: 山西
等级:版主
威望:6
帖子:281
积分:3843
注册:2007-3-14

我查了一下,三楼的代码应该没问题,而是版本问题。
我用的是8.0版VF,在帮助文件中UPDATE - SQL 命令中确实没有…from …
但9.0版就有了。
只不过搞不明白的是,7.0版有…from …,8.0版怎么会没有?一头雾水……
2008-9-24 10:23
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.056796 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved