当需要遍历内部表并根据特定条件执行特定操作时,可以在LOOP AT 语句中使用AT FIRST、AT LAST、AT NEW 和 AT END OF等控制结构。
AT FIRST
用于在首次进入内表循环时执行特定操作。当处理循环的第一条记录时,会触发 AT FIRST 之后的代码块。
LOOP AT lt_ekpo INTO ls_ekpo.
AT FIRST.
WRITE: / '采购订单数据开始:'.
ENDAT.
WRITE: / ls_ekpo-ebeln, ls_ekpo-ebelp, ls_ekpo-txz01.
ENDLOOP.
AT LAST
AT LAST 相对应于 AT FIRST,用于在处理内表的最后一条数据时执行特定操作,当循环的最后一行被处理时,会执行 AT LAST 下面的代码。
LOOP AT lt_ekpo INTO ls_ekpo.
WRITE: / ls_ekpo-ebeln, ls_ekpo-ebelp, ls_ekpo-txz01.
AT LAST.
WRITE: / '采购订单数据处理完毕。'.
ENDAT.
ENDLOOP.
AT NEW
用于检测到内表中的关键字段变化时执行特定操作,在循环过程中,如果当前条目的关键字段值与前一个条目不同,则会执行 AT NEW 下面的代码。
SORT lt_ekpo BY ebeln ebelp.
LOOP AT lt_ekpo INTO ls_ekpo.
AT NEW ebeln.
WRITE: / '采购订单:', ls_ekpo-ebeln.
ENDAT.
WRITE: / ls_ekpo-ebelp, ls_ekpo-txz01.
ENDLOOP.
AT END OF
用于在特定字段的所有记录处理完毕后触发。当循环到同一字段的最后一个条目时,会执行 AT END OF 下面的代码。
SORT lt_ekpo BY ebeln ebelp.
LOOP AT lt_ekpo INTO ls_ekpo.
AT NEW ebeln.
WRITE: / '采购订单:', ls_ekpo-ebeln.
ENDAT.
APPEND ls_ekpo TO lt_ekpo_tmp.
AT END OF ebeln.
LOOP AT lt_ekpo_tmp INTO DATA(ls_group).
WRITE: / ls_group-ebelp, ls_group-txz01.
ENDLOOP.
WRITE: / '该订单的所有项目处理完毕。'.
ENDAT.
ENDLOOP.
注意:在输出时按采购订单分组,必须在循环之前对内表按 EBELN 排序,这可以确保相同的字段值相邻,当处理每条记录时,只有当 EBELN 改变时,AT NEW 控制结构才能正确触发。