ABAP:データベーステーブルからのキーによる参照値の取得

少し前に、動的プログラムを作成して、キーによって参照値を内部テーブルにフェッチするメソッドを作成しました。 残念なことに、当局はそれを行うことを禁じているため、ソースコードは機能しません。 したがって、私は理論の一般的な説明に自分自身を制限します。



たとえば、内部テーブルがあります。



DATA: begin of it_TABLE occurs 0, BE type T001-BUKRS, BENAME type T001-BUTXT, end of it_TABLE .
      
      





テーブルにBEフィールドが入力されているため、対応するBEの BUTXT値をT001から選択し、 BENAMEフィールドに入力する必要があります。 これを「正しく」行う方法(つまり、最小限のメモリオーバーヘッドで、可能な限り迅速に)。



  1. BEフィールドに一意の値を選択します。
  2. T001のすべてのエントリを作成しましょう。
  3. 内部テーブルを調べて、BEごとに、T001から選択したデータで対応する値を見つけます。 (もちろん、HASHテーブルを使用して検索を高速化します)
そして、このシーケンスは常に同じです。

このプロセスのコードは次のとおりです
 FIELD-SYMBOLS: <wa_Table> like line of it_Table . *--      BE TYPES: BEGIN OF s_k1, BUKRS type T001-BUKRS, END OF s_k1 . DATA: it_k1 TYPE SORTED TABLE OF s_k1 WITH UNIQUE KEY BUKRS , wa_k1 like line of it_k1. LOOP AT it_Table ASSIGNING <wa_Table>. wa_k1-BUKRS = <wa_Table>-BE. INSERT wa_k1 INTO TABLE it_k1. ENDLOOP. *--     T001    TYPES: BEGIN OF s_v1, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF s_v1 . DATA: it_v1 TYPE SORTED TABLE OF s_v1 WITH NON-UNIQUE KEY BUKRS , wa_v1 like line of it_v1. IF it_k1[] IS INITIAL. REFRESH it_v1. ELSE. SELECT BUKRS BUTXT FROM T001 INTO CORRESPONDING FIELDS OF TABLE it_v1 FOR ALL ENTRIES in it_k1 WHERE BUKRS = it_k1-BUKRS . ENDIF. *--     LOOP AT it_Table ASSIGNING <wa_Table>. READ TABLE it_v1 INTO wa_v1 with table key BUKRS = <wa_Table>-BE . IF sy-subrc = 0. <wa_Table>-BENAME = wa_v1-BUTXT. ELSE. CLEAR <wa_Table>-BENAME. ENDIF. ENDLOOP.
      
      



そして、同じアクションが常に私たちの場所で実行される場合、それらの説明を最小限に減らす価値があります。 特にこの場合、選択する必要があるテーブル、キーフィールド、およびデータを書き込むフィールドを指定する必要があります。



つまり 上記のコードの本質がすべて書かれている次の小さな行があります。
  'T001{BUKRS=BE}{BUTXT>BENAME}'
      
      





メソッドに上記の行と内部テーブルを渡します。 メソッドを呼び出した後、BENAMEフィールドにはT001-BUTXTからの対応する値が入力されます。 コードを削減しました。さらに、他のプログラマーがメソッドを手伝ってくれるだけで十分で、彼はこの行が何をするかをすぐに理解するでしょう。 この場合、アルゴリズム全体が小さな行に収まります。

ここに私のメソッドによって生成されたコードがあります
  TYPES: BEGIN OF s_k1, BUKRS type T001-BUKRS, END OF s_k1 . DATA: it_k1 TYPE SORTED TABLE OF s_k1 WITH UNIQUE KEY BUKRS , wa_k1 like line of it_k1. FIELD-SYMBOLS: <fs_1_BUKRS> type ANY, <fs_1_BUTXT> type ANY . "--      BE LOOP AT <it_Table> ASSIGNING <wa_Table>. "-- ASSIGN COMPONENT 'BE' OF STRUCTURE <wa_Table> TO <fs_1_BUKRS>. wa_k1-BUKRS = <fs_1_BUKRS>. "--     INSERT wa_k1 INTO TABLE it_k1. ENDLOOP. TYPES: BEGIN OF s_v1, BUKRS TYPE T001-BUKRS, BUTXT TYPE T001-BUTXT, END OF s_v1 . DATA: it_v1 TYPE SORTED TABLE OF s_v1 WITH NON-UNIQUE KEY BUKRS , wa_v1 like line of it_v1. *--    T001 IF it_k1[] IS INITIAL. REFRESH it_v1. ELSE. SELECT BUKRS BUTXT FROM T001 INTO CORRESPONDING FIELDS OF TABLE it_v1 FOR ALL ENTRIES in it_k1 WHERE BUKRS = it_k1-BUKRS . ENDIF. FREE it_k1. *--     LOOP AT <it_Table> ASSIGNING <wa_Table>. ASSIGN COMPONENT 'BE' OF STRUCTURE <wa_Table> TO <fs_1_BUKRS>. ASSIGN COMPONENT 'BENAME' OF STRUCTURE <wa_Table> TO <fs_1_BUTXT>. "--   READ TABLE it_v1 INTO wa_v1 with table key BUKRS = <fs_1_BUKRS> . IF sy-subrc = 0. <fs_1_BUTXT> = wa_v1-BUTXT. ELSE. CLEAR: <fs_1_BUTXT> . ENDIF. ENDLOOP. FREE it_v1.
      
      



メソッドが完全に機能するために、定数とシステム変数を指定する機能を追加します(たとえば、テキストを選択するにはsy-languが必要になることがよくあります)。 また、コマンドのリストを指定する機能を追加します-その後、データを順番に選択できます。



どのように機能しますか? -動的プログラムの使用。 つまり このメソッドは、文字列を介して渡されたパラメーターを分析し、動的プログラムを生成して開始します。 プログラムを追加するには、「INSERT REPORT l_repid FROM CODE。」を使用します。作成されるプログラムの数に制限されないように。



PS多くの値を選択する必要があるとき、この方法に特に満足しています。ディレクターからの作業の過程で、選択のための新しいフィールドを追加するための指示が追加されます。



更新 :プロセスコードは正しい形式で記述されました-53行でした。 パラメータ行+メソッド呼び出し= 5行。 つまり コードは10倍削減され、現在は1ページ内に配置されています。 私の意見では、これは読みやすさを大幅に向上させます。



All Articles