Перебор динамической внутренней таблицы в ABAP — неизвестные атрибуты

Создал динамическую внутреннюю таблицу с именем таблицы в качестве входной строки от пользователя, как мне пройти через то же самое?

Пожалуйста, найдите MWE:

DATA W_TABNAME TYPE W_TABNAME.
DATA W_DREF TYPE REF TO DATA.
DATA W_WA TYPE REF TO DATA.

FIELD-SYMBOLS <ITAB> TYPE ANY TABLE.
FIELD-SYMBOLS <WA> TYPE ANY.

W_TABNAME = P_TABLE.

CREATE DATA W_DREF TYPE TABLE OF (W_TABNAME).
ASSIGN W_DREF->* TO <ITAB>.

CREATE DATA W_WA LIKE LINE OF <ITAB>.
ASSIGN W_WA->* TO <WA>.

SELECT * FROM (W_TABNAME) INTO TABLE <ITAB>.

LOOP AT <ITAB> INTO <WA>.
  **WRITE:/ <WA>.** ---> how do I fetch the field name here
ENDLOOP. 

person Subham    schedule 10.09.2016    source источник


Ответы (4)


Объедините ответы vwegert и Leelaprasad Kolapalli:

DATA: lro_structdescr TYPE REF TO cl_abap_structdescr,
      lt_components   TYPE cl_abap_structdescr=>component_table.
 FIELD-SYMBOLS: <ls_comp> LIKE LINE OF lt_components.

   LOOP AT itab ASSIGNING <wa>
      IF lt_components IS INITIAL.  "get columns' names only once.
        lro_structdescr ?= cl_abap_typedescr=>describe_by_data( <wa> ).
        lt_components = lro_structdescr->get_components( ).
      ENDIF.

      DO. "iterate all columns in the row
        ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <fs_field>.
        IF sy-subrc <> 0.
          EXIT.
        ENDIF.

        READ TABLE lt_components ASSIGNING <ls_comp> INDEX sy-index.
        "field name: <ls_comp>-name.
        "field value: <fs_field>.
      ENDDO.
   ENDLOOP
person futu    schedule 19.09.2016

Возможно, вам потребуется использовать идентификацию типа во время выполнения (RTTI) и ASSIGN COMPONENT name OF STRUCTURE <wa> TO <bar>.

person vwegert    schedule 10.09.2016
comment
Не могли бы вы уточнить - person Subham; 10.09.2016
comment
Прочтите документацию, на которую я дал ссылку, попробуйте ее, и если вы столкнетесь с конкретной проблемой, вернитесь с конкретным вопросом. Вы не упомянули, чего пытаетесь достичь, и я не собираюсь тратить время на догадки. - person vwegert; 10.09.2016
comment
извиняюсь за неясность. Я хотел бы получить имена полей из структуры «WA» и отобразить их. Что я делаю неправильно здесь - person Subham; 10.09.2016
comment
Используйте структуру RTTS ABAP. У вас есть вспомогательные классы для достижения того, что вы хотите. Если вы все еще застряли, вернитесь к нам с подробностями о том, что вы пробовали и где вы застряли :) Если вы хотите заниматься динамическим программированием в ABAP, вам нужно будет ознакомиться с инфраструктурой RTTS для эффективного программирования. - person TheG; 10.09.2016
comment
Прямой пост под вашим (OP) также ссылается на rtti: stackoverflow.com/questions/39331010/ - person icbytes; 12.09.2016

Обратитесь к этому коду:

  PARAMETERS:p_table TYPE string.
  DATA w_tabname TYPE w_tabname.
  DATA w_dref TYPE REF TO data.
  DATA: w_wa TYPE REF TO data.
  FIELD-SYMBOLS: <itab> TYPE ANY TABLE,
                 <wa> TYPE ANY,
                 <lv_field_val> TYPE ANY.
  w_tabname = p_table.

  CREATE DATA w_dref TYPE TABLE OF (w_tabname).
  ASSIGN w_dref->* TO <itab>.

  CREATE DATA w_wa LIKE LINE OF <itab>.
  ASSIGN w_wa->* TO <wa>.

  SELECT * FROM (w_tabname) INTO TABLE <itab>.

 LOOP AT <itab> INTO <wa>.
   DO.     
      ASSIGN COMPONENT sy-index OF STRUCTURE <wa> TO <lv_field_val>.
      IF sy-subrc NE 0.     
        EXIT.  
      ENDIF.   
      WRITE: sy-index.  
      WRITE:':' ,<lv_field_val>.         "Here we can get individual field value
      skip.
   ENDDO.
   exit.  
 ENDLOOP.

если вы хотите, чтобы имена полей для таблицы использовали этот FM 'DD_GET_FIELD_INFO'.

Надеюсь, это полезно.

person Leelaprasad Kolapalli    schedule 16.09.2016

Единственный способ заставить это работать — это функция 'DDIF_FIELDINFO_GET'. Он получает имя словарной структуры, таблицы или типа и возвращает список ее полей, а также множество полезных сведений о них, таких как элемент данных поля, описание, длина и т. д. . Вот простой пример:

DATA: lt_fields_info TYPE dfies_tab.

CALL FUNCTION 'DDIF_FIELDINFO_GET'
  EXPORTING
    tabname        = 'MARA'
  TABLES
    dfies_tab      = lt_fields_info[]
  EXCEPTIONS
    not_found      = 1
    internal_error = 2
    OTHERS         = 3.

IF sy-subrc <> 0.
* Handle errors.
ENDIF.

LOOP AT lt_fields_info[] INTO ls_field_info.
  " Dynamically printing the fields' details:
  WRITE: / 'Field name: ', 
           ls_field_info-fieldname,
           'Field data element: ',
           ls_field_info-rollname,
           'Field description: ',
           ls_field_info-fieldtext.

ENDLOOP.

Leelaprasad Kolapalli (извините, я не могу понять, как пометить имя пользователя в своем комментарии) предложил использовать функцию 'DD_GET_FIELD_INFO'. К сожалению, для некоторых таблиц DDIC это не сработало без видимых причин. Это побудило меня поискать в Google похожую функцию, а затем я нашел лучшую. К сожалению, обе функции не работают с локальными (внутренними) структурами, определенными в классах или включениях, поэтому я не знаю, как получить для них сведения о полях.

Я не мог заставить работать ни один из этих CL_ABAP______DESCR классов/методов, потому что они либо вызывали ошибку преобразования, либо вообще не сообщали мне имя поля. Они сказали мне значение поля и базовый тип, которые НЕ являются тем, что мы с ОП пытаемся получить.

ASSIGN COMPONENT и все его варианты тоже бесполезны. Я не могу сделать ASSIGN COMPONENT 'MANDT' OF STRUCTURE ..., потому что не знаю названия поля! В моем конкретном случае на работе я использую позицию поля (индекс) в структуре и команду ASSIGN COMPONENT sy-index OF STRUCTURE ....

Я исследовал Интернет и нашел около десяти разных сообщений с множеством вводящих в заблуждение ответов и людей, которые на самом деле не читали вопросы или не понимали их, и я безуспешно пробовал их все, пока не нашел вышеупомянутую функцию. Я надеюсь, что это полезно для всех, поскольку это было полезно для меня.

person Cuky    schedule 28.09.2017