首先作为我们开发过程中必不可少的命令For Each 有着无与伦比的重要性 但是我们从Wiki上得知 我们用到的可能只是它一丢丢的能力并没有全部使用出来。
所以 这篇文档将记录这个命令的各种用处 方便自己 WiKi的链接为:https://wiki.genexus.com/commwiki/servlet/wiki?24744,For%20Each%20command 需要的话可以尝试去看一下。
第一个命令就是For each <Transaction> 这就不用说了 查询某些表数据集的语句
第二个命令就是For each order <Attribute> 这个我们也经常用 根据指定的值来排序 如果加括号即为倒序 反之亦然 然后还有一个 For each order none 此命令用于在执行查询过程中不做排序
第三个命令就是For each using <DataSelector> 这个我们很少用到 首先要说的是DataSelector是我们GeneXus中的一个对象 中文名称叫做数据选择器,我们如果细心点的话,在我们写一个Grid页面的同时会发现GeneXux会自动帮我生成一个这样的玩意儿↓
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175050769-858802442.png)
当我们仔细看这些东西的时候 会发现这其实就是页面上的各种筛选条件 我们一时半会也不知道写这么多东西分别代表什么 但是大体知道这个对象是做什么事的就行了 回到原题当我们使用
For each using <DataSelector> 并且指定一个此类对象的时候那么 换言之我们其实就是把这些筛选条件集合到一起筛选条件就是这个DataSelector 用来简化代码 ,这样说可能不是很清楚那么我换一种图片方式我们还是使用自己的KB随便拉一个Grid的页面并且使用Sdt来填充数据 同时追加一些筛选条件我们没有使用DataSelector的时候是这样的↓
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175130402-383452316.png)
调用方法并传入查询条件
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175206920-1201807659.png)
然后根据对应传进来的参数执行查询操作
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175231770-240697326.png)
这就是我们正常情况下的筛选操作 这里我没有提Grid中使用Condition的筛选是因为这两者不好做比较 。当我们使用DataSelector来做这些筛选功能的时候就会变成这样↓
我们新建一个DataSelector 然后模仿GeneXus自己生成方式来写就会变成这样
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175301222-1213343919.png)
这样我们 就可以调用了 他的调用方式也简单
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175322252-1904604212.png)
其实没什么本质上的不同 而且这两种方式是可以共存的唯一的区别就在于在这两种情况并存的情况下 For each 的Order具有较高的优先级,其他筛选条件则没有。
第四个命令为For each <unique > 这个用的频率还算比较高 指定属性在筛选过程中对于在数据集中重复的数据予以过滤 。
第五个命令为For each <Blocking> 这个命令估计只适用于比较大型的项目了 他的官方文档为https://wiki.genexus.com/commwiki/servlet/wiki?5572,Category%3ABlocking+Data+Updates,
从文档上来看这属于一种批量处理方式,举个栗子:现阶段一个项目中 某条语句可能要对数据库中的10000条语句发生变更操作 这样的话我们客户端可能就要和数据库交互10000次的往返操作,鉴于此种情形 我们本地做10000条假数据来测试,
写简单点我们 将这10000条记录的CustomeNum变为1 并观察他的运行时间
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175405108-1401331001.png)
Log日志如下:
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175628730-228323007.png)
貌似有点太短了,同条件下我们把数据量加大一点好了(´・ω・)ノ(._.`) 65万条 再试一下
这。。。算了 不加了 可能我这里是本地数据库的原因所以才这么快吧。
我们再试试使用Blocking命令执行
![](https://img2018.cnblogs.com/blog/1344377/201910/1344377-20191015175628730-228323007.png)
结果时间花的更久了。。。。。。
这个问题先记下 反正wiki上是这么说的 用途也是这样的 应该有什么我没注意到的地方 嗯没了 下次再来完善下好了