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

举报
百里丶落云 发表于 2023/08/09 10:40:46 2023/08/09
【摘要】 序HELLO , 这里是百里,一个学习中的ABAPER , 今天学的东西是AS NEW 和 AS END 的用法, 在别的语言中可能是我见识少,我真没见到过这种用法. 是一个非常神奇的东西,今天就在讲解下 AS NEW 和 AS END 的常用方法及案例. 什么是AS NEW 及 AS ENDF是内表的一个字段,当内表中F字段以及F左边的任何字段内容发生变化时,执行其中的代码段。AT...

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.

image.png

验证 先后顺序

这个例子展示的内容为对应数据的应用场景, 在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.

结果

image.png

统计某个字段发生次数

这个案例讲的是利用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.

结果展示

image.png

技术总结

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

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

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

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

wallhaven-k7q9m7.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。