易表在线答疑技术与交流精华分享 → 多条件多范围筛选(不用Loop版)(小吴原创)


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

主题:多条件多范围筛选(不用Loop版)(小吴原创)

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


加好友 发短信
等级:天使 帖子:178 积分:0 威望:0 精华:0 注册:2006/8/11 11:09:00
多条件多范围筛选(不用Loop版)(小吴原创)  发帖心情 Post By:2006/8/16 19:20:00 [只看该作者]

我们在易表中设计查询功能通常都是利用FilterFor函数,再结合变量,基本可以完成大部分较简单的查询任务。虽然FilterFor可以设置多组比较条件(每组CompareCol,CompareMode,CompareValue为一组条件),但只能筛选出满足所有设置的条件的记录;

  可是我们经常会遇到需要一次筛选出多个不相干的记录,甚至需要同时筛选出几个范围,比如,一个表里有100行数据,编号为1-100,我们需要一次筛选出编号为1,3,5,7,9,45~66,82~97的记录,那我们该如何做呢?

  下面,详细讲解一个可以一次完成筛选任意多个盘号,5组盘号范围的例子的制作过程(每个待查盘号和盘号范围之间都要用英文逗号“,”隔开,查询范围的起始值和截止值前后都用分页符“|”隔开):

1、新建一个文件;

2、设置2列,列名分别为【盘号】、【辅助列】,【盘号】列为数值型,【辅助列】为逻辑型,然后利用编辑菜单中的智能填充→等差填充,将【盘号】列填上1~100(辅助列以后可以隐藏起来);

3、设置如下11个变量:
%欲查盘号%
%起始盘号1%
%截止盘号1%
%起始盘号2%
%截止盘号2%
%起始盘号3%
%截止盘号3%
%起始盘号4%
%截止盘号4%
%起始盘号5%
%截止盘号5%

4、设计筛选窗口,在窗口上插入变量%欲查盘号%,再插入一个自定义按钮;

5、设置辅助列的刷新公式:If(Instr("," + Text([盘号]) + ",","," + [%欲查盘号%] + ",") >= 0, - 1,0)
  因为以后筛选的时候肯定要由用户在筛选窗口上填写要筛选的盘号,也就是变量%欲查盘号%将由用户自定义后作为筛选条件参与筛选动作,所以该公式的含义就是:如果【盘号】列中的数字在变量%欲查盘号%中出现过(Instr函数的作用是返回指定字符串在另一个字符串中首次出现的位置,设置为>=0就可以理解为指定的字符在变量%欲查盘号%中出现过),则辅助列打勾——即为-1,反之不打勾——即为0)

6、设置筛选窗口上自定义按钮的公式:
(此步为关键,为便于大家理解,下面的公式做了换行处理,这样看起来更清楚)
ShowAllRows() and RecalcGrid(GridName) and FilterFor("辅助列", "=" , - 1)
and SetVariable("%起始盘号1%",Split([%欲查盘号%],"|",2))
and SetVariable("%截止盘号1%",Split([%欲查盘号%],"|",3))
and SetVariable("%起始盘号2%",Split([%欲查盘号%],"|",5))
and SetVariable("%截止盘号2%",Split([%欲查盘号%],"|",6))
and SetVariable("%起始盘号3%",Split([%欲查盘号%],"|",8))
and SetVariable("%截止盘号3%",Split([%欲查盘号%],"|",9))
and SetVariable("%起始盘号4%",Split([%欲查盘号%],"|",11))
and SetVariable("%截止盘号4%",Split([%欲查盘号%],"|",12))
and SetVariable("%起始盘号5%",Split([%欲查盘号%],"|",14))
and SetVariable("%截止盘号5%",Split([%欲查盘号%],"|",15))
and FilterFor("盘号", ">=" , Number([%起始盘号1%]),"盘号" ,"<=" ,Number([%截止盘号1%]),1)
and FilterFor("盘号", ">=" , Number([%起始盘号2%]),"盘号" ,"<=" ,Number([%截止盘号2%]),1)
and FilterFor("盘号", ">=" , Number([%起始盘号3%]),"盘号" ,"<=" ,Number([%截止盘号3%]),1)
and FilterFor("盘号", ">=" , Number([%起始盘号4%]),"盘号" ,"<=" ,Number([%截止盘号4%]),1)
and FilterFor("盘号", ">=" , Number([%起始盘号5%]),"盘号" ,"<=" ,Number([%截止盘号5%]),1)

7、解析自定义按钮的公式:
上面第6步中给自定义按钮设置的公式看起来很可怕,其实仔细分解并不难理解哦:

  ●第1行为显示所有行并重算当前表然后筛选辅助列打勾的记录;(这一步中的重新计算实际上就是计算上面第5步中设置的辅助列的刷新公式)

  ●接下来的10行SetVariable就是对最初设置的10个变量进行赋值,前面说过,每组查询范围是用分页符隔开,所以对变量赋值是就利用Split分割变量%欲查盘号%。

  大家注意看一下:10个赋值语句中Split函数的Position参数依次为:2,3,5,6,8,9,11,12,14,15,为什么会是这样跳跃的呢?

  其实,上面的10次赋值就是在数分割符“|”,因为我们这个例子中筛选盘号和盘号范围可以任意交错,为避免计算机无法识别,盘号范围得用“|”隔开,如范围10~15在我们这个例子里就得写为:“|10|15|”;

  那么第一句赋值语句:SetVariable("%起始盘号1%",Split([%欲查盘号%],"|",2))的作用就是将变量%欲查盘号%中第一个分隔符“|”后面的内容赋值给变量%起始盘号1%

  第三句赋值语句中Split函数的Position参数为5,是因为第一组盘号范围结束的时候还有一个分隔符“|”,所以第二组盘号的起始值应该是当Split函数的Position参数为5时返回的内容,第三个赋值语句就是给变量%起始盘号2%进行赋值的!!

  ●再往下面的5句筛选应该很好理解吧?就是依次筛选出盘号在5个范围里的记录;需要注意的是,这5句筛选的中用到的FilterFor函数的Option参数都为1,这样做是因为之前已经做过筛选了,Option参数设为1的意义在于“满足本次和之前的筛选条件中的任何一个即可”,这时你再抬头看看上面公式中的第一个FilterFor就没有用Option参数!

8、大功告成!现在,你可以尝试在窗口中筛选:2,6,9,15,19,|34|38|,41,99,28,|88|92|,56,|66|69|,78,100
按下筛选按钮后很快就得到25条记录,如下图所示,检查一下,结果就是我们想要的,爽!
egd文件下载
本演示文件里,还包含【欲查盘号范围起始1】~【欲查盘号范围起始5】和【欲查盘号范围截止1】~【欲查盘号范围截止5】共10列,这10列的刷新公式就是10个变量,这样做的目的是让大家可以更清楚地了解为10个变量的赋值情况;

经验总结:

  通过上面的例子,我们可以体会到利用易表实现多个不连续、不相关的编号或编号范围查询其实也不是什么难事!

  上面的例子仅支持最多5组盘号范围的查询,其实,要想支持更多,无非就是多设几组变量,多来几次FilterFor就搞定了。

(本方法由lmk斑竹和小吴斑竹合作完成!)


 回到顶部