【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】

【MM】

【SD】

【製造業SAP拡張開発(FI/SD/MM)】大阪・リモート併用/基本設計・テスト

要スキル:
SAPのFI、SD、MMいずれかのモジュールにおいて、基本設計以降のフェーズを担当したご経験
月額単価:
~1,050,000円 / 月
稼働場所:
大阪府
稼働率:
100%
作業内容:
製造業の基幹システムとして稼働するSAPシステムの機能拡張プロジェクトです。FI、SD、MMいずれかのモジュール担当として、要件定義書をインプットに基本設計書を作成し、開発チームへの連携、そして完成した機能の受入テストまで、一連のプロセスを中心メンバーとして担当していただきます。 主な業務内容: ・要件定義書に基づく、アドオン機能等の基本設計書の作成 ・開発チームへの設計内容の説明、およびQ&A対応 ・開発チームが作成した機能の受入テスト計画策定、シナリオ作成、テスト実施 ・テスト結果の評価、不具合管理、および修正依頼 ・関連ドキュメント(設計書、テスト仕様書など)の作成および更新

【FI】

【製造業ユーザートレーニング支援(FI)】東京・品川(リモート併用)/QA対応・テスト調査

要スキル:
SAP FIモジュールに関する基本的な知識(ジュニアコンサルタントレベル)
月額単価:
~900,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
製造業におけるSAP導入プロジェクトが、ユーザートレーニングおよびテストフェーズを迎えています。 この重要な局面において、ユーザーがシステムを円滑に利用開始できるよう、トレーニング時のQA対応やインターフェイステストで発生したバグの調査などを中心メンバーとして担当していただきます。 主な業務内容: ・業務ユーザートレーニング実施時におけるQA対応、および説明補助 ・インターフェイステスト等で発生した不具合(バグ)の原因調査、切り分け ・ユーザーからの問い合わせ対応、およびエスカレーション ・関連ドキュメント(FAQ、手順書など)の作成支援

【FI】

【製造業SAP導入(FI-AA)】東京・品川(リモート併用)/Fit&Gap・要件定義

要スキル:
SAP FI-AA(固定資産)モジュールにおけるシニアコンサルタントとしてのご経験
月額単価:
~1,700,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
製造業の基幹システムとしてSAPを導入するプロジェクトです。 今回は、プロジェクトの初期段階であるFit&Gap分析から要件定義フェーズにご参画いただきます。FI-AA(固定資産)領域の専門家として、新システムの方向性を定める重要な役割を中心メンバーとして担っていただきます。 主な業務内容: ・FI-AA(固定資産)領域におけるFit&Gap分析の実施 ・顧客担当者とのディスカッションを通じた、現行業務のヒアリングおよび新業務プロセスの設計 ・SAP標準機能との適合性を評価し、要件定義書の作成を主導 ・顕在化した課題の整理、および解決方針の策定・提案 ・関連ドキュメント(議事録、課題管理表など)の作成

【SD】

【台湾向けSAP展開支援(SD)】東京・豊洲(週1出社)/テスト・アドオン設計

要スキル:
SD領域においてSAPプロジェクトに携わったご経験 【尚可】 中国語(ビジネスレベルでなくても可)の知見
月額単価:
~1,300,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
国内のSAPシステムを台湾拠点へ展開するグローバルプロジェクトです。 今回は、システムの品質を確固たるものにする総合テストフェーズにおいて、SD領域の専門家としてご参画いただきます。 テスト時の不具合調査・対応から、関連するアドオンの設計、課題検討・提案まで、多岐にわたる業務を中心メンバーとして担当していただきます。 主な業務内容: ・総合テストフェーズにおけるテスト対応、およびテスト時の不具合調査・対応 ・受注・出荷インターフェースに関するアドオン設計、および改修 ・帳票関連アドオン(Packing list, Invoice等/Smartform使用)の設計・開発連携 ・SD領域に関する各種課題の検討、および解決策の提案業務 ・関連ドキュメントの作成および更新

【FI】

【総合商社システム移行支援(FI-AA/AP/AR)】フルリモート/トレーニング計画

要スキル:
SAPのFI-AA(固定資産)またはAP/AR(債権債務)領域におけるトレーニング計画策定のご経験 【尚可】 ・商社向け業務システムの設計、導入、構築のご経験 ・SAP GTM(Global Trade Management)に関する知見
月額単価:
~1,000,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
大手総合商社の基幹システム移行プロジェクトにおいて、ユーザー部門が新システムをスムーズに活用できるよう、運用開始に向けた準備を支援するポジションです。 FI-AA(固定資産)またはAP/AR(債権債務)領域の専門家として、ユーザートレーニングの計画策定・準備を中心メンバーとして担当していただきます。 主な業務内容: ・FI-AAまたはAP/AR領域における、ユーザー向けトレーニング計画の策定および準備支援 ・トレーニングカリキュラム、マニュアル、教材などの作成支援 ・移行後の新業務プロセス定着化に向けた各種支援、および課題対応 ・ユーザー部門やプロジェクトチームとの連携、調整

【CO】

【FI】

【外資系SAPロールイン(業務フローリード)】神奈川・新川崎(リモート併用)/会計領域

要スキル:
①SAP経験+英語対応可 ・会計知見 ・業務フロー作成経験 ・ビジネスレベル英語力 ・ユーザー対応経験 ②SAP未経験(SAP以外のその他業務フロー作成経験者) ・会計知見 ・業務フロー作成経験 ・ビジネスレベル英語 ・ユーザー対応経験 【歓迎スキル】 ・公認会計士資格保有者 ・SAPプロジェクト経験
月額単価:
~1,400,000円 / 月
稼働場所:
神奈川県
稼働率:
100%
作業内容:
外資系製造業の日本拠点へSAPを導入するロールインプロジェクトです。現在はテストフェーズにあり、本稼働に向けた業務改革の一環として、業務フローの整備が重要な課題となっています。本ポジションでは、海外で作成された英語資料を基に日本語の業務フローを作成し、その品質を管理するチームリードとして、プロジェクトの成功を推進していただきます。 主な業務内容: ・海外で作成された英語ベースの資料を理解し、日本の業務に合わせた日本語の業務フローへの落とし込み ・海外の導入チームおよび日本のクライアントとの英語でのコミュニケーション、会議のファシリテーション ・チームメンバーが作成した業務フロー等のアウトプットに対するレビュー、および品質管理 ・業務改革の推進に関する各種調整、および課題解決支援

【MM】

【素材メーカーS/4HANA移行管理(MM/PMO)】フルリモート/移行計画・作業管理

要スキル:
・SAP MM領域におけるデータ移行の知見とご経験 ・PMOとしてプロジェクト全体の調整やリードをしたご経験
月額単価:
~1,700,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
素材メーカーのSAP S/4HANA導入プロジェクトにおいて、データ移行全体の管理を担うポジションです。S/4HANAのみならず、BTP、Salesforce、スクラッチ開発システムなど、複数のシステムが対象となる複雑な移行プロジェクトにおいて、移行計画の策定からリハーサルの管理まで、一連のマネジメント業務をPMOとして担当していただきます。 主な業務内容: ・プロジェクト全体を見据えた、データ移行計画の策定、および関係各所との調整 ・移行ツールの設計・開発・テストに関する作業管理、および進捗・課題管理 ・移行リハーサルの計画策定、および実行管理 ・データ移行に関するリスクの識別、評価、および対策の検討 ・プロジェクト内での円滑なコミュニケーション促進、および報告業務

【MM】

【素材メーカーS/4HANA導入(テスト管理 MM/PMO)】フルリモート/テスト計画・作業管理

要スキル:
・SAP MM領域における業務シナリオテスト、UAT(ユーザー受入テスト)のご経験 ・テスト統括のご経験 ・PMOとしてプロジェクト全体の調整やリードをしたご経験
月額単価:
~1,700,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
素材メーカーのSAP S/4HANA導入プロジェクトにおいて、システムの品質を保証するテストフェーズ全般の管理を担うポジションです。 結合テスト、業務シナリオテスト、UAT(ユーザー受入テスト)といった各テストフェーズにおいて、計画策定から作業管理まで、一連のマネジメント業務をテストの責任者として担当していただきます。 主な業務内容: ・結合テスト、業務シナリオテスト、UATに関するテスト計画の作成および調整 ・テストシナリオ作成の支援、および進捗管理 ・テスト全体の作業管理(タスク割り当て、進捗・課題・品質管理) ・テスト結果の取りまとめ、および報告 ・関連部署やベンダーとの円滑なコミュニケーション、および調整業務

【PP】

【その他】

【医療機器メーカーS/4HANA導入(PP/QM)】東京・八王子(オンサイト)/要件定義リード

要スキル:
・SAP PP/QMモジュールに関する深い知識 ・生産/製造管理領域における業務プロセス設計の経験 ・高いコミュニケーション能力(顧客との折衝、ディスカッション推進など) 【尚可】 ・ビジネスレベルの英語力
月額単価:
~1,800,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
医療機器メーカーにおける基幹システム刷新の一環として、SAP S/4HANAを導入するプロジェクトです。 プロジェクトの初期段階かつ最重要フェーズである要件定義において、PP/QM領域の専門家として、新業務プロセスの設計とシステム要件の具体化を主導していただきます。 主な業務内容: ・SAP PP/QM領域における要件定義の主導、および顧客担当者とのディスカッションのファシリテーション ・現行業務プロセスの分析、および新業務フローの設計(Fit&Gap分析) ・顕在化した課題の整理、およびSAP標準機能を活用した対応方針の策定・提案 ・各種ドキュメント作成(要件定義書、議事録、課題管理表など)

【MM】

【SD】

【製造業データ移行支援(SD/MMシニアSE)】フルリモート/データ投入・分析・課題対応

要スキル:
・SAP SDまたはMMモジュールにおけるデータ移行のご経験 ・要件定義フェーズ後半から導入プロジェクトに参画したご経験
月額単価:
~1,200,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
製造業における基幹システム刷新の一環として、SAP導入プロジェクトのデータ移行フェーズが進行中です。 この重要なフェーズにおいて、ロジスティクス領域(SD/MM)のシニアSEとして、移行ツールを用いたデータ投入から結果分析、課題対応までの一連の業務を責任をもって担当していただきます。 主な業務内容: ・移行ツールを用いたSD/MM関連マスタ・トランザクションデータの投入作業 ・データ投入結果の整合性チェック、および分析 ・データ不整合やエラー発生時の原因調査、および課題対応 ・移行手順書の作成、更新 ・関連チームとの連携、進捗報告
この記事のポイント

データベース操作(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】

【MM】

【SD】

【製造業SAP拡張開発(FI/SD/MM)】大阪・リモート併用/基本設計・テスト

要スキル:
SAPのFI、SD、MMいずれかのモジュールにおいて、基本設計以降のフェーズを担当したご経験
月額単価:
~1,050,000円 / 月
稼働場所:
大阪府
稼働率:
100%
作業内容:
製造業の基幹システムとして稼働するSAPシステムの機能拡張プロジェクトです。FI、SD、MMいずれかのモジュール担当として、要件定義書をインプットに基本設計書を作成し、開発チームへの連携、そして完成した機能の受入テストまで、一連のプロセスを中心メンバーとして担当していただきます。 主な業務内容: ・要件定義書に基づく、アドオン機能等の基本設計書の作成 ・開発チームへの設計内容の説明、およびQ&A対応 ・開発チームが作成した機能の受入テスト計画策定、シナリオ作成、テスト実施 ・テスト結果の評価、不具合管理、および修正依頼 ・関連ドキュメント(設計書、テスト仕様書など)の作成および更新

【FI】

【製造業ユーザートレーニング支援(FI)】東京・品川(リモート併用)/QA対応・テスト調査

要スキル:
SAP FIモジュールに関する基本的な知識(ジュニアコンサルタントレベル)
月額単価:
~900,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
製造業におけるSAP導入プロジェクトが、ユーザートレーニングおよびテストフェーズを迎えています。 この重要な局面において、ユーザーがシステムを円滑に利用開始できるよう、トレーニング時のQA対応やインターフェイステストで発生したバグの調査などを中心メンバーとして担当していただきます。 主な業務内容: ・業務ユーザートレーニング実施時におけるQA対応、および説明補助 ・インターフェイステスト等で発生した不具合(バグ)の原因調査、切り分け ・ユーザーからの問い合わせ対応、およびエスカレーション ・関連ドキュメント(FAQ、手順書など)の作成支援

【FI】

【製造業SAP導入(FI-AA)】東京・品川(リモート併用)/Fit&Gap・要件定義

要スキル:
SAP FI-AA(固定資産)モジュールにおけるシニアコンサルタントとしてのご経験
月額単価:
~1,700,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
製造業の基幹システムとしてSAPを導入するプロジェクトです。 今回は、プロジェクトの初期段階であるFit&Gap分析から要件定義フェーズにご参画いただきます。FI-AA(固定資産)領域の専門家として、新システムの方向性を定める重要な役割を中心メンバーとして担っていただきます。 主な業務内容: ・FI-AA(固定資産)領域におけるFit&Gap分析の実施 ・顧客担当者とのディスカッションを通じた、現行業務のヒアリングおよび新業務プロセスの設計 ・SAP標準機能との適合性を評価し、要件定義書の作成を主導 ・顕在化した課題の整理、および解決方針の策定・提案 ・関連ドキュメント(議事録、課題管理表など)の作成

【SD】

【台湾向けSAP展開支援(SD)】東京・豊洲(週1出社)/テスト・アドオン設計

要スキル:
SD領域においてSAPプロジェクトに携わったご経験 【尚可】 中国語(ビジネスレベルでなくても可)の知見
月額単価:
~1,300,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
国内のSAPシステムを台湾拠点へ展開するグローバルプロジェクトです。 今回は、システムの品質を確固たるものにする総合テストフェーズにおいて、SD領域の専門家としてご参画いただきます。 テスト時の不具合調査・対応から、関連するアドオンの設計、課題検討・提案まで、多岐にわたる業務を中心メンバーとして担当していただきます。 主な業務内容: ・総合テストフェーズにおけるテスト対応、およびテスト時の不具合調査・対応 ・受注・出荷インターフェースに関するアドオン設計、および改修 ・帳票関連アドオン(Packing list, Invoice等/Smartform使用)の設計・開発連携 ・SD領域に関する各種課題の検討、および解決策の提案業務 ・関連ドキュメントの作成および更新

【FI】

【総合商社システム移行支援(FI-AA/AP/AR)】フルリモート/トレーニング計画

要スキル:
SAPのFI-AA(固定資産)またはAP/AR(債権債務)領域におけるトレーニング計画策定のご経験 【尚可】 ・商社向け業務システムの設計、導入、構築のご経験 ・SAP GTM(Global Trade Management)に関する知見
月額単価:
~1,000,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
大手総合商社の基幹システム移行プロジェクトにおいて、ユーザー部門が新システムをスムーズに活用できるよう、運用開始に向けた準備を支援するポジションです。 FI-AA(固定資産)またはAP/AR(債権債務)領域の専門家として、ユーザートレーニングの計画策定・準備を中心メンバーとして担当していただきます。 主な業務内容: ・FI-AAまたはAP/AR領域における、ユーザー向けトレーニング計画の策定および準備支援 ・トレーニングカリキュラム、マニュアル、教材などの作成支援 ・移行後の新業務プロセス定着化に向けた各種支援、および課題対応 ・ユーザー部門やプロジェクトチームとの連携、調整

【CO】

【FI】

【外資系SAPロールイン(業務フローリード)】神奈川・新川崎(リモート併用)/会計領域

要スキル:
①SAP経験+英語対応可 ・会計知見 ・業務フロー作成経験 ・ビジネスレベル英語力 ・ユーザー対応経験 ②SAP未経験(SAP以外のその他業務フロー作成経験者) ・会計知見 ・業務フロー作成経験 ・ビジネスレベル英語 ・ユーザー対応経験 【歓迎スキル】 ・公認会計士資格保有者 ・SAPプロジェクト経験
月額単価:
~1,400,000円 / 月
稼働場所:
神奈川県
稼働率:
100%
作業内容:
外資系製造業の日本拠点へSAPを導入するロールインプロジェクトです。現在はテストフェーズにあり、本稼働に向けた業務改革の一環として、業務フローの整備が重要な課題となっています。本ポジションでは、海外で作成された英語資料を基に日本語の業務フローを作成し、その品質を管理するチームリードとして、プロジェクトの成功を推進していただきます。 主な業務内容: ・海外で作成された英語ベースの資料を理解し、日本の業務に合わせた日本語の業務フローへの落とし込み ・海外の導入チームおよび日本のクライアントとの英語でのコミュニケーション、会議のファシリテーション ・チームメンバーが作成した業務フロー等のアウトプットに対するレビュー、および品質管理 ・業務改革の推進に関する各種調整、および課題解決支援

【MM】

【素材メーカーS/4HANA移行管理(MM/PMO)】フルリモート/移行計画・作業管理

要スキル:
・SAP MM領域におけるデータ移行の知見とご経験 ・PMOとしてプロジェクト全体の調整やリードをしたご経験
月額単価:
~1,700,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
素材メーカーのSAP S/4HANA導入プロジェクトにおいて、データ移行全体の管理を担うポジションです。S/4HANAのみならず、BTP、Salesforce、スクラッチ開発システムなど、複数のシステムが対象となる複雑な移行プロジェクトにおいて、移行計画の策定からリハーサルの管理まで、一連のマネジメント業務をPMOとして担当していただきます。 主な業務内容: ・プロジェクト全体を見据えた、データ移行計画の策定、および関係各所との調整 ・移行ツールの設計・開発・テストに関する作業管理、および進捗・課題管理 ・移行リハーサルの計画策定、および実行管理 ・データ移行に関するリスクの識別、評価、および対策の検討 ・プロジェクト内での円滑なコミュニケーション促進、および報告業務

【MM】

【素材メーカーS/4HANA導入(テスト管理 MM/PMO)】フルリモート/テスト計画・作業管理

要スキル:
・SAP MM領域における業務シナリオテスト、UAT(ユーザー受入テスト)のご経験 ・テスト統括のご経験 ・PMOとしてプロジェクト全体の調整やリードをしたご経験
月額単価:
~1,700,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
素材メーカーのSAP S/4HANA導入プロジェクトにおいて、システムの品質を保証するテストフェーズ全般の管理を担うポジションです。 結合テスト、業務シナリオテスト、UAT(ユーザー受入テスト)といった各テストフェーズにおいて、計画策定から作業管理まで、一連のマネジメント業務をテストの責任者として担当していただきます。 主な業務内容: ・結合テスト、業務シナリオテスト、UATに関するテスト計画の作成および調整 ・テストシナリオ作成の支援、および進捗管理 ・テスト全体の作業管理(タスク割り当て、進捗・課題・品質管理) ・テスト結果の取りまとめ、および報告 ・関連部署やベンダーとの円滑なコミュニケーション、および調整業務

【PP】

【その他】

【医療機器メーカーS/4HANA導入(PP/QM)】東京・八王子(オンサイト)/要件定義リード

要スキル:
・SAP PP/QMモジュールに関する深い知識 ・生産/製造管理領域における業務プロセス設計の経験 ・高いコミュニケーション能力(顧客との折衝、ディスカッション推進など) 【尚可】 ・ビジネスレベルの英語力
月額単価:
~1,800,000円 / 月
稼働場所:
東京都
稼働率:
100%
作業内容:
医療機器メーカーにおける基幹システム刷新の一環として、SAP S/4HANAを導入するプロジェクトです。 プロジェクトの初期段階かつ最重要フェーズである要件定義において、PP/QM領域の専門家として、新業務プロセスの設計とシステム要件の具体化を主導していただきます。 主な業務内容: ・SAP PP/QM領域における要件定義の主導、および顧客担当者とのディスカッションのファシリテーション ・現行業務プロセスの分析、および新業務フローの設計(Fit&Gap分析) ・顕在化した課題の整理、およびSAP標準機能を活用した対応方針の策定・提案 ・各種ドキュメント作成(要件定義書、議事録、課題管理表など)

【MM】

【SD】

【製造業データ移行支援(SD/MMシニアSE)】フルリモート/データ投入・分析・課題対応

要スキル:
・SAP SDまたはMMモジュールにおけるデータ移行のご経験 ・要件定義フェーズ後半から導入プロジェクトに参画したご経験
月額単価:
~1,200,000円 / 月
稼働場所:
フルリモート
稼働率:
100%
作業内容:
製造業における基幹システム刷新の一環として、SAP導入プロジェクトのデータ移行フェーズが進行中です。 この重要なフェーズにおいて、ロジスティクス領域(SD/MM)のシニアSEとして、移行ツールを用いたデータ投入から結果分析、課題対応までの一連の業務を責任をもって担当していただきます。 主な業務内容: ・移行ツールを用いたSD/MM関連マスタ・トランザクションデータの投入作業 ・データ投入結果の整合性チェック、および分析 ・データ不整合やエラー発生時の原因調査、および課題対応 ・移行手順書の作成、更新 ・関連チームとの連携、進捗報告

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

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

SAPラボのライターの特徴

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

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

募集要項

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

ご応募/お問合せ先

info@sap-labo.com

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

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

この記事を書いた人

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

この記事のポイント