Получение имен полей из символов поля - PullRequest
0 голосов
/ 08 января 2019

Мне нужно получить имена полей в символе поля <itab>, чтобы я мог использовать имена для каталога полей ALV.

Так что я использовал cl_abap_structdescr, но он всегда выдает ошибку. Я попробовал это с внутренней таблицей, и у меня был ожидаемый результат, но я должен использовать символ поля вместо внутренней таблицы.

ASSIGN lo_itab->* TO <itab>

data: go_struct type ref to cl_abap_structdescr,
      gt_comp   type abap_component_tab,
      gs_comp   type abap_componentdescr.


  go_struct ?= cl_abap_typedescr=>describe_by_data( <itab> ).
  gt_comp = go_struct->get_components( ).

  loop at gt_comp into gs_comp.

      PERFORM fill_fieldcat USING : 
     gs_comp-name      ''       gs_comp-name
   .
  endloop.

это ошибка; enter image description here

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Поскольку <itab>, очевидно, является внутренней таблицей , ее тип - "таблица", а не "структура"! (также смотрите короткий дамп, он говорит, что describe_by_data возвратил тип cl_abap_tabledescr, который не совместим с типом цели go_struct, т.е. cl_abap_structdescr)

Таким образом, вы должны сначала получить тип таблицы, а затем тип строк (я предполагаю, что это структурированный тип, но в некоторых других ситуациях это могут быть и другие типы).

data: go_table type ref to cl_abap_tabledescr.
      go_struct type ref to cl_abap_structdescr,
      gt_comp   type abap_component_tab,
      gs_comp   type abap_componentdescr.

go_table ?= cl_abap_typedescr=>describe_by_data( <itab> ).
go_struct ?= go_table->get_table_line_type( ).
gt_comp = go_struct->get_components( ).
...
0 голосов
/ 08 января 2019

Поскольку вы присваиваете ссылочный тип другому ссылочному типу, вы получаете дамп. Определите тип структуры и передайте вместо того, что я делал в примере ниже. Вы не получите никакой свалки.

data: go_struct type ref to cl_abap_structdescr,
      gt_comp   type abap_component_tab,
      gs_comp   type abap_componentdescr.

  DATA ls_spfli TYPE spfli.
  go_struct ?= cl_abap_typedescr=>describe_by_data( ls_spfli ).
  gt_comp = go_struct->get_components( ).

  loop at gt_comp into gs_comp.

*      PERFORM fill_fieldcat USING :
*     gs_comp-name      ''       gs_comp-name
*   .
  endloop.
...