2

用表名作为用户的输入字符串构造了一个动态内部表,我该如何循环呢?

请找到 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

4 回答 4

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
于 2016-09-19T08:09:02.437 回答
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'。

希望它有帮助。

于 2016-09-16T13:34:12.893 回答
1

您可能需要使用运行时类型识别 (RTTI)ASSIGN COMPONENT name OF STRUCTURE <wa> TO <bar>.

于 2016-09-10T16:02:24.047 回答
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 上搜索类似的功能,然后我找到了更好的功能。遗憾的是,这两个函数都不适用于类或包含中定义的本地(内部)结构,因此我不知道如何获取它们的字段详细信息。

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

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

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

于 2017-09-28T15:00:13.960 回答