ABAP: AT ... ENDAT的使用
来源:互联网 发布:fc2破解版客户端域名 编辑:程序博客网 时间:2024/06/08 06:23
在ABAP报表程序中,经常会涉及到内表字段的统计。而统计一般会以一个或多个Key字段为节点,统计其他某些数值类型字段。这里我们就会用到AT<level>
.. ENDAT。
这里<LEVEL>
包括: new , first , last , end of .
使用前提:一般在loop中使用,要提前对内表进行排序sort,排序的主键为统计时用到的节点(比如,按销售组织统计,节点为vkorg),Loop不能加where条件,在at 和 endat之间不能再使用loop语法。
那下面我们简单介绍一下四种用法:
1.AT NEW F. 代码段..ENDAT.f是内表的一个字段,当内表中f字段以及f左边的任何字段内容发生变化时,执行其中的代码段。
2. AT END OF F. 代码段.. ENDAT.当f字段以及f左边字段内容即将发生变化时,执行代码段。
上面这两种用法,看似很相近,但是 at new 是新变化的时候执行,也就是有变化的新一行loop进工作区时执行。而 at end of 则是下一行即将变化时执行,也就是有变化新一行的前一行loop时执行。
所以这里容易混淆,我们做个简单的例子更好理解区分。
REPORT ZTEST NO STANDARD PAGE HEADING.TYPES:BEGIN OF TY_TEST,NAME(3) TYPE C,PRODUCT TYPE C,SALES TYPE I,END OF TY_TEST.DATA:FLAG TYPE C, MARK TYPE C.DATA:I_TEST TYPE TABLE OF TY_TEST, W_TEST TYPE TY_TEST.DATA:I_TEST2 TYPE TABLE OF TY_TEST, I_TEST3 TYPE TABLE OF TY_TEST.W_TEST-NAME = '001'.W_TEST-PRODUCT = 'A'.W_TEST-SALES = 10.APPEND W_TEST TO I_TEST.W_TEST-NAME = '001'.W_TEST-PRODUCT = 'B'.W_TEST-SALES = 20.APPEND W_TEST TO I_TEST.W_TEST-NAME = '002'.W_TEST-PRODUCT = 'A'.W_TEST-SALES = 20.APPEND W_TEST TO I_TEST.W_TEST-NAME = '002'.W_TEST-PRODUCT = 'B'.W_TEST-SALES = 30.APPEND W_TEST TO I_TEST.W_TEST-NAME = '002'.W_TEST-PRODUCT = 'C'.W_TEST-SALES = 60.APPEND W_TEST TO I_TEST.W_TEST-NAME = '003'.W_TEST-PRODUCT = 'A'.W_TEST-SALES = 30.APPEND W_TEST TO I_TEST.CLEAR:W_TEST.SORT I_TEST BY NAME PRODUCT .LOOP AT I_TEST INTO W_TEST. AT NEW NAME. FLAG = 'X'. ENDAT. IF FLAG = 'X'. APPEND W_TEST TO I_TEST2. CLEAR:FLAG . ENDIF. AT END OF NAME. MARK = 'X'. ENDAT. IF MARK = 'X'. APPEND W_TEST TO I_TEST3. CLEAR:MARK. ENDIF. CLEAR:W_TEST.ENDLOOP.WRITE:/ '结果如下:'.WRITE:/ 'AT NEW 用法:'.LOOP AT I_TEST2 INTO W_TEST. WRITE:/ W_TEST-NAME,' ', W_TEST-PRODUCT, W_TEST-SALES. CLEAR:W_TEST.ENDLOOP.WRITE:/ .WRITE:/ 'AT END OF 用法:'.LOOP AT I_TEST3 INTO W_TEST. WRITE:/ W_TEST-NAME,' ', W_TEST-PRODUCT, W_TEST-SALES. CLEAR:W_TEST.ENDLOOP.
执行结果显示如下截图:
通过上面的代码和最终结果,我们应该更加清晰这两种用法的区别,在统计之前,我们的内表I_TEST中有6条数据:
然后我们按照name,product排序。最然name是唯一关键字段,但name排在第一位,所以这里product加入排序并不影响,也是为了后面结果能更直观的显示出来。
排序后,我们loop内表,第一行,001 A 10 。
这时,进入at new 的代码段,因为这里name = 001,是新的一个name,如上代码。我们给flag赋值X,这样执行一条插入语句,将此行插入到结构完全一样的内表I_TEST2中,然后clear 标记字(不要忘记clear)。
loop第二行,001 B 20 。
这次,不会进入at new中的代码段了,因为name还是001没变。但是这次会进入at end of中的代码段,因为下一行的name是002,也就是前面说到的下一行即将变化时。这样,我们将此行append到I_TEST3中。
后面我就不多说了,总之以key字段为唯一标准。这样我们在统计内表中数据时,就可以根据不同key字段进行统计。
再提一点,我们上面的代码中为何用到两个标记位(其实一个就够了,为了看起来条理清晰):flag,mark。
因为当进入at 。。endat中的时候,工作区中的值除了key字段,其他字段会全部变为默认值,字符型字段值全变为*,数值全部变为0:
而当跳出AT … END AT.语法块后,工作区内容恢复原样:
如图,由于这种特性,我们不将插入语句或赋值语句写在at endat之中,而是通过标记变量的方式解决,因为影响的只是工作区中的内容。
上面讲述了两种常用的,还有两种比较简单,我们不做例子代码,简单描述下:
3. AT FIRST. 代码段.. ENDAT. 内表的第一行时,执行。
4. AT LAST. 代码段..ENDAT.内表的最后一行时执行。
上面这两种用法,就比较简单易懂了。一个是在loop的第一行时,进入调用;另一个是最后一行时。而且不用对Loop进行排序,也没有key字段。
在sap报表开发过程中,可能会经常用到at end of 和 at new.希望通过这篇博文能让大家对这两种用法更好的理解。
对于内表的统计,有时我们还会用到collect。后面我们会简单介绍下。
如果看我前面博文《将Excel导入SAP中》的朋友可能会注意到,代码中就使用了at end of 。废话不多说,大家自行掌握,欢迎探讨交流。
- ABAP: AT ... ENDAT的使用
- ABAP LOOP AT中使用AT FIRST,AT NEW,AT END OF,AT LAST
- SAP ABAP AT NEW 和AT END OF的用法
- abap消息的使用
- ABAP游标的使用
- abap-使用vim做abap的编辑器
- abap loop at Assigning
- SAP ABAP AT NEW 和AT END OF的用法[转]
- AT+CNMI的使用
- AT+CNMI的使用
- AT+CNMI的使用
- AT+CNMI的使用
- AT+CNMI的使用
- At.js的使用
- AT+CNMI的使用
- 【ABAP】AT NEW和AT END OF
- abap中 provide 的使用
- abap collect的使用实例
- acm之母函数题目1
- 第一次接触,我只是试一试
- js 获取url中的参数值
- FreeMarker入门实战教程
- 观察者模式
- ABAP: AT ... ENDAT的使用
- 单链表定义
- 【复习】servlet之hello world
- oracle对null赋值默认值
- cocos2dx-3.4虚拟摇杆的实现
- python编程的中文问题
- web api 中get和post一些经验总结
- iOS 支持 IPv6
- 模式识别(Pattern Recognition)学习笔记(二十八)-- 决策树