3

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

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

CLEAR lv_loopcounter.
LOOP AT lt_itab INTO ls_wa.
    ADD 1 TO lv_loopcounter.
    ...
ENDLOOP.

我们可以这样做:

LOOP AT lt_itab INTO ls_wa.
    AT FIRST.
        CLEAR lv_loopcounter.
    ENDAT.
    ADD 1 TO lv_loopcounter.
    ...
ENDLOOP.

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

这里有最佳实践吗?是否有我应该注意的隐藏警告?

4

2 回答 2

5

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

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

于 2014-05-09T12:01:39.910 回答
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.

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

于 2015-01-19T15:31:24.937 回答