[SAP ABAP] LOOP中的AT NEW 与 AT END OF

在ABAP语言中,LOOP 循环里的 AT NEW 与 AT END OF 语句用于处理内表数据分组相关的操作

当 LOOP 循环处理内表数据时,AT NEW 语句用于检测指定字段或字段组合的值是否发生变化,如果当前行的指定字段值与上一行不同,AT NEW 后的代码块就会被执行

AT END OF 与 AT NEW 相对应,用于检测分组的结束,当循环处理到某一组数据的最后一行时(即指定字段值即将发生变化时),AT END OF 后的代码块会被执行

示例1

REPORT z437_test_2025.

* 自定义数据类型
TYPES: BEGIN OF ty_demo,
    col1 TYPE c LENGTH 5,
    col2 TYPE c LENGTH 5,
    col3 TYPE i,
END OF ty_demo.

* 定义内表与结构体
DATA: lt_demo TYPE STANDARD TABLE OF ty_demo,
      ls_demo TYPE ty_demo.

* 添加数据
ls_demo-col1 = '1000'.
ls_demo-col2 = 'A1'.
ls_demo-col3 = '1'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '1000'.
ls_demo-col2 = 'A2'.
ls_demo-col3 = '2'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '2000'.
ls_demo-col2 = 'A2'.
ls_demo-col3 = '3'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '2000'.
ls_demo-col2 = 'A2'.
ls_demo-col3 = '4'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '2000'.
ls_demo-col2 = 'A3'.
ls_demo-col3 = '5'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '3000'.
ls_demo-col2 = 'A3'.
ls_demo-col3 = '6'.
APPEND ls_demo TO lt_demo.

cl_demo_output=>display( lt_demo ).

输出结果:

AT NEW col1:以col1为分组条件,在每组的第一条记录时执行,在上述内表lt_demo里会在第一条,第三条,第六条记录时会执行

输出结果:

AT NEW col2:以col1和col2为分组条件,在每组的第一条记录时执行,在上述内表lt_demo里会在第一条,第二条,第三条,第五条,第六条记录时会执行 

输出结果:

AT END OF col1:以col1为分组条件,在每组的最后一条记录时执行,在上述内表lt_demo里会在第二条,第五条,第六条记录时会执行

输出结果:

AT END OF col2:以col1和col2为分组条件,在每组的最后一条记录时执行,在上述内表lt_demo里会在第一条,第二条,第四条,第五条,第六条记录时会执行

输出结果:

① AT NEW xxx 是以xxx及其左边的所有字段为分组条件,在每组的第一条记录时执行

② AT END OF xxx 是以xxx及其左边的所有字段为分组条件,在每组的最后一条记录时执行

提示Tips:进入AT NEW和AT END OF语句后,工作区里的数字型会清零,字符型会变成*,所以不能直接使用工作区进行数据操作

Debug进行代码调试,内表ls_tmp_demo出现以下情况 

为了避免上述情况,我们可以使用LOOP AT...ASSIGNING FIELD-SYMBOL直接操作内表数据 

REPORT z437_test_2025.

* 自定义数据类型
TYPES: BEGIN OF ty_demo,
    col1 TYPE c LENGTH 5,
    col2 TYPE c LENGTH 5,
    col3 TYPE i,
END OF ty_demo.

* 定义内表与结构体
DATA: lt_demo TYPE STANDARD TABLE OF ty_demo,
      lt_import TYPE STANDARD TABLE OF ty_demo,
      ls_demo TYPE ty_demo.

* 添加数据
ls_demo-col1 = '1000'.
ls_demo-col2 = 'A1'.
ls_demo-col3 = '1'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '1000'.
ls_demo-col2 = 'A2'.
ls_demo-col3 = '2'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '2000'.
ls_demo-col2 = 'A2'.
ls_demo-col3 = '3'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '2000'.
ls_demo-col2 = 'A2'.
ls_demo-col3 = '4'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '2000'.
ls_demo-col2 = 'A3'.
ls_demo-col3 = '5'.
APPEND ls_demo TO lt_demo.

CLEAR ls_demo.
ls_demo-col1 = '3000'.
ls_demo-col2 = 'A3'.
ls_demo-col3 = '6'.
APPEND ls_demo TO lt_demo.

SORT lt_demo BY col1.  " 排序

LOOP AT lt_demo ASSIGNING FIELD-SYMBOL(<lfs_demo>).
  AT NEW col1.
    APPEND <lfs_demo> TO lt_import.
  ENDAT.
ENDLOOP.

cl_demo_output=>display( lt_import ).

输出结果:

示例2

REPORT z437_test_2025.

* 自定义数据类型
TYPES: BEGIN OF ty_ekpo,
    ebeln TYPE ebeln,       " 采购凭证编号
    ebelp TYPE ebelp,       " 采购凭证的项目编号
    txz01 TYPE c LENGTH 20, " 描述信息
END OF ty_ekpo.

* 定义内表与结构体
DATA: lt_ekpo     TYPE STANDARD TABLE OF ty_ekpo,
      ls_ekpo     TYPE ty_ekpo,
      ls_ekpo_tmp TYPE ty_ekpo.

* 添加数据
ls_ekpo-ebeln = '1'.
ls_ekpo-ebelp = 10.
ls_ekpo-txz01 = 'TEXT1'.
APPEND ls_ekpo TO lt_ekpo.

ls_ekpo-ebeln = '1'.
ls_ekpo-ebelp = 20.
ls_ekpo-txz01 = 'TEXT1'.
APPEND ls_ekpo TO lt_ekpo.

ls_ekpo-ebeln = '2'.
ls_ekpo-ebelp = 10.
ls_ekpo-txz01 = 'TEXT1'.
APPEND ls_ekpo TO lt_ekpo.

ls_ekpo-ebeln = '2'.
ls_ekpo-ebelp = 20.
ls_ekpo-txz01 = 'TEXT1'.
APPEND ls_ekpo TO lt_ekpo.

ls_ekpo-ebeln = '2'.
ls_ekpo-ebelp = 30.
ls_ekpo-txz01 = 'TEXT1'.
APPEND ls_ekpo TO lt_ekpo.

ls_ekpo-ebeln = '3'.
ls_ekpo-ebelp = 10.
ls_ekpo-txz01 = 'TEXT1'.
APPEND ls_ekpo TO lt_ekpo.

ls_ekpo-ebeln = '4'.
ls_ekpo-ebelp = 10.
ls_ekpo-txz01 = 'TEXT1'.
APPEND ls_ekpo TO lt_ekpo.

* 对内表lt_ekpo进行排序
SORT lt_ekpo BY ebeln.

* 临时存储采购订单,按照采购订单编号进行区分
DATA: lt_ekpo_tmp TYPE STANDARD TABLE OF ty_ekpo.

LOOP AT lt_ekpo INTO ls_ekpo.
  ls_ekpo_tmp = ls_ekpo.

  APPEND ls_ekpo_tmp TO lt_ekpo_tmp.

  AT NEW ebeln.     " 当ebeln字段发生变化并且是其第一次出现,输出以下内容
    WRITE: / '采购订单:', ls_ekpo_tmp-ebeln.
  ENDAT.

  AT END OF ebeln.  " 当ebeln字段发生变化并且是其最后一次出现,输出以下内容
    LOOP AT lt_ekpo_tmp INTO DATA(ls_e).
      WRITE: / ls_e-ebeln,ls_e-ebelp,ls_e-txz01.
    ENDLOOP.
    CLEAR lt_ekpo_tmp.  " 清空内表内容
  ENDAT.

ENDLOOP.

输出结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值