需求是这样的,如1年级有8个班,那么考号编排规则是:第1个班的第一个学生考号为1号,第2个班的第一个学生考号为2号,以此类推。
我现在的办法是导出到excel里面用公式算出考号后,在保存为dbf。确点是 数据库结构 要丢失。
求解决vfp 具体算法。
------解决方案--------------------------------------------------------
这是哪个没事做,坐办公室里捧着茶杯想出来的“方案”?是不是每个班级的人数都一样多?不一样多的话出现空缺怎么办?
不管了,就这样理解了:1-8班依次从1-8号开头,一个班里每个学生的考号相差8,空缺不管
for i=1 to 8
repl all 考号 with i+(学号-1)*8
endf
------解决方案--------------------------------------------------------
可能应当将上面的学号换成班里的顺序号
------解决方案--------------------------------------------------------
VFP的功能真的很强大!就这简单的三行语句就将排考号的问题给解决了。。。
如果将班级号也放在表里,一行语句就解决了。。。
------解决方案--------------------------------------------------------
这其实是一个算法的问题了
无论用啥办法,只要达到:
1)同班的不连
2)同班在同试场的人数尽可能少,座位尽可能远
我给你写一段代码,你参考参考,数据表就用你提供的那个表,只是把表名改成了SCB.dbf
- SQL code
Set Safety OffClose Databases*定义试场坐位号次序串zwh_cx='010711152127030917250513192329021016222604081418243006122028'*设置标准满试场人数scbzrs=30*记录各年级总人数Use scb Alias scb In 0Select scbCount For nj='1' To r1Count For nj='2' To r2Count For nj='3' To r3*计算各年级共需要的试场总数,不同年级不混排scs1=Ceiling(r1/scbzrs)scs2=Ceiling(r2/scbzrs)scs3=Ceiling(r3/scbzrs)*计算各年级尾数试场人数wscrs1=r1-Int(r1/scbzrs)*scbzrswscrs2=r2-Int(r2/scbzrs)*scbzrswscrs3=r3-Int(r3/scbzrs)*scbzrs*建立一个中间表,并利用这个中间表进行编排Create Dbf lsscb (sch c(3),zwh c(2),xxh c(4))*************************************************** lsscb字段说明*sch:三位字符,第一位代表年级,后两位代表试场号 **zwh:两位字符代表座位号 **xxh:第一位代表年级,第二位代表单双号,1单2双 ** 最后两位表示按照坐位号次序串重新生成的顺序 ***************************************************Select lsscbIf r1>0 s=1 z=1 For i=1 To r1 Append Blank If Mod(z,2)=1 Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '11'+Substr(zwh_cx,2*z-1,2) Else Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '12'+Substr(zwh_cx,2*z-1,2) Endif If z<scbzrs z=z+1 Else z=1 s=s+1 Endif EndforEndifIf r2>0 s=1 z=1 For i=1 To r2 Append Blank If Mod(z,2)=1 Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '21'+Substr(zwh_cx,2*z-1,2) Else Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '22'+Substr(zwh_cx,2*z-1,2) Endif If z<scbzrs z=z+1 Else z=1 s=s+1 Endif EndforEndifIf r3>0 s=1 z=1 For i=1 To r3 Append Blank If Mod(z,2)=1 Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '31'+Substr(zwh_cx,2*z-1,2) Else Replace sch With Chrtran('1'+Str(s,2,0),' ','0'),zwh With Chrtran(Str(z,2,0),' ','0'),xxh With '32'+Substr(zwh_cx,2*z-1,2) Endif If z<scbzrs z=z+1 Else z=1 s=s+1 Endif EndforEndifIndex On xxh To lsscbCopy To lsZapAppend From lsSelect scbIndex On nj+bj To scbCopy To lsZapAppend From ls*给scb.dbf增加两个字段If Type("scb.sch")='U' Alter Table scb Add Column sch c(3)EndifIf Type("scb.zwh")='U' Alter Table scb Add Column zwh c(2)ENDIF*将编排的结果更新到scb新增的两个字段中Select lsscbScan jlh=Recno() sc=sch zw=zwh Select scb Go jlh Replace sch With sc,zwh With zw Select lsscbENDSCANSELECT lsscbUSEDELETE FILE lsscb.*SELECT scbINDEX on sch+zwh TO scbCOPY TO lsZAPAPPEND FROM lsDelete File ls.Dbf********************************************生成考号的代码就省略,毕竟考号的规则很多 ********************************************CLOSE DATABASESSet Safety OnReturn
------解决方案--------------------------------------------------------