2016-09-10 40 views
1

ユーザからの入力文字列としてテーブル名を使用して動的内部テーブルを作成しました。どのようにループするのですか?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. 

答えて

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テーブルでは明らかな理由がないため、DDICテーブルでは機能しませんでした。これは私に類似の機能のためにGoogleを検索するように促し、より良いものを見つけました。 悲しいことに、クラスまたはインクルードで定義されているように、両方の関数がローカル(内部)構造では機能しないため、フィールドの詳細を取得する方法がわかりません。

CL_ABAP______DESCRクラス/メソッドは、変換エラーを引き起こしたか、フィールドの名前を全く教えてくれなかったため、動作しませんでした。彼らは私にフィールドの価値と基本的なタイプを教えてくれました。これはOPと私が得ようとしているものではありません。

ASSIGN COMPONENTであり、その変形もいずれも有用ではない。私はフィールドの名前を知らないので、ASSIGN COMPONENT 'MANDT' OF STRUCTURE ...をやり遂げることはできません!職場の私の具体的なケースでは、構造体のフィールドの位置(インデックス)を使用しています。コマンドはASSIGN COMPONENT sy-index OF STRUCTURE ...です。

私はウェブを調査し、誤解を招くほどの回答をたくさん載せた10の異なる投稿と、実際に質問を読んでいないか、理解していない人を見つけました。上記の機能。私にとって有用だったのは誰にとっても有益だと思います。

関連する問題