【SAP ABAP】基本構文:データベーステーブル操作(SELECT、INSERT、UPDATE、DELETE)

ABAP基本構文、DB操作編

登場人物紹介

三崎レイナ
社会人1年目。新卒でITコンサルティングファームに就職。初配属がSAPプロジェクトにアサインされる。SAPがわからないことだらけで悩んでいたところ、会社の先輩にSAPラボの所長を紹介され、毎週末に所長とSAPのお勉強中!

博士
SAPラボの所長。SAP大好き博士!SAP導入プロジェクトを構想策定~運用保守まであらゆるフェーズを数多く経験。
いまは優しきおじいちゃんだが、プロマネバリバリの時代はかなり怖かったらしい。現在は引退しSAPの後進育成と啓蒙活動に従事中!
若者に負けぬようX(旧Twitter)も奮闘中。

この記事を読むメリット

  • SELECT命令、INSERT命令、UPDATE命令、DELETE命令を使用して、データベーステーブル操作を行えるようになります。
博士

今回はABAPのデータベース操作(SQL操作)について説明するぞい!

データベース操作(SQL操作)はABAPプログラミングの基本であり、重要なスキルです。本記事では、SELECT命令、INSERT命令、UPDATE命令、DELETE命令の基本的な使い方について解説します。

SAPフリーランスバンク SAPフリーランスバンク

新着のSAPフリーランス案件

【FI】

【空輸業S/4HANA再構築(FI/TRM)】東京・大田区(リモート併用)/要件定義

月額単価
1,300,000円 / 月
稼働場所
東京都
業務領域
要件定義
稼働率:
100%
作業内容:
現行のECC6.0からSAP S/4HANAへ基幹システムを再構築するプロジェクトです。 Fit to Standardを基本方針としつつ、現行システムからの変革ポイントを中心に要件定義を進めます。 本プロジェクトにおいて、ご自身の専門領域(債権管理、債務管理、I/F、TRM)のコンサルタントまたはSEとして、要件定義フェーズを中心メンバーとして担当していただきます。 募集ポジションと主な業務内容: ① 債権管理(AR)に詳しいSAP会計コンサルタント AR領域の専門家として、現行業務の分析、新業務プロセスの設計、Fit&Gap分析、および要件定義を主導します。 ② 債務管理(AP)に詳しいSAP会計コンサルタント AP領域の専門家として、現行業務の分析、新業務プロセスの設計、Fit&Gap分析、および要件定義を主導します。 ③ I/Fの設計開発ができるSAP会計SE 会計領域における外部システムとのインターフェースについて、要件定義から設計、開発連携までを担当します。 ④ TRMモジュールの経験者(ジュニアコンサルタント可) TRM(Treasury and Risk Management)領域の担当として、要件定義やFit&Gap分析の支援を行います。

【FI】

【S/4HANAグローバルERPテンプレート(FI-RTR)】フルリモート/構想・要件定義準備

月額単価
1,600,000円 / 月
稼働場所
フルリモート
業務領域
要件定義
稼働率:
100%
作業内容:
製造業のグローバルなビジネス展開を支える、SAP S/4HANAによる新ERPテンプレートの構築プロジェクトです。 本ポジションでは、プロジェクトの初期段階である要件定義準備フェーズにおいて、FI(Record to Report)領域の専門家としてご参画いただきます。先行して導入されたFIシステムとの連携も考慮しながら、SAP構築を推進する重要な役割を担当していただきます。 主な業務内容:
  • FI(RTR)領域における、グローバルテンプレートの構想策定および要件定義準備
  • 現行業務プロセスの分析、およびグローバル標準プロセスの設計支援
  • 先行導入済みのFIシステムとの連携方式の検討、および設計
  • 課題の整理、および解決方針の策定・提案
  • 関連ドキュメント(構想資料、課題管理表など)の作成

【CO】

【FI】

【MM】

【SD】

【その他】

【ECC→S/4HANA移行(FI基本設計)】東京駅(週1出社)/アドオン帳票再設計

月額単価
900,000円 / 月
稼働場所
東京都
業務領域
設計, 開発(ABAP/Fiori)
稼働率:
100%
作業内容:
ECC6.0からS/4HANAへの移行プロジェクトにおいて、設計書が存在しない数十本の既存アドオン帳票(ABAP)をS/4HANA環境で再実装することがミッションです。 本ポジションでは、現行のABAPプログラムをリバースエンジニアリングしながら、顧客への要件ヒアリングを行い、S/4HANA用の新たな基本設計書を作成する、非常に重要な役割を担当していただきます。 主な業務内容:
  • 既存アドオン帳票(ABAP)のソースコード解析(リバースエンジニアリング)
  • 顧客担当者への要件ヒアリング、および仕様確認
  • S/4HANA環境で実装するための、新たな基本設計書レベルの資料作成
  • 作成した基本設計書の開発チームへの説明、および連携

【CO】

【SD】

【その他】

【部品事業SAP S/4HANA新規導入】フルリモート/大規模募集(SD/CO/IF設計者)

月額単価
1,300,000円 / 月
稼働場所
フルリモート
業務領域
要件定義
稼働率:
100%
作業内容:
交換部品の受発注や出荷を管理する部品事業の基幹システムを、既存の非SAPシステムからSAP S/4HANAへ新規に導入するプロジェクトです。 本募集では、プロジェクトの根幹をなす基本設計フェーズにおいて、ご自身の専門領域(SD、CO、I/F)の設計者として、新システムの基盤構築を担当していただきます。 募集ポジションと主な業務内容:
  • 合計17名の設計者を募集します。
  • SD(販売管理)設計者:6名
  • CO(管理会計)設計者:2名
  • I/F(インターフェース)設計者:9名
ご担当いただく主な業務は以下の通りです。
  • 担当モジュール領域における要件確認、および追加機能開発の基本設計
  • テストシナリオの作成支援、および検証
  • データ移行方式の検討支援
  • 関連ドキュメントの作成および更新

【MM】

【製造業SAP(MM I/F設計)】フルリモート(大崎)/要件定義・外部設計

月額単価
1,400,000円 / 月
稼働場所
フルリモート
業務領域
要件定義, 設計
稼働率:
100%
作業内容:
製造業のSAPプロジェクトにおいて、MM(在庫購買管理)領域のインターフェース構築が重要なテーマとなっています。 本ポジションでは、MMの専門家として、お客様と直接要件を確認しながらインターフェースの設計を行い、その後の開発・テストまでの一連のタスクを単独で推進していただきます。 主な業務内容:
  • 顧客担当者とのディスカッションを通じた、MM領域のインターフェース要件定義
  • インターフェースの外部設計書の作成
  • 開発チームへの設計内容の連携、およびQ&A対応
  • 開発されたインターフェースのテスト計画策定、および実施
  • 関連ドキュメントの作成および更新

【CO】

【FI】

【MM】

【PP】

【SD】

【製造業S/4HANA(ABAP開発)】東京・十条/設計・開発・テスト

月額単価
800,000円 / 月
稼働場所
東京都
業務領域
設計, 開発(ABAP/Fiori)
稼働率:
100%
作業内容:
製造業のS/4HANAプロジェクトにおいて、業務要件に合わせたアドオン機能の設計・開発がミッションです。 ご自身の得意なモジュール(SD, MM, PP, QM, FI, COのいずれか)を担当し、基本設計から開発、結合・総合テストまで、一連の開発工程を自律的に推進していただきます。 主な業務内容:
  • SAP S/4HANA環境におけるアドオン機能の基本設計、および詳細設計
  • ABAPによる開発・実装(BAdI, BAPI, ALV, Dynpro等の知見を想定)
  • 開発した機能の単体テスト、結合テスト、総合テストの実施
  • 他のSEとの要件確認や仕様調整などのコミュニケーション
  • 関連ドキュメント(設計書、テスト仕様書など)の作成

【MM】

【SD】

【製造業システム再構築(S/4 SD/MM)】東京・神保町/設計・開発

月額単価
1,100,000円 / 月
稼働場所
東京都
業務領域
設計, 開発(ABAP/Fiori)
稼働率:
100%
作業内容:
既存の基幹システムをSAP S/4HANAで再構築するプロジェクトです。 本ポジションでは、ロジスティクス領域(SD/MM)の専門家として、アドオン機能の設計から開発、テストに至るまでの一連の工程を中心メンバーとして担当していただきます。 主な業務内容:
  • 既存システムの機能解析・調査、およびS/4HANAへの移行に関する概要設計
  • 販売管理(SD/MM)領域におけるアドオン機能の基本設計・詳細設計
  • ABAP等による開発・実装
  • 開発した機能の単体テスト、および結合テスト支援
  • 関連ドキュメント(設計書、テスト仕様書など)の作成

【PP】

【SD】

【その他】

【S/4HANAグローバル展開支援】岡山(リモート相談可)/要件定義・導入(PP/QM/SD/LWM)

月額単価
1,200,000円 / 月
稼働場所
岡山県
業務領域
要件定義
稼働率:
100%
作業内容:
米国のグローバルテンプレートを基に、岡山拠点へSAP S/4HANAを導入するロールインプロジェクトです。 本プロジェクトでは、ご自身の専門モジュール(PPDS, QM, SD, LWM)のコンサルタントとして、要件定義からUAT、データ移行、導入後のハイパーケアまで、一連の導入プロセスを主体的に推進していただきます。 主な業務内容:
  • 担当モジュールにおける、業務プロセスの整理、および要件定義
  • グローバルテンプレートとのFit&Gap分析、およびアドオン要件定義書の作成
  • カスタマイズ設定、および開発チームとの連携
  • UAT(ユーザー受入テスト)、データ移行の支援
  • SIハイパーケア(本稼働後の初期サポート)
  • 米国テンプレート担当と岡山現地担当者とのコミュニケーション(英語・日本語)

【MM】

【SD】

【SAP保守運用(MM/SD)】大阪・肥後橋(リモート相談可)/リーダー・コンサルタント募集

月額単価
1,300,000円 / 月
稼働場所
大阪府
業務領域
運用・保守
稼働率:
100%
作業内容:
SAPのフルモジュールを対象とした大規模な保守運用プロジェクトです。 現在、並行してシステムのバージョンアップ案件も進行しており、プロジェクト全体では約50名が稼働しています。今回は、増加するシステム改善案件に対応するため、保守運用体制を強化するメンバーを募集します。 安定稼働の維持と継続的なシステム改善を中心メンバーとして推進していただきます。 募集ポジションと主な業務内容: ① チームリーダー(1名募集) 保守運用チーム(小規模開発案件含む)のリーダーとして、メンバー管理、タスク管理、顧客折衝、ベンダーコントロールなどを担います。 ② MM/SD コンサルタント(3名募集) MM/SDの専門家として、ユーザーからの問い合わせ対応、障害調査、システム改善の要件定義、設計、テストなどを担当します。

【CO】

【FI】

【MM】

【PP】

【SD】

【その他】

【S/4HANA新規導入(CO-PC/PS)】東京(週1-2出社)/要件定義

月額単価
1,600,000円 / 月
稼働場所
東京都
業務領域
要件定義
稼働率:
100%
作業内容:
全社的な基幹システムをSAP S/4HANAで新規に構築する大規模プロジェクトです。 現在は要件定義の準備フェーズにあり、2025年10月より本格的な要件定義フェーズが展開されます。 本ポジションでは、原価・会計チームの一員として、特にCO-PC領域を中心に要件定義を主体的に推進していただきます。 主な業務内容:
  • CO(特にCO-PC)およびPS領域における要件定義の推進
  • ユーザー部門とのディスカッション、ワークショップのファシリテーション
  • 現行業務プロセスの分析、およびS/4HANAを前提とした新業務フローの設計
  • Fit&Gap分析、および課題に対する解決策の検討・提案
  • 関連ドキュメント(要件定義書、議事録など)の作成
この記事のポイント

データベース操作(SQL操作)について

データベース操作の基本は、データの取得(SELECT)、データの挿入(INSERT)、データの更新(UPDATE)、データの削除(DELETE)です。それぞれの操作について、具体的な例を交えながら説明していきます。

SELECT命令

SELECT命令はデータベースからデータを取得するための基本的かつ重要な命令です。

博士

まずはSELECT命令じゃ。

基本の構文
 SELECT 項目1
     項目2
     …
  FROM テーブル名
  INTO TABLE 内部テーブル.
 ※SELECTの後には取得したい項目を記載し、全項目取得したい場合は「*」を記載します。
 ※作業領域(ワークエリア)にデータを格納したい場合は「TABLE」を省略します。

博士

SELECT命令の基本の使用例は以下の通りじゃ。

全ての項目を取得する場合

使用例
DATA: lt_sflight TYPE TABLE OF sflight.

SELECT *
  FROM sflight
  INTO TABLE lt_sflight.

WRITE: 'sflightテーブルから', sy-dbcnt, '件のデータを取得しました'.

このプログラムでは、’sflight’テーブルの全データが内部テーブル’lt_sflight’に格納されます。

実行結果

ABAP、SELECTの基本(結果)

博士

パフォーマンスを悪化させない為にも、必要なフィールドのみをSELECTするようにするのじゃ。SELECT *は避け、以下のように必要な項目のみ指定するぞい!

特定の項目を選択して取得する場合

使用例
TYPES: BEGIN OF ty_sflight,
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
         fldate  TYPE sflight-fldate,
       END OF ty_sflight.

DATA: lt_sflight TYPE STANDARD TABLE OF ty_sflight,
      ls_sflight TYPE ty_sflight.

SELECT carrid
       connid
       fldate
  FROM sflight
  INTO TABLE lt_sflight.

WRITE: 'sflightテーブルから', sy-dbcnt, '件のデータを取得しました'.
LOOP AT lt_sflight INTO ls_sflight.
  WRITE: / ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate.
ENDLOOP.

このプログラムでは、’sflight’テーブルの’carrid’、’connid’、’fldate’項目の全データが内部テーブル’lt_sflight’に格納されます。

実行結果

ABAP、SELECTの基本(結果)

博士

SELECT命令には様々なオプションがあるぞい!

データのフィルタリング

WHERE

特定の条件に基づいてデータをフィルタリングするには、WHEREオプションを使用します。

使用例
DATA: lt_sflight TYPE TABLE OF sflight.

SELECT *
  FROM sflight
  INTO TABLE lt_sflight
 WHERE carrid = 'LH'.

WRITE: 'sflightテーブルから', sy-dbcnt, '件のデータを取得しました'.

このプログラムでは、’carrid’が’LH’のフライト情報のみを取得します。

実行結果

ABAP、SELECTの基本(結果)、WHEREオプション

データの取得件数を指定する場合

‘SELECT SINGLE’や’UP TO n ROWS’を使用することで、データの取得する件数を指定することができます。

SELECT SINGLE

条件に該当するデータを1件だけ取得することができます。データの存在チェックに使用されることが多いです。

使用例
DATA: wa_sflight TYPE sflight.

SELECT SINGLE *
  FROM sflight
  INTO wa_sflight
 WHERE carrid = 'LH' AND connid = '0400'.

WRITE: '航空会社:', wa_sflight-carrid, 'フライト番号:',wa_sflight-connid, '日付:', wa_sflight-fldate.

このプログラムでは、’sflight’テーブルから’carrid’が’LH’で’connid’が’0400’のデータを1件のみ作業領域’wa_sflight’に格納します。

実行結果

ABAP、SELECTの基本(結果)、SELECT SINGLE

UP TO n ROWS

「n」の部分に入れた数字分のデータを取得します。
SELECT SINGLEと同様に1件だけ取得して存在チェックをする場合に使用されることが多いです。

使用例
DATA: lt_sflight TYPE TABLE OF sflight.

SELECT *
  FROM sflight
  INTO TABLE lt_sflight UP TO 10 ROWS.

WRITE: 'sflightテーブルから', sy-dbcnt, '件のデータを取得しました'.

このプログラムでは、’sflight’テーブルから最大10件のデータを内部テーブル’lt_sflight’に格納します。

実行結果

ABAP、SELECTの基本(結果)、UP TO n ROWS

複数のテーブルからデータを取得する場合

FOR ALL ENTRIES

FOR ALL ENTRIESを使用すると、内部テーブルのデータを基に他のテーブルからデータを取得します。

使用例
DATA: lt_sflight TYPE TABLE OF sflight,
      lt_sbook TYPE TABLE OF sbook.

SELECT *
  FROM sflight
  INTO TABLE lt_sflight
 WHERE carrid = 'LH'.

IF lt_sflight IS NOT INITIAL.
  SELECT * FROM sbook INTO TABLE lt_sbook
     FOR ALL ENTRIES IN lt_sflight
   WHERE carrid = lt_sflight-carrid
     AND connid = lt_sflight-connid.
ENDIF.

WRITE: 'sbookテーブルから', sy-dbcnt, '件のデータを取得しました'.

このプログラムでは、’sflight’テーブルからデータを取得し、’carrid’と’connid’を基に’sbook’テーブルから関連データを取得します。

実行結果

ABAP、SELECTの基本(結果)、FOR ALL ENTRIES

FOR ALL ENTRIESの注意点!
FOR ALL ENTRIES を使用する際には、内部テーブルが空の場合にすべてのレコードを取得してしまう可能性があります。これを防ぐために、必ず内部テーブルが空でないことを確認してください。

JOIN

JOINは複数のテーブルから関連するデータを結合して1つの内部テーブルにデータを格納します。JOINにはいくつかの種類がありますが、最も一般的なものを以下に示します。

  • INNER JOIN
    結合条件に一致するレコードを結合して内部テーブルに格納します。結合条件に一致しないレコードは格納されません。
使用例
TYPES: BEGIN OF ty_itab,
        carrid TYPE sflight-carrid,
        connid TYPE sflight-connid,
        fldate TYPE sflight-fldate,
        bookid TYPE sbook-bookid,
        customid TYPE sbook-customid,
       END OF ty_itab.
DATA: itab TYPE STANDARD TABLE OF ty_itab.

SELECT sflight~carrid
       sflight~connid
       sflight~fldate
       sbook~bookid
       sbook~customid
  INTO TABLE itab
  FROM sflight
 INNER JOIN sbook
    ON sflight~carrid = sbook~carrid
   AND sflight~connid = sbook~connid
 WHERE sflight~carrid = 'LH' AND sflight~connid = '0400' AND sbook~fldate = '20230604'.

WRITE: 'sflightとsbookを結合(INNER JOIN)して', sy-dbcnt, '件のデータを取得しました'.

このプログラムでは、’INNER JOIN’を使用して’sflight’テーブルと’sbook’テーブルを’carrid’と’connid’項目で結合し、結合条件に一致するレコードを取得します。

実行結果

ABAP、SELECTの基本(結果)、INNER JOIN

  • LEFT JOIN
    左側のテーブルの全レコードと結合条件に一致する右側のテーブルのレコードを結合します。結合条件に一致しない右側のレコードはNULLとして内部テーブルに格納されます。
使用例
SELECT sflight~carrid
       sflight~connid
       sflight~fldate
       sbook~bookid
       sbook~customid
  INTO TABLE itab
  FROM sflight
  LEFT JOIN sbook
    ON sflight~carrid = sbook~carrid
   AND sflight~connid = sbook~connid
 WHERE sflight~carrid = 'LH' AND sflight~connid = '0400' AND sflight~fldate = '20230604'.

WRITE: 'sflightとsbookを結合(LEFT JOIN)して', sy-dbcnt, '件のデータを取得しました'.

このプログラムでは、’sflight’テーブルの全レコードと一致する’sbook’テーブルのレコードを取得し、一致しない場合は’sbook’の列にNULLが入ります。

実行結果

ABAP、SELECTの基本(結果)、LEFT JOIN

  • RIGHT JOIN
    右側のテーブルの全レコードと結合条件に一致する左側のテーブルのレコードを結合します。結合条件に一致しない左側のレコードはNULLとして結果セットに含まれます。
博士

左右のテーブルを入れ替えてLEFT JOINを使用するのと同じの為、INNER JOINとLEFT JOINを覚えておけば問題ないぞい!

JOINの機能

  • 複数のテーブルから関連するデータを結合します。
  • 結合条件に基づいてレコードを取得します。
  • INNER JOIN、LEFT JOIN、RIGHT JOINなどがあります。

データの集計

GROUP BY、HAVING

データを集計する場合、GROUP BYとHAVINGを使用します。
GROUP BYを使用して指定したコンポーネントごとに集計することが可能です。HAVINGでGROUP BYの条件を指定することが可能です。

使用例
TYPES: BEGIN OF sflight_agg,
         carrid TYPE sflight-carrid,
         num_flights TYPE i,
       END OF sflight_agg.

DATA: lt_aggregate TYPE TABLE OF sflight_agg,
      ls_aggregate TYPE sflight_agg.

SELECT carrid
       COUNT(*) AS num_flights
  INTO TABLE lt_aggregate
  FROM sflight
 GROUP BY carrid
HAVING COUNT(*) > 1.

LOOP AT lt_aggregate INTO ls_aggregate.
  WRITE: / '航空会社コード:', ls_aggregate-carrid, 'フライト数:', ls_aggregate-num_flights.
ENDLOOP.

このプログラムでは、’sflight’テーブルの’carrid’ごとにフライト数を集計し、2便以上のキャリアのみを取得します。

実行結果

ABAP、SELECTの基本(結果)、GROUP-BY、HAVING

データの並び替え

ORDER BY

データを特定の順序で並べ替えるには、ORDER BYオプションを使用します。

使用例
DATA: lt_sflight TYPE TABLE OF sflight,
      ls_sflight TYPE sflight.

SELECT *
  FROM sflight
  INTO TABLE lt_sflight
 ORDER BY fldate DESCENDING.

WRITE: 'sflightテーブルから', sy-dbcnt, '件のデータを取得しました'.
LOOP AT lt_sflight INTO ls_sflight.
  WRITE: / ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate.
ENDLOOP.

このプログラムでは、’sflight’テーブルのデータを’fldate’の降順で並べ替えて取得します。

実行結果

ABAP、SELECTの基本(結果)、ORDER BY

SELECT文の結合

UNION

複数のSELECT文の結果セットを結合して1つの内部テーブルを作成します。
UNIONには’UNION’と’UNION ALL’の2種類があります。
ABAP7.4以降のS4HANAでの新構文でのみ使用可能です。

  • UNION
    重複を排除して内部テーブルに格納します。
使用例
TYPES: BEGIN OF sunion,
         carrid TYPE sflight-carrid,
         connid TYPE sflight-connid,
       END OF sunion.

DATA: lt_union TYPE TABLE OF sunion.

SELECT carrid, connid FROM sflight
  UNION
SELECT carrid, connid FROM sbook
  INTO TABLE @lt_union.

WRITE: sy-dbcnt, '件のデータを取得しました'.
LOOP AT lt_union INTO DATA(ls_union).
  WRITE: / ls_union-carrid, ls_union-connid.
ENDLOOP.

このプログラムでは、’sflight’と’sbook’テーブルからデータを取得し、重複を排除して1つの内部テーブルに格納します。

実行結果

ABAP、SELECTの基本(結果)、UNION

  • UNION ALL
    重複を排除せずに内部テーブルに格納します。
使用例
SELECT carrid, connid FROM sflight
  WHERE fldate = '20230604'
  UNION ALL
SELECT carrid, connid FROM sbook
  WHERE fldate = '20230604'
  INTO TABLE @lt_union.

WRITE: sy-dbcnt, '件のデータを取得しました'.
LOOP AT lt_union INTO DATA(ls_union).
  WRITE: / ls_union-carrid, ls_union-connid.
ENDLOOP.

このプログラムでは、’sflight’と’sbook’テーブルからデータを取得し、重複を排除せずに1つの内部テーブルに格納します。

実行結果

ABAP、SELECTの基本(結果)、UNION ALL

UNIONの機能

  • 複数のSELECT文の結果を結合します。
  • 重複を排除する’UNION’と重複を排除しない’UNION ALL’があります。

INSERT命令

博士

次はINSERT命令じゃ。

新しいレコードをデータベーステーブルに挿入するには、INSERT命令を使用します。

基本の構文
・単一のレコードを挿入する場合
 INSERT INTO テーブル名 VALUES 作業領域.
 INSERT テーブル名 FROM 作業領域.
・複数のレコードを挿入する場合
 INSERT テーブル名 FROM TABLE 内部テーブル名.

博士

実際に使用例を見ていくぞい!

単一のレコードを挿入する場合

使用例
DATA: wa_zflight TYPE zflight.

wa_zflight-flight_id = 'FL004'.
wa_zflight-airline_id = 'LH'.
wa_zflight-arrival_airport = 'NRT'.
wa_zflight-seat_capacity = 250.

INSERT INTO zflight VALUES wa_zflight.

IF sy-subrc = 0.
  WRITE: 'Record inserted successfully'.
ELSE.
  WRITE: 'Failed to insert record'.
ENDIF.

このプログラムでは、INSERT命令を使用して’zflight’テーブルに新しいフライトデータを挿入します。その後、’sy-subrc’を使って挿入が成功したかどうかを確認しています。

実行結果

ABAP、INSERTの基本(結果)

複数のレコードを挿入する場合

使用例
DATA: lt_zflight TYPE TABLE OF zflight,
      ls_zflight TYPE zflight.

ls_zflight-flight_id = 'FL005'.
ls_zflight-airline_id = 'BA'.
ls_zflight-arrival_airport = 'LHR'.
ls_zflight-seat_capacity = 300.
APPEND ls_zflight TO lt_zflight.

ls_zflight-flight_id = 'FL006'.
ls_zflight-airline_id = 'AF'.
ls_zflight-arrival_airport = 'CDG'.
ls_zflight-seat_capacity = 350.
APPEND ls_zflight TO lt_zflight.

INSERT zflight FROM TABLE lt_zflight.

IF sy-subrc = 0.
  WRITE: 'Records inserted successfully'.
ELSE.
  WRITE: 'Failed to insert records'.
ENDIF.

このプログラムでは、’zflight’テーブルに挿入したいデータを内部テーブルに格納して、その内部テーブルからINSERT命令を使用して’zflight’テーブルに複数データを挿入します。

実行結果

ABAP、INSERTの基本(結果)、複数

重複エントリを許容する場合

INSERT命令は内部テーブル内にキー重複のデータがある場合にショートダンプしてしまいますが、重複キーエラーを許容し、エラーが発生しても処理を続行する場合には’ACCEPTING DUPLICATE KEYS’を使用します。また、S/4 HANA特有ですが’ACCEPTING DUPLICATE ENTRIES’を使用することも可能です。

エラーハンドリング

挿入処理でエラーが発生した場合の処理を追加することが大切です。例えば、重複キーエラーの場合などです。

使用例
DATA: lt_flight TYPE TABLE OF zflight,
      ls_flight  TYPE zflight,
      lt_failed  TYPE TABLE OF zflight,
      ls_failed  TYPE zflight.

* データの準備
ls_flight-flight_id = 'FL007'.
ls_flight-airline_id = 'DL'.
ls_flight-arrival_airport = 'ATL'.
ls_flight-seat_capacity = 280.
APPEND ls_flight TO lt_flight.

ls_flight-flight_id = 'FL008'.
ls_flight-airline_id = 'UA'.
ls_flight-arrival_airport = 'ORD'.
ls_flight-seat_capacity = 300.
APPEND ls_flight TO lt_flight.

* データの挿入
LOOP AT lt_flight INTO ls_flight.
  INSERT zflight FROM ls_flight.
  IF sy-subrc <> 0.
    APPEND ls_flight TO lt_failed.
  ENDIF.
ENDLOOP.

* 挿入結果の確認
IF lt_failed IS INITIAL.
  WRITE: 'Records inserted successfully'.
ELSE.
  WRITE: 'Some records failed to insert'.
  LOOP AT lt_failed INTO ls_failed.
    WRITE: / 'Failed to insert: ', ls_failed-flight_id, ls_failed-airline_id, ls_failed-arrival_airport, ls_failed-seat_capacity.
  ENDLOOP.
ENDIF.

このプログラムでは、’lt_flightという内部テーブルに準備されたフライトデータを、ループを使って一行ずつ’zflight’テーブルに挿入します。挿入の際にエラーが発生した場合(sy-subrcが0以外の場合)、エラーが発生したレコードをlt_failedという別の内部テーブルに追加します。すべての挿入処理が完了した後、lt_failedが空であれば「レコードが正常に挿入された」と出力し、空でない場合は「挿入に失敗したレコードがある」として、失敗したレコードの詳細を出力します。

実行結果

ABAP、INSERTの基本(結果)、エラーハンドリング

UPDATE命令

博士

次はUPDATE命令じゃ。

既存のレコードを更新するには、UPDATE命令を使用します。

基本の構文
・特定の項目を指定して更新する場合
 UPDATE テーブル名 SET フィールド1 = 値1, フィールド2 = 値2 … WHERE 条件.
・作業領域を使用して更新する場合
 UPDATE テーブル名 FROM 作業領域.
・内部テーブルを使用して更新する場合
 UPDATE テーブル名 FROM TABLE 内部テーブル.

博士

まずは簡単な使用例を見ていくぞい!

特定の項目を指定して更新する場合

使用例
UPDATE zflight
   SET arrival_airport = 'LAX'
 WHERE flight_id = 'FL004'.

IF sy-subrc = 0 AND sy-dbcnt > 0.
  WRITE: 'Record updated successfully'.
ELSEIF sy-subrc = 0 AND sy-dbcnt = 0.
  WRITE: 'No matching record found to update'.
ELSE.
  WRITE: 'Update failed due to an error'.
ENDIF.

このプログラムでは、’flight_id’が’FL004’の’arrival_airport’を’LAX’に更新します。更新の結果を’sy-subrc’と’sy-dbcnt’で判定し、適切なメッセージを出力します。

実行結果

ABAP、UPDATEの基本(結果)、項目指定

作業領域を使用して更新する場合

使用例
DATA: ls_flight TYPE zflight.

SELECT SINGLE * FROM zflight INTO ls_flight WHERE flight_id = 'FL003' AND airline_id = 'AF'.

ls_flight-arrival_airport = 'HND'.
ls_flight-seat_capacity = 290.
UPDATE zflight FROM ls_flight.

このプログラムでは、特定のフライト情報を選択し、その座席数を更新します。まず、フライトIDが’FL003’で航空会社IDが’AF’のフライト情報を取得し、その到着空港を’HND’、座席数を’290’に更新します。(更新結果の判定ロジックは記載を省略)

実行結果

ABAP、UPDATEの基本(結果)、構造から

内部テーブルを使用して更新する場合

使用例
DATA: lt_flight TYPE TABLE OF zflight,
      ls_flight TYPE zflight.

ls_flight-flight_id = 'FL001'.
ls_flight-airline_id = 'DL'.
ls_flight-arrival_airport = 'ATL'.
ls_flight-seat_capacity = 280.
APPEND ls_flight TO lt_flight.

ls_flight-flight_id = 'FL003'.
ls_flight-airline_id = 'UA'.
ls_flight-arrival_airport = 'ORD'.
ls_flight-seat_capacity = 300.
APPEND ls_flight TO lt_flight.

UPDATE zflight FROM TABLE lt_flight.

このプログラムでは、複数のフライト情報を内部テーブルに準備し、それらの情報を基に’zflight’テーブルを更新します。’FL001’および’FL003’のフライト情報を設定し、対応するフライトIDに基づいて更新します。(更新結果の判定ロジックは記載を省略)

実行結果

ABAP、UPDATEの基本(結果)、内部テーブルから

DELETE命令

データベースのレコードを削除するには、DELETE命令を使用します。

基本の構文
・WHERE句を使用して削除する場合
 DELETE FROM テーブル名 WHERE 条件.
・作業領域を使用して削除する場合
 DELETE テーブル名 FROM 作業領域.
・内部テーブルを使用して削除する場合
 DELETE テーブル名 FROM TABLE 内部テーブル.

博士

まずは簡単な使用例を見ていくぞい!

WHERE句を使用して削除する場合

使用例
DELETE FROM zflight WHERE flight_id = 'FL002' AND airline_id = 'BA'.

IF sy-subrc = 0 AND sy-dbcnt > 0.
  WRITE: 'Record deleted successfully'.
ELSEIF sy-subrc = 0 AND sy-dbcnt = 0.
  WRITE: 'No matching record found to delete'.
ELSE.
  WRITE: 'Delete failed due to an error'.
ENDIF.

このプログラムでは、’zflight’テーブルから’flight_id’が’FL002’で’airline_id’が’BA’のレコードを削除します。削除が成功したかどうかを’sy-subrc’と’sy-dbcnt’で判定し、適切なメッセージを出力します。

実行結果

ABAP、UPDATEの基本(結果)、WHEREオプション

作業領域を使用して削除する場合

使用例
DATA: ls_flight TYPE zflight.

ls_flight-flight_id = 'FL004'.
ls_flight-airline_id = 'LH'.

DELETE zflight FROM ls_flight.

このプログラムでは、作業領域’ls_flight’の内容に基づいて’zflight’テーブルから対応するレコードを削除します。’flight_id’が’FL004’で’airline_id’が’LH’のレコードを削除します。(削除結果の判定ロジックは記載を省略)

実行結果

ABAP、DELETEの基本(結果)、構造から

内部テーブルを使用して削除する場合

使用例
DATA: lt_flight TYPE TABLE OF zflight,
      ls_flight TYPE zflight.

ls_flight-flight_id = 'FL001'.
ls_flight-airline_id = 'DL'.
APPEND ls_flight TO lt_flight.

ls_flight-flight_id = 'FL003'.
ls_flight-airline_id = 'UA'.
APPEND ls_flight TO lt_flight.

DELETE zflight FROM TABLE lt_flight.

このプログラムでは、内部テーブル’lt_flight’の各行の内容に基づいてル’zflight’テーブルから対応する複数のレコードを削除します。’flight_id’が’FL001’か’FL003’でそれぞれ’airline_id’が’DL’と’UA’のレコードを削除します。(削除結果の判定ロジックは記載を省略)

実行結果

ABAP、DELETEの基本(結果)、内部テーブルから

テーブル全体のレコードを削除する場合

使用例
DELETE FROM zflight.

このプログラムでは、’zflight’テーブルから全てのレコードを削除します。(削除結果の判定ロジックは記載を省略)

実行結果

ABAP、DELETEの基本(結果)、すべて削除

システム項目

SY-SUBRC

SY-SUBRC(System Subroutine Return Code)は、ABAPプログラム内で実行された操作の結果を示すシステム変数です。多くのABAP命令や汎用モジュールは、実行後にSY-SUBRCを設定します。一般的には、操作が成功したかどうかを判断するために使われます。

  • 成功時: SY-SUBRCの値は0になります。
  • 失敗時: SY-SUBRCの値は0以外の数値になります(例えば、1や4など)。失敗の理由は命令や汎用モジュールによって異なるため、マニュアルを参照して具体的な意味を確認することが重要です。

SY-DBCNT

SY-DBCNT(Database Count)は、直前のデータベース操作で処理された行数を保持するシステム変数です。SELECT、INSERT、UPDATE、DELETEなどのデータベース操作を行った際に、その操作が影響を与えた行数を示します。

  • SELECT命令: 取得した行数
  • INSERT命令 挿入された行数
  • UPDATE命令 更新された行数
  • DELETE命令 削除された行数

まとめ

博士

ここまででデータベース操作(SQL操作)についての基本的な説明をしたぞい!

レイナ

ありがとうございます!自分でもいろいろ試して使ってみます!

ABAPのデータベース操作は、データベースと連携してSAPアプリケーションを効果的に開発するための基本です。SELECT命令、INSERT命令、UPDATE命令、DELETE命令の各命令を理解し、適切に使用することで、より効率的かつ効果的にデータ操作が可能となります。まず基本的な構文を練習し、徐々に複雑なデータベース操作に挑戦してみましょう!

新着のSAPフリーランス案件

【FI】

【空輸業S/4HANA再構築(FI/TRM)】東京・大田区(リモート併用)/要件定義

月額単価
1,300,000円 / 月
稼働場所
東京都
業務領域
要件定義
稼働率:
100%
作業内容:
現行のECC6.0からSAP S/4HANAへ基幹システムを再構築するプロジェクトです。 Fit to Standardを基本方針としつつ、現行システムからの変革ポイントを中心に要件定義を進めます。 本プロジェクトにおいて、ご自身の専門領域(債権管理、債務管理、I/F、TRM)のコンサルタントまたはSEとして、要件定義フェーズを中心メンバーとして担当していただきます。 募集ポジションと主な業務内容: ① 債権管理(AR)に詳しいSAP会計コンサルタント AR領域の専門家として、現行業務の分析、新業務プロセスの設計、Fit&Gap分析、および要件定義を主導します。 ② 債務管理(AP)に詳しいSAP会計コンサルタント AP領域の専門家として、現行業務の分析、新業務プロセスの設計、Fit&Gap分析、および要件定義を主導します。 ③ I/Fの設計開発ができるSAP会計SE 会計領域における外部システムとのインターフェースについて、要件定義から設計、開発連携までを担当します。 ④ TRMモジュールの経験者(ジュニアコンサルタント可) TRM(Treasury and Risk Management)領域の担当として、要件定義やFit&Gap分析の支援を行います。

【FI】

【S/4HANAグローバルERPテンプレート(FI-RTR)】フルリモート/構想・要件定義準備

月額単価
1,600,000円 / 月
稼働場所
フルリモート
業務領域
要件定義
稼働率:
100%
作業内容:
製造業のグローバルなビジネス展開を支える、SAP S/4HANAによる新ERPテンプレートの構築プロジェクトです。 本ポジションでは、プロジェクトの初期段階である要件定義準備フェーズにおいて、FI(Record to Report)領域の専門家としてご参画いただきます。先行して導入されたFIシステムとの連携も考慮しながら、SAP構築を推進する重要な役割を担当していただきます。 主な業務内容:
  • FI(RTR)領域における、グローバルテンプレートの構想策定および要件定義準備
  • 現行業務プロセスの分析、およびグローバル標準プロセスの設計支援
  • 先行導入済みのFIシステムとの連携方式の検討、および設計
  • 課題の整理、および解決方針の策定・提案
  • 関連ドキュメント(構想資料、課題管理表など)の作成

【CO】

【FI】

【MM】

【SD】

【その他】

【ECC→S/4HANA移行(FI基本設計)】東京駅(週1出社)/アドオン帳票再設計

月額単価
900,000円 / 月
稼働場所
東京都
業務領域
設計, 開発(ABAP/Fiori)
稼働率:
100%
作業内容:
ECC6.0からS/4HANAへの移行プロジェクトにおいて、設計書が存在しない数十本の既存アドオン帳票(ABAP)をS/4HANA環境で再実装することがミッションです。 本ポジションでは、現行のABAPプログラムをリバースエンジニアリングしながら、顧客への要件ヒアリングを行い、S/4HANA用の新たな基本設計書を作成する、非常に重要な役割を担当していただきます。 主な業務内容:
  • 既存アドオン帳票(ABAP)のソースコード解析(リバースエンジニアリング)
  • 顧客担当者への要件ヒアリング、および仕様確認
  • S/4HANA環境で実装するための、新たな基本設計書レベルの資料作成
  • 作成した基本設計書の開発チームへの説明、および連携

【CO】

【SD】

【その他】

【部品事業SAP S/4HANA新規導入】フルリモート/大規模募集(SD/CO/IF設計者)

月額単価
1,300,000円 / 月
稼働場所
フルリモート
業務領域
要件定義
稼働率:
100%
作業内容:
交換部品の受発注や出荷を管理する部品事業の基幹システムを、既存の非SAPシステムからSAP S/4HANAへ新規に導入するプロジェクトです。 本募集では、プロジェクトの根幹をなす基本設計フェーズにおいて、ご自身の専門領域(SD、CO、I/F)の設計者として、新システムの基盤構築を担当していただきます。 募集ポジションと主な業務内容:
  • 合計17名の設計者を募集します。
  • SD(販売管理)設計者:6名
  • CO(管理会計)設計者:2名
  • I/F(インターフェース)設計者:9名
ご担当いただく主な業務は以下の通りです。
  • 担当モジュール領域における要件確認、および追加機能開発の基本設計
  • テストシナリオの作成支援、および検証
  • データ移行方式の検討支援
  • 関連ドキュメントの作成および更新

【MM】

【製造業SAP(MM I/F設計)】フルリモート(大崎)/要件定義・外部設計

月額単価
1,400,000円 / 月
稼働場所
フルリモート
業務領域
要件定義, 設計
稼働率:
100%
作業内容:
製造業のSAPプロジェクトにおいて、MM(在庫購買管理)領域のインターフェース構築が重要なテーマとなっています。 本ポジションでは、MMの専門家として、お客様と直接要件を確認しながらインターフェースの設計を行い、その後の開発・テストまでの一連のタスクを単独で推進していただきます。 主な業務内容:
  • 顧客担当者とのディスカッションを通じた、MM領域のインターフェース要件定義
  • インターフェースの外部設計書の作成
  • 開発チームへの設計内容の連携、およびQ&A対応
  • 開発されたインターフェースのテスト計画策定、および実施
  • 関連ドキュメントの作成および更新

【CO】

【FI】

【MM】

【PP】

【SD】

【製造業S/4HANA(ABAP開発)】東京・十条/設計・開発・テスト

月額単価
800,000円 / 月
稼働場所
東京都
業務領域
設計, 開発(ABAP/Fiori)
稼働率:
100%
作業内容:
製造業のS/4HANAプロジェクトにおいて、業務要件に合わせたアドオン機能の設計・開発がミッションです。 ご自身の得意なモジュール(SD, MM, PP, QM, FI, COのいずれか)を担当し、基本設計から開発、結合・総合テストまで、一連の開発工程を自律的に推進していただきます。 主な業務内容:
  • SAP S/4HANA環境におけるアドオン機能の基本設計、および詳細設計
  • ABAPによる開発・実装(BAdI, BAPI, ALV, Dynpro等の知見を想定)
  • 開発した機能の単体テスト、結合テスト、総合テストの実施
  • 他のSEとの要件確認や仕様調整などのコミュニケーション
  • 関連ドキュメント(設計書、テスト仕様書など)の作成

【MM】

【SD】

【製造業システム再構築(S/4 SD/MM)】東京・神保町/設計・開発

月額単価
1,100,000円 / 月
稼働場所
東京都
業務領域
設計, 開発(ABAP/Fiori)
稼働率:
100%
作業内容:
既存の基幹システムをSAP S/4HANAで再構築するプロジェクトです。 本ポジションでは、ロジスティクス領域(SD/MM)の専門家として、アドオン機能の設計から開発、テストに至るまでの一連の工程を中心メンバーとして担当していただきます。 主な業務内容:
  • 既存システムの機能解析・調査、およびS/4HANAへの移行に関する概要設計
  • 販売管理(SD/MM)領域におけるアドオン機能の基本設計・詳細設計
  • ABAP等による開発・実装
  • 開発した機能の単体テスト、および結合テスト支援
  • 関連ドキュメント(設計書、テスト仕様書など)の作成

【PP】

【SD】

【その他】

【S/4HANAグローバル展開支援】岡山(リモート相談可)/要件定義・導入(PP/QM/SD/LWM)

月額単価
1,200,000円 / 月
稼働場所
岡山県
業務領域
要件定義
稼働率:
100%
作業内容:
米国のグローバルテンプレートを基に、岡山拠点へSAP S/4HANAを導入するロールインプロジェクトです。 本プロジェクトでは、ご自身の専門モジュール(PPDS, QM, SD, LWM)のコンサルタントとして、要件定義からUAT、データ移行、導入後のハイパーケアまで、一連の導入プロセスを主体的に推進していただきます。 主な業務内容:
  • 担当モジュールにおける、業務プロセスの整理、および要件定義
  • グローバルテンプレートとのFit&Gap分析、およびアドオン要件定義書の作成
  • カスタマイズ設定、および開発チームとの連携
  • UAT(ユーザー受入テスト)、データ移行の支援
  • SIハイパーケア(本稼働後の初期サポート)
  • 米国テンプレート担当と岡山現地担当者とのコミュニケーション(英語・日本語)

【MM】

【SD】

【SAP保守運用(MM/SD)】大阪・肥後橋(リモート相談可)/リーダー・コンサルタント募集

月額単価
1,300,000円 / 月
稼働場所
大阪府
業務領域
運用・保守
稼働率:
100%
作業内容:
SAPのフルモジュールを対象とした大規模な保守運用プロジェクトです。 現在、並行してシステムのバージョンアップ案件も進行しており、プロジェクト全体では約50名が稼働しています。今回は、増加するシステム改善案件に対応するため、保守運用体制を強化するメンバーを募集します。 安定稼働の維持と継続的なシステム改善を中心メンバーとして推進していただきます。 募集ポジションと主な業務内容: ① チームリーダー(1名募集) 保守運用チーム(小規模開発案件含む)のリーダーとして、メンバー管理、タスク管理、顧客折衝、ベンダーコントロールなどを担います。 ② MM/SD コンサルタント(3名募集) MM/SDの専門家として、ユーザーからの問い合わせ対応、障害調査、システム改善の要件定義、設計、テストなどを担当します。

【CO】

【FI】

【MM】

【PP】

【SD】

【その他】

【S/4HANA新規導入(CO-PC/PS)】東京(週1-2出社)/要件定義

月額単価
1,600,000円 / 月
稼働場所
東京都
業務領域
要件定義
稼働率:
100%
作業内容:
全社的な基幹システムをSAP S/4HANAで新規に構築する大規模プロジェクトです。 現在は要件定義の準備フェーズにあり、2025年10月より本格的な要件定義フェーズが展開されます。 本ポジションでは、原価・会計チームの一員として、特にCO-PC領域を中心に要件定義を主体的に推進していただきます。 主な業務内容:
  • CO(特にCO-PC)およびPS領域における要件定義の推進
  • ユーザー部門とのディスカッション、ワークショップのファシリテーション
  • 現行業務プロセスの分析、およびS/4HANAを前提とした新業務フローの設計
  • Fit&Gap分析、および課題に対する解決策の検討・提案
  • 関連ドキュメント(要件定義書、議事録など)の作成

★★★SAPラボのライター募集★★★

SAPラボでは、SAPの知識を活かして副業をしたい方を募集してるのじゃ!

SAPラボのライターの特徴

・ライティング初心者OK!
・報酬高単価!
・業務委託契約なので副業として最適!

SAP記事執筆者としての活動実績として利用可能なので、転職時や案件探しの際に企業へのアピール材料にもなります。

募集要項

・SAP導入や運用保守プロジェクトへの参画経験1年以上

ご応募/お問合せ先

info@sap-labo.com

少しでもご興味ある方、ぜひお気軽にご連絡下さい!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

新卒でSAPエンジニアとしてABAPでの新規開発や保守業務を担当。
業務内容としてはロジ系(MM/SD)がメインで、ABAPの開発が最も得意。

この記事のポイント