ABAP(Advanced Business Application Programming、元々はドイツ語で「一般的なレポート作成プロセッサ」を意味するAllgemeiner Berichts-Aufbereitungs-Prozessor [ 2 ])は、ドイツのソフトウェア会社SAP SEによって開発された高水準プログラミング言語です。現在、Javaと並んで、ビジネスアプリケーション構築のためのSAP NetWeaverプラットフォームの一部であるSAP NetWeaver Application Serverのプログラミング言語として位置づけられています。
ABAPは、1980年代に初めて開発された、数多くのアプリケーション固有の第4世代言語(4GL )の一つです。元々はSAP R/2のレポート言語であり、SAP R/2は、大企業が資材管理や財務・管理会計のためのメインフレームビジネスアプリケーションを構築することを可能にするプラットフォームでした。
ABAPは元々、ドイツ語で「汎用レポート準備プロセッサ」を意味するAllgemeiner Berichts-Aufbereitungs-Prozessorの頭文字をとった略語でしたが、後にAdvanced Business Application Programmingに名称変更されました。ABAPは、論理データベース(LDB)の概念を取り入れた最初の言語の1つであり、あらゆるプラットフォーム、言語、ユニットをサポートする基本データベースレベルから高度な抽象化を提供します。
ABAP言語は、もともと開発者がSAP R/3プラットフォームを開発するために使用されていました。また、SAPの顧客がSAPアプリケーションを拡張するためにも使用されることを想定しており、顧客はABAPプログラミングを使用してカスタムレポートやインターフェースを開発できます。この言語は、プログラミング経験のある、より技術的な顧客向けに設計されていました。
ABAPは、SAPが1992年に初めてリリースしたクライアント/サーバシステムR/3のプログラムを作成するための言語として現在も使われています。1990年代を通じてコンピュータハードウェアが進化するにつれ、SAPのアプリケーションやシステムの多くはABAPで記述されるようになりました。2001年までには、最も基本的な機能を除いてすべてがABAPで記述されるようになりました。1999年、SAPはR/3リリース4.6とともに、ABAPのオブジェクト指向拡張機能であるABAP Objectsをリリースしました。
SAPの現在の開発プラットフォームであるNetWeaverは、ABAPとJavaの両方をサポートしています。
ABAPは、ビジネスアプリケーション、オペレーティングシステム、データベースの間に抽象化レイヤーを備えています。これにより、アプリケーションが特定のサーバーやデータベースプラットフォームに直接依存することがなくなり、プラットフォーム間での移植が容易になります。
SAP Netweaver は現在、UNIX ( AIX、HP-UX、Solaris、Linux )、Microsoft Windows、IBM System i (旧 iSeries、AS/400)上のi5/OS 、およびIBM System z (旧 zSeries、S/390)上のz/OSで動作します。サポートされているデータベースは、 HANA、SAP ASE (旧 Sybase)、IBM Db2、Informix、MaxDB、Oracle、およびMicrosoft SQL Serverです(Informix のサポートは SAP Basis リリース 7.00 で終了しました)。[ 3 ]
すべてのABAPプログラムはSAPデータベース内に存在します。JavaやC++プログラムのように、個別の外部ファイルに格納されることはありません。データベース内では、すべてのABAPコードは2つの形式で存在します。1つはソースコードで、ABAPワークベンチツールを使用して表示および編集できます。もう1つは生成コードで、Javaバイトコードにやや類似したバイナリ表現です。ABAPプログラムは、SAPカーネルの一部であるランタイムシステムの制御下で実行されます。ランタイムシステムは、ABAPステートメントの処理、画面のフローロジックの制御、およびイベント(ユーザーが画面ボタンをクリックするなど)への応答を担当します。この点において、 Java VMに匹敵する仮想マシンと見なすことができます。ABAPランタイムシステムの重要なコンポーネントはデータベースインターフェースです。これは、データベースに依存しないABAPステートメント(「Open SQL」)を、基盤となるDBMSが理解できるステートメント(「Native SQL」)に変換します。データベースインターフェースは、 ABAPプログラムに代わってリレーショナルデータベースとのすべての通信を処理します。また、アプリケーションサーバーのローカルメモリにテーブルや頻繁にアクセスされるデータをバッファリングするなどの追加機能も備えています。
すべてのSAPデータはSAPシステムという環境下で存在し、すべてのSAPソフトウェアもSAPシステムという環境下で動作します。システムは、中央のリレーショナルデータベースと、このデータベース内のデータやプログラムにアクセスする1つ以上のアプリケーションサーバー(「インスタンス」)で構成されます。SAPシステムには少なくとも1つのインスタンスが含まれますが、サイジングやパフォーマンス上の理由から、複数のインスタンスが含まれる場合もあります。複数のインスタンスを持つシステムでは、負荷分散メカニズムによって、利用可能なアプリケーションサーバー全体に負荷が均等に分散されます。
Webアプリケーションサーバーのインストール環境(ランドスケープ)は、通常、開発用、テストおよび品質保証用、本番用の3つのシステムで構成されます。ランドスケープには、これより多くのシステム(例えば、単体テスト用とプレプロダクションテスト用の別々のシステム)が含まれる場合もあれば、これより少ないシステム(例えば、開発用と本番用のみで、QAは別ではない)が含まれる場合もありますが、3つのシステムが最も一般的な構成です。ABAPプログラムは開発システムで作成され、最初のテストが行われます。その後、ランドスケープ内の他のシステムに配布されます。これらの操作は、変更および移送システム(CTS)によって制御されます。CTSは、同時実行制御(例えば、2人の開発者が同時に同じコードを変更することを防ぐ)、バージョン管理、およびQAシステムと本番システムへのプログラムのデプロイを担当します。
Webアプリケーションサーバーは、データベース層、アプリケーション層、プレゼンテーション層の3つの層で構成されています。これらの層は、同じ物理マシン上または異なる物理マシン上で実行できます。データベース層には、リレーショナルデータベースとデータベースソフトウェアが含まれます。アプリケーション層には、システムのインスタンスが含まれます。ビジネストランザクションやABAP開発を含むすべてのアプリケーションプロセスは、アプリケーション層で実行されます。プレゼンテーション層は、システムのユーザーとのやり取りを処理します。ABAPアプリケーションサーバーへのオンラインアクセスは、「SAP GUI」と呼ばれる独自のグラフィカルインターフェイス、またはWebブラウザーを介して行うことができます。
ABAPソフトウェアはソフトウェアコンポーネントとして展開されます。その例としては、以下のようなものがあります。
SAP 用語では、トランザクションとはプログラムの実行のことです。SAP システムで ABAP コードを実行する通常の方法は、トランザクション コードを入力することです (たとえば、VA01 は「販売注文の作成」のトランザクション コードです)。ABAP 開発者が使用する一般的なトランザクション コード (T コード) は、SE38、SE09、SE10、SE24、SE11、SE16N、SE80、SE37、ST22 などです。[ 4 ] [ 5 ]トランザクションは、システム定義またはユーザー固有のロール ベースのメニューを介して呼び出すことができます。トランザクションは、すべての SAP 画面にあるコマンド フィールドに直接トランザクション コードを入力して開始することもできます。トランザクションは、ABAP ステートメントを使用してプログラム的に呼び出すこともできます。トランザクション の一般的な概念はCALL TRANSACTION、SAP 用語では論理作業単位 (LUW) と呼ばれます。LEAVETOTRANSACTION.
他のプログラミング言語と同様に、ABAPプログラムは実行可能な単位であるか、または他のプログラムに再利用可能なコードを提供するライブラリのいずれかであり、ライブラリ自体は単独では実行できません。
ABAPでは、実行可能プログラムを2種類に分類します。
レポートは比較的シンプルなプログラミングモデルに従っており、ユーザーがオプションで一連のパラメータ(例えば、データのサブセットの選択)を入力すると、プログラムはその入力パラメータを使用して対話型リスト形式のレポートを生成します。「レポート」という用語は、データを変更するように設計することもできるため、やや誤解を招く可能性があります。これらのプログラムがレポートと呼ばれる理由は、生成される出力が「リスト指向」であるためです。
モジュールプールは、画面の集合体を使用して、より複雑なユーザーインタラクションパターンを定義します。「画面」とは、ユーザーが実際に目にする物理的なイメージを指します。各画面には「フローロジック」があり、これは画面によって暗黙的に呼び出されるABAPコードを指し、「PBO」(出力前処理)と「PAI」(入力後処理)のセクションに分かれています。SAPのドキュメントでは、「dynpro」(動的プログラム)という用語は、画面とそのフローロジックの組み合わせを指します。
実行不可能なプログラムの種類は以下のとおりです。
ABAPプログラムは個々の文(ステートメント)で構成されます。ステートメントの最初の単語はABAPキーワードと呼ばれます。各ステートメントはピリオドで終わります。単語は常に少なくとも1つのスペースで区切る必要があります。ステートメントは自由にインデントできます。キーワード、加算、オペランドに関しては、ABAPランタイムシステムは大文字と小文字を区別しません。
ステートメントは複数行にわたる場合があります。1行に複数のステートメントを記述することも可能ですが(推奨されません)、最初の列にアスタリスク * が付いている行は、ABAPランタイムシステムによってコメント行として認識され、無視されます。二重引用符 ("") は、その行の残りの部分がコメントであることを示します。
ABAPで開発を行うには2つの方法があります。どちらの方法が利用できるかは、ABAPシステムのリリース状況によって異なります。
ABAPワークベンチはABAPシステムの一部であり、SAP GUIを介してアクセスします。プログラム編集のためのさまざまなツールが含まれています。その中で最も重要なものは次のとおりです(トランザクションコードは括弧内に示されています)。
オブジェクトナビゲーター(トランザクションSE80)は、これらの様々なツールへの単一の統合インターフェースを提供します。
ABAP開発ツール(ADT )は、正式には「ABAP in Eclipse」として知られており、ABAPオブジェクトを開発するためのEclipse IDE用のプラグインのセットです。[ 6 ]
このシナリオでは、ABAP開発者は必要なツールを自分のコンピュータにインストールしてローカルで作業を行い、バックエンドとの継続的な同期が実行されます。
ABAPディクショナリには、SAPシステム内のデータに関するすべてのメタデータが含まれています。ABAPワークベンチと密接に連携しており、データ(テーブル、ビュー、データ型など)への参照はすべてディクショナリから取得されます。開発者は、ABAPディクショナリトランザクション(直接、またはABAPワークベンチ内のSE80オブジェクトナビゲーター経由)を使用して、このメタデータを表示および管理します。
ディクショナリオブジェクトが変更されると、変更されたオブジェクトを参照するプログラムは、次回実行時に自動的に新しいバージョンを参照するようになります。ABAPはインタプリタ方式であるため、変更されたディクショナリオブジェクトを参照するプログラムを再コンパイルする必要はありません。
以下に、最も重要な辞書オブジェクトの種類について簡単に説明します。
ABAP構文の簡単な説明は、おなじみの「Hello」から始まります。
REPORT TEST . WRITE 'Hello, World!' .REPORTこの例にはと の2 つのステートメントが含まれていますWRITE。プログラムは画面にリストを表示します。この場合、リストは「Hello, World!」という 1 行で構成されています。 ステートメントは、このプログラムがレポートであることを示しています。ステートメントを にREPORT置き換えると、このプログラムはモジュール プールになります。REPORTPROGRAM
最初の部分(左端)が同一の連続する文は、連鎖演算子を使用して「連鎖」文にまとめることができます:。文の共通部分はコロンの左側に、異なる部分はコロンの右側にカンマで区切って記述します。コロン演算子は、スペースを入れずに直前のトークンに直接付加されます(以下の例に示すように、トークンリスト内のカンマについても同様です)。
チェーンはステートメントでよく使用されますWRITE。WRITEは引数を 1 つしか受け付けないため、たとえば FLIGHTINFO という構造体から 3 つのフィールドを表示したい場合は、次のようにコーディングする必要があります。
FLIGHTINFO - CITYFROMを書き込む。FLIGHTINFO - CITYTOを書き込む。FLIGHTINFO - AIRPTOを書き込む。文を連結することで、より読みやすく、より直感的な形式になります。
書き込み: FLIGHTINFO - CITYFROM 、FLIGHTINFO - CITYTO 、FLIGHTINFO - AIRPTO 。連鎖文では、最初の部分(コロンの前)は文名だけに限定されません。連続する文の共通部分全体をコロンの前に配置できます。例:
LASTNAMEの'A'を'B'に置き換えます。FIRSTNAMEの'A'を'B'に置き換えます。CITYNAMEの'A'を'B'に置き換えます。連鎖形式で書き直すと次のようになります。
'A'を'B'に置き換えます: LASTNAME 、FIRSTNAME 、CITYNAME 。ABAPでは、テキストをコメントとして定義する方法が2つあります。
例:
*************************************** ** プログラム: 予約 ** ** 著者: ジョー・バイト、2007年7月7日 ** ***************************************予約状況を報告する。* データベースからフライト予約を読み込むSELECT * FROM FLIGHTINFO WHERE CLASS = 'Y' "Y = エコノミーOR CLASS = 'C' . "C = ビジネス(...)ABAPのコードは空白文字に敏感です。
x = a + b ( c ) 。変数 a の部分文字列のうち、b から始まり、変数 c で定義された長さのものを変数 x に代入します。
x = a + b ( c ) 。変数 x に、変数 a と、パラメータ c を指定したメソッド b の呼び出し結果の合計を代入します。
C/C++やJavaのような言語は、限られた数の言語固有のステートメントを定義し、ライブラリを介してほとんどの機能を提供するのに対し、ABAPには膨大な数の組み込みステートメントが含まれています。これらのステートメントは従来、文のような構造を使用し、シンボルを避けていたため、ABAPプログラムは比較的冗長でした。しかし、ABAP言語のより新しいバージョンでは、より簡潔なスタイルが可能になっています。[ 7 ]
ステートメントベースの構文(COBOLに由来する構文)と式ベースの構文(C/Javaなど)の例:
価格に税金を加算します。 * はPRICE = PRICE + TAXと同等です。ABAPには、組み込みのデータ型が用意されています。さらに、ABAPディクショナリで定義されているすべての構造体、テーブル、ビュー、データ要素を変数の型として使用できます。また、オブジェクトクラスやインターフェースも型として使用できます。
組み込みデータ型は以下のとおりです。
日付変数または定数(型 D)には、西暦 1 年 1 月 1 日からの日数が格納されます。時刻変数または定数(型 T)には、午前 1 時からの秒数が格納されます。両方の型の特別な特徴は、整数としても文字列としてもアクセスできることです(日付の場合は内部フォーマット「YYYYMMDD」、時刻の場合は「hhmmss」)。これらは日付と時刻の処理に使用できます。たとえば、以下のコード スニペットは、前月の最終日を計算します(注: SY-DATUM は、現在の日付を格納するシステム定義変数です)。
DATA LAST_EOM TYPE D . "月末最終日* 今日の日付LAST_EOM = SY - DATUMから開始します。* YYYYMMDD 文字列の文字 6 と 7 (0 相対) を "01" に設定し、* 現在の月の最初の日とします。LAST_EOM + 6 ( 2 ) = '01' 。* 1 日を引きます。LAST_EOM = LAST_EOM - 1 。WRITE : '前月の最終日は' , LAST_EOMでした。ABAP の変数はすべて、使用するには明示的に宣言する必要があります。変数は、個別のステートメントと明示的な型指定で宣言することも、ABAP 7.40 以降では推論型指定によるインライン宣言で宣言することもできます。
通常、すべての宣言はコードモジュール(プログラム、サブルーチン、関数)の先頭、最初の実行可能ステートメントの前に配置されます。この配置は慣例であり、強制される構文規則ではありません。宣言は、名前、型、長さ(該当する場合)、追加の修飾子(例えば、パック10進数フィールドの暗黙の小数点以下の桁数)、およびオプションで初期値で構成されます。
* プリミティブ型: DATA : COUNTER TYPE I 、VALIDITY TYPE I VALUE 60 、TAXRATE ( 3 ) TYPE P DECIMALS 1 、LASTNAME ( 20 ) TYPE C 、DESCRIPTION TYPE STRING 。* 辞書タイプ: DATA : ORIGIN TYPE COUNTRY 。* 内部テーブル: DATA : T_FLIGHTS TYPE TABLE OF FLIGHTINFO , T_LOOKUP TYPE HASHED TABLE OF FLT_LOOKUP 。* オブジェクト: DATA : BOOKING TYPE REF TO CL_FLT_BOOKING 。連続するDATA文を連結するためにコロンが使用されている点に注目してください。
ABAP 7.40以降、[ 8 ]変数は次の構文でインライン宣言できます。
DATA ( variable_name ) = 'VALUE' 。この種の宣言では、メソッドシグネチャやデータベーステーブル構造などによって、静的に型を推論できる必要があります。
この構文はOpenSQLステートメントでも使用可能です。
SELECT * FROM ekko INTO @ DATA ( lt_ekko ) WHERE ebeln EQ @ lv_ebeln .ABAP言語は、「ABAPオブジェクト」と呼ばれる機能を通じてオブジェクト指向プログラミングをサポートしています。 [ 9 ]これにより、アプリケーションが簡素化され、制御しやすくなります。
ABAP Objectsは既存の言語と完全に互換性があるため、ABAP Objectsを使用するプログラムでは既存のステートメントやモジュール化ユニットを使用でき、既存のABAPプログラムでABAP Objectsを使用することもできます。ABAP Objectsプログラムでは構文チェックがより厳格で、特定のステートメントの構文形式(通常は古い形式)は許可されません。
オブジェクトは、特性とそれぞれの動作を組み合わせたカプセルを形成します。オブジェクトによって、プログラマーは実際の問題と提案されたソフトウェアソリューションを1対1でマッピングできるようになります。ビジネス環境における典型的なオブジェクトとしては、たとえば「顧客」、「注文」、「請求書」などがあります。リリース3.1以降、SAP Web Application Server ABAPのビジネスオブジェクトリポジトリ(BOR)には、このようなオブジェクトの例が含まれています。BORオブジェクトモデルは、BORオブジェクトタイプをABAPクラスライブラリに移行することで、次のリリースでABAPオブジェクトに統合されます。オブジェクト指向全体に関する包括的な入門は、このABAPオブジェクト入門の範囲をはるかに超えます。このドキュメントでは、オブジェクト指向で普遍的に使用され、ABAPオブジェクトにも登場する用語をいくつか紹介します。以降のセクションでは、これらの用語がABAPオブジェクトでどのように使用されるかをさらに詳しく説明します。このセクションの最後には、オブジェクト指向に関する書籍のタイトルをいくつか挙げた参考文献リストがあります。
オブジェクト指向プログラミングにおいて、オブジェクトは通常、以下の特性を持つ。
ABAPコアデータサービス(ABAP CDS)は、AS ABAP向けに一般的なCDSコンセプトを実装したものです。ABAP CDSを使用すると、アプリケーションサーバーの中央データベース上にセマンティックデータモデルを定義できます。AS ABAPでは、これらのモデルはデータベースシステムとは独立して定義できます。これらのモデルのエンティティは、ABAPディクショナリで定義されている既存のデータベーステーブルやビューと比較して、アクセス機能が強化されているため、Open SQLベースのアプリケーションを最適化できます。これは、AS ABAPがSAP HANAデータベースを使用する場合に特に顕著です。SAP HANAのインメモリ特性を最適に活用できるためです。
データモデルは、ABAP CDSに付属のデータ定義言語(DDL)とデータ制御言語(DCL)を用いて、ABAP CDS構文で定義されます。これらの言語で定義されたオブジェクトはABAPディクショナリに統合され、ここで管理されます。
CDSソースコードはEclipseベースのABAP開発ツール(ADT)でのみプログラミングできます。データ定義言語(DDL)とデータ制御言語(DCL)は異なるエディタを使用します。[ 10 ]
内部テーブルは、ABAP 言語の重要な機能です。内部テーブルは、 C++ の構造体のベクトルや Java のオブジェクトのベクトルと同様に定義されます。これらの言語との主な違いは、ABAP では内部テーブルの内容に簡単にアクセスして操作するためのステートメントのコレクションが提供されていることです。ABAP は配列をサポートしていないため、複数の要素を持つデータ オブジェクトを定義する唯一の方法は内部テーブルを使用することであることに注意してください。[ 12 ]
内部テーブルは、固定構造の可変データセットをABAPのワーキングメモリに格納する方法であり、動的配列の機能を提供します。データは行単位で格納され、各行は同じ構造を持ちます。
内部テーブルは、プログラム内からデータベーステーブルの内容を格納およびフォーマットするために使用されるのが望ましい。さらに、構造体と関連付けられた内部テーブルは、ABAPプログラムで複雑なデータ構造を定義するための重要な手段となる。
次の例では、データベーステーブルVBRKの形式を持つ2つのフィールドを持つ内部テーブルを定義します。
* まず、構造化型を定義します。TYPES : BEGIN OF t_vbrk , VBELN TYPE VBRK - VBELN , ZUONR TYPE VBRK - ZUONR , END OF t_vbrk 。* ここで、定義した型 t_vbrk の内部テーブルを定義します。DATA : gt_vbrk TYPE STANDARD TABLE OF t_vbrk , gt_vbrk_2 TYPE STANDARD TABLE OF t_vbrk . "テーブルをさらに定義するのは簡単です* 必要に応じて、構造 (内部テーブルの行) を定義します。* 型または内部テーブルへの参照による定義: DATA : gs_vbrk TYPE t_vbrk , gs_vbrk_2 LIKE LINE OF gt_vbrk_2 .* 必要に応じてテーブルタイプを定義することもできます。TYPES tt_vbrk TYPE STANDARD TABLE OF t_vbrk 。以下のリストは、ABAP言語の歴史における重要な節目について概略を示したものです。詳細については、「ABAP - リリース固有の変更点」を参照してください。