当前位置: 代码迷 >> VFP >> 求编排考号有关问题
  详细解决方案

求编排考号有关问题

热度:5821   发布时间:2013-02-26 00:00:00.0
求编排考号问题
需求是这样的,如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
------解决方案--------------------------------------------------------
  相关解决方案