SAPABAP-内部テーブルの読み取り

READ TABLEステートメントの次の構文を使用して、テーブルの行を読み取ることができます。

READ TABLE <internal_table> FROM <work_area_itab>.

この構文では、<work_area_itab>式は、<internal_table>テーブルの線種と互換性のある作業領域を表します。次の構文に示すように、WITH KEY句を使用して、READステートメント内で検索キーを指定できますが、テーブルキーは指定できません。

READ TABLE <internal_table> WITH KEY = <internal_tab_field>.

ここでは、内部テーブルの行全体が search key。テーブルの行全体の内容が、<internal_tab_field>フィールドの内容と比較されます。<internal_tab_field>フィールドの値がテーブルの線種と互換性がない場合、これらの値はテーブルの線種に従って変換されます。検索キーを使用すると、構造化された行タイプを持たない内部テーブルのエントリを検索できます。つまり、行が単一のフィールドまたは内部テーブルタイプである場合です。

READステートメントの次の構文は、COMPARING句を使用して作業領域またはフィールドシンボルを指定するために使用されます。

READ TABLE <internal_table> <key> INTO <work_area_itab>
   [COMPARING <F1> <F2>...<Fn>].

COMPARING句を使用すると、構造化明細タイプの指定されたテーブル項目<F1>、<F2> .... <Fn>が、移送される前に作業領域の対応する項目と比較されます。ALL FIELDS句が指定されている場合、SAPシステムはすべてのコンポーネントを比較します。SAPシステムがキーに基づいてエントリを検出すると、SY-SUBRC変数の値は0に設定されます。さらに、比較対象のコンテンツの場合、SY-SUBRC変数の値は2または4に設​​定されます。フィールドが同じでない場合、またはSAPシステムがエントリを見つけられない場合。ただし、SAPシステムは、比較の結果に関係なく、エントリが見つかるたびにエントリをターゲット作業領域にコピーします。

REPORT  ZREAD_DEMO. 
*/Creating an internal table 
DATA: BEGIN OF Record1, 
ColP TYPE I, 
ColQ TYPE I, 
END OF Record1. 

DATA mytable LIKE HASHED TABLE OF Record1 WITH UNIQUE KEY ColP. 
DO 6 Times.
Record1-ColP = SY-INDEX. 
Record1-ColQ = SY-INDEX + 5. 
INSERT Record1 INTO TABLE mytable. 
ENDDO. 

Record1-ColP = 4. 
Record1-ColQ = 12. 
READ TABLE mytable FROM Record1 INTO Record1 COMPARING ColQ. 

WRITE: 'SY-SUBRC =', SY-SUBRC. 
SKIP. 
WRITE: / Record1-ColP, Record1-ColQ.

上記のコードは次の出力を生成します-

SY-SUBRC =    2 

4         9

上記の例では、mytableはハッシュテーブルタイプの内部テーブルであり、作業領域としてRecord1が使用され、一意のキーとしてColPが使用されています。最初に、mytableには6行が入力されます。ここで、ColPフィールドにはSY-INDEX変数の値が含まれ、ColQフィールドには(SY-INDEX + 5)値が含まれます。

Record1作業領域には、ColPフィールドとColQフィールドの値としてそれぞれ4と12が入力されます。READステートメントは、COMPARING句を使用してColPキーフィールドの値をRecord1作業領域の値と比較した後、テーブルの行を読み取り、読み取った行の内容を作業領域にコピーします。ColPフィールドの値が4の場合、ColQの値は12ではなく9であるため、SY-SUBRC変数の値は2として表示されます。