结果如下:(为了看得更清楚,我省略了两个字段sj2,sj3,DD是表示日期)
DDSJ1SB3Exp_6Exp_7122000/09/12 08:00:00 AM2000/09/12 02:00:00 PMOn timeOn time132000/09/13 08:01:00 AM2000/09/13 02:00:00 PMNO timeOn time142000/09/14 08:00:00 AM2000/09/14 02:01:00 PMOn timeNO time152000/09/15 08:00:00 AM2000/09/15 02:00:00 PMOn timeOn time
和第一条命令相比,它不同的地方是:在分组之后,在13号这天的分组里,第一个记录的xm=1,所以iif()的结果是sj-initsj,即这天的上午上班时间跟基准时间的差(是一个数值型的)。到了第二个记录xm=2,iif()的结果是0,第三、四个记录的iif()都是0,最后sum()把sj-initsj、0、0、0这四个数值中起来,结果还是sj-initsj,也就是第一个记录跟基准时间的差,然后再加上基准时间,也就是这天的上班时间了。
这条命令的奥妙就在于日期可以相减,结果是一个数值,然后用sum()进行累加;而日期加一数值,结果还是日期。在求早上状态时(xm='1'),如果不是早上上班的时间,就累加零,否则就累加上班时间与基准时间的差。最后把结果再加上基准时间又得回原来的上班时间。
而字符那里,如果直接使用第一条命令那种做法,也是不行的。原因也一样,前面三个记录的结果都让第四个记录的值给覆盖了。因本例特殊点,具有唯一性,所以还可以sum()+iif()的方法。但sum()不可以处理字符串,所以要用iif()转换为数值型。
工作原理跟刚才计算时间那样,用内部的iif()把xm="1".AND.zt="on time"即上午准时上班的记录设为1,而其它的时间或上午不是准时上班的就是0,然后用sum()累加,最后又用外面的iif()对sum()的结果进行判断,如果结果是1,就表示上午是准时上班。因为只有一个上午上班记录(xm='1'),而只有zt='on time'才表示准时上班。
在决定是否用分组前,应先确定以哪些定段作为分组依据。分组依据确定后,就要检查一下,你认为某些记录是应该在同一个分组内的,但如果直接就去分组的话,这些记录又不是同一个分组内(看看第一和第二个例子),就要想办法找出这些记录有什么共同点,然后根据这些共同点转换一下,得出一个相同的中间值(第一个例子就是减去各自的记录号从而找出共同点)。然后才根据这个共同点进行分组。