テーブル行の操作
このトピックはテーブルのデータ行に対して、読み込みや変更などの操作方法を取り上げて説明します。
読み込み
内部テーブルから単一行を読み込みするには、以下の命令を使用します。
- READ TABLE itab search-key search-result.
検索キーを指定
読み込む対象となるデータ行の検索キーを指定する方法を説明します。
(1)テーブルキー指定
検索キーとして itab のテーブルキーを使用するには、以下のように key を入力します。
- READ TABLE itab FROM wa result.
または
- READ TABLE itab WITH TABLE KEY k1 = f1 … kn = fn result.
全タイプの内部テーブルに対して、この方法を利用することができます。
(2)任意キー指定
テーブルキー以外の項目も検索キーとして指定することができます。
- READ TABLE itab WITH KEY k1 = f1 … kn = fn result.
標準テーブルの場合、「BINARY SEARCH」をつけて検索の高速化を図ることができます。これは、標準テーブルが検索キー項目によってソートされていることを前提にしています、そうではない場合、エラーにならないが、意図しないデータ行が読み出されることになってしまいます。
(3)index指定
標準テーブルおよびソートテーブルに限りますが、読み込む行のテーブル索引を明示的にidxによって指定することができます。
- READ TABLE 読出元の内部テーブル INTO 読み出し先構造 INDEX idx
idx は、i 型のデータオブジェクトである必要があります。
取得できたかをチェック
対象データが取得できた場合と取得できなかった場合、それぞれ以下のようにシステム項目に値が設定されます。
- 取得できた場合
- sy-subrc: 0
- sy-tabix: 取得された行のインデックス
- 取得できなかった場合
- sy-subrc: エラーコード(0でない数字)
対象行のデータを照会
検索対象行のデータを照会するには、作業領域かフィールドシンボルかを使用することができます。
- 作業領域を使用
READ TABLE itab key INTO wa - フィールドシンボルを使用
READ TABLE itab key ASSIGNING <fs>.
存在チェック
対象データ行の内容を関心せず、対象データが存在しているかどうかのみをチェックする場合があります。その際、「READ TABLE」命令に「NO FIELDS」オプションをつけることができます。
挿入
単一行挿入
単一行を内部テーブルの特定の箇所に挿入する場合は、「INSERT」を使用します。
- INSERT wa INTO TABLE itab INDEX idx.
複数行挿入
複数行を内部テーブルの特定の箇所に挿入する場合は「INSERT LINES OF」を使用します。
- INSERT LINES OF itab1 FROM idx1_1 TO idx1_2 INTO TABLE itab2 INDEX idx2.
変更
単一行変更
単一行を変更するには、以下の命令を使用します。
- MODIFY TABLE itab FROM wa [TRANSPORTING f1 f2 …].
複数行変更
条件を使用して 1 行または複数行を変更するには、以下の命令を使用します。 MODIFY itab FROM wa TRANSPORTING f1 f2 …WHERE cond.
削除
単一行削除
内部テーブルの単一行を削除する場合は、DELETE 命令を使用します。
- DELETE TABLE itab FROM wa.
または
- DELETE TABLE itab WITH TABLE KEY k1 = f1 … kn = fn.
または
- DELETE TABLE itab Index idx
複数行削除
内部テーブルの行を複数まとめて削除する場合には、「DELETE .. WHERE」文を使用します。
- DELETE TABLE itable WHERE key = value.
走査
内部テーブルを走査するには、命令LOOP~ENDLOOPを使用します。 FROM を指定できるのは、 標準テーブルおよび ソートテ ーブルの場合に限られます。 すべてのテーブルデータ型について WHERE を指定することができます。
DATA : T_WITH_ITEM TYPE TABLE OF WITH_ITEM, W_WITH_ITEM TYPE WITH_ITEM. * 処理 LOOP AT T_WITH_ITEM INTO W_WITH_ITEM WHERE BELNR = W_BELNR AND BUZEI = W_BUZEI. * 処理 ENDLOOP.