| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1598 人关注过本帖
标题:根据考场数与每场的人数,求一个VFP程序
只看楼主 加入收藏
wangzhiyi
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:366
专家分:684
注 册:2014-4-9
收藏
得分:0 
程序代码:
set talk off
set safe off
clos all
crea table abc (准考证号 c(20),姓名  c(8),总分 n(6),考场 c(20),rnd n(6),年级 c(6),考号 c(10),类别 c(2))
M_File=GETFILE('xls','学生基本数据')
IF M_File=" " 
   =MESSAGEBOX("请选择待编排考场的学生基本数据文件!",0+48,"提示")
   RETURN
ELSE 
   IF JUSTEXT(M_FILE)#"XLS"  &&获得文件扩展名  
      =MESSAGEBOX("您选择的不是EXCEL文档!",0+48,"提示")
      RETURN
   ENDIF
ENDIF 
myexcel=createobject('excel.application') &&创建一个对象
myexcel.visible=.f.&&不可见
bookexcel=myexcel.workbooks.open(M_File) &&打开指定文件
o_SheetName=myexcel.application.ActiveSheet.Name &&获取当前激活工作表的名称
UsedRange =bookexcel.worksheets(o_SheetName).UsedRange &&返回工作表中可使用的区域,UsedRange表的属性
o_cols=UsedRange.columns.count &&汇总列
IF UsedRange.rows.count<=1 
   =MESSAGEBOX("待导入数据行数太少,请检查!",0+16,"提示")
ELSE 
   DIMENSION ls(UsedRange.rows.count ,o_cols)
   ls=bookexcel.activesheet.usedrange.value
   FOR i=2 TO ALEN(ls,1)
       APPEND BLANK  
       REPLACE 姓名 WITH ls(i,2),年级 WITH ls(i,1)
       IF TYPE("ls(i,3)")='N'
          REPLACE 考号 WITH ALLTRIM(STR(ls(i,3)))
       ELSE
          REPLACE 考号 WITH ls(i,3)
       ENDIF
      [i] IF TYPE("ls(i,4)")='N'
          REPLACE 总分 WITH ls(i,5)
       ELSE
          REPLACE 总分 WITH val(ls(i,5))
       ENDIF
[/i]       IF TYPE("ls(i,5)")='N'
          REPLACE 类别 WITH ALLTRIM(STR(ls(i,5)))
       ELSE
          REPLACE 类别 WITH ls(i,5)
       ENDIF
   ENDFOR
ENDIF 
myexcel.workbooks.close &&关闭工作区
myexcel.quit &&关闭excel
input "每考场人数:" to rs1
sele 1
[i]*scan
*    [color=#FF00FF]REPLACE all rnd with 99999*RAND()[/color]
*ENDSCAN
inde on -1*总分 to rnd1
[/i]kszs=INT(RECCOUNT()/rs1)+1
for i=1 to kszs
    for j=1 to rs1
       [i] zkzh1='6'+subs(年级,1,1)+subs(年级,4,2)+'5'+IIF(i<10,'0'+STR(i,1),STR(i,2))+IIF(j<10,'0'+STR(j,1),STR(j,2))
[/i]        REPLACE 准考证号 with zkzh1,考场 with IIF(i<10,'0'+STR(i,1),STR(i,2))
        if !eof()
           skip
        ELSE
           return
        ENDIF
    endf
endf
copy TO d:\考场安排 type xls fiel 准考证号,姓名,考场
不考虑美观的情况下,做了一个程序,不知道能不能达到你的目的。看了楼主对于考号的解释后修改部分内容(斜体部分)。

[ 本帖最后由 wangzhiyi 于 2015-3-17 14:58 编辑 ]
2015-03-16 15:08
by1314by1314
Rank: 1
等 级:新手上路
帖 子:5
专家分:3
注 册:2015-3-15
收藏
得分:3 
    楼主的意思是不是:根据人数和考场数,自动分配考场并自动生成学生考号.并生成表格.
2015-03-16 15:26
rqyys289
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-3-16
收藏
得分:0 
从EXCEL表中可以看出考号共9位数,如考号:"610651732"
从该考号中如何区分年级、考场号、学生考号,它们各是几位数字
猜测如下:
年级:61065(这个年级可以为其他的,可以是201406或201506等等)
考场号:17
学生考号:32
考号应该是:年级+两位的考场号+学生的考号
这是高中的学生,为月考准备的考号!没有专业什么的。

请大家帮忙,谢谢了!
2015-03-17 08:36
rqyys289
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-3-16
收藏
得分:0 
谢谢wangzhiyi!要求是:根据总分成绩编完考场(30个场,变量)、考号(每场35人,变量)后,自动生成考号,年级:61065(这个年级可以为其他的,可以是201406或201506等等)
考场号:17
学生考号:32
考号应该是:年级+两位的考场号+学生的考号
2015-03-17 08:50
rqyys289
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2015-3-16
收藏
得分:0 
实例表中的考号( 14-03  高暄暄    610350729  476 )6103是指14级03班,5是我们学校代码,0729是指第7场29号;( 14-05  郭首富    610550534  467 )6105是指14级05班,5是我们学校代码,0534是指第5场34号,这些考号要自动生成,请高手指点,谢谢!

2015-03-17 08:55
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2197
专家分:3838
注 册:2007-4-27
收藏
得分:3 
每个试场的人数不一样也是可以排的。只要在一个表上设置好考场数,并输入每个试场的可排人数。然后对表进行循环,编制考号。就会是每个考场人数是任意的。

只求每天有一丁点儿的进步就可以了
2015-03-17 10:18
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9805
专家分:26913
注 册:2012-2-5
收藏
得分:3 
程序代码:
Close Databases
Import From 实例表.XLS Type XL5
Use 实例表
Select 实例表
* 保存第一条记录中的字段名
Scatter To Azdm 

* 删除第一条记录
Delete For Recno()=1
Pack

* 更换字段名
For lnI=1 To Fcount()
    Alter Table 实例表 Rename Column (Field(lnI)) To (Alltrim(Azdm[lnI]))
EndFor
* 按班级字段排序生成一个新表
Sort To Sckh On (Azdm[1])
Use In 实例表

Use Sckh In 0
Select Sckh 
* 添加一个字段名(Kh),保存实际生成的考号
If Type("Sckh.Kh")=="U"
    Alter Table Sckh Add Kh C(9)
EndIf
Local Rs
Rs=35 && 一个考场35人

Replace All Kh With "61"+Right(Alltrim(Evaluate(Azdm)),2)+"5"+Padl(Ceiling(Recno()/Rs),2,"0")+Padl(Iif(Mod(Recno(),Rs)=0,Rs,Mod(Recno(),Rs)),2,"0")
Browse

说明
* 班级号:Right(Alltrim(Evaluate(Azdm)),2)
* 考场号:Padl(Ceiling(Recno()/Rs),2,"0")
* 考生号:Padl(Iif(Mod(Recno(),Rs)=0,Rs,Mod(Recno(),Rs)),2,"0")


[ 本帖最后由 sdta 于 2015-3-17 10:45 编辑 ]

坚守VFP最后的阵地
2015-03-17 10:19
gbox23
Rank: 1
等 级:新手上路
帖 子:22
专家分:3
注 册:2015-3-17
收藏
得分:3 
路过
2015-03-17 10:59
kinvanhon
Rank: 5Rank: 5
来 自:战争学院
等 级:贵宾
威 望:16
帖 子:99
专家分:258
注 册:2014-10-7
收藏
得分:0 
大概逻辑就是学生总数除以30的余数大于25,则每个考场都是30人。反之考场人数分为30人和35人两种(你说的变量)。为了尽量避免同一班的人在同一考场,添加了随机数辅助字段。(还存在一个一般不太可能出现的逻辑错误)
新手敲的渣代码,各位高手勿喷,人也比较懒,没写注释。
程序代码:
CLOSE TABLES
SET TALK OFF
SET SAFETY OFF
USE student IN 1
SELECT 1
ALTER table student ADD n int
replace n WITH ROUND(rand()*100000,0) IN 1
aa=RECCOUNT()
bb=aa%30
cc=INT(aa/30)
IF bb>25
    cc=cc+1
    SELECT a,b,c FROM student ORDER BY n INTO CURSOR temp1 READWRITE
    SELECT *,RECNO() as f FROM temp1 INTO CURSOR temp READWRITE
    FOR i=1 TO cc
        SELECT temp
        replace c WITH '61'+SUBSTR(ALLTRIM(a),4,2)+'5'+PADL(i,2,'0')+PADL(RECNO()%30,2,'0') FOR f>(i-1)*30 AND f<=i*30 IN temp
        replace c WITH '61'+SUBSTR(ALLTRIM(a),4,2)+'5'+PADL(i,2,'0')+'30' FOR SUBSTR(c,8,2)=='00' AND f=i*30 IN temp
    ENDFOR
    COPY TO student TYPE xl5
ELSE
    IF bb%5=0
        dd=INT(bb/5)
    ELSE
        dd=INT(bb/5)+1
    ENDIF
    cc=cc-dd
    SELECT a,b,c FROM student ORDER BY n INTO CURSOR temp1 READWRITE
    SELECT *,RECNO() as f FROM temp1 INTO CURSOR temp READWRITE
    SELECT temp
    FOR i=1 TO cc
        replace c WITH '61'+SUBSTR(ALLTRIM(a),4,2)+'5'+PADL(i,2,'0')+PADL(RECNO()%30,2,'0') FOR f>(i-1)*30 AND f <= i*30 IN temp
        replace c WITH '61'+SUBSTR(ALLTRIM(a),4,2)+'5'+PADL(i,2,'0')+'30' FOR SUBSTR(c,8,2)=='00' AND f=i*30 IN temp
    ENDFOR
    FOR j=1 TO dd
        replace c WITH '61'+SUBSTR(ALLTRIM(a),4,2)+'5'+PADL(j+cc,2,'0')+PADL((RECNO()-cc*30)%35,2,'0') FOR f>cc*30+(j-1)*35 AND f<=cc*30+j*35 IN temp
        replace c WITH '61'+SUBSTR(ALLTRIM(a),4,2)+'5'+PADL(j+cc,2,'0')+'35' FOR SUBSTR(c,8,2)=='00' AND f=cc*30+j*35 IN temp
    ENDFOR
    COPY TO student TYPE xl5
ENDIF
    
2015-03-17 13:01
wangzhiyi
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:34
帖 子:366
专家分:684
注 册:2014-4-9
收藏
得分:0 
以下是引用rqyys289在2015-3-17 08:50:24的发言:

谢谢wangzhiyi!要求是:根据总分成绩编完考场(30个场,变量)、考号(每场35人,变量)后,自动生成考号,年级:61065(这个年级可以为其他的,可以是201406或201506等等)
考场号:17
学生考号:32
考号应该是:年级+两位的考场号+学生的考号
考场的个数应该是根据你的学生总数和每场人数来定的,不可能是使用变量吧。还有你这考号中的年级编码好象没多大意思吧。班级14-03到了考号中14年好象就没什么体现,个人觉得14-03到了考号中应该是6403吧
2015-03-17 14:46
快速回复:根据考场数与每场的人数,求一个VFP程序
数据加载中...
 
   



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

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