Почему встроенный объявленный itab не инициализируется в ВЫХОДЕ ЭКРАНА ВЫБОРА? - PullRequest
1 голос
/ 21 июня 2019

У меня есть следующий фрагмент кода.

REPORT YYY.

TYPES: BEGIN OF t_test,
    test TYPE c LENGTH 4,
  END OF t_test,
  tth_test TYPE HASHED TABLE OF t_test WITH UNIQUE KEY test.

DATA(g_tab_test) = VALUE tth_test( ( test = 'AAAA' ) ( test = 'BBBB' )
  ( test = 'CCCC' ) ( test = 'DDDD' ) ).

PARAMETERS:
  p_x1 TYPE abap_bool,
  p_x2 TYPE abap_bool,
  p_x3 TYPE abap_bool.

CLASS lcl_main DEFINITION FINAL CREATE PRIVATE.
  PUBLIC SECTION.
    CLASS-METHODS:
      main.
ENDCLASS.

CLASS lcl_main IMPLEMENTATION.
  METHOD main.
  ENDMETHOD.
ENDCLASS.

AT SELECTION-SCREEN OUTPUT.
  LOOP AT screen.
    MODIFY SCREEN.
  ENDLOOP.
  BREAK-POINT. "<-- why is the table g_tab_test not initialsed here yet?

AT SELECTION-SCREEN ON p_x1.
  ASSERT 1 = 1.

Несмотря на свое определение, таблица в точке разрыва в AT SELECTION-SCREEN OUTPUT пуста.Почему это так и является ли это документированным поведением?

1 Ответ

7 голосов
/ 21 июня 2019

Я считаю, что это задокументированное поведение.

https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapstart-of-selection.htm

В исполняемой программе следующие операторы присваиваются неявный блок события START-OF-SELECTION, который вставляется явный блок события START-OF-SELECTION, если он существует:

Все заявления, которые не являются декларацией и перечислены перед первый явный блок обработки.

Все функциональные операторы в программе, если она не содержит явные блоки обработки,

Код находится "в воздухе", а не под конкретным событием, это означает, что инициализация внутренней таблицы будет выполняться только с неявным START-OF-SELECTION.

Кодовая часть должна быть под INITIALIZATION (или LOAD-OF-PROGRAM в зависимости от точной необходимости)

...