SAP ABAP 内部テーブル: 作成、読み取り、入力、コピー、削除

⚡ スマートサマリー

SAP ABAPの内部テーブルオブジェクトは、プログラム内で動的に使用するために、固定構造のデータを保持します。このページでは、作業領域、ヘッダー行、4つの作成方法、およびテーブル行へのデータの入力、コピー、読み取り、削除を行うステートメントについて説明します。

  • ???? コア定義: 内部テーブルは、メインメモリに同一構造の行を格納するもので、多くの場合、データベーステーブルから読み取ったデータのフォーマットを整えるために使用されます。
  • 🧾 作業エリアの役割: 作業領域とは、テーブルと同じ形式の単一の行であり、テーブルを一度に1行ずつ処理します。
  • 🏷️ ヘッダー行: ヘッダー行のあるテーブルは暗黙的に作業領域を受け取るため、行に名前を付けなくても直接挿入または読み取ることができます。
  • 🛠️ 4つの制作方法: TYPES ステートメント、既存のテーブルへの参照、既存の構造体への参照、または OCCURS で宣言された新しい構造体。
  • ➕ 人口増加: APPENDは1行を追加し、COLLECTは重複キーの数値フィールドを集計し、INSERTは選択したインデックスに1行を挿入します。
  • 🔍 読んでコピーする: LOOP AT はすべての行を読み込み、READ TABLE はインデックスで 1 行を読み込み、MOVE または等号はテーブル全体をコピーします。
  • 🗑️ 削除: LOOP 内の DELETE は現在の行を削除し、DELETE … INDEX は既知の位置にある行を削除します。

SAP ABAP内部テーブル

内部テーブルとは何ですか?

内部テーブル ABAP で動的に使用するために固定構造からデータを取得するために使用されます。 内部テーブルの各行は同じフィールド構造を持ちます。 内部テーブルの主な用途は、プログラム内のデータベース テーブルのデータを保存し、フォーマットすることです。

内部テーブルは常に作業領域と連携して機能するため、次にその概念について説明します。

作業エリアとは何ですか?

作業領域は、データの単一行で構成されます。内部テーブルと同じ形式である必要があります。内部テーブルのデータを1行ずつ処理するために使用されます。

内部テーブルと作業エリアの違いは?

百聞は一見に如かず

内部テーブルと作業領域の違い

図は、テーブルが多数の行を保持している一方で、作業領域には現在処理中の行のみを保持していることを示しています。この作業領域がシステムによって作成されるか、開発者によって作成されるかは、後述するテーブルの種類によって異なります。

内部テーブルの種類

内部テーブルには XNUMX 種類があります。

  1. HEADER行のある内部テーブル
  2. HEADER 行のない内部テーブル。

ヘッダー行のある内部テーブル

  • ここでは、システムが自動的に作業領域を作成します。
  • 作業領域のデータ型は内部テーブルと同じです。
  • この作業領域は HEADER 行と呼ばれます。
  • ここで、テーブルの内容に対するすべての変更やアクションが実行されます。 この結果、レコードをテーブルに直接挿入したり、内部テーブルから直接アクセスしたりすることができます。

ヘッダー行のない内部テーブル :

  • ここでは、テーブルに関連付けられた作業領域はありません。
  • このようなテーブルにアクセスする必要がある場合は、作業領域を明示的に指定します。
  • したがって、これらのテーブルには直接アクセスできません。

💡ヒント: ヘッダー行のあるテーブルは、テーブル名と作業領域名が同じになるため、コードが曖昧になります。新しいプログラムでは、ヘッダー行のないテーブルを宣言し、明示的に作業領域を指定する必要があります。

標準、ソート済み、ハッシュ化された内部テーブル

ヘッダー行の有無に加えて、すべての内部テーブルには、行の検索方法を決定するテーブルの種類があります。この種類は、TYPE STANDARD TABLE、TYPE SORTED TABLE、またはTYPE HASHED TABLEオプションで選択され、実行時に直接影響を与えます。

テーブルの種類 アクセス方法 キー 最適な用途
スタンダード インデックスとキー、キーに対する線形検索 非一意 逐次処理、およびインデックスを使用して読み取る小さなテーブル
並べ替え インデックスとキー、キーに対するバイナリサーチ 一意か非一意かを問わず、自動的にソートされます。 大きな表では、主要なキーフィールドを繰り返し読みます。
ハッシュ化 ハッシュアルゴリズムを使用したキーのみ ユニークな データベースレコードのバッファなど、常にフルキーで読み取られる非常に大きなテーブル

標準テーブルはデフォルトであり、シーケンシャル処理に適しています。ハッシュテーブルは格納される行数に関係なくアクセス時間を一定に保つため、パフォーマンスルールは SQLを開く レコードのバッファリングにおすすめです。

内部テーブルの作成

内部テーブルを作成するにはさまざまな方法があります。 一つずつ見ていきましょう -

1.Type ステートメントを使用する

それでは、TYPEステートメントを使用して内部テーブルitabを作成してみましょう。

構文は –

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'

Initial lines は、その型に応じた正しい値で初期化された行をテーブルに追加します。ここでは、col1 は文字型、col2 は整数型です。次に、APPEND initial line を実行すると、列のデータ型に応じて初期化された行が追加されます。つまり、col1 にはスペース、col2 には 0 が追加されます。

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>].

ここは作業エリアですまたはイニシャル 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 に設定されます。

⚠️ 警告: READ TABLE … INDEX 0 は実行時エラーを発生させるため、実行時に計算されたインデックスはステートメントの実行前にチェックする必要があります。

内部テーブルの削除

内部テーブルから行を削除するにはさまざまな方法があります。

1.ループ内の行を削除します。

これは行を削除する最も簡単な方法です。

構文

DELETE <ITABLE>.

このステートメントはループ内でのみ機能します。 現在の行を削除します。 ループ内の行を条件付きで削除するには、 WHERE句.

2.インデックスを使用して行を削除します。

これは、既知のインデックスにある内部テーブルから行を削除するために使用されます。

構文

DELETE <ITABLE> INDEX <IDX>.

インデックスのある行削除されます。次の行のインデックスは 1 減ります。

3.重複行の削除。

テーブルがキーフィールドでソートされた後、重複する行が削除されます。

SORT itab BY col1.

DELETE ADJACENT DUPLICATES FROM itab COMPARING col1.

隣接する行のみが比較されるため、SORT ステートメントを最初に実行する必要があります。テーブルを完全に空にするには、CLEAR itab[] または REFRESH itab を使用します。

よくあるご質問

CLEAR itab はヘッダー行のみを空にし、CLEAR itab[] は本体を空にします。REFRESH は常に本体を空にしますが、メモリは確保されたままです。FREE は本体を空にすると同時にメモリも解放します。

SY-TABIX には、現在処理中の内部テーブルの行番号が格納されます。SY-INDEX には、DO ループまたは WHILE ループのパス番号が格納されます。ハッシュテーブルにはインデックスがないため、SY-TABIX はゼロになります。

LOOP AT itab ASSIGNING でフィールドシンボルを割り当てると、すべての行を作業領域にコピーする必要がなくなるため、大きなテーブルでも高速に実行され、MODIFY ステートメントを使用せずにその場で行を変更できます。

はい。ABAP開発ツールのAIアシスタントは、OCCURSとヘッダー行の宣言を明示的な作業領域を持つTYPE STANDARD TABLE OFに書き換え、ヘッダー行が消えた時点でエラーになるステートメントにフラグを立てます。

AIパフォーマンスアドバイザーは、テーブルがどのように格納され、読み取られるかを調べ、実行時間が線形検索に支配されている場合は、ソート済みテーブルまたはハッシュテーブルを推奨します。推奨は、 tracトランザクションSATにおけるe。