!--a11y-->

任意のテーブルの単一の行を読み込むには、以下の命令を使用します。
READ TABLE <itab> <key> <result>.
この命令をすべての種類のテーブルに対して有効にするためには、索引ではなくキーを使用してエントリを指定しなければなりません。キーは、命令の<key> 部で指定します。<result> 部で、取得された行の追加処理オプションを指定することができます。
いずれかの可能なオプションの影響を受けない限り、SY-SUBRC は、エントリが検出されると0 に設定され、エントリが検出されないと 4 に設定されます。内部テーブルが索引テーブルである場合は、SY-TABIX は取得された行の索引に設定されます。テーブルのキーが一意でなく、重複エントリがある場合は、最初のエントリが読み込まれます。
検索キーは、テーブルキーと別のキーのいずれを使用してもかまいません。
検索キーとして <itab> のテーブルキーを使用するには、以下のように <key> を入力します。
READ TABLE <itab> FROM <wa> <result>.
または、
READ TABLE <itab> WITH TABLE KEY <k1> = <f1> ...<kn> = <fn> <result>.
最初の命令では、<wa> は<itab> の行データ型と互換性がある作業領域でなければなりません。キー項目の値は、作業領域の対応するコンポーネントから取得されます。
2 番目の命令では、各キー項目の値を明示的に指定する必要があります。実行時までいずれかのキー項目の名前がわからない場合は、(<ni>) = <fi> の書式を使用して、項目<ni> の内容として指定することができます。<f i> のデータ型がキー項目と互換性がない場合は、システムによってデータ型が変換されます。
以下のように関連する行が検索されます。
キ 標準テーブル
ライナー検索。この検索では、実行時間がテーブルエントリ数と正比例します。
キ ソートテーブル
バイナリ検索。この検索では、実行時間がテーブルエントリ数と対数比例します。
キ ハッシュテーブル
内部テーブルのハッシュアルゴリズムを使用してエントリが検索されます。実行時間はテーブルエントリ数とは無関係です。
検索キーとしてテーブルキー以外のキーを使用するには、以下のように <key> を入力します。
READ TABLE <itab> WITH KEY = <f> <result>.
または、
READ TABLE <itab> WITH KEY <k1> = <f1> ...<kn> = <fn> <result>.
最初の命令では、内部テーブルの行全体が検索キーとして使用されます。テーブル行全体の内容が項目 <f> の内容と比較されます。<f> がテーブルの行データ型と互換性がない場合、値はその行データ型に変換されます。検索キーを使用すると、構造化された行データ型を持たない、つまり、行が単一の項目または内部テーブルデータ型である内部テーブルのエントリを検索することができます。
2 番目の命令では、検索キーはテーブル項目 <k1>...<kn> のうちのいずれかで構成されます。いずれかのコンポーネントの名前が実行時までわからない場合は、項目 <n i> の内容を書式 (<n i>) = <f i> で指定することができます。命令の実行時に <n i> が空である場合は、その検索項目は無視されます。<f i> のデータ型が内部テーブルのコンポーネントと互換性がない場合、データ型はシステムによって変換されます。オフセットと長さを指定して、検索を一部の項目に制限することができます。
すべてのテーブルタイプ でライナー検索が行われます。実行時間はテーブル行の数と正比例します。
検出されたテーブルエントリに対する処理を規定するオプションを指定することができます。
以下のように <result> を指定して、テーブルから読み込んだテーブルエントリを作業領域に書き込むことができます。
READ TABLE <itab> <key> INTO <wa> [COMPARING
<f1> <f2> ...
|ALL FIELDS]
[TRANSPORTING
<f1> <f2> ...
|ALL FIELDS
|NO
FIELDS].
COMPARING オプションまたは TRANSPORTING オプションを使用しない場合は、テーブル行の内容を作業領域 <wa> のデータ型に変換できなければなりません。COMPARING または TRANSPORTING を指定する場合は、行データ型と作業領域は互換性がなければなりません。関連する内部テーブルの行データ型と互換性がある作業領域を必ず使用してください。
COMPARING オプションを使用すると、構造化された行データ型の指定されたテーブル項目 <fi> は、転送される前に作業領域の対応する項目と比較されます。ALL FIELDS オプションを使用すると、すべてのコンポーネントが比較されます。指定したキー <key> を持つエントリが検出され、比較された項目の内容が同じである場合は、SY-SUBRC が 0 に設定されます。比較された項目の内容が同じでない場合は、値 2 が返されます。エントリが検出されない場合は、SY-SUBRC が 4 に設定されます。エントリが検出されると、比較の結果に関係なく、転送先の作業領域にエントリがコピーされます。
TRANSPORTING オプションを使用すると、作業領域に転送する構造化された行データ型のテーブル項目を指定することができます。TRANSPORTING を指定せずに ALL FIELDS を指定すると、すべての項目の内容が転送されます。NO FIELDS を指定すると、項目は転送されません。この場合、READ 命令によってシステム項目SY-SUBRC および SY-TABIX にのみデータが書き込まれます。TRANSPORTING NO FIELDS で作業領域 <wa> を指定する必要はないので、省略してください。
どちらのオプションでも、(<ni>) の書式で項目 <ni> の内容として項目<fi> を動的に指定することができます。命令の実行時に <n i> が空である場合は、その項目は無視されます。オフセットと長さを指定して、検索を一部の項目に制限することができます。
以下のように<result> を指定して、テーブルから読み込んだテーブルエントリをフィールドシンボルに割り当てることができます。
READ TABLE <itab> <key> ASSIGNING <FS>.
READ 命令のあと、フィールドシンボルはテーブル行を指します。行データ型が構造化されている場合、フィールドシンボルを宣言するときに同じデータ型を指定してください。この操作によって、フィールドシンボルのコンポーネントをアドレス指定することができるようになります。データ型を静的に指定できない場合は、追加のフィールドシンボルと構造のコンポーネントの割り当ての手法を使用して構造のコンポーネントをアドレス指定してください。
フィールドシンボルにテーブル行を割り当てる方法の追加情報については、フィールドシンボルを使用したアクセスを参照してください。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4 TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE
ITAB.
ENDDO.
LINE-COL1 = 2. LINE-COL2 = 3.
READ TABLE ITAB FROM LINE INTO LINE COMPARING COL2.
WRITE: 'SY-SUBRC =', SY-SUBRC.
SKIP.
WRITE: / LINE-COL1, LINE-COL2.
出力は以下のようになります。
SY-SUBRC = 2
2 4
ハッシュテーブルに平方数の一覧が書き込まれます。行データ型と互換性のある作業領域 LINE には数字 2 および 3 が書き込まれます。READ 命令によって、キー項目 COL1 が作業領域と同じ値を持つテーブルの行が読み込まれ、作業領域にコピーされます。項目 COL2 の内容が異なっているため、SY-SUBRC は 2 に設定されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE SORTED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE
ITAB.
ENDDO.
CLEAR LINE.
READ TABLE ITAB WITH
TABLE KEY COL1 = 3
INTO
LINE TRANSPORTING COL2.
WRITE:
'SY-SUBRC =', SY-SUBRC,
/ 'SY-TABIX =', SY-TABIX.
SKIP.
WRITE: / LINE-COL1, LINE-COL2.
出力は以下のようになります。
SY-SUBRC
= 0
SY-TABIX = 3
0 9
ソートテーブルに平方数の一覧が書き込まれます。READ 命令によって、キー項目 COL1 が作業領域と同じ値を持つテーブルの行が読み込まれ、作業領域にコピーされます。COL2 の内容のみが、作業領域 LINE にコピーされます。ITAB は索引テーブルであるため、SY-SUBRC は 0 、SY-TABIX は 3 にそれぞれ設定されます。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE SORTED TABLE OF LINE WITH UNIQUE KEY COL1.
DO 4
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE ITAB.
ENDDO.
READ TABLE ITAB WITH KEY COL2 = 16 TRANSPORTING NO FIELDS.
WRITE:
'SY-SUBRC =', SY-SUBRC,
/ 'SY-TABIX =', SY-TABIX.
出力は以下のようになります。
SY-SUBRC
= 0
SY-TABIX = 4
ソートテーブルに平方数の一覧が書き込まれます。READ 命令によって、キー項目 COL1 の値が 16 のテーブルの行が読み込まれます。テーブルキーは使用されません。項目は、作業領域にコピーされることも、フィールドシンボルに割り当てられることもありません。代わりに、システム項目が設定されます。行が検出されたため、SY-SUBRC は 0 に設定され、SY-TABIX は 4 に設定されています。

DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF
LINE.
DATA ITAB LIKE HASHED TABLE OF LINE WITH UNIQUE KEY COL1.
FIELD-SYMBOLS <FS> LIKE LINE OF ITAB.
DO 4
TIMES.
LINE-COL1 = SY-INDEX.
LINE-COL2 = SY-INDEX ** 2.
INSERT LINE INTO TABLE
ITAB.
ENDDO.
READ TABLE ITAB WITH TABLE KEY COL1 = 2 ASSIGNING <FS>.
<FS>-COL2 = 100.
LOOP AT ITAB INTO
LINE.
WRITE: / LINE-COL1, LINE-COL2.
ENDLOOP.
出力は以下のようになります。
1 1
2 100
3 9
4 16
ハッシュテーブルに平方数の一覧が書き込まれます。READ 命令によって、キー項目 COL1 の値が 2 のテーブルの行が読み込まれ、フィールドシンボル <FS> に割り当てられます。次に、<FS> のコンポーネント COL2 に値 100 が割り当てられます。これによって、対応するテーブル項目が変更されます。