为什么嵌套的LOOP AT SCREEN会导致无限循环/递归?

Jag*_*ger 5 sap abap

这是给你的。尽管这种语言构造没有多大意义,但我想知道为什么嵌套LOOP AT SCREEN会导致无限循环(递归?)。

让我们采用以下简单程序。

REPORT yyy.

PARAMETERS:
  p_x1 TYPE abap_bool.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    BREAK-POINT.
  ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

BREAK-POINT语句将仅执行4次。这导致了这样的嵌套循环将运行16次的假设。相反,下面提到的程序将永远运行并以超时异常结束。

REPORT yyy.

PARAMETERS:
  p_x1 TYPE abap_bool.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT SCREEN.
    LOOP AT SCREEN.
      ASSERT 1 = 1.
    ENDLOOP.
  ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

看来嵌套LOOP AT SCREEN会导致无限循环或某种无限递归。

为什么会这样呢?是否记录在某处?扩展检查不报告有关循环的任何内容。这同样适用于代码检查器。

编辑

我还检查了这是否是带有标题行的内部表的普遍问题。好像没有

REPORT YYY.

DATA: gt_t000 TYPE t000 OCCURS 10 WITH HEADER LINE.

START-OF-SELECTION.
  SELECT * FROM t000
    INTO TABLE gt_t000[].

  LOOP AT gt_t000.
    LOOP AT gt_t000.
      WRITE / gt_t000-mandt.
    ENDLOOP.
  ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

Ale*_*ell 1

这种嵌套结构没有实际用途,但我已经提了票(387728 / 2023)并得到了 SAP 的官方答复:

不支持屏幕上的嵌套循环。不幸的是,这不会被错误捕获,但通常会导致系统出现奇怪的行为,很可能是无限循环。

我们将检查是否可以(不兼容地)以嵌套循环屏幕创建运行时错误的方式更改系统行为。

因此,我们应该得出结论,它是官方不支持的功能,因此使用它会导致未定义的系统行为。