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

2022-12-05 08:38:11 浏览数 (2)


开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

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

什么是AS NEW 及 AS END

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

代码语言:javascript复制
AT NEW F.
    代码段..
ENDAT.

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

代码语言:javascript复制
AT END OF F.
 代码段..
ENDAT.

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

结构定义

代码语言:javascript复制
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.     

数据准备

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

代码语言:javascript复制
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.

验证 先后顺序

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

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

代码语言:javascript复制
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.

结果

统计某个字段发生次数

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

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

代码语言:javascript复制
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.

结果展示

技术总结

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

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

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

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

0 人点赞