需求是这样的,如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 Off Close Databases *定义试场坐位号次序串 zwh_cx='010711152127030917250513192329021016222604081418243006122028' *设置标准满试场人数 scbzrs=30 *记录各年级总人数 Use scb Alias scb In 0 Select scb Count For nj='1' To r1 Count For nj='2' To r2 Count For nj='3' To r3 *计算各年级共需要的试场总数,不同年级不混排 scs1=Ceiling(r1/scbzrs) scs2=Ceiling(r2/scbzrs) scs3=Ceiling(r3/scbzrs) *计算各年级尾数试场人数 wscrs1=r1-Int(r1/scbzrs)*scbzrs wscrs2=r2-Int(r2/scbzrs)*scbzrs wscrs3=r3-Int(r3/scbzrs)*scbzrs *建立一个中间表,并利用这个中间表进行编排 Create Dbf lsscb (sch c(3),zwh c(2),xxh c(4)) ************************************************** * lsscb字段说明 *sch:三位字符,第一位代表年级,后两位代表试场号 * *zwh:两位字符代表座位号 * *xxh:第一位代表年级,第二位代表单双号,1单2双 * * 最后两位表示按照坐位号次序串重新生成的顺序 * ************************************************** Select lsscb If 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 Endfor Endif If 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 Endfor Endif If 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 Endfor Endif Index On xxh To lsscb Copy To ls Zap Append From ls Select scb Index On nj+bj To scb Copy To ls Zap Append From ls *给scb.dbf增加两个字段 If Type("scb.sch")='U' Alter Table scb Add Column sch c(3) Endif If Type("scb.zwh")='U' Alter Table scb Add Column zwh c(2) ENDIF *将编排的结果更新到scb新增的两个字段中 Select lsscb Scan jlh=Recno() sc=sch zw=zwh Select scb Go jlh Replace sch With sc,zwh With zw Select lsscb ENDSCAN SELECT lsscb USE DELETE FILE lsscb.* SELECT scb INDEX on sch+zwh TO scb COPY TO ls ZAP APPEND FROM ls Delete File ls.Dbf ******************************************* *生成考号的代码就省略,毕竟考号的规则很多 * ******************************************* CLOSE DATABASES Set Safety On Return
------解决方案--------------------