三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
登場人物紹介
三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!
博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退し、SAPの後進育成と啓蒙活動に従事中!
この記事を読むメリット
今回はABAPの内部テーブル操作について説明するぞい!
内部テーブル操作はABAPプログラミングの基本であり、重要なスキルです。
本記事では、APPEND命令、INSERT命令、COLLECT命令、LOOP AT命令、READ TABLE命令、MODIFY命令、SORT命令、DELETE命令の基本的な使い方について解説します。
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
ABAPの内部テーブルはメモリ内で動的にデータを格納できるデータ構造で、データベースから取得したデータやプログラム内で生成したデータを操作する際に非常に便利です。
DBテーブルと同様に以下のような表形式でメモリ内で格納され、更新や削除といった操作が可能です。
標準テーブルとは、ABAPで使用される最も一般的な内部テーブルです。内部テーブル宣言時に’TYPE STANDARD TABLE OF’と記述することで標準テーブルが宣言されますが、’TYPE TABLE OF’と記述した場合も標準テーブルの宣言だとみなされます。順序やキーに関係なく、抽出したデータがそのままの形で格納されます。
DATA: lt_standard TYPE STANDARD TABLE OF ty_structure.
ソートテーブルとは、格納されているデータが特定のキーによってソートされる内部テーブルです。
データを格納する際に指定したキーでソートをかけてから格納するため、標準テーブルと比べて挿入時に時間がかかりますが、ソートテーブル内のデータを条件付きで読み込む場合は処理効率が向上します。
ソートテーブルを宣言する際には、必ずキーの設定をする必要があります。
DATA: lt_sorted TYPE SORTED TABLE OF ty_structure WITH UNIQUE KEY key_field.
ハッシュテーブルとは、キーによってデータに高速にアクセスできる内部テーブルです。
キーが一意である必要があります。データの検索やアクセスが非常に迅速に行えるため、大規模なデータセットに対して有効です。
DATA: lt_hashed TYPE HASHED TABLE OF ty_structure WITH UNIQUE KEY key_field.
まずは、内部テーブルにデータを挿入する方法を説明するぞい!
データを挿入するためにはAPPEND命令、INSERT命令、COLLECT命令があるのじゃ。
APPEND命令は、内部テーブルの末尾に新しい行を追加します。
基本の構文
APPEND 作業領域 TO 内部テーブル.
※作業領域と内部テーブルのデータ型は一致している必要があります。
TYPES: BEGIN OF ty_employee,
id TYPE i,
name TYPE string,
age TYPE i,
END OF ty_employee.
DATA: lt_employees TYPE STANDARD TABLE OF ty_employee,
ls_employee TYPE ty_employee.
ls_employee-id = 1.
ls_employee-name = 'Alice'.
ls_employee-age = 30.
APPEND ls_employee TO lt_employees.
ls_employee-id = 2.
ls_employee-name = 'Bob'.
ls_employee-age = 25.
APPEND ls_employee TO lt_employees.
LOOP AT lt_employees INTO ls_employee.
WRITE: / 'ID:', ls_employee-id, 'NAME:', ls_employee-name, 'AGE:', ls_employee-age.
ENDLOOP.
このプログラムでは、内部テーブルに行を追加する方法を示しています。APPEND命令を使って、作業領域のデータを内部テーブルの末尾に追加します。
APPEND命令の注意点
INSERT命令、内部テーブルの指定した位置に新しい行を挿入します。
基本の構文
INSERT 作業領域 TO TABLE 内部テーブル INDEX インデックス.
※作業領域と内部テーブルのデータ型は一致している必要があります。
※’INDEX’を指定しない場合は、APPENDと同じく最後の行にデータ追加されます。
" 最初に2行追加しておく
ls_employee-id = 2.
ls_employee-name = 'Alice'.
ls_employee-age = 30.
APPEND ls_employee TO lt_employees.
ls_employee-id = 4.
ls_employee-name = 'Charlie'.
ls_employee-age = 28.
APPEND ls_employee TO lt_employees.
" 2番目の位置に行を挿入する
ls_employee-id = 3.
ls_employee-name = 'Bob'.
ls_employee-age = 25.
INSERT ls_employee INTO lt_employees INDEX 2.
" 最初に行を追加する
ls_employee-id = 1.
ls_employee-name = 'David'.
ls_employee-age = 35.
INSERT ls_employee INTO lt_employees INDEX 1.
" 内部テーブルの内容を出力する
LOOP AT lt_employees INTO ls_employee.
WRITE: / 'ID:', ls_employee-id, 'NAME:', ls_employee-name, 'AGE:', ls_employee-age.
ENDLOOP.
このプログラムでは、内部テーブル lt_employees に従業員データを追加および挿入し、その内容を出力しています。具体的には、最初に2行のデータを APPEND 命令で末尾に追加し、次に INSERT 命令で特定の位置(2番目と1番目)に新しい行を挿入しています。(データ定義部分の記載は省略しています)
INSERT命令の注意点
COLLECT命令は、内部テーブルに行を追加する際、キーが同じ行が既に存在する場合は数値項目を集計し、存在しない場合は新しい行を追加します。
基本の構文
COLLECT 作業領域 TO 内部テーブル.
※作業領域と内部テーブルのデータ型は一致している必要があります。
TYPES: BEGIN OF ty_sales,
id TYPE i,
product TYPE string,
amount TYPE i,
END OF ty_sales.
DATA: lt_sales TYPE SORTED TABLE OF ty_sales WITH UNIQUE KEY id product,
ls_sales TYPE ty_sales.
ls_sales-id = 1.
ls_sales-product = 'ProductA'.
ls_sales-amount = 100.
COLLECT ls_sales INTO lt_sales.
ls_sales-id = 1.
ls_sales-product = 'ProductA'.
ls_sales-amount = 150.
COLLECT ls_sales INTO lt_sales.
ls_sales-id = 2.
ls_sales-product = 'ProductB'.
ls_sales-amount = 200.
COLLECT ls_sales INTO lt_sales.
" 内部テーブルの内容を出力する
LOOP AT lt_sales INTO ls_sales.
WRITE: / 'ID:', ls_sales-id, 'PRODUCT:', ls_sales-product, 'AMOUNT:', ls_sales-amount.
ENDLOOP.
このプログラムでは、COLLECT 命令を使用して売上データを内部テーブル lt_sales に追加しています。COLLECT 命令により、同じキー(ここでは id と product が同じ)の行が既に存在する場合、数値フィールド amount が集計されます。
COLLECT命令の注意点
次は、内部テーブルのデータを操作するための方法を説明するぞい!
データを操作するためにはLOOP AT命令、READ TABLE命令、MODIFY命令、SORT命令、DELETE命令があるのじゃ。
LOOP AT命令は、内部テーブルのデータを読み込む際に使用します。
基本構文やプログラム例は下記の「LOOP命令(LOOP~ENDLOOP)」の説明をご参照ください。
また、「フィールドシンボル」についての説明もご参照ください。
フィールドシンボルを使用することで、内部テーブルの行を直接操作します。
READ TABLE命令は、内部テーブルからデータを検索するために使用されます。基本的な構文はシンプルで、様々なオプションを使うことで柔軟な検索が可能です。sy-subrcを使って検索結果を判断し、必要に応じてエラーハンドリングを行います。(読み取りに失敗した場合、sy-subrcは0以外の値を返します。)
基本の構文
READ TABLE 内部テーブル [INTO 作業領域/ASSIGNING <フィールドシンボル>] [オプション].
特定のキーで検索します。WITH KEYオプションを使用する場合、指定したキーが内部テーブルのキー項目と一致していることを確認してください。キーが一致していないと、正しい結果が得られません。
TYPES: BEGIN OF ty_customer,
customer_id TYPE string,
customer_name TYPE string,
customer_address TYPE string,
END OF ty_customer.
DATA: lt_customers TYPE TABLE OF ty_customer,
ls_customer TYPE ty_customer.
" データを内部テーブルに挿入する例
APPEND VALUE #( customer_id = '12345' customer_name = 'John Doe' customer_address = '123 Main St' ) TO lt_customers.
APPEND VALUE #( customer_id = '67890' customer_name = 'Jane Doe' customer_address = '456 Elm St' ) TO lt_customers.
" WITH KEYオプションを使って検索
READ TABLE lt_customers INTO ls_customer WITH KEY customer_id = '12345'.
IF sy-subrc = 0.
WRITE: / 'データが見つかりました。'.
ELSE.
WRITE: / 'データが見つかりませんでした。'.
ENDIF.
このプログラムでは、customer_idをキーにして内部テーブルlt_customersからデータを検索し、検索結果を作業領域ls_customerに格納します。データが見つかった場合、その旨を出力します。
特定のインデックス(行番号)を指定して検索します。INDEXオプションを使用する場合、指定するインデックスが内部テーブルの範囲内であることを確認してください。
" INDEXオプションを使って検索
READ TABLE lt_customers INTO ls_customer INDEX 2.
このプログラムでは、インデックス2の行を内部テーブルlt_customersから検索し、結果を作業領域ls_customerに格納します。
特定の項目だけを読み取ります。TRANSPORTINGオプションを使用して特定の項目だけを読み取る場合、必要な項目が全て指定されていることを確認してください。指定されていない項目は読み取られないため、後続の処理でデータが不足する可能性があります。
" TRANSPORTINGオプションを使って検索
READ TABLE lt_customers INTO ls_customer INDEX 2 TRANSPORTING customer_name.
このプログラムでは、customer_name項目のみを内部テーブルlt_customersから検索し、結果を作業領域ls_customerに格納します。
テーブルがソートされている場合にバイナリ検索を使用します。BINARY SEARCHオプションを使用する場合、内部テーブルが検索キーでソートされていることを確認してください。ソートされていない場合、正確な検索結果が得られない可能性があります。
" BINARY SEARCHオプションを使って検索
READ TABLE lt_customers INTO ls_customer WITH KEY customer_id = '12345' BINARY SEARCH.
このプログラムでは、customer_idをキーにしてバイナリ検索を使用して内部テーブルlt_customersからデータを検索し、結果を作業領域ls_customerに格納します。
データを転送せず、検索結果のみを取得します。TRANSPORTING NO FIELDSオプションを使用する場合、データを転送せずに検索結果のみを取得するため、データの存在チェックのみに使用します。このオプションを使用する場合、内部テーブルの構造やデータに依存しない検索が行われます。
" TRANSPORTING NO FIELDSオプションを使って検索
READ TABLE lt_customers TRANSPORTING NO FIELDS WITH KEY customer_id = '12345'.
このプログラムでは、customer_idをキーにして内部テーブルlt_customersからデータを取得せずに検索結果のみを取得します。
READ TABLE命令の注意点
MODIFY命令は、内部テーブルの既存の行を変更します。
基本の構文
・単一行の変更または挿入する場合
MODIFY TABLE 内部テーブル FROM 作業領域 [TRANSPORTING 項目名].
・条件を使用して複数の行を変更する場合
MODIFY 内部テーブル FROM 作業領域 TRANSPORTING 項目名 WHERE 条件.
・変更する行を指定して行を変更する場合
MODIFY 内部テーブル FROM 作業領域 INDEX インデックス [TRANSPORTING 項目名].
※作業領域と内部テーブルのデータ型は一致している必要があります。
※TRANSPORTINGを指定することで更新対象の項目を指定することができます。
TYPES: BEGIN OF ty_employee,
id TYPE i,
name TYPE string,
age TYPE i,
END OF ty_employee.
DATA: lt_employees TYPE SORTED TABLE OF ty_employee WITH UNIQUE KEY id,
ls_employee TYPE ty_employee.
ls_employee-id = 1.
ls_employee-name = 'Alice'.
ls_employee-age = 30.
APPEND ls_employee TO lt_employees.
ls_employee-id = 2.
ls_employee-name = 'Bob'.
ls_employee-age = 25.
APPEND ls_employee TO lt_employees.
READ TABLE lt_employees INTO ls_employee WITH KEY id = 2.
IF sy-subrc = 0.
ls_employee-name = 'Robert'.
MODIFY TABLE lt_employees FROM ls_employee.
ENDIF.
LOOP AT lt_employees INTO ls_employee.
WRITE: / 'ID:', ls_employee-id, 'NAME:', ls_employee-name, 'AGE:', ls_employee-age.
ENDLOOP.
このプログラムでは、MODIFY命令を使用して内部テーブル ‘lt_employees’の既存の行を変更しています。ここでは’ID’が’2’の従業員の名前を’Bob’から’Robert’に変更しています。
MODIFY命令の注意点
SORT命令は、内部テーブルを特定の項目でソートします。
基本の構文
SORT 内部テーブル BY 項目 [ASCENDING|DESCENDING].
※ASCENDING(昇順)またはDESCENDING(降順)を選択します。指定しない場合はデフォルトでASCENDINGで並び替えされます。
TYPES: BEGIN OF ty_employee,
id TYPE i,
name TYPE string,
age TYPE i,
END OF ty_employee.
DATA: lt_employees TYPE STANDARD TABLE OF ty_employee,
ls_employee TYPE ty_employee.
ls_employee-id = 1.
ls_employee-name = 'Charlie'.
ls_employee-age = 30.
APPEND ls_employee TO lt_employees.
ls_employee-id = 2.
ls_employee-name = 'Alice'.
ls_employee-age = 25.
APPEND ls_employee TO lt_employees.
ls_employee-id = 3.
ls_employee-name = 'Bob'.
ls_employee-age = 20.
APPEND ls_employee TO lt_employees.
SORT lt_employees BY name ASCENDING.
LOOP AT lt_employees INTO ls_employee.
WRITE: / 'ID:', ls_employee-id, 'NAME:', ls_employee-name, 'AGE:', ls_employee-age.
ENDLOOP.
このプログラムでは、SORT命令を使用して内部テーブル ‘lt_employees’を’name’項目でソートし、ソート後の内容を出力しています。
SORT命令の注意点
DELETE命令は、特定の条件に一致する行を内部テーブルから削除します。
基本の構文
・条件を使用して複数の行を削除する場合
DELETE 内部テーブル WHERE 条件.
・削除する行を指定して行を削除する場合
DELETE 内部テーブル INDEX インデックス.
・テーブルキーを使用して行を削除する場合
DELETE TABLE 内部テーブル FROM 作業領域.
※作業領域と内部テーブルのデータ型は一致している必要があります。
TYPES: BEGIN OF ty_employee,
id TYPE i,
name TYPE string,
age TYPE i,
END OF ty_employee.
DATA: lt_employees TYPE STANDARD TABLE OF ty_employee,
ls_employee TYPE ty_employee.
" データの追加
ls_employee-id = 1.
ls_employee-name = 'Alice'.
ls_employee-age = 30.
APPEND ls_employee TO lt_employees.
ls_employee-id = 2.
ls_employee-name = 'Bob'.
ls_employee-age = 25.
APPEND ls_employee TO lt_employees.
" 条件を指定して削除する
DELETE lt_employees WHERE name = 'Alice'.
" 残りの行の内容を出力する
LOOP AT lt_employees INTO ls_employee.
WRITE: / 'ID:', ls_employee-id, 'NAME:', ls_employee-name, 'AGE:', ls_employee-age.
ENDLOOP.
このプログラムでは、DELETE命令を使用して内部テーブル ‘lt_employees’から名前が’Alice’の行を削除し、残りの行の内容を出力しています。
DELETE命令の注意点
ABAPの内部テーブルに関する基本的な操作方法を説明しました。内部テーブルはデータ操作を効率化し、複雑なデータ処理を簡素化するための重要なツールです。さらに深く理解するためには、実際に手を動かしてコードを書いてみることが大切です。
新着のSAPフリーランス案件
【FI】
S/4HANAへのバージョンアップ支援(Jrコンサル可)
【PP】
メーカー向けSAP移行プロジェクト支援
【MM】
【SD】
製造業向けロジ領域の運用保守支援
【BASIS】
【MM】
【SD】
製造業向け運用保守支援支援
【CO】
【FI】
【MM】
【PP】
【SD】
大手メーカー社向けSAP導入支援
【FI】
商社向け基幹システムバージョン支援
【FI】
SAP運用業務支援
【FI】
SAP導入プロジェクト支援
【FI】
光学機器 S/4HANA導入テスト支援
【CO】
一般消費財メーカーS/4 HANAバージョンアップ
SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!
SAPラボのライターの特徴
・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!
SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。
募集要項
・SAP導入や運用保守プロジェクトへの参画経験1年以上
ご応募/お問合せ先
info@sap-labo.com
少しでもご興味ある方、ぜひお気軽にご連絡下さい!
新卒でSAPエンジニアとしてABAPでの新規開発や保守業務を担当。
業務内容としてはロジ系(MM/SD)がメインで、ABAPの開発が最も得意。