易表在线答疑技术与交流用户社区 → [求助]loop 公式应用问题


  共有6865人关注过本帖树形打印复制链接

主题:[求助]loop 公式应用问题

帅哥哟,离线,有人找我吗?
jdw814520
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:189 积分:1100 威望:0 精华:0 注册:2006/10/15 14:22:00
[求助]loop 公式应用问题  发帖心情 Post By:2013/8/5 14:18:00 [只看该作者]

怎样将这个公式用Loop重复运算,直到 cell(row,""班级"")=cell(row-1,""班级"")不成立为止:        EvalFor(GridName,"p","if(row=firstrow,1,if(cell(row,""班级"")=cell(row-1,""班级""),cell(row-1,col)-1.1,row))","姓名", ">=" ,"") And SortCol("p",1)

 

谢谢大家帮帮忙。


 回到顶部
帅哥哟,离线,有人找我吗?
jdw814520
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:189 积分:1100 威望:0 精华:0 注册:2006/10/15 14:22:00
  发帖心情 Post By:2013/8/5 15:10:00 [只看该作者]

这个公式怎么不运行呀!   EvalFor(GridName,"考号","") And EvalFor(GridName,"考室","")And SortCol("总分",2) And Loop("cell(row,""班级"")=cell(row-1,""班级"")","DelRow(GridName,""p"") And  EvalFor(GridName,""p"",""if(row=firstrow,1,if(cell(row,""""班级"""")=cell(row-1,""""班级""""),cell(row-1,col)-1.1,row))"") And SortCol(""p"",1) And DelRow(GridName,""k"") And EvalFor(GridName,""k"",""if(row=firstrow,1,if(cell(row,""""班级"""")=cell(row-1,""""班级""""),cell(row-1,col)-1.2,row))"") And SortCol(""k"",1)",100)

 回到顶部
帅哥哟,离线,有人找我吗?
wjq1072
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:16190 积分:125850 威望:1 精华:0 注册:2006/8/12 12:29:00
  发帖心情 Post By:2013/8/5 15:16:00 [只看该作者]

学校考试要自动随机安排考场座位通常会提出两个要求:
1、同一年级统一随机排考场、座位;
2、同一考场相邻座位不能为同一班级学生。
随机排考场、座位比较容易,相邻座位不同班不容易。现提出解决思路:
1、按年级排序,每个年级产生一个随机数码,对这个数码按年级重新排序。
这样每个年级的所有班级、学生就随机排列了,但是免不了会出现相邻座位的学生为同班。
2、所以必须判断并找出同班相邻座位的学生,再次重排。
3、反复(1、2步骤)直至没有同班相邻。
在易表中如何实现?(表中有:年级、班级、座位等列)
1、增加(临时辅助)一字符列k,用于产生“随机数”;
2、增加(临时辅助)一逻辑列p,用于判断“相邻同班”。
下面通过按钮公式来实现以上要求。

首先:
SortCol("年级",1)-------------------按年级排序
AddCol(Grid,"k",0, False )----------增加一字符列k
AddCol(Grid,"p",3, False )----------增加一逻辑列p

第一步(对01年级):
EvalFor(Grid,"p","-1","年级","=","01")------对p列01年级的行赋值-1

1、EvalFor(Grid,"k","Rand(1)","p","=",-1)------对k列p等于-1的行赋予0-1的随机数
2、EvalFor(Grid,"k","10","年级","<>","01")-----对k列不等于01年级的行赋值10
这样对k列重新排序时就只针对01年级进行。
3、SortCol("k",1)------------------------------对k列01年级部分重新排序
4、EvalFor(Grid,"p","Cell(Row,""班级"")=Cell(Row-1,""班级"")","年级","=","01")----判断01年级同班相邻p就为-1

第二步
使用Loop()函数循环执行第一步中的1、2、3、4、直到01年级相邻不同班为止。
Loop("MinFor(Grid,""p"")=-1", "1 And 2 And 3 And 4",100)------循环条件为p列存在-1;最多循环100次

第三步
得到(01年级):
EvalFor(Grid,"p","-1","年级","=","01") And
Loop("MinFor(Grid,""p"")=-1", "EvalFor(Grid,""k"",""Rand(1)"",""p"",""="",-1) And EvalFor(Grid,""k"",""10"",""年级"",""<>"",""01"") And SortCol(""k"",1) And EvalFor(Grid,""p"",""Cell(Row,""""班级"""")=Cell(Row-1,""""班级"""")"",""年级"",""="",""01"")",100)

第四步
为了得到自动的动态对多个年级进行以上的循环判断,就需要使用一番三Eval()函数了。
Eval("EvalFor(Grid,""p"",""-1"",""年级"",""="","""+Substitute(Substitute(Substitute(Eval("Substitute(""|@|#|"",""|"","""+Substitute(ListFor(Grid,"年级",1),"|",""")+""|""+Substitute(""|@|#|"",""|"",""")+""")"),"@",""") And Loop(""MinFor(Grid,""""p"""")=-1"", ""EvalFor(Grid,""""k"""",""""Rand(1)"""",""""p"""",""""="""",-1) And EvalFor(Grid,""""k"""",""""10"""",""""年级"""",""""<>"""","""""),"#",""""") And SortCol(""""k"""",1) And EvalFor(Grid,""""p"""",""""Cell(Row,""""""""班级"""""""")=Cell(Row-1,""""""""班级"""""""")"""",""""年级"""",""""="""","""""),"|",""""")"",100) And EvalFor(Grid,""p"",""-1"",""年级"",""="",""")+""""")"",100)") And SortCol("年级",1)

到此所有年级都已经按年级排好座位(相邻不同班)

第五步
接下来就是如何按年级、班级的人数分配考场。(再利用k列)
EvalFor(Grid,"k","Concat([年级],[班级],""班教室\"",Text(CountFor(Grid,""年级"",""="",[年级],""班级"",""="",[班级])))")-----

计算出年级、班级、人数(如:01年级01班教室\55)
1、分配01年级01班级55人教室为一个考场;
EvalFor(Grid,"考室","")----------------------清空考室列

EvalFor(Grid,"考室","""01年级01班教室""",1,55)-------将"01年级01班教室"写入考室列1-55行
再SortCol(""考室"",1)-------------------------------考室列排序,把"01年级02班教室"放置最上面
EvalFor(Grid,"考室","""01年级02班教室""",1,58)-------将"01年级02班教室"写入考室列1-58行
再SortCol(""考室"",1)-------------------------------考室列排序,把"01年级03班教室"放置最上面

--------
第六步
为了得到自动的动态对多个年级多个班级进行按年级、班级的人数分配考场,就需要使用一番二Eval()函数了。
得到:
Eval("EvalFor(Grid,""考室"","""""""+Substitute(Substitute(ListFor(Grid,"k",1),"\",""""""",1,"),"|",") And SortCol(""考室"",1) And EvalFor(Grid,""考室"",""""""")+") And SortCol(""考室"",1)")

第七步
SortCol("年级",1)---------------按年级排序
EvalFor(Grid,"考室号","Left(GetPY([考室]),4)+Right(""000""+Text(CountFor(Grid,""考室"",""="",[考室],1,Row)),3)")------
----按年级、班级写入考室号
EvalFor(Grid,"准考证号","Concat(Left(GetPY([考室]),4),""KC"",Format(Row,""0000""))")------写入准考证号
DeleteCol(GridName,"p")------删除临时列
DeleteCol(GridName,"k")------删除临时列

最后按钮公式:
SortCol("年级",1) And
AddCol(Grid,"k",0, False ) And
AddCol(Grid,"p",3, False ) And
Eval("EvalFor(Grid,""p"",""-1"",""年级"",""="","""+Substitute(Substitute(Substitute(Eval("Substitute(""|@|#|"",""|"","""+Substitute(ListFor(Grid,"年级",1),"|",""")+""|""+Substitute(""|@|#|"",""|"",""")+""")"),"@",""") And Loop(""MinFor(Grid,""""p"""")=-1"", ""EvalFor(Grid,""""k"""",""""Rand(1)"""",""""p"""",""""="""",-1) And EvalFor(Grid,""""k"""",""""10"""",""""年级"""",""""<>"""","""""),"#",""""") And SortCol(""""k"""",1) And EvalFor(Grid,""""p"""",""""Cell(Row,""""""""班级"""""""")=Cell(Row-1,""""""""班级"""""""")"""",""""年级"""",""""="""","""""),"|",""""")"",100) And EvalFor(Grid,""p"",""-1"",""年级"",""="",""")+""""")"",100)") And SortCol("年级",1) And
EvalFor(Grid,"考室","") And
EvalFor(Grid,"k","Concat([年级],[班级],""班教室\"",Text(CountFor(Grid,""年级"",""="",[年级],""班级"",""="",[班级])))") And
Eval("EvalFor(Grid,""考室"","""""""+Substitute(Substitute(ListFor(Grid,"k",1),"\",""""""",1,"),"|",") And SortCol(""考室"",1) And EvalFor(Grid,""考室"",""""""")+") And SortCol(""考室"",1)") And
SortCol("年级",1) And
EvalFor(Grid,"考室号","Left(GetPY([考室]),4)+Right(""000""+Text(CountFor(Grid,""考室"",""="",[考室],1,Row)),3)") And
EvalFor(Grid,"准考证号","Concat(Left(GetPY([考室]),4),""KC"",Format(Row,""0000""))") And
DeleteCol(GridName,"p") And
DeleteCol(GridName,"k")


 回到顶部
帅哥哟,离线,有人找我吗?
wjq1072
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:16190 积分:125850 威望:1 精华:0 注册:2006/8/12 12:29:00
  发帖心情 Post By:2013/8/5 15:27:00 [只看该作者]

参考具体文件!

 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:随机考室考号安排(同类别同班级不相邻).egd


 回到顶部
帅哥哟,离线,有人找我吗?
jdw814520
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:189 积分:1100 威望:0 精华:0 注册:2006/10/15 14:22:00
  发帖心情 Post By:2013/8/5 15:34:00 [只看该作者]

帮我把公式看看吧,谢谢了哟。


 回到顶部
帅哥哟,离线,有人找我吗?
wjq1072
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:16190 积分:125850 威望:1 精华:0 注册:2006/8/12 12:29:00
  发帖心情 Post By:2013/8/5 16:28:00 [只看该作者]

这个公式怎么不运行呀!  

EvalFor(GridName,"考号","") And
EvalFor(GridName,"考室","")And
SortCol("总分",2) And
Loop("cell(row,""班级"")=cell(row-1,""班级"")","DelRow(GridName,""p"") And  EvalFor(GridName,""p"",""if(row=firstrow,1,if(cell(row,""""班级"""")=cell(row-1,""""班级""""),cell(row-1,col)-1.1,row))"") And SortCol(""p"",1) And DelRow(GridName,""k"") And EvalFor(GridName,""k"",""if(row=firstrow,1,if(cell(row,""""班级"""")=cell(row-1,""""班级""""),cell(row-1,col)-1.2,row))"") And SortCol(""k"",1)",100)
================================================

1、cell(row,""班级"")=cell(row-1,""班级"")------这个条件怎么成立?看不懂!
2、DelRow(GridName,""p"")------这个是什么意思?删除哪一行?
3、DelRow(GridName,""k"")------这个是什么意思?删除哪一行?
DelRow()
删除指定表中的指定行
Delrow(Grid, Row)
Grid  指定表,可以用表名表示,也可以用位置表示。
Row   要删除的行。
例如:
DelRow(订单表",1)
删除订单表的第一行
DelRow(GridName,Row)
删除当前表的当前行
DelRow("客户表",[客户表!Rows])
删除客户表的最后一行。
4、看不懂Loop()函数中的循环部分!


 回到顶部
帅哥哟,离线,有人找我吗?
jdw814520
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:189 积分:1100 威望:0 精华:0 注册:2006/10/15 14:22:00
  发帖心情 Post By:2013/8/5 17:04:00 [只看该作者]

cell(row,""班级"")=cell(row-1,""班级"")  表示班级列中上一行的班级等于当前行的班级

 

我的意思是:

1、按总分降序排列-------SortCol("总分",2)

2、在当前表中添加数值列--"p"列-------------and  AddCol(Grid,"p",1, False )

3、运算P列,运算公式为: And  EvalFor(GridName,"p","if(row=firstrow,1,if(cell(row,""班级"")=cell(row-1,""班级""),cell(row-1,col)+2.1,row)")

4、将P列升序排列-------And  Sortcol("p”,1)

5、用Loop重复上面3、4两步,直到cell(row,""班级"")=cell(row-1,""班级"")  不成立为止!

这样写怎么不运行哟:

SortCol("总分",2) and  AddCol(Grid,"p",1, False ) And Loop("cell(row,""班级"")=cell(row-1,""班级"")","EvalFor(GridName,""p"",""if(row=firstrow,1,if(cell(row,""""班级"""")=cell(row-1,""""班级""""),cell(row-1,col)+2.1,row)"")And  Sortcol(""p”",1)",100)

[此贴子已经被作者于2013-8-5 17:12:36编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
wjq1072
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:16190 积分:125850 威望:1 精华:0 注册:2006/8/12 12:29:00
  发帖心情 Post By:2013/8/5 17:22:00 [只看该作者]

你可以先不使用Loop函数,就使用按钮一次一次的点击试试?


 回到顶部
帅哥哟,离线,有人找我吗?
jdw814520
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:189 积分:1100 威望:0 精华:0 注册:2006/10/15 14:22:00
  发帖心情 Post By:2013/8/5 17:34:00 [只看该作者]

试了能行的。

 


 回到顶部
帅哥哟,离线,有人找我吗?
jdw814520
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:189 积分:1100 威望:0 精华:0 注册:2006/10/15 14:22:00
  发帖心情 Post By:2013/8/5 17:35:00 [只看该作者]

就是不知道能不能用Loop 按一次就解决了。

 回到顶部
总数 19 1 2 下一页