2016-09-10 4 views
1

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

Пожалуйста, найдите 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. 

ответ

1

Вы, вероятно, нужно использовать Runtime Type Identification (RTTI)ASSIGN COMPONENT name OF STRUCTURE <wa> TO <bar>. и

+0

Прошу прокомментировать – Subham

+0

Прочитайте документацию, с которой я связан, попробуйте, и если вы столкнулись с конкретной проблемой, вернитесь с конкретным вопросом. Вы не упомянули, чего вы пытаетесь достичь, и я не собираюсь тратить время на угадывание. – vwegert

+0

извинения за неясность. Я хотел бы получить имена полей из структуры и отобразить их. Что я делаю неправильно здесь – Subham

1

См этот код:

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'.

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

1

комбината 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 
0

Единственный способ, которым я мог бы получить эту работу является функция '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 для аналогичной функции, а затем я нашел лучшую. К сожалению, обе функции не работают с локальными (внутренними) структурами, как определено в классах или включаются, поэтому я не знаю, как получить данные полей для них.

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

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

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

Смежные вопросы