标题:请大家帮我看下这个程序排准考证的,哪里出错了,排到倒数第二个考时,都会 ...
只看楼主
hjf1218
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2013-1-20
结帖率:78.57%
已结贴  问题点数:10 回复次数:11 
请大家帮我看下这个程序排准考证的,哪里出错了,排到倒数第二个考时,都会丢倒数第二考室后一个号码
请大家帮我看下这个程序排准考证的,哪里出错了,排到倒数第二个考室时,都会丢倒数第二考室后一个号码

例如:排58个考室,第57考室,尾数是5730这个号码就会没掉

程序代码:
GO TOP

 KDRS = RECCOUNT()

 KCS = IIF(INT(KDRS / 30) = KDRS / 30,INT(KDRS / 30),INT(KDRS / 30) + 1)

 WKCRS = KDRS - (KCS - 1) * 30

 BZ = 'f'

 FOR Y = 1 TO 30 STEP 2
    FOR X = KCHS TO KCHS + KCS - 1
       DO CASE 
       CASE X < 10
          KCH = '00' + STR(X,1)
       CASE X >= 10 AND X < 100
          KCH = '0' + STR(X,2)
       CASE X >= 100
          KCH = STR(X,3)
       ENDCASE 
       DO CASE 
       CASE Y < 10
          ZH = '0' + STR(Y,1)
       CASE Y >= 10
          ZH = STR(Y,2)
       ENDCASE 
       REPLACE ZKH WITH '372' +KCH + ZH
       SKIP 
    ENDFOR 
    DO CASE 
    CASE (WKCRS / 2) <> INT(WKCRS / 2)
       IF Y >= WKCRS AND BZ = 'f'
          KCS = KCS - 1
          BZ = 't'
          LOOP 
       ENDIF 
    CASE WKCRS = 30
       IF Y = 29 AND BZ = 'f'
          KCS = KCS - 1
          BZ = 't'
          LOOP 
       ENDIF 
    CASE (WKCRS / 2) = INT(WKCRS / 2)
       IF Y >= WKCRS - 2 AND BZ = 'f'
          KCS = KCS - 1
          BZ = 't'
          LOOP 
       ENDIF 
    ENDCASE 

 ENDFOR 

 BZ = 'f'

 FOR Y = 2 TO 30 STEP 2
    FOR X = KCHS TO KCS + 1 + KCHS - 1
       DO CASE 
       CASE X < 10
          KCH = '00' + STR(X,1)
       CASE X >= 10 AND X < 100
          KCH = '0' + STR(X,2)
       CASE X >= 100
          KCH = STR(X,3)
       ENDCASE 
       DO CASE 
       CASE Y < 10
          ZH = '0' + STR(Y,1)
       CASE Y >= 10
          ZH = STR(Y,2)
       ENDCASE 
       REPLACE ZKH WITH '372' + KCH + ZH
       SKIP 
       IF EOF()
          EXIT 
       ENDIF 
    ENDFOR 
    IF EOF()
       EXIT 
    ENDIF 
    DO CASE 
    CASE WKCRS = 30
       LOOP 
    CASE (WKCRS / 2) <> INT(WKCRS / 2)
       IF Y >= WKCRS - 2 AND BZ = 'f'
          KCS = KCS - 1
          BZ = 't'
          LOOP 
       ENDIF 
    CASE (WKCRS / 2) = INT(WKCRS / 2)
       IF Y >= WKCRS AND BZ = 'f'
          KCS = KCS - 1
          BZ = 't'
          LOOP 
       ENDIF 
    ENDCASE 

 ENDFOR 

 IF WKCRS = 30
    KCHS = KCHS + KCS + 1

 ELSE 
    KCHS = KCHS + KCS + 2

 ENDIF 

 RETURN 
搜索更多相关主题的帖子: 号码 准考证 倒数 
2013-05-20 10:48
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
1.上传数据表
2.排准考证号原则

坚守VFP最后的阵地
2013-05-20 10:54
hjf1218
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2013-1-20
得分:0 
11.rar (520 Bytes)


说明:按bmh表中的字段,第3起,取4位,就是substr(bmh,3,4)这个相同的,认为是同一学校,按这个来排,生成一个临时表,然后写到总表中,

zkh,是生成的准考号,aaaa是随机生成的数字,schoolname,是考点,可以选择多个,另外还有一点,有时候是中间的考室断了,就是有2和4考室,结果没有3考室
2013-05-20 11:13
hjf1218
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2013-1-20
得分:0 
程序代码:
select 3
count for zkh#' ' to zkhc
if  zkhc=reccount()
messagebox("准考号已编排",0+48,"提示")
return
endif
select 2
if reccount()=0
return
endif
if csh=0&&初始化=0
messagebox("请进行初始化操作",0+48,"提示")
return
endif
set safety off
kchs=1&&考场号数,下一考场号数为上一考点考场号数——1
select 2&&中考考点安排库
count for 标识='考点' to kdnum&&考点个数
go top
kd=1
for kd=1 to kdnum step 1
    select 4
    use 准考号生成库
    zap
    select 2
    do while .t.
    if 标识='考点'
        schoolabc=学校名称&&考点名称
    endif
        skip
        codeabc=代码
        select 3&&zkxxk.dbf
        set filter to substr(bmh,3,4)=codeabc
        replace all schoolname with schoolabc&&考点名称
        *rand.prg
        *对该校随机
        set decimals to 0
        go top
        do while .not. eof()
              replace aaaa with rand()*50000
              skip
        enddo
        set decimal to
        sort on aaaa to temp
        select 4&&准考号生成库
        append from temp
        select 2&&考点安排库
        if 标识='考点'.or.eof()
            exit
        endif
    enddo
    select 4&&准考号编排库
    do 准考号生成.prg
    index on bmh tag bmh additive
    select 3
    set filter to 
    update on bmh from d replace zkh with d.zkh
endfor
select 3
index on zkh tag zkh additive
set safety on
messagebox("准考号生成完毕!",0+48,"提示")
2013-05-20 11:16
hjf1218
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2013-1-20
得分:0 
后面的代码是调用前面的准考号生成.prg
2013-05-20 11:22
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:10 
以下是引用hjf1218在2013-5-20 11:13:57的发言:

 
 
说明:按bmh表中的字段,第3起,取4位,就是substr(bmh,3,4)这个相同的,认为是同一学校,按这个来排,生成一个临时表,然后写到总表中,
 
zkh,是生成的准考号,aaaa是随机生成的数字,schoolname,是考点,可以选择多个,另外还有一点,有时候是中间的考室断了,就是有2和4考室,结果没有3考室
不明白

坚守VFP最后的阵地
2013-05-20 11:31
hjf1218
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2013-1-20
得分:0 
这样说吧,我第二次发的代码是,调用第一次代码的,第二次中的确  do 准考号生成.prg  这句话是调用第一次发的代码  我要的结果就是,考室要连的排下去,schoolabc=学校名称&&考点名称,这个名称可以不同,但教室要连的排下去
2013-05-20 11:35
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
每个考生要有个随机号,是这个意思吧
排号容易,关键是你要把排号的原则说清楚。

[ 本帖最后由 sdta 于 2013-5-20 11:41 编辑 ]

坚守VFP最后的阵地
2013-05-20 11:39
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
程序代码:
*排考场简单示例 (VFP9.0CREATE CURSOR T (编号 C(4),考场号 C(2),考生号 C(4),SJH N(10,2))
FOR I=1 TO 1791
    INSERT INTO T (编号) VALUES (PADL(I,4,[0]))
ENDFOR
=RAND(-1)
REPLACE ALL SJH WITH RAND()*1000000
SELECT 编号,考场号,考生号 FROM T ORDER BY SJH INTO CURSOR TT READWRITE
UPDATE TT SET 考场号=PADL(CEILING(RECNO([TT])/30),2,[0]),考生号=PADL(CEILING(RECNO([TT])/30),2,[0])+PADL(IIF(MOD(RECNO([TT]),30)=0,30,INT(MOD(RECNO([TT]),30))),2,[0]) FROM TT
SELECT TT
BROWSE

坚守VFP最后的阵地
2013-05-20 12:09
hjf1218
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2013-1-20
得分:0 
这个不是我写的,我也不是很明白排号的原则,只是拿来用而已,就是想弄明白是什么意思,方便以后自己改
2013-05-21 00:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-407533-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.092096 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved