Looping through a dynamic internal table in ABAP - unkown attributes

时间:2016-09-10 15:23:40

标签: sap dynamic-programming abap

Constructed a dynamic internal table with the table name as input string from the user, how do I loop through the same?

Please find the 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. 

4 个答案:

答案 0 :(得分:2)

结合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

答案 1 :(得分:1)

答案 2 :(得分: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'。

希望它有用。

答案 3 :(得分: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表不起作用。这促使我搜索谷歌的类似功能,然后我找到了更好的功能。 遗憾的是,这两个函数都不适用于类或包含中定义的本地(内部)结构,因此我不知道如何获取字段的详细信息。

我无法使这些CL_ABAP______DESCR类/方法中的任何一个工作,因为它们或者导致了转换错误,或者根本没有告诉我字段的名称。他们确实告诉我场地的价值和基本类型,这不是OP和我想要获得的。

ASSIGN COMPONENT及其所有变体也无济于事。我做不到ASSIGN COMPONENT 'MANDT' OF STRUCTURE ...,因为我不知道该字段的名称!在我工作的具体情况中,我在结构中使用字段的位置(索引),命令是ASSIGN COMPONENT sy-index OF STRUCTURE ...

我研究了网络,发现了大约十个不同的帖子,里面有很多误导性的答案以及那些没有真正阅读过问题或理解它们的人,我尝试了所有这些都没有运气,直到我找到了上述内容功能。我希望它对任何人都有用,因为它对我有用。

相关问题