SAP ABAP 内部テーブル: 作成、読み取り、入力、コピー、削除
内部テーブルとは何ですか?
内部テーブル ABAP で動的に使用するために固定構造からデータを取得するために使用されます。 内部テーブルの各行は同じフィールド構造を持ちます。 内部テーブルの主な用途は、プログラム内のデータベース テーブルのデータを保存し、フォーマットすることです。
ワークエリアとは何ですか?
作業領域は単一行のデータです。 これらは、内部テーブルのいずれかと同じ形式である必要があります。 内部テーブルのデータを一度に XNUMX 行ずつ処理するために使用されます。
内部テーブルと作業領域の違い?
百聞は一見に如かず
内部テーブルの種類
内部テーブルには XNUMX 種類があります。
- HEADER行のある内部テーブル
- HEADER 行のない内部テーブル。
ヘッダー行のある内部テーブル
- ここでは、システムが自動的に作業領域を作成します。
- 作業領域のデータ型は内部テーブルと同じです。
- この作業領域は HEADER 行と呼ばれます。
- ここで、テーブルの内容に対するすべての変更やアクションが実行されます。 この結果、レコードをテーブルに直接挿入したり、内部テーブルから直接アクセスしたりすることができます。
ヘッダー行のない内部テーブル :
- ここでは、テーブルに関連付けられた作業領域はありません。
- このようなテーブルにアクセスする必要がある場合は、作業領域を明示的に指定します。
- したがって、これらのテーブルには直接アクセスできません。
内部テーブルの作成
内部テーブルを作成するにはさまざまな方法があります。 一つずつ見ていきましょう -
1.Type ステートメントを使用する
次に、次を使用して内部テーブル itab を作成しましょう。 TYPE ステートメント.
構文は –
Types : begin of line, column1 type I, column2 type I, end of line.
例:
TYPES : begin of line, empno type I, empname(20) type c , end of line.
TYPES ステートメントは、定義どおりに構造行を作成します。
実際に内部テーブルitabを作成するには、次のコマンドを使用します。
Data itab type line occurs 10.
内部テーブル itab は line の構造で作成されます。内部テーブルの構造を宣言することに加えて、OCCURS 句は主記憶域に保持されるテーブル エントリの数 (この場合は 10) も定義します。 余分なレコードがページング領域に書き出され、パフォーマンスに影響を与える可能性があります
2.別のテーブルを参照する
既存のテーブルを参照して内部テーブルを作成することができます。既存のテーブルは標準のテーブルでも構いません。 SAP テーブル、Z テーブル、または別の内部テーブル。
構文-
Data <f> <type> [with header line].
例 -
DATA itab TYPE line OCCURS 10 with header line.
ここでは、ヘッダー行を含むタイプ line の内部テーブル itab が作成されます。 「ヘッダー行あり」はオプションであることに注意してください。
3.既存の構造を参照することにより
構文-
Data <f> LIKE <struct> occurs n [with header line].
例 -
DATA itab LIKE sline OCCURS 10.
ここでは、sline と同じ構造を持つテーブル itab が作成されます。
4.新しい構造を作成することにより
次に、独自の構造を持つ内部テーブルを作成してみましょう。 ここではヘッダー行を含むテーブルが作成されています。 初期設定で.
構文–
Data : Begin of <f> occurs <n>, <component declaration>, ................................., End of <f>.
例–
Data : Begin of itab occurs 10, column1 type I, column2(4) type C, column3 like mara-ernam, End of itab.
内部テーブル itab が作成されます
内部テーブルの設定
いくつかの内部テーブルが正常に作成されたので、内部テーブルにレコードを追加する方法を見てみましょう。 テーブルにデータを入力するにはさまざまな方法が利用可能です
1.データを一行ずつ追加
使用可能な最初の方法は、APPEND ステートメントの使用です。
APPEND ステートメントを使用すると、別の作業領域から内部テーブルに XNUMX 行を追加するか、内部テーブルに最初の XNUMX 行を追加できます。
構文–
APPEND [<wa> TO / INITIAL LINE TO] <itable>.
ここが作業エリアまたは、最初の行が内部テーブルに追加されます。
システム変数 SY-TABIX には、追加された行のインデックスが含まれています。
例:
Data: Begin of itab occurs 10, col1 type C, col2 type I, end of itab. Append initial line to itab.
結果 : ' ' '0'
初期行は、その型の正しい値で初期化された行をテーブルに追加します。 ここで、col1 は文字、col2 は整数です。 次に、最初の行を APPEND して、列のデータ型に関して初期化された行 (つまり、col1 にはスペース、col0 には 2) を追加します。
2.COLLECT文の使い方
COLLECT は、内部テーブルにデータを設定するために使用されるステートメントの別の形式です。 一般に、COLLECT は、一意の標準キーを持つ内部テーブルに行を挿入するときに使用されます。
構文-
COLLECT [<wa> INTO] <itable>.
ヘッダ行のあるテーブルの場合、INTOオプションは省略されます。 追加しようとしているものと同じキーを持つエントリがすでに存在すると仮定すると、新しい行はテーブルに追加されませんが、両方のエントリの数値フィールドが追加され、キーに対応するエントリが XNUMX つだけ存在します。 。 SY-TABIXの値が元のエントリの行に変更されます。 それ以外の場合、COLLECT は APPEND と同様に動作し、SY-TABIX には処理された行のインデックスが含まれます。
3.INSERT ステートメントの使用
INSERT ステートメントは、行/作業領域を内部テーブルに追加します。 INSERT ステートメントの INDEX 句を使用して、新しい行を追加する位置を指定できます。
構文
INSERT [<wa> INTO / INITIAL LINE INTO] <itable> [index <idx>].
ここが作業エリアまたは INITIAL LINE が内部テーブルに挿入されますインデックスで。
内部テーブルのコピー
APPEND LINES または INSERT LINES ステートメントを使用すると、ある内部テーブルの内容を別のテーブルにコピーできます。より簡単な方法は、次の構文のいずれかを使用することです。
MOVE <itab1> To <itab2>. OR <itab1> = <itab2>.
これらはITAB1の内容をITAB2にコピーします。 ヘッダー行のある内部テーブルの場合、作業領域と区別するために [] を使用する必要があります。 したがって、ヘッダー行を含む内部テーブルの内容をコピーするには、構文は次のようになります。
itab1[] = itab2[].
内部テーブルの読み取り
これで、内部テーブルの作成とそこにデータを設定する方法に慣れてきました。 次に、実際にデータを使用する方法、または内部テーブルからデータを取得する方法を見ていきます。
1. ループ - エンドループの使用
内部テーブルにアクセスまたは読み取る方法の XNUMX つは、LOOP-ENDLOOP を使用することです。
構文
LOOP AT <itable> [INTO <wa>] ................................... ENDLOOP.
ここで LOOP AT ITABLE と言うと、内部テーブル ITABLE が XNUMX 行ずつ読み取られます。 LOOP-ENDLOOP 構造のどの部分でも、その行の列の値にアクセスできます。 SY-SUBRC の値は次のように設定されます。 0XNUMX つのレコードだけが読み取られる場合でも。
2. READの使用
内部テーブルを読み取るもう XNUMX つの方法は、READ ステートメントを使用することです。
構文-
READ TABLE <itable> [INTO <wa>] INDEX <idx>.
このステートメントは、現在の行、またはインデックスで指定された行を読み取ります。 。 SY-TABIX の値は、読み取られた行のインデックスです。 指定されたインデックスを持つエントリが見つかった場合、SY-SUBRC は 0 に設定されます。指定されたインデックスが 0 未満の場合は、実行時エラーが発生します。 指定されたインデックスがテーブル サイズを超える場合、SY-SUBRC は 4 に設定されます。
内部テーブルの削除
内部テーブルから行を削除するにはさまざまな方法があります。
1.ループ内の行を削除します。
これは行を削除する最も簡単な方法です。
構文
DELETE <ITABLE>.
このステートメントはループ内でのみ機能します。 現在の行を削除します。 ループ内の行を条件付きで削除するには、 WHERE句.
2.インデックスを使用して行を削除します。
これは、既知のインデックスにある内部テーブルから行を削除するために使用されます。
構文
DELETE <ITABLE> INDEX <IDX>.
インデックスのある行削除されます。次の行のインデックスは 1 減ります。