2017-12-13 14 views
0

簡略化の方法については、以下のコードを参考にしてください。下のコードはうまくいきますが、コードを強化したり短縮して動的にする方法はありますか?動的構造体に値を代入する

TYPES: BEGIN OF lty_dates, 
      yesterday TYPE string, 
      today  TYPE string, 
      tomorrow TYPE string, 
      END OF lty_dates. 

    DATA: it_table TYPE TABLE OF lty_dates. 

    DO 3 TIMES. 
     CASE lv_count. 
     WHEN 1. 
      it_table[ 1 ]-zyesterday = 'Result Yesterday'. 
      it_table[ 2 ]-zyesterday = 'Result Yesterday'. 
      it_table[ 3 ]-zyesterday = 'Result Yesterday'. 

     WHEN 2. 
      it_table[ 1 ]-ztoday = 'Result Today'. 
      it_table[ 2 ]-ztoday = 'Result today'. 
      it_table[ 3 ]-ztoday = 'Result Today'. 

     WHEN 3. 
      it_table[ 1 ]-ztommorrow = 'Result Tomorrow'. 
      it_table[ 2 ]-ztommorrow = 'Result Tomorrow'. 
      it_table[ 3 ]-ztommorrow = 'Result Tomorrow'. 
     ENDCASE. 

     lv_count = lv_count + 1. 

    ENDDO. 

私の考えは、以下の擬似コードのようなものです。 it_tableのフィールドが100(フィールド)に達すると、CASEを複数回実行する必要はありません。

DO 3 TIMES. 
     ASSIGN 'ZTODAY' TO <dynamic_fieldname>. 
     it_table[ 1 ]-<dynamic_fieldname> = <dynamic_result>. 
     it_table[ 2 ]-<dynamic_fieldname> = <dynamic_result>. 
     it_table[ 3 ]-<dynamic_fieldname> = <dynamic_result>. 
    ENDDO. 

これを手伝ってください。

+0

正確にもっと動的にしたいのですか? – vwegert

+0

@vwegert私はrow1の結果(昨日、今日、明日)を得るために同様のmapping1を持っています。 row2の結果を取得する別のマッピング2、次にrow3の結果を取得する別のマッピング3だから、すべての行について、私は結果を得るために異なるマッピングを持つでしょうが、各マッピングは、昨日、今日、そして明日の値を取得するために適用されます。私の考えでは、提供されたコードは、昨日の列、今日の列と明日の列と同様のマッピングを想定しています。 ASSIGN COMPONENT構文には何かがあるかもしれません。私もそれを周りに再生する必要があります。 – Czarinaaaaa29

答えて

1

よくお試しください。私はそれがあなたを助けると思う。あなたは実際には、あなたのコードは、この結果テーブルを作成するSTRUCTURE OFコマンドのASSIGN COMPONENTで

TYPES: BEGIN OF lty_dates, 
     yesterday TYPE string, 
     today  TYPE string, 
     tomorrow TYPE string, 
     END OF lty_dates. 

TYPES: BEGIN OF lty_result , 
     fieldname TYPE fieldname, 
     result TYPE string, 
     END OF lty_result . 

FIELD-SYMBOLS <fs_data> TYPE any . 

DATA: lt_table TYPE TABLE OF lty_dates, 
     lt_result TYPE TABLE OF lty_result. 

lt_result = VALUE #((fieldname   = 'yesterday' 
         result = 'result_yesterdaty') 
         (fieldname = 'today' 
         result = 'result_today') 
         (fieldname = 'tomorrow' 
         result = 'result_tomorrow' 
        )). 

DO 3 TIMES . 
    APPEND INITIAL LINE TO lt_table . 
ENDDO . 

LOOP AT lt_table ASSIGNING FIELD-SYMBOL(<fs_table>) . 
    LOOP AT lt_result ASSIGNING FIELD-SYMBOL(<fs_result>) . 
    ASSIGN COMPONENT <fs_result>-fieldname OF STRUCTURE <fs_table> TO <fs_data> . 
    MOVE <fs_result>-result TO <fs_data> . 
    ENDLOOP . 
ENDLOOP . 
+0

私はrow1の結果(昨日、今日、明日)を得るために同様のmapping1を持っています。 row2の結果を取得する別のマッピング2、次にrow3の結果を取得する別のマッピング3だから、すべての行について、私は結果を得るために異なるマッピングを持つでしょうが、各マッピングは、昨日、今日、そして明日の値を取得するために適用されます。 私が考えているのは、昨日の列、今日の列と明日の列に、私のデザインを満足させない同様のマッピングを想定しています。 ASSIGN COMPONENT構文には何かがあるかもしれません。私もそれを周りに再生する必要があります。 – Czarinaaaaa29

1

を詳しく見ていく必要があります。

YESTERDAY   TODAY   TOMORROW 
Result Yesterday Result Today Result Tomorrow 
Result Yesterday Result today Result Tomorrow 
Result Yesterday Result Today Result Tomorrow 

このためにマクロを使用しないのはなぜ?マクロは完全にあなたのニーズを満たすことができます:ループの反復は、(あなたのコードのように)itabの行に等しい場合

FIELD-SYMBOLS: <fvalue> TYPE ANY. 
DEFINE put_values. 
    ASSIGN COMPONENT &1 OF STRUCTURE &2 TO <fvalue>. 
    <fvalue> = &3. 
END-OF-DEFINITION. 

it_table = VALUE #(() () ()). 

LOOP AT it_table ASSIGNING FIELD-SYMBOL(<fs_tab>). 
    put_values 'yesterday' <fs_tab> 'Result Yesterday'. 
    put_values 'today' <fs_tab> 'Result Today'. 
    put_values 'tomorrow' <fs_tab> 'Result Tomorrow'. 
ENDLOOP. 

これがあれば番号を動作します。