使用AT FIRST初始化循环变量

Lil*_*hal 3 sap abap

AT FIRST对于任何必须运行的命令或者在循环本身开始运行之前必须初始化的变量,似乎控制级处理的声明似乎是理想的.鉴于AT命令如何清除工作区中的列,这是我仍然为他们看到的少数几个用途之一.

为了说明,而不是这样做:

CLEAR lv_loopcounter.
LOOP AT lt_itab INTO ls_wa.
    ADD 1 TO lv_loopcounter.
    ...
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

我们可以这样做:

LOOP AT lt_itab INTO ls_wa.
    AT FIRST.
        CLEAR lv_loopcounter.
    ENDAT.
    ADD 1 TO lv_loopcounter.
    ...
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

这里显而易见的是,变量需要初始化以使循环按预期运行.当你有很多需要在循环之前运行的语句时,它还可以使代码更清晰.我看到的唯一缺点是它LOOP在逻辑上不应该在代码中移动代码.

这里有最好的做法吗?我应该注意隐藏的警告吗?

vwe*_*ert 5

两种变体都是可能的,但它们在语义上是不同的:在第一个版本中,命令CLEAR是无条件执行的,在第一个版本中,只有在lt_itab包含至少一行时才执行.对于实际的循环实现,差异是无关紧要的,但对于空表,有问题的变量的值在ENDLOOP达到语句后会有所不同.只要你理智地处理空表,这不是问题...... :-)

第二个版本唯一的另一个微观警告是AT FIRST清除所有非字符字段ls_wa并将所有字符字段设置ls_wa为'*'.


Lil*_*hal 5

虽然vwegert的回答是,我在我的问题描述的简单循环的情况下正确,存在一个很重要的辅助的情况下AT FIRST无法功能,你可能会想到,这是一个循环的条件时。

正如 SAP 的AT文档所述:

控制级别由内部表的第一行定义。读取该行时发生控制中断。

换句话说,AT FIRST不会在循环的第一次迭代时触发,而是在读取内部表的绝对第一行时触发。这意味着如果我们只循环内部表的几行,很可能我们不会循环第一行。如果是这种情况,将不会进入控制块。

举个例子:

LOOP AT lt_itab INTO DATA(ls_itab) WHERE itab_col1 = iv_value.
    AT FIRST.
        CLEAR lv_loopcounter.
    ENDAT.
    ADD 1 to lv_loopcounter.
    ...
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

如果itab_col1第一个内部表行匹配iv_value,循环计数器将被清除。如果第一行的值与此值不匹配,则不会清除循环计数器!