Отображение таблицы с cl_salv_table: тип itab не совместим с формальным параметром t_table

Мне нужно отобразить внутреннюю таблицу с cl_salv_table. В настоящее время я беру таблицу bkpf, вырезаю три столбца и вставляю их во внутреннюю таблицу. Но теперь он говорит, что параметр и lt_bkpf несовместимы по типу.

Вот мой код:

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 5(15) p_name1 FOR FIELD p_blart.
PARAMETERS: p_blart TYPE blart.

SELECTION-SCREEN END OF LINE.

AT SELECTION-SCREEN OUTPUT.
  p_name1 = 'Belegart'.

INITIALIZATION.
  p_blart = 'DD'. "Set default value
END-OF-SELECTION.

Data:
BEGIN OF gt_bkpf OCCURS 0,
  bukrs LIKE bkpf-bukrs,
  blart LIKE bkpf-blart,
  gjahr LIKE bkpf-gjahr,
END OF gt_bkpf.

SELECT bukrs, blart, gjahr
  FROM bkpf
  WHERE blart LIKE @p_blart
  INTO CORRESPONDING FIELDS OF @gt_bkpf.
ENDSELECT.

cl_salv_table=>factory( IMPORTING r_salv_table = go_table
                        CHANGING t_table = gt_bkpf ).

  go_table->display( ).

person Elekam    schedule 07.10.2020    source источник
comment
Пожалуйста, не задавайте повторно тот же вопрос, который вы использовали для решения первой проблемы, задайте вопрос, касающийся вашей текущей проблемы с CX_SALV_NOT_FOUND, и сообщите нам, какая строка связана с ошибкой. Спасибо.   -  person Sandra Rossi    schedule 07.10.2020


Ответы (1)


Внутренняя таблица объявляется со строкой заголовка (из-за OCCURS), это устарело и не поддерживается в среде OO. Вы должны объявить таблицу следующим образом:

TYPES: BEGIN OF ty_bkpf,
  bukrs TYPE bkpf-bukrs,
  blart TYPE bkpf-blart,
  gjahr TYPE bkpf-gjahr,
END OF ty_bkpf.

DATA: lt_bkpf TYPE STANDARD TABLE OF ty_bkpf.

Обратите внимание, что LIKE также заменяется на TYPE.

person József Szikszai    schedule 07.10.2020
comment
Я хотел бы добавить, что вы все еще можете отправить таблицу со строкой заголовка в качестве параметра, вам просто нужно использовать соглашение itab[]. Это, очевидно, работает только в том случае, если вы вызываете метод из кода, отличного от OO. - person gabrielbaca; 26.10.2020
comment
@gabrielbaca: это правильно, но не лучше ли исправить корень проблемы и избавиться от всех устаревших языковых элементов? - person József Szikszai; 29.10.2020
comment
Это идеально, но не всегда возможно. Возможно, вам потребуется добавить новые функции в устаревшую программу, и вы не сможете изменить все. Сценарий, который приходит на ум, который все еще используется, — это отчеты с опциями выбора, которые всегда создаются в виде таблицы диапазонов со строкой заголовка. В этом случае вам всегда нужно использовать нотацию itab[] для отправки метода класса. - person gabrielbaca; 30.10.2020