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

おそらく、Runtime Type Identification (RTTI)ASSIGN COMPONENT name OF STRUCTURE <wa> TO <bar>.

于 2016-09-10T16:02:24.047 に答える
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 に答える
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 ....

私はウェブを調査し、誤解を招くような回答がたくさんあり、質問を実際に読んだり理解したりしていない人がいる約10の異なる投稿を見つけました。私にとって役に立ったので、誰にとっても役立つことを願っています。

于 2017-09-28T15:00:13.960 に答える