HELLO , 这里是百里,一个学习中的ABAPER , 今天学的东西是AS NEW 和 AS END 的用法, 在别的语言中可能是我见识少,我真没见到过这种用法. 是一个非常神奇的东西,今天就在讲解下 AS NEW 和 AS END 的常用方法及案例.

什么是AS NEW 及 AS END

F是内表的一个字段,当内表中F字段以及F左边的任何字段内容发生变化时,执行其中的代码段。

AT NEW F.
代码段..
ENDAT.

当F字段以及F左边字段内容即将发生变化时,执行代码段。

AT END OF F.
代码段..
ENDAT.

这是一个非常神奇且新奇的语法.利用这个语法可以做很多东西, 比如说判断重复性,求和, 判断数量超出多少,判断导入数据是否一个数据对应多个内容等等 . 这里讲述两个案例.

结构定义

TYPES:BEGIN OF TY_TEST,
name TYPE char10,
age TYPE char10,
sex TYPE char10,
END OF TY_TEST.

DATA:FLAG TYPE C,
loag 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.
DATA:lt_alv1 TYPE TABLE OF TY_TEST,
lt_alv2 TYPE TABLE OF TY_TEST.
DATA:l_line TYPE i.

DATA:l_flag TYPE char1.

数据准备

创建数据后,数据一定要排序.

W_TEST-name = '001'.
W_TEST-age = 'A'.
W_TEST-sex = 10.
APPEND W_TEST TO I_TEST.

W_TEST-NAME = '001'.
W_TEST-age = 'B'.
W_TEST-sex = 20.
APPEND W_TEST TO I_TEST.

W_TEST-NAME = '002'.
W_TEST-age = 'A'.
W_TEST-sex = 20.
APPEND W_TEST TO I_TEST.

W_TEST-NAME = '002'.
W_TEST-age = 'B'.
W_TEST-sex = 30.
APPEND W_TEST TO I_TEST.


W_TEST-NAME = '002'.
W_TEST-age = 'C'.
W_TEST-sex = 60.
APPEND W_TEST TO I_TEST.

W_TEST-NAME = '003'.
W_TEST-age = 'A'.
W_TEST-sex = 30.
APPEND W_TEST TO I_TEST.

ABAP 之 as new 和 as end 的使用方法 ._字段

验证 先后顺序

这个例子展示的内容为对应数据的应用场景, 在loop 循环中, 当触发AS NEW 时 ,但凡遇到新的内容 使得flag 赋值,通过逻辑判断.把新的内容追加到内表中.

当触发AS END 时 , 当字段以及左边字段内容即将发生变化时,记录的数据,追加到对应的内表中.

CLEAR:W_TEST.
SORT I_TEST BY NAME age .

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.
loag = 'X'.
ENDAT.

IF loag = 'X'.
APPEND W_TEST TO I_TEST3.
CLEAR: loag.
ENDIF.

CLEAR:W_TEST.
ENDLOOP.



WRITE:/ '结果如下:'.
WRITE:/ 'AT NEW 用法:'.
LOOP AT I_TEST2 INTO W_TEST.
WRITE:/ W_TEST-NAME,' ', W_TEST-age, W_TEST-sex.
CLEAR:W_TEST.
ENDLOOP.
WRITE:/ .

WRITE:/ 'AT END OF 用法:'.
LOOP AT I_TEST3 INTO W_TEST.
WRITE:/ W_TEST-NAME,' ', W_TEST-age, W_TEST-sex.
CLEAR:W_TEST.
ENDLOOP.

结果

ABAP 之 as new 和 as end 的使用方法 ._数据_02

统计某个字段发生次数

这个案例讲的是利用AS NEW 触发时,统计某个字段的数量. 当然如果在sql 中 会有很简单的方式, 不过利用AS NEW 的方式,也可以做出对应的东西.

通过数据赋值,循环对应数据到指针, 当AS NEW 触发时 ,删除非对应的数据, 保留其他数据 ,统计数据次数输出值.

lt_alv1[] = I_TEST.
SORT : lt_alv1 by age .
LOOP AT I_TEST ASSIGNING FIELD-SYMBOL(<ls_alv>).
AT NEW age.

REFRESH lt_alv2.
CLEAR:l_line.

lt_alv2[] = lt_alv1[].
DELETE lt_alv2 WHERE age NE <ls_alv>-age.
l_line = lines( lt_alv2 ).

ENDAT.

WRITE : sy-uline .
WRITE : SY-TABIX .
WRITE : <ls_alv>-age .
WRITE : l_line .
ENDLOOP.

结果展示

ABAP 之 as new 和 as end 的使用方法 ._数据_03

技术总结

本篇内容展示的为AS NEW 及 AS END 的技术使用方式, 学会了这种内容,可以在数据验证, 接口对接, OLE, excel 上传等数据上都可以对应的内容. 在必要的时候 ,可以求和等种种方式. 代码是死的, 人是活的. 熟悉demo ,活学活用.

这里是百里 ,一个努力的学习者 , 最近 学习了 生命之花 ,以及生命时间轴, 明天看下抽个时间分享下 这个技术 ..

当然 这个可能也是技术吧 哈哈哈 .

欲得真学问,须下苦工夫. 掘友们 明天见 ~

ABAP 之 as new 和 as end 的使用方法 ._数据_04