SAPABAP-クイックガイド
ABAPは、4GL(第4世代)言語であるAdvanced Business ApplicationProgrammingの略です。現在、Javaとともに、SAPアプリケーションサーバープログラミングの主要言語として位置付けられています。
SAPシステムの高レベルのアーキテクチャから始めましょう。一般的なSAPシステムの3層クライアント/サーバーアーキテクチャを以下に示します。
ザ・ Presentation layerSAPシステムの制御に使用できる任意の入力デバイスで構成されます。これは、Webブラウザー、モバイルデバイスなどである可能性があります。すべての中央処理はで行われますApplication server。アプリケーションサーバーは、それ自体が1つのシステムであるだけでなく、処理システムの複数のインスタンスである可能性があります。サーバーはと通信しますDatabase layerこれは通常、主にパフォーマンス上の理由とセキュリティのために、別のサーバーに保持されます。通信は、プレゼンテーション層からデータベースまで、システムの各層の間で行われ、チェーンをバックアップします。
Note− ABAPプログラムは、アプリケーションサーバーレベルで実行されます。ソフトウェアの技術的な配布は、その物理的な場所とは無関係です。つまり、基本的に3つのレベルすべてを1台のコンピューターに重ねてインストールすることも、各レベルを別のコンピューターまたはサーバーにインストールすることもできます。
ABAPプログラムはSAPデータベース内にあります。これらは、SAPカーネルの一部であるランタイムシステムの制御下で実行されます。ランタイムシステムは、すべてのABAPステートメントを処理し、フローロジックを制御し、ユーザーイベントに応答します。
したがって、C ++やJavaとは異なり、ABAPプログラムは個別の外部ファイルに保存されません。データベース内では、ABAPコードは2つの形式で存在します-
Source ABAPワークベンチツールで表示および編集できるコード。
Generated code、これはバイナリ表現です。Javaに精通している場合、この生成されたコードはJavaバイトコードにいくらか匹敵します。
ランタイムシステムは、Java仮想マシンと同様に仮想マシンと見なすことができます。ABAPランタイムシステムの重要なコンポーネントは、データベースに依存しないステートメント(Open SQL)を基盤となるデータベース(Native SQL)によって理解されるステートメントに変換するデータベースインターフェイスです。SAPは多種多様なデータベースと連携でき、同じABAPプログラムをそれらすべてで実行できます。
レポートは、一般的なABAPの原則とツールを理解するための良い出発点です。ABAPレポートは多くの分野で使用されています。この章では、簡単なABAPレポートの作成がいかに簡単であるかを説明します。
こんにちはABAP
一般的な「HelloWorld」の例から始めましょう。
各ABAPステートメントは、ABAPキーワードで始まり、ピリオドで終わります。キーワードは、少なくとも1つのスペースで区切る必要があります。ABAPステートメントに1行または複数行を使用するかどうかは関係ありません。
SAP NetWeaver Application Server ABAP(「ASABAP」とも呼ばれます)に付属のABAPツールの一部であるABAPエディタを使用してコードを入力する必要があります。
「ASABAP」は、独自のデータベース、ABAPランタイム環境、およびABAPエディタなどのABAP開発ツールを備えたアプリケーションサーバです。AS ABAPは、ハードウェア、オペレーティングシステム、およびデータベースから独立した開発プラットフォームを提供します。
ABAPエディタの使用
Step 1−トランザクションSE38を開始して、ABAPエディタ(次の章で説明)にナビゲートします。多くのABAPオブジェクトの1つであるレポートの作成を開始しましょう。
Step 2−エディタの第一画面で、入力項目PROGRAMにレポートの名前を指定します。名前はZHELLO1として指定できます。先行するZは名前にとって重要です。Zは、レポートが顧客の名前空間に存在することを保証します。
顧客の名前空間には、接頭辞YまたはZが付いたすべてのオブジェクトが含まれます。顧客またはパートナーがオブジェクト(レポートなど)を作成するときに、これらのオブジェクトをSAPのオブジェクトと区別し、オブジェクトとの名前の競合を防ぐために常に使用されます。
Step 3−レポート名は小文字で入力できますが、エディターはそれを大文字に変更します。したがって、ABAPオブジェクトの名前では、大文字と小文字は区別されません。
Step 4−レポートの名前を指定したら、[作成]ボタンをクリックします。ポップアップウィンドウABAP:PROGRAM ATTRIBUTESがポップアップし、レポートに関する詳細情報を提供します。
Step 5−レポートタイプとして「実行可能プログラム」を選択し、タイトル「マイファーストABAPレポート」を入力してから、保存を選択して続行します。次に、CREATE OBJECT DIRECTORYENTRYウィンドウがポップアップ表示されます。[ローカルオブジェクト]ボタンを選択すると、ポップアップが閉じます。
REPORTステートメントの下にWRITEステートメントを入力すると、最初のレポートを完成させることができます。これにより、完全なレポートには次のように2行だけが含まれます。
REPORT ZHELLO1.
WRITE 'Hello World'.
レポートの開始
キーボード(Ctrl + S)または保存アイコン(コマンドフィールドの横の右側)を使用して、レポートを保存できます。ABAP開発はASABAPで行われます。
レポートの開始は、保存するのと同じくらい簡単です。ACTIVATIONボタン(開始アイコンの横の左側)をクリックし、アイコンDIRECTPROCESSINGまたはF8ファンクションキーを使用してレポートを開始します。タイトル「MyFirstABAP Report」と、出力「HelloWorld」も表示されます。これが出力です-
My First ABAP Report
Hello World
新しいレポートをアクティブ化したり、既存のレポートへの変更をアクティブ化したりしない限り、ユーザーには関係ありません。これは、他の開発者がプロジェクトで使用するオブジェクトで作業する可能性がある中央開発環境では重要です。
既存のコードの表示
フィールドプログラムを確認し、値ZHELLO1をダブルクリックすると、ABAPエディタにレポートのコードが表示されます。これはフォワードナビゲーションと呼ばれます。オブジェクトの名前をダブルクリックすると、適切なツールでそのオブジェクトが開きます。
SAP ABAPを理解するには、ログイン、ABAPエディタ、ログアウトなどの画面に関する基本的な知識が必要です。この章では、画面ナビゲーションと標準のツールバー機能に焦点を当てます。
ログイン画面
SAPサーバーにログオンすると、SAPログイン画面でユーザーIDとパスワードの入力を求められます。有効なユーザーIDとパスワードを入力してEnterキーを押す必要があります(ユーザーIDとパスワードはシステム管理者によって提供されます)。ログイン画面は以下のとおりです。
ツールバーアイコン
以下は、SAP画面のツールバーです。
Menu Bar −メニューバーはダイアログウィンドウの最上行です。
Standard Toolbar −このツールバーでは、Top of Page、End of Page、Page Up、Page Down、Saveなどのほとんどの標準機能を使用できます。
Title Bar −タイトルバーには、現在使用しているアプリケーション/ビジネスプロセスの名前が表示されます。
Application Toolbar −アプリケーション固有のメニューオプションはここから入手できます。
Command Field−メニュートランザクションをナビゲートせずにアプリケーションを起動でき、一部の論理コードがビジネスプロセスに割り当てられます。トランザクションコードをコマンドフィールドに入力して、アプリケーションを直接起動します。
ABAPエディタ
トランザクションSE38を開始して(コマンド項目にSE38と入力)、ABAPエディタにナビゲートすることができます。
標準のキーとアイコン
Exit keysプログラム/モジュールを終了するか、ログオフするために使用されます。また、最後にアクセスした画面に戻るためにも使用されます。
以下は、画像に示されているSAPで使用される標準の終了キーです。
レポートを確認、アクティブ化、および処理するためのオプションは次のとおりです。
ログオフ
作業が終了したら、ABAPエディタを終了するか、SAPシステムからログオフすることをお勧めします。
ステートメント
ABAPソースプログラムは、コメントとABAPステートメントで構成されています。ABAPのすべてのステートメントはキーワードで始まり、ピリオドで終わります。ABAPでは大文字と小文字は区別されません。
プログラムの最初の非コメント行は、REPORTという単語で始まります。レポートは常に、作成された実行可能プログラムの最初の行になります。ステートメントの後には、以前に作成されたプログラム名が続きます。その後、回線は終止符で終了します。
構文は-
REPORT [Program_Name].
[Statements…].
これにより、ステートメントはエディター内で必要な数の行を占めることができます。たとえば、REPORTは次のようになります-
REPORT Z_Test123_01.
ステートメントは、コマンドと、ピリオドで終わる変数およびオプションで構成されます。ステートメントの最後にピリオドが表示されている限り、問題は発生しません。ステートメントが終了するのはこの期間です。
コードを書いてみましょう。
REPORTステートメントの下の行に、次のステートメントを入力するだけです。「ABAPチュートリアル」と記述します。
REPORT Z_Test123_01.
Write 'This is ABAP Tutorial'.
Four things to consider while writing statements −
writeステートメントは、引用符で囲まれているものをすべて出力ウィンドウに書き込みます。
ABAPエディタは、一重引用符で囲まれたテキスト文字列を除いて、すべてのテキストを大文字に変換します。
一部の古いプログラミング言語とは異なり、ABAPはステートメントが行のどこから始まるかを気にしません。これを利用して、インデントを使用してコードのブロックを示すことにより、プログラムの可読性を向上させることができます。
ABAPには、ステートメントのレイアウトに関する制限はありません。つまり、複数のステートメントを1行に配置したり、1つのステートメントを複数行にまたがったりすることができます。
コロン表記
各ステートメントの先頭が同一である場合、連続するステートメントをチェーン化できます。これは、ピリオドが通常のステートメントを終了するのと同じように、個々のステートメントを終了するために使用されるコロン(:)演算子とコンマを使用して行われます。
以下は、いくつかのキーストロークを節約できるプログラムの例です-
WRITE 'Hello'.
WRITE 'ABAP'.
WRITE 'World'.
コロン表記を使用すると、次のように書き直すことができます-
WRITE: 'Hello',
'ABAP',
'World'.
他のABAPステートメントと同様に、レイアウトは重要ではありません。これは同様に正しいステートメントです-
WRITE: 'Hello', 'ABAP', 'World'.
コメント
インラインコメントは、2つの方法のいずれかによってプログラムのどこにでも宣言できます-
全行コメントは、行の最初の位置にアスタリスク(*)を置くことによって示されます。この場合、システムは行全体をコメントと見なします。コメントは複数行にまたがることができないため、ピリオドで終了する必要はありません-
* This is the comment line
部分行コメントは、ステートメントの後に二重引用符( ")を入力することで示されます。二重引用符に続くすべてのテキストは、システムによってコメントと見なされます。部分行コメントは、それ以上拡張されない可能性があるため、ピリオドで終了する必要はありません。 1行より-
WRITE 'Hello'. "Here is the partial comment
Note −コメント化されたコードはABAPエディタによって大文字にされません。
ブランクの抑制
NO-ZEROコマンドは、DATAステートメントの後に続きます。ブランクを含む数値フィールドの先行ゼロをすべて抑制します。通常、出力はユーザーにとって読みやすいものです。
例
REPORT Z_Test123_01.
DATA: W_NUR(10) TYPE N.
MOVE 50 TO W_NUR.
WRITE W_NUR NO-ZERO.
上記のコードは次の出力を生成します-
50
Note − NO-ZEROコマンドがない場合、出力は次のようになります。0000000050
空白行
SKIPコマンドは、ページに空白行を挿入するのに役立ちます。
例
メッセージコマンドは次のとおりです-
WRITE 'This is the 1st line'.
SKIP.
WRITE 'This is the 2nd line'.
上記のメッセージコマンドは、次の出力を生成します-
This is the 1st line
This is the 2nd line
SKIPコマンドを使用して、複数の空白行を挿入する場合があります。
SKIP number_of_lines.
出力は、行数で定義されたいくつかの空白行になります。SKIPコマンドは、ページ上の目的の行にカーソルを置くこともできます。
SKIP TO LINE line_number.
このコマンドは、カーソルをページの上下に動的に移動するために使用されます。通常、このコマンドの後にWRITEステートメントを実行して、目的の行に出力を配置します。
行の挿入
ULINEコマンドは、出力全体に水平線を自動的に挿入します。線の位置と長さを制御することも可能です。構文は非常に単純です-
ULINE.
例
メッセージコマンドは次のとおりです-
WRITE 'This is Underlined'.
ULINE.
上記のコードは次の出力を生成します-
This is Underlined (and a horizontal line below this).
メッセージ
MESSAGEコマンドは、プログラムの開始時にREPORTステートメントで指定されたメッセージIDによって定義されたメッセージを表示します。メッセージIDは、MESSAGEコマンドが使用されたときにプログラムがアクセスする1,000個のメッセージのセットを定義する2文字のコードです。
メッセージには000から999までの番号が付けられています。各番号には、最大80文字までのメッセージテキストが関連付けられています。メッセージ番号が呼び出されると、対応するテキストが表示されます。
メッセージコマンドで使用する文字は次のとおりです-
メッセージ | タイプ | 結果 |
---|---|---|
E | エラー | メッセージが表示され、アプリケーションは現在の時点で停止します。プログラムがバックグラウンドモードで実行されている場合、ジョブはキャンセルされ、メッセージはジョブログに記録されます。 |
W | 警告 | メッセージが表示され、アプリケーションを続行するには、ユーザーはEnterキーを押す必要があります。バックグラウンドモードでは、メッセージはジョブログに記録されます。 |
私 | 情報 | ポップアップウィンドウが開き、メッセージテキストが表示されます。続行するには、Enterキーを押す必要があります。バックグラウンドモードでは、メッセージはジョブログに記録されます。 |
A | 異常終了 | このメッセージクラスは、ユーザーが現在使用しているトランザクションをキャンセルします。 |
S | 成功 | これにより、画面の下部に情報メッセージが表示されます。表示される情報は本質的に肯定的なものであり、ユーザーからのフィードバックを目的としています。このメッセージは、プログラムを妨げるものではありません。 |
バツ | アボート | このメッセージはプログラムを中止し、ABAPショートダンプを生成します。 |
エラーメッセージは通常、ユーザーが想定外のことを実行できないようにするために使用されます。警告メッセージは通常、ユーザーの行動の結果をユーザーに思い出させるために使用されます。情報メッセージは、ユーザーに役立つ情報を提供します。
例
ID ABのメッセージのメッセージを作成すると、MESSAGEコマンド-MESSAGEE011は次の出力を返します-
EAB011 This report does not support sub-number summarization.
ABAPでプログラミングする場合、さまざまな情報を格納するためにさまざまな変数を使用する必要があります。変数は、値を格納するために予約されたメモリ位置に他なりません。これは、変数を作成するときに、メモリにいくらかのスペースを予約することを意味します。文字、整数、浮動小数点などのさまざまなデータ型の情報を格納したい場合があります。変数のデータ型に基づいて、オペレーティングシステムはメモリを割り当て、予約済みメモリに格納できるものを決定します。
基本データ型
ABAPは、プログラマーに固定長および可変長のデータ型の豊富な品揃えを提供します。次の表に、ABAP基本データタイプを示します。
タイプ | キーワード |
---|---|
バイトフィールド | バツ |
テキストフィールド | C |
整数 | 私 |
浮動小数点 | F |
パック数 | P |
テキスト文字列 | ストリング |
一部のフィールドと番号は、次のように1つ以上の名前を使用して変更できます。
- byte
- numeric
- character-like
次の表は、データ型、メモリに値を格納するために必要なメモリ量、およびそのようなタイプの変数に格納できる最小値と最大値を示しています。
タイプ | 典型的な長さ | 典型的な範囲 |
---|---|---|
バツ | 1バイト | 任意のバイト値(00からFF) |
C | 1文字 | 1〜65535 |
N(提出された数値テキスト) | 1文字 | 1〜65535 |
D(文字のような日付) | 8文字 | 8文字 |
T(文字のような時間) | 6文字 | 6文字 |
私 | 4バイト | -2147483648から2147483647 |
F | 8バイト | 2.2250738585072014E-308〜1.7976931348623157E +308正または負 |
P | 8バイト | [-10 ^(2len -1)+1]から[+10 ^(2len -1)1](ここで、len =固定長) |
ストリング | 変数 | 英数字 |
XSTRING(バイト文字列) | 変数 | 任意のバイト値(00からFF) |
例
REPORT YR_SEP_12.
DATA text_line TYPE C LENGTH 40.
text_line = 'A Chapter on Data Types'.
Write text_line.
DATA text_string TYPE STRING.
text_string = 'A Program in ABAP'.
Write / text_string.
DATA d_date TYPE D.
d_date = SY-DATUM.
Write / d_date.
この例では、事前定義された長さ40のタイプCの文字列があります。STRINGは、可変長の任意の文字列(テキスト文字列)に使用できるデータ型です。タイプSTRINGデータオブジェクトは、通常、固定長が重要ではない文字のようなコンテンツに使用する必要があります。
上記のコードは次の出力を生成します-
A Chapter on Data Types
A Program in ABAP
12092015
DATE型は、日付情報の格納に使用され、上記のように8桁を格納できます。
複合型と参照型
複合型は次のように分類されます Structure types そして Table types。構造タイプでは、基本タイプと構造(つまり、構造に埋め込まれた構造)がグループ化されます。基本タイプのグループ化のみを検討できます。ただし、構造体のネストが利用できることに注意する必要があります。
基本タイプをグループ化すると、データ項目にグループ化されたデータ項目としてアクセスしたり、個々の基本タイプのデータ項目(構造フィールド)にアクセスしたりできます。テーブルタイプは、他のプログラミング言語では配列としてよく知られています。Arrays単純配列または構造配列にすることができます。ABAPでは、配列は内部テーブルと呼ばれ、他のプログラミング言語と比較すると、さまざまな方法で宣言および操作できます。次の表は、内部テーブルが特徴付けられるパラメータを示しています。
S.No. | パラメータと説明 |
---|---|
1 | Line or row type 内部テーブルの行は、基本型、複合型、または参照型にすることができます。 |
2 | Key テーブルの行を識別する内部テーブルのキーとして、フィールドまたはフィールドのグループを指定します。キーには、基本タイプのフィールドが含まれています。 |
3 | Access method ABAPプログラムが個々のテーブルエントリにアクセスする方法について説明します。 |
参照型は、クラス、インターフェイス、および実行時データ項目のインスタンスを参照するために使用されます。ABAP OOP実行時型サービス(RTTS)を使用すると、実行時にデータ項目を宣言できます。
変数は、プログラムの割り当てられたメモリ領域内に値を格納するために使用される名前付きデータオブジェクトです。名前が示すように、ユーザーはABAPステートメントを使用して変数の内容を変更できます。ABAPの各変数には特定のタイプがあり、変数のメモリのサイズとレイアウトを決定します。そのメモリ内に保存できる値の範囲。変数に適用できる一連の操作。
使用する前に、すべての変数を宣言する必要があります。変数宣言の基本的な形式は次のとおりです。
DATA <f> TYPE <type> VALUE <val>.
ここで、<f>は変数の名前を指定します。変数の名前は最大30文字です。<type>は、変数のタイプを指定します。完全に指定された技術属性を持つデータ型は、<type>と呼ばれます。<val>は、<f>変数の初期値を指定します。基本固定長変数を定義する場合、DATAステートメントは変数の値にタイプ固有の初期値を自動的に入力します。<val>の他の可能な値は、リテラル、定数、またはIsINITIALなどの明示的な句です。
以下は、変数宣言の有効な例です。
DATA d1(2) TYPE C.
DATA d2 LIKE d1.
DATA minimum_value TYPE I VALUE 10.
上記のコードスニペットでは、d1はCタイプの変数、d2はd1タイプの変数、minimum_valueはABAP整数タイプIの変数です。
この章では、ABAPで使用可能なさまざまな変数タイプについて説明します。ABAPには3種類の変数があります-
- 静的変数
- 参照変数
- システム変数
静的変数
静的変数は、サブルーチン、汎用モジュール、および静的メソッドで宣言されます。
存続期間は、宣言のコンテキストにリンクされています。
'CLASS-DATA'ステートメントを使用すると、クラス内で変数を宣言できます。
'PARAMETERS'ステートメントを使用して、選択画面の入力フィールドにリンクされている基本データオブジェクトを宣言できます。
'SELECT-OPTIONS'ステートメントを使用して、選択画面の入力フィールドにリンクされている内部テーブルを宣言することもできます。
以下は、変数に名前を付けるときに使用される規則です。
「t」や「、」などの特殊文字を使用して変数に名前を付けることはできません。
事前定義されたデータオブジェクトの名前は変更できません。
変数の名前は、ABAPキーワードまたは句と同じにすることはできません。
変数の名前は、それ以上のコメントを必要とせずに、変数の意味を伝える必要があります。
ハイフンは、構造のコンポーネントを表すために予約されています。したがって、変数名にハイフンを使用しないようにする必要があります。
アンダースコア文字は、複合語を区切るために使用できます。
このプログラムは、PARAMETERSステートメントを使用して変数を宣言する方法を示しています-
REPORT ZTest123_01.
PARAMETERS: NAME(10) TYPE C,
CLASS TYPE I,
SCORE TYPE P DECIMALS 2,
CONNECT TYPE MARA-MATNR.
ここで、NAMEは10文字のパラメータを表し、CLASSはバイト単位のデフォルトサイズの整数型のパラメータを指定し、SCOREは小数点以下2桁までの値を持つパック型パラメータを表し、CONNECTはABAPディクショナリのMARA-MATNF型を参照します。 。
上記のコードは次の出力を生成します-
参照変数
参照変数を宣言するための構文は次のとおりです。
DATA <ref> TYPE REF TO <type> VALUE IS INITIAL.
REF TO加算は、参照変数refを宣言します。
REF TOの後の指定は、参照変数の静的タイプを指定します。
静的タイプは、<ref>が参照できるオブジェクトのセットを制限します。
参照変数の動的タイプは、現在参照しているデータ型またはクラスです。
静的型は常により一般的であるか、動的型と同じです。
TYPE加算は、バインドされた参照型を作成するために、開始値として使用され、VALUE加算の後に指定できるのはISINITIALのみです。
例
CLASS C1 DEFINITION.
PUBLIC SECTION.
DATA Bl TYPE I VALUE 1.
ENDCLASS. DATA: Oref TYPE REF TO C1 ,
Dref1 LIKE REF TO Oref,
Dref2 TYPE REF TO I .
CREATE OBJECT Oref.
GET REFERENCE OF Oref INTO Dref1.
CREATE DATA Dref2.
Dref2→* = Dref1→*→Bl.
上記のコードスニペットでは、オブジェクト参照Orefと2つのデータ参照変数Dref1およびDref2が宣言されています。
両方のデータ参照変数は完全に型指定されており、オペランド位置で逆参照演算子→*を使用して逆参照できます。
システム変数
ABAPシステム変数には、すべてのABAPプログラムからアクセスできます。
これらのフィールドは、実際にはランタイム環境によって入力されます。
これらのフィールドの値は、任意の時点でのシステムの状態を示します。
システム変数の完全なリストは、SAPのSYSTテーブルにあります。
SYST構造体の個々のフィールドには、「SYST-」または「SY-」のいずれかを使用してアクセスできます。
例
REPORT Z_Test123_01.
WRITE:/'SY-ABCDE', SY-ABCDE,
/'SY-DATUM', SY-DATUM,
/'SY-DBSYS', SY-DBSYS,
/'SY-HOST ', SY-HOST,
/'SY-LANGU', SY-LANGU,
/'SY-MANDT', SY-MANDT,
/'SY-OPSYS', SY-OPSYS,
/'SY-SAPRL', SY-SAPRL,
/'SY-SYSID', SY-SYSID,
/'SY-TCODE', SY-TCODE,
/'SY-UNAME', SY-UNAME,
/'SY-UZEIT', SY-UZEIT.
上記のコードは次の出力を生成します-
SY-ABCDE ABCDEFGHIJKLMNOPQRSTUVWXYZ
SY-DATUM 12.09.2015
SY-DBSYS ORACLE
SY-HOST sapserver
SY-LANGU EN
SY-MANDT 800
SY-OPSYS Windows NT
SY-SAPRL 700
SY-SYSID DMO
SY-TCODE SE38
SY-UNAME SAPUSER
SY-UZEIT 14:25:48
リテラルは、プログラムのソースコード内で作成する名前のないデータオブジェクトです。それらはそれらの値によって完全に定義されます。リテラルの値を変更することはできません。定数は、宣言型ステートメントを使用して静的に作成された名前付きデータオブジェクトです。定数は、プログラムのメモリ領域に格納されている値を割り当てることによって宣言されます。定数に割り当てられた値は、プログラムの実行中に変更することはできません。これらの固定値は、リテラルと見なすこともできます。リテラルには、数値と文字の2種類があります。
数値リテラル
数値リテラルは、接頭辞付きの記号を付けることができる一連の数字です。数値リテラルには、小数点の区切り文字や仮数と指数の表記はありません。
以下は、数値リテラルのいくつかの例です-
183.
-97.
+326.
文字リテラル
文字リテラルは、単一引用符で囲まれたABAPプログラムのソースコード内の英数字のシーケンスです。引用符で囲まれた文字リテラルには、事前定義されたABAPタイプCがあり、テキストフィールドリテラルとして記述されます。「逆引用符」で囲まれたリテラルは、ABAPタイプSTRINGであり、文字列リテラルとして記述されます。フィールド長は文字数によって定義されます。
Note −テキストフィールドリテラルでは、末尾の空白は無視されますが、文字列リテラルではそれらが考慮されます。
以下は、文字リテラルの例です。
テキストフィールドリテラル
REPORT YR_SEP_12.
Write 'Tutorials Point'.
Write / 'ABAP Tutorial'.
文字列フィールドリテラル
REPORT YR_SEP_12.
Write `Tutorials Point `.
Write / `ABAP Tutorial `.
上記の両方の場合で出力は同じです-
Tutorials Point
ABAP Tutorial
Note−定数の値を変更しようとすると、構文エラーまたは実行時エラーが発生する可能性があります。クラスまたはインターフェースの宣言部分で宣言する定数は、そのクラスまたはインターフェースの静的属性に属します。
CONSTANTSステートメント
CONSTANTSステートメントを使用して、名前付きデータオブジェクトを宣言できます。
以下は構文です-
CONSTANTS <f> TYPE <type> VALUE <val>.
CONSTANTSステートメントはDATAステートメントに似ています。
<f>は、定数の名前を指定します。TYPE <type>は、既存のデータ型<type>と同じ技術属性を継承する<f>という名前の定数を表します。VALUE <val>は、宣言された定数名<f>に初期値を割り当てます。
Note−CONSTANTSステートメントでVALUE句を使用する必要があります。句「VALUE」は、宣言中に定数に初期値を割り当てるために使用されます。
基本定数、複素定数、参照定数の3種類の定数があります。次のステートメントは、CONSTANTSステートメントを使用して定数を定義する方法を示しています。
REPORT YR_SEP_12.
CONSTANTS PQR TYPE P DECIMALS 4 VALUE '1.2356'.
Write: / 'The value of PQR is:', PQR.
出力は-
The value of PQR is: 1.2356
ここでは、基本データ型を指し、基本定数と呼ばれます。
以下は、複素定数の例です-
BEGIN OF EMPLOYEE,
Name(25) TYPE C VALUE 'Management Team',
Organization(40) TYPE C VALUE 'Tutorials Point Ltd',
Place(10) TYPE C VALUE 'India',
END OF EMPLOYEE.
上記のコードスニペットでは、EMPLOYEEは、Name、Organization、Placeフィールドで構成される複雑な定数です。
次のステートメントは、定数参照を宣言します-
CONSTANTS null_pointer TYPE REF TO object VALUE IS INITIAL.
比較に定数参照を使用することも、プロシージャに渡すこともできます。
ABAPは、変数を操作するための豊富な演算子セットを提供します。すべてのABAPオペレーターは、4つのカテゴリーに分類されます-
- 算術演算子
- 比較演算子
- ビット演算子
- 文字列演算子
算術演算子
算術演算子は、代数で使用されるのと同じ方法で数式で使用されます。次のリストは、算術演算子について説明しています。整数変数Aが20を保持し、変数Bが40を保持するとします。
S.No. | 算術演算子と説明 |
---|---|
1 | + (Addition) 演算子のいずれかの側に値を追加します。例:A + Bは60になります。 |
2 | − (Subtraction) 左側のオペランドから右側のオペランドを減算します。例:A −Bは-20を与えます。 |
3 | * (Multiplication) 演算子のいずれかの側で値を乗算します。例:A * Bは800になります。 |
4 | / (Division) 左側のオペランドを右側のオペランドで除算します。例:B / Aは2を与えます。 |
5 | MOD (Modulus) 左側のオペランドを右側のオペランドで除算し、余りを返します。例:B MODAは0を返します。 |
例
REPORT YS_SEP_08.
DATA: A TYPE I VALUE 150,
B TYPE I VALUE 50,
Result TYPE I.
Result = A / B.
WRITE / Result.
上記のコードは次の出力を生成します-
3
比較演算子
さまざまなオペランドのさまざまなタイプの比較演算子について説明しましょう。
S.No. | 比較演算子と説明 |
---|---|
1 | = (equality test). Alternate form is EQ. 2つのオペランドの値が等しいかどうかをチェックし、等しい場合は条件が真になります。例(A = B)は正しくありません。 |
2 | <> (Inequality test). Alternate form is NE. 2つのオペランドの値が等しいかどうかをチェックします。値が等しくない場合、条件は真になります。例(A <> B)は真です。 |
3 | > (Greater than test). Alternate form is GT. 左のオペランドの値が右のオペランドの値より大きいかどうかを確認します。はいの場合、条件は真になります。例(A> B)は正しくありません。 |
4 | < (Less than test). Alternate form is LT. 左のオペランドの値が右のオペランドの値よりも小さいかどうかを確認します。はいの場合、条件は真になります。例(A <B)は真です。 |
5 | >= (Greater than or equals) Alternate form is GE. 左のオペランドの値が右のオペランドの値以上であるかどうかを確認します。はいの場合、条件は真になります。例(A> = B)は正しくありません。 |
6 | <= (Less than or equals test). Alternate form is LE. 左オペランドの値が右オペランドの値以下かどうかをチェックします。はいの場合、条件は真になります。例(A <= B)は真です。 |
7 | a1 BETWEEN a2 AND a3 (Interval test) a1がa2とa3(両端を含む)の間にあるかどうかを確認します。はいの場合、条件は真になります。例(A BETWEEN B AND C)は真です。 |
8 | IS INITIAL 変数の内容が変更されておらず、初期値が自動的に割り当てられている場合、条件は真になります。例(A IS INITIAL)が正しくない |
9 | IS NOT INITIAL 変数の内容が変更された場合、条件は真になります。例(A IS NOT INITIAL)は真です。 |
Note−変数のデータ型または長さが一致しない場合、自動変換が実行されます。異なるデータ型の2つの値を比較しながら、一方または両方の値に対して自動型調整が実行されます。変換タイプは、データタイプとデータタイプの優先順位によって決定されます。
以下は優先順位です-
一方のフィールドがタイプIの場合、もう一方はタイプIに変換されます。
一方のフィールドがタイプPの場合、もう一方はタイプPに変換されます。
一方のフィールドがタイプDの場合、もう一方はタイプDに変換されます。ただし、CタイプとNタイプは変換されず、直接比較されます。タイプTの場合も同様です。
一方のフィールドがタイプNで、もう一方のフィールドがタイプCまたはXの場合、両方のフィールドがタイプPに変換されます。
一方のフィールドがタイプCで、もう一方のフィールドがタイプXの場合、XタイプはタイプCに変換されます。
例1
REPORT YS_SEP_08.
DATA: A TYPE I VALUE 115,
B TYPE I VALUE 119.
IF A LT B.
WRITE: / 'A is less than B'.
ENDIF
上記のコードは次の出力を生成します-
A is less than B
例2
REPORT YS_SEP_08.
DATA: A TYPE I.
IF A IS INITIAL.
WRITE: / 'A is assigned'.
ENDIF.
上記のコードは次の出力を生成します-
A is assigned.
ビット演算子
ABAPは、ブール代数式の作成に使用できる一連のビット単位の論理演算子も提供します。ビット単位の演算子は、括弧などを使用して複雑な式に組み合わせることができます。
S.No. | ビット単位の演算子と説明 |
---|---|
1 | BIT-NOT 16進数のすべてのビットを反対の値に反転する単項演算子。たとえば、この演算子をビットレベル値10101010(たとえば「AA」)の16進数に適用すると、01010101が得られます。 |
2 | BIT-AND この二項演算子は、ブールAND演算子を使用して各フィールドをビットごとに比較します。 |
3 | BIT-XOR ブールXOR(排他的論理和)演算子を使用して各フィールドをビットごとに比較する二項演算子。 |
4 | BIT-OR ブールOR演算子を使用して各フィールドをビットごとに比較する二項演算子。 |
たとえば、以下は、フィールドAとフィールドBに含まれる2つのビット値に対してブールAND、OR、またはXOR演算子を適用したときに生成される値を示す真理値表です。
フィールドA | フィールドB | そして | または | XOR |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
文字列演算子
以下は文字列演算子のリストです-
S.No. | 文字列演算子と説明 |
---|---|
1 | CO (Contains Only) AがBの文字だけで構成されているかどうかを確認します。 |
2 | CN (Not Contains ONLY) AにBにない文字が含まれているかどうかを確認します。 |
3 | CA (Contains ANY) AにBの文字が少なくとも1つ含まれているかどうかを確認します。 |
4 | NA (NOT Contains Any) AにBの文字が含まれていないかどうかを確認します。 |
5 | CS (Contains a String) Aに文字列Bが含まれているかどうかを確認します。 |
6 | NS (NOT Contains a String) Aに文字列Bが含まれていないか確認します。 |
7 | CP (Contains a Pattern) AにBのパターンが含まれているかどうかをチェックします。 |
8 | NP (NOT Contains a Pattern) AにBのパターンが含まれていないかどうかをチェックします。 |
例
REPORT YS_SEP_08.
DATA: P(10) TYPE C VALUE 'APPLE',
Q(10) TYPE C VALUE 'CHAIR'.
IF P CA Q.
WRITE: / 'P contains at least one character of Q'.
ENDIF.
上記のコードは次の出力を生成します-
P contains at least one character of Q.
コードのブロックを数回実行する必要がある場合があります。一般に、ステートメントは順番に実行されます。関数の最初のステートメントが最初に実行され、次に2番目のステートメントが実行されます。
プログラミング言語は、より複雑な実行パスを可能にするさまざまな制御構造を提供します。Aloop statement ステートメントまたはステートメントのグループを複数回実行できます。以下は、ほとんどのプログラミング言語でのループステートメントの一般的な形式です。
ABAPプログラミング言語は、ループ要件を処理するために次のタイプのループを提供します。
S.No. | ループの種類と説明 |
---|---|
1 | WHILEループ 指定された条件が真の場合、ステートメントまたはステートメントのグループを繰り返します。ループ本体を実行する前に条件をテストします。 |
2 | ループする DOステートメントは、特定のタスクを特定の回数繰り返す場合に役立ちます。 |
3 | ネストされたループ 別のWHILEまたはDOループ内で1つ以上のループを使用できます。 |
ループ制御ステートメント
ループ制御ステートメントは、実行を通常のシーケンスから変更します。ABAPには、ループを途中で終了できるようにする制御ステートメントが含まれています。以下の制御ステートメントをサポートします。
S.No. | 制御ステートメントと説明 |
---|---|
1 | 継続する ループに本体の残りをスキップさせ、次のループパスを開始します。 |
2 | 小切手 条件がfalseの場合、CHECKの後の残りのステートメントは無視され、システムは次のループパスを開始します。 |
3 | 出口 ループを完全に終了し、ループの直後のステートメントに実行を転送します。 |
意思決定構造には、プログラムによって評価またはテストされる1つ以上の条件と、条件が真であると判断された場合に実行される1つまたは複数のステートメント、およびオプションで、条件が真である場合に実行される他のステートメントがあります。 falseと判断されます。
以下は、ほとんどのプログラミング言語に見られる典型的な意思決定構造の一般的な形式です。
ABAPプログラミング言語は、以下のタイプの意思決定ステートメントを提供します。
S.No. | ステートメントと説明 |
---|---|
1 | IFステートメント IFステートメントは、論理式とそれに続く1つ以上のステートメントで構成されます。 |
2 | IF ..その他のステートメント IFステートメントの後には、式がfalseの場合に実行されるオプションのELSEステートメントを続けることができます。 |
3 | ネストされたIFステートメント 1つのIFまたはELSEIFステートメントを別のIFまたはELSEIFステートメント内で使用できます。 |
4 | CASEコントロールステートメント CASEステートメントは、2つ以上のフィールドまたは変数を比較する必要がある場合に使用されます。 |
StringsABAPプログラミングで広く使用されている、は文字のシーケンスです。
最小1文字、最大65,535文字の英数字を保持するために、データ型C変数を使用します。デフォルトでは、これらは左揃えになっています。
文字列の作成
次の宣言と初期化により、「Hello」という単語で構成される文字列が作成されます。文字列のサイズは、「Hello」という単語の文字数とまったく同じです。
Data my_Char(5) VALUE 'Hello'.
次のプログラムは、文字列の作成例です。
REPORT YT_SEP_15.
DATA my_Char(5) VALUE 'Hello'.
Write my_Char.
上記のコードは次の出力を生成します-
Hello
文字列の長さ
文字列の長さを見つけるために、 STRLEN statement。STRLEN()関数は、文字列に含まれる文字数を返します。
例
REPORT YT_SEP_15.
DATA: title_1(10) VALUE 'Tutorials',
length_1 TYPE I.
length_1 = STRLEN( title_1 ).
Write: / 'The Length of the Title is:', length_1.
上記のコードは次の出力を生成します-
The Length of the Title is: 9
ABAPは、文字列を操作するさまざまなステートメントをサポートしています。
S.No. | ステートメントと目的 |
---|---|
1 | CONCATENATE 2つのストリングが結合されて、3番目のストリングが形成されます。 |
2 | CONDENSE このステートメントは、スペース文字を削除します。 |
3 | STRLEN フィールドの長さを見つけるために使用されます。 |
4 | REPLACE 文字の置換に使用されます。 |
5 | SEARCH 文字列で検索を実行します。 |
6 | SHIFT 文字列の内容を左または右に移動するために使用されます。 |
7 | SPLIT フィールドの内容を2つ以上のフィールドに分割するために使用されます。 |
次の例では、上記のステートメントのいくつかを使用しています。
例
REPORT YT_SEP_15.
DATA: title_1(10) VALUE 'Tutorials',
title_2(10) VALUE 'Point',
spaced_title(30) VALUE 'Tutorials Point Limited',
sep,
dest1(30),
dest2(30).
CONCATENATE title_1 title_2 INTO dest1.
Write: / 'Concatenation:', dest1.
CONCATENATE title_1 title_2 INTO dest2 SEPARATED BY sep.
Write: / 'Concatenation with Space:', dest2.
CONDENSE spaced_title.
Write: / 'Condense with Gaps:', spaced_title.
CONDENSE spaced_title NO-GAPS.
Write: / 'Condense with No Gaps:', spaced_title.
上記のコードは次の出力を生成します-
Concatenation: TutorialsPoint
Concatenation with Space: Tutorials Point
Condense with Gaps: Tutorials Point Limited
Condense with No Gaps: TutorialsPointLimited
Note −
連結の場合、「sep」はフィールド間にスペースを挿入します。
CONDENSEステートメントは、フィールド間の空白スペースを削除しますが、1文字のスペースのみを残します。
'NO-GAPS'は、すべてのスペースを削除するCONDENSEステートメントへのオプションの追加です。
ABAPは、世界中のほとんどで有効なグレゴリオ暦を暗黙的に参照します。出力を国固有のカレンダーに変換できます。日付は、カレンダーに関して正確な日、週、または月に指定された時刻です。時間は、1日に対して正確な秒または分に指定されます。ABAPは、常に24時間形式で時間を節約します。出力は国固有の形式にすることができます。日付と時刻は通常、現在のタイムゾーンで有効なローカル日付として解釈されます。
ABAPには、日付と時刻を処理するための2つの組み込みタイプが用意されています-
- Dデータ型
- Tデータ型
以下は基本的なフォーマットです-
DATA: date TYPE D,
time TYPE T.
DATA: year TYPE I,
month TYPE I,
day TYPE I,
hour TYPE I,
minute TYPE I,
second TYPE I.
これらのタイプは両方とも、それぞれYYYYMMDDおよびHHMMSSの形式を持つ固定長の文字タイプです。
タイムスタンプ
これらの組み込みタイプに加えて、他の2つのタイプ TIMESTAMP そして TIMESTAMPLタイムスタンプをUTC形式で保存するために、多くの標準アプリケーションテーブルで使用されています。次の表は、ABAPで使用可能な基本的な日付と時刻のタイプを示しています。
S.No. | データ型と説明 |
---|---|
1 | D YYYYMMDD形式の組み込みの固定長日付型。たとえば、値20100913は、2010年9月13日の日付を表します。 |
2 | T HHMMSS形式の組み込みの固定長時間タイプ。たとえば、値102305は時刻10:23:05 AMを表します。 |
3 | TIMESTAMP (タイプP –長さ8小数点なし) このタイプは、YYYYMMDDhhmmss形式で短いタイムスタンプを表すために使用されます。たとえば、値20100913102305は、2010年9月13日の午前10:23:05の日付を表します。 |
4 | TIMESTAMPL (タイプP-長さ11小数7) TIMESTAMPLは、長いタイムスタンプをYYYYMMDDhhmmss、mmmuuun形式で表します。ここで、追加の数字「mmmuuun」は秒の端数を表します。 |
現在の日時
次のコードスニペットは、現在のシステムの日付と時刻を取得します。
REPORT YR_SEP_15.
DATA: date_1 TYPE D.
date_1 = SY-DATUM.
Write: / 'Present Date is:', date_1 DD/MM/YYYY.
date_1 = date_1 + 06.
Write: / 'Date after 6 Days is:', date_1 DD/MM/YYYY.
上記のコードは次の出力を生成します-
Present Date is: 21.09.2015
Date after 6 Days is: 27.09.2015
変数date_1には、現在のシステム日付SY-DATUMの値が割り当てられます。次に、日付値を6ずつインクリメントします。ABAPでの日付計算に関して、これは、日付オブジェクトの日コンポーネントを6日増やしていることを意味します。ABAPランタイム環境は、月末に達するたびに日付値をロールオーバーするのに十分スマートです。
時間の計算は、日付の計算と同様に機能します。次のコードは、基本的な時間演算を使用して、現在のシステム時間を75秒インクリメントします。
REPORT YR_SEP_15.
DATA: time_1 TYPE T.
time_1 = SY-UZEIT.
Write /(60) time_1 USING EDIT MASK
'Now the Time is: __:__:__'.
time_1 = time_1 + 75.
Write /(60) time_1 USING EDIT MASK
'A Minute and a Quarter from Now, it is: __:__:__'.
上記のコードは次の出力を生成します-
Now the Time is 11:45:05
A Minute and a Quarter from Now, it is: 11:46:20
タイムスタンプの操作
現在のシステム時刻を取得し、を使用してタイムスタンプ変数に格納できます。 GET TIME STAMP次のコードに示すように。GET TIME STAMPステートメントは、使用されるタイムスタンプデータオブジェクトのタイプに応じて、タイムスタンプをロングハンドまたはショートハンドの形式で格納します。タイムスタンプ値は、UTC標準を使用してエンコードされます。
REPORT YR_SEP_12.
DATA: stamp_1 TYPE TIMESTAMP,
stamp_2 TYPE TIMESTAMPL.
GET TIME STAMP FIELD stamp_1.
Write: / 'The short time stamp is:', stamp_1
TIME ZONE SY-ZONLO.
GET TIME STAMP FIELD stamp_2.
Write: / 'The long time stamp is:', stamp_2
TIME ZONE SY-ZONLO.
上記のコードは次の出力を生成します-
The short time stamp is: 18.09.2015 11:19:40
The long time stamp is: 18.09.2015 11:19:40,9370000
上記の例では、WRITEステートメントのTIMEZONE追加を使用してタイムスタンプを表示しています。この追加により、指定されたタイムゾーンのルールに従ってタイムスタンプの出力がフォーマットされます。システムフィールドSY-ZONLOは、ユーザーの設定で設定されたローカルタイムゾーンを表示するために使用されます。
ABAPには、プログラムの出力をフォーマットするためのさまざまなタイプのフォーマットオプションが用意されています。たとえば、さまざまな色や書式設定スタイルのさまざまなアイテムを含むリストを作成できます。
WRITEステートメントは、画面にデータを表示するために使用されるフォーマットステートメントです。WRITEステートメントにはさまざまなフォーマットオプションがあります。WRITEステートメントの構文は次のとおりです。
WRITE <format> <f> <options>.
この構文では、<format>は出力形式の仕様を表します。これは、改行から始まる出力の表示を示すスラッシュ(/)にすることができます。スラッシュに加えて、フォーマット仕様には列番号と列長が含まれます。たとえば、WRITE / 04(6)ステートメントは、新しい行が列4で始まり、列の長さが6であることを示していますが、WRITE 20ステートメントは、列20の現在の行を示しています。番号付きテキスト。
次の表は、フォーマットに使用されるさまざまな句について説明しています。
S.No. | 条項と説明 |
---|---|
1 | LEFT-JUSTIFIED 出力を左揃えにすることを指定します。 |
2 | CENTERED 出力が中央に配置されていることを示します。 |
3 | RIGHT-JUSTIFIED 出力が右寄せされることを指定します。 |
4 | UNDER <g> 出力はフィールド<g>のすぐ下から始まります。 |
5 | NO-GAP フィールド<f>の後の空白が拒否されることを指定します。 |
6 | USING EDIT MASK <m> フォーマットテンプレート<m>の仕様を示します。編集マスクなしの使用:これは、ABAPディクショナリで指定されたフォーマットテンプレートが非アクティブ化されることを指定します。 |
7 | NO-ZERO フィールドにゼロのみが含まれている場合、それらはブランクに置き換えられます。 |
以下は、数値型フィールドのフォーマットオプションです-
S.No. | 条項と説明 |
---|---|
1 | NO-SIGN 画面に先行記号を表示しないことを指定します。 |
2 | EXPONENT <e> タイプF(浮動小数点フィールド)で、指数が<e>で定義されることを指定します。 |
3 | ROUND <r> タイプPフィールド(パックされた数値データ型)は、最初に10 **(-r)で乗算され、次に整数値に丸められます。 |
4 | CURRENCY <c> TCURXデータベーステーブルに格納されている通貨<c>値に従ってフォーマットが行われることを示します。 |
5 | UNIT <u> タイプPのT006データベーステーブルで指定されている<u>単位に従って、小数点以下の桁数が固定されることを指定します。 |
6 | DECIMALS <d> 小数点以下の桁数<d>を表示する必要があることを指定します。 |
たとえば、次の表は、日付フィールドのさまざまなフォーマットオプションを示しています-
書式設定オプション | 例 |
---|---|
DD / MM / YY | 2015年1月13日 |
MM / DD / YY | 2015年1月13日 |
DD / MM / YYYY | 2015年1月13日 |
MM / DD / YYYY | 2015年1月13日 |
DDMMYY | 130115 |
MMDDYY | 011315 |
YYMMDD | 150113 |
ここで、DDは2桁の日付、MMは2桁の月、YYは2桁の年、YYYYは4桁の年を表します。
上記のフォーマットオプションのいくつかを実装するABAPコードの例を見てみましょう-
REPORT ZTest123_01.
DATA: n(9) TYPE C VALUE 'Tutorials',
m(5) TYPE C VALUE 'Point'.
WRITE: n, m.
WRITE: / n,
/ m UNDER n.
WRITE: / n NO-GAP, m.
DATA time TYPE T VALUE '112538'.
WRITE: / time,
/(8) time Using EDIT MASK '__:__:__'.
上記のコードは次の出力を生成します-
Tutorials Point
Tutorials
Point
TutorialsPoint
112538
11:25:38
アン exceptionプログラムの実行中に発生する問題です。例外が発生すると、プログラムの通常のフローが中断され、プログラムアプリケーションが異常終了します。これはお勧めできません。したがって、これらの例外を処理する必要があります。
例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。ABAP例外処理は、RAISE、TRY、CATCH、およびCLEANUPの3つのキーワードに基づいて構築されています。ブロックが例外を発生させると仮定すると、メソッドはTRYキーワードとCATCHキーワードの組み合わせを使用して例外をキャッチします。TRY-CATCHブロックは、例外を生成する可能性のあるコードの周囲に配置されます。以下は、TRY – CATCH −を使用するための構文です。
TRY.
Try Block <Code that raises an exception>
CATCH
Catch Block <exception handler M>
. . .
. . .
. . .
CATCH
Catch Block <exception handler R>
CLEANUP.
Cleanup block <to restore consistent state>
ENDTRY.
RAISE−例外が発生して、いくつかの例外的な状況が発生したことを示します。通常、例外ハンドラはエラーを修復するか、代替の解決策を見つけようとします。
TRY− TRYブロックには、例外が処理されるアプリケーションコーディングが含まれています。このステートメントブロックは順番に処理されます。これには、さらに制御構造と、プロシージャまたは他のABAPプログラムの呼び出しを含めることができます。その後に1つ以上のキャッチブロックが続きます。
CATCH−プログラムは、問題を処理したいプログラム内の場所で例外ハンドラーを使用して例外をキャッチします。CATCHキーワードは、例外のキャッチを示します。
CLEANUP− CLEANUPブロックのステートメントは、同じTRY-ENDTRYコンストラクトのハンドラーによってキャッチされないTRYブロックで例外が発生するたびに実行されます。CLEANUP句内で、システムはオブジェクトを一貫性のある状態に復元したり、外部リソースを解放したりできます。つまり、TRYブロックのコンテキストに対してクリーンアップ作業を実行できます。
例外の発生
例外は、メソッド、汎用モジュール、サブルーチンなどの任意の時点で発生する可能性があります。例外を発生させる方法は2つあります-
ABAPランタイムシステムによって発生した例外。
たとえば、Y = 1/0です。これにより、CX_SY_ZERODIVIDEタイプの実行時エラーが発生します。
プログラマーによって提起された例外。
例外オブジェクトの発生と作成を同時に行います。最初のシナリオにすでに存在する例外オブジェクトを使用して例外を発生させます。構文は次のとおりです。RAISEEXCEPTIONexep。
例外をキャッチする
ハンドラーは、例外をキャッチするために使用されます。
コードスニペットを見てみましょう-
DATA: result TYPE P LENGTH 8 DECIMALS 2,
exref TYPE REF TO CX_ROOT,
msgtxt TYPE STRING.
PARAMETERS: Num1 TYPE I, Num2 TYPE I.
TRY.
result = Num1 / Num2.
CATCH CX_SY_ZERODIVIDE INTO exref.
msgtxt = exref→GET_TEXT( ).
CATCH CX_SY_CONVERSION_NO_NUMBER INTO exref.
msgtxt = exref→GET_TEXT( ).
上記のコードスニペットでは、Num1をNum2で除算して、float型変数の結果を取得しようとしています。
2種類の例外が生成される可能性があります。
数値変換エラー。
ゼロ除算例外。ハンドラーは、CX_SY_CONVERSION_NO_NUMBER例外とCX_SY_ZERODIVIDE例外をキャッチします。ここでは、例外クラスのGET_TEXT()メソッドを使用して、例外の説明を取得します。
例外の属性
例外の5つの属性とメソッドは次のとおりです-
S.No. | 属性と説明 |
---|---|
1 | Textid 例外のさまざまなテキストを定義するために使用され、メソッドget_textの結果にも影響します。 |
2 | Previous この属性は、例外のチェーンを構築できるようにする元の例外を格納できます。 |
3 | get_text これにより、例外のシステム言語に従って、テキスト表現が文字列として返されます。 |
4 | get_longtext これにより、例外のテキスト表現の長いバリアントが文字列として返されます。 |
5 | get_source_position 例外が発生した場所に到達したプログラム名と行番号を示します。 |
例
REPORT ZExceptionsDemo.
PARAMETERS Num_1 TYPE I.
DATA res_1 TYPE P DECIMALS 2.
DATA orf_1 TYPE REF TO CX_ROOT.
DATA txt_1 TYPE STRING.
start-of-selection.
Write: / 'Square Root and Division with:', Num_1.
write: /.
TRY.
IF ABS( Num_1 ) > 150.
RAISE EXCEPTION TYPE CX_DEMO_ABS_TOO_LARGE.
ENDIF.
TRY.
res_1 = SQRT( Num_1 ).
Write: / 'Result of square root:', res_1.
res_1 = 1 / Num_1.
Write: / 'Result of division:', res_1.
CATCH CX_SY_ZERODIVIDE INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
CLEANUP.
CLEAR res_1.
ENDTRY.
CATCH CX_SY_ARITHMETIC_ERROR INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
CATCH CX_ROOT INTO orf_1.
txt_1 = orf_1→GET_TEXT( ).
ENDTRY.
IF NOT txt_1 IS INITIAL.
Write / txt_1.
ENDIF.
Write: / 'Final Result is:', res_1.
この例では、数値が150より大きい場合、例外CX_DEMO_ABS_TOO_LARGEが発生します。上記のコードは、数値160に対して次の出力を生成します。
Square Root and Division with: 160
The absolute value of number is too high
Final Result is: 0.00
ご存知のように、SQLは2つの部分に分けることができます-
- DML(データ操作言語)
- DDL(データ定義言語)
DML部分は、SELECT、INSERT、UPDATE、DELETEなどのクエリおよび更新コマンドで構成され、ABAPプログラムはSQLのDML部分を処理します。DDL部分は、CREATE TABLE、CREATE INDEX、DROP TABLE、ALTER TABLEなどのコマンドで構成され、ABAPDictionaryはSQLのDDL部分を処理します。
ABAPディクショナリは、データベースによって維持されるメタデータとともにSAPデータベースに存在するメタデータ(つまり、データに関するデータ)として表示することができます。ディクショナリは、データ定義を作成および管理し、テーブル、データ要素、ドメイン、ビュー、およびタイプを作成するために使用されます。
ABAPディクショナリの基本タイプ
ABAPディクショナリの基本的なタイプは次のとおりです。
Data elements データ型、長さ、場合によっては小数点以下の桁数を定義して、基本型を記述します。
Structures 任意のタイプを持つことができるコンポーネントで。
Table types 内部テーブルの構造を記述します。
ディクショナリ環境のさまざまなオブジェクトは、ABAPプログラムで参照することができます。辞書はグローバルエリアとして知られています。ディクショナリ内のオブジェクトはすべてのABAPプログラムに対してグローバルであり、ABAPプログラム内のデータは、これらのディクショナリグローバルオブジェクトを参照することによって宣言することができます。
ディクショナリはユーザ定義タイプの定義をサポートしており、これらのタイプはABAPプログラムで使用されます。また、テーブル、ビュー、インデックスなどのデータベースオブジェクトの構造も定義します。これらのオブジェクトは、オブジェクトがアクティブ化されると、ディクショナリ定義の基になるデータベースに自動的に作成されます。辞書には、検索ヘルプなどの編集ツールや、オブジェクトのロックなどのロックツールも用意されています。
辞書タスク
ABAPディクショナリは以下を実現します-
- データの整合性を強化します。
- 冗長性なしでデータ定義を管理します。
- 残りのABAP開発ワークベンチと緊密に統合します。
例
複雑なユーザー定義型は、辞書の3つの基本型から作成できます。顧客データは、次の画像に示すように、名前、住所、電話のコンポーネントを持つ構造「顧客」に保存されます。Nameは、コンポーネント、FirstnameおよびLastnameを持つ構造でもあります。これらのコンポーネントはどちらも、タイプがデータ要素によって定義されているため、基本的なものです。
コンポーネントのタイプAddressは、コンポーネントが構造でもある構造によって定義され、Telephoneコンポーネントは、顧客が複数の電話番号を持つことができるため、テーブルタイプによって定義されます。タイプはABAPプログラムで使用され、汎用モジュールのインタフェースパラメータのタイプを定義するためにも使用されます。
ABAPディクショナリでデータを定義するための3つの基本的なオブジェクトは、ドメイン、データ要素、およびテーブルです。ドメインは、フィールドタイプや長さなどのテーブルフィールドの技術的な定義に使用され、データ要素はセマンティック定義(簡単な説明)に使用されます。データ要素は、特定のビジネスコンテキストにおけるドメインの意味を記述します。これには、主に画面のフィールドヘルプとフィールドラベルが含まれています。
ドメインはデータ要素に割り当てられ、データ要素はテーブルフィールドまたは構造フィールドに割り当てられます。たとえば、MATNRドメイン(CHARマテリアル番号)は、MATNR_N、MATNN、MATNR_Dなどのデータ要素に割り当てられ、これらは多くのテーブルフィールドと構造フィールドに割り当てられます。
ドメインの作成
新しいドメインを作成する前に、既存のドメインのテーブルフィールドに必要な技術仕様が同じであるかどうかを確認してください。もしそうなら、私たちはその既存のドメインを使用することになっています。ドメインを作成する手順について説明しましょう。
Step 1 −トランザクションSE11に進みます。
Step 2− ABAPディクショナリの第一画面でドメインのラジオボタンを選択し、次のスクリーンショットに示すようにドメインの名前を入力します。[作成]ボタンをクリックします。顧客の名前空間の下にドメインを作成することができ、オブジェクトの名前は常に「Z」または「Y」で始まります。
Step 3−ドメインのメンテナンス画面の短いテキストフィールドに説明を入力します。この場合、それは「顧客ドメイン」です。Note −この属性を入力するまで、他の属性を入力することはできません。
Step 4− [定義]タブの[フォーマット]ブロックに、データ型、文字数、小数点以下の桁数を入力します。出力長のキーを押すと、出力長が提案されて表示されます。提案された出力長を上書きすると、ドメインのアクティブ化中に警告が表示される場合があります。コンバースに記入することができます。必要に応じて、[ルーチン]、[署名]、および[小文字]フィールド。ただし、これらは常にオプションの属性です。
Step 5− [値の範囲]タブを選択します。ドメインが固定値のみを持つように制限されている場合は、固定値または間隔を入力します。このドメインを参照するフィールドの外部キーを定義するときに、システムがこのテーブルをチェックテーブルとして提案する必要がある場合は、値テーブルを定義します。ただし、これらはすべてオプションの属性です。
Step 6−変更を保存します。[オブジェクトディレクトリエントリの作成]ポップアップが表示され、パッケージを要求します。作業しているパッケージ名を入力できます。パッケージがない場合は、オブジェクトナビゲータで作成するか、[ローカルオブジェクト]ボタンを使用してドメインを保存できます。
Step 7−ドメインをアクティブ化します。[アクティブ化]アイコン(マッチ棒アイコン)をクリックするか、CTRL + F3を押してドメインをアクティブ化します。次のスナップショットに示すように、現在非アクティブな2つのオブジェクトを一覧表示するポップアップウィンドウが表示されます。
Step 8−この時点で、ZSEP_18という名前の「DOMA」というラベルの付いた最上位エントリが有効化されます。これが強調表示されているので、緑色のチェックマークボタンをクリックします。このウィンドウが消え、ステータスバーに「オブジェクトがアクティブ化されました」というメッセージが表示されます。
ドメインをアクティブ化したときにエラーメッセージまたは警告が発生した場合、アクティブ化ログが自動的に表示されます。アクティベーションログには、アクティベーションフローに関する情報が表示されます。ユーティリティ(M)→アクティベーションログを使用してアクティベーションログを呼び出すこともできます。
データ要素は、ABAPデータディクショナリの個々のフィールドを記述します。これらは、複合型の最小の分割できない単位であり、テーブルフィールドのタイプ、構造コンポーネント、またはテーブルの行タイプを定義するために使用されます。テーブルフィールドの意味に関する情報、および対応する画面フィールドの編集に関する情報をデータ要素に割り当てることができます。この情報は、データ要素を参照するすべての画面フィールドで自動的に利用できます。データ要素は、基本型または参照型のいずれかを記述します。
データ要素の作成
新しいデータ要素を作成する前に、既存のデータ要素がテーブルフィールドで必要とされるのと同じセマンティック仕様を持っているかどうかを確認する必要があります。その場合は、その既存のデータ要素を使用できます。事前定義されたタイプ、ドメイン、または参照タイプを使用してデータ要素を割り当てることができます。
データ要素を作成する手順は次のとおりです-
Step 1 −トランザクションSE11に進みます。
Step 2 − ABAPディクショナリの第一画面でデータタイプのラジオボタンを選択し、以下に示すようにデータエレメントの名称を入力します。
Step 3− [作成]ボタンをクリックします。顧客の名前空間の下にデータ要素を作成することができ、オブジェクトの名前は常に「Z」または「Y」で始まります。
Step 4 −3つのラジオボタンとともに表示されるCREATETYPEポップアップの[データ要素]ラジオボタンを確認します。
Step 5−緑色のチェックマークアイコンをクリックします。データエレメントの更新画面が表示されます。
Step 6−データエレメントの更新画面のショートテキスト項目に説明を入力します。この場合、それは「顧客データ要素」です。Note −この属性を入力するまで、他の属性を入力することはできません。
Step 7−データ要素にタイプを割り当てます。基本タイプをチェックして基本データ要素を作成するか、参照タイプをチェックして参照データ要素を作成できます。エレメンタリタイプ内のドメインまたは事前定義タイプに、参照タイプの名前または参照タイプ内の事前定義タイプへの参照を使用して、データ要素を割り当てることができます。
Step 8− [フィールドラベル]タブに、ショートテキスト、ミディアムテキスト、ロングテキスト、および見出しのフィールドを入力します。Enterキーを押すと、これらのラベルの長さが自動的に生成されます。
Step 9−変更を保存します。[オブジェクトディレクトリエントリの作成]ポップアップが表示され、パッケージを要求します。作業しているパッケージ名を入力できます。パッケージがない場合は、オブジェクトナビゲータで作成するか、[ローカルオブジェクト]ボタンを使用してデータ要素を保存できます。
Step 10−データ要素を有効化します。[アクティブ化]アイコン(マッチ棒アイコン)をクリックするか、CTRL + F3を押してデータ要素をアクティブ化します。次のスクリーンショットに示すように、現在非アクティブな2つのオブジェクトを一覧表示するポップアップウィンドウが表示されます。
Step 11−この時点で、Z_CUSTという名前の「DTEL」というラベルの付いた最上位エントリが有効化されます。これが強調表示されているので、緑色のチェックマークボタンをクリックします。このウィンドウが消え、ステータスバーに「オブジェクトがアクティブ化されました」というメッセージが表示されます。
データエレメントを有効化したときにエラーメッセージまたは警告が発生した場合、有効化ログが自動的に表示されます。アクティベーションログには、アクティベーションフローに関する情報が表示されます。ユーティリティ(M)→アクティベーションログを使用してアクティベーションログを呼び出すこともできます。
テーブルは、ABAPディクショナリのデータベースとは独立して定義することができます。テーブルがABAPディクショナリで有効化されると、その項目の同様のコピーがデータベースにも作成されます。テーブルの定義はSAPシステムで使用されるデータベースに依存するため、ABAPディクショナリで定義されたテーブルはデータベースと互換性のある形式に自動的に変換されます。
テーブルには1つ以上のフィールドを含めることができ、各フィールドはデータ型と長さで定義されます。テーブルに格納されている大量のデータは、テーブルで定義されているいくつかのフィールドに分散されます。
テーブルフィールドの種類
テーブルは多くのフィールドで構成され、各フィールドには多くの要素が含まれています。次の表に、テーブルフィールドのさまざまな要素を示します-
S.No. | 要素と説明 |
---|---|
1 | Field name これは、最大16文字を含むことができるフィールドに付けられた名前です。フィールド名は、数字、文字、およびアンダースコアで構成できます。文字で始まる必要があります。 |
2 | Key flag フィールドがキーフィールドに属するかどうかを決定します。 |
3 | Field type データ型をフィールドに割り当てます。 |
4 | Field length フィールドに入力できる文字数。 |
5 | Decimal places 小数点以下の桁数を定義します。この要素は、数値データ型にのみ使用されます。 |
6 | Short text 対応するフィールドの意味を説明します。 |
ABAPディクショナリでのテーブルの作成
Step 1−トランザクションSE11に移動し、 'データベーステーブル'ラジオボタンを選択して、登録するテーブルの名称を入力します。この例では、ZCUSTOMERS1という名前を入力しました。[作成]ボタンをクリックします。ディクショナリ:テーブル更新画面が表示されます。ここでは、「配信とメンテナンス」タブがデフォルトで選択されています。
Step 2 − [簡単な説明]フィールドに説明の短いテキストを入力します。
Step 3−「デリバリークラス」フィールドの横にある「検索ヘルプ」アイコンをクリックします。'[アプリケーションテーブル(マスタおよびトランザクションデータ)]'オプションを選択します。
Step 4− [データブラウザ/テーブルビューのメンテナンス]ドロップダウンメニューから[表示/メンテナンスを許可]オプションを選択します。ディクショナリ:メンテナンステーブル画面が表示されます。
Step 5− [フィールド]タブを選択します。[フィールド]タブに関連するオプションを含む画面が表示されます。
Step 6−「フィールド」列にテーブルフィールドの名前を入力します。フィールド名には、文字、数字、およびアンダースコアを含めることができますが、常に文字で始まり、16文字を超えてはなりません。
作成するフィールドには、定義されたデータ要素からデータ型、長さ、小数点以下の桁数、短いテキストなどの属性を取得するため、データ要素も含まれている必要があります。
Step 7−フィールドをテーブルキーの一部にする場合は、[キー]列を選択します。CLIENT、CUSTOMER、NAME、TITLE、DOBなどのフィールドを作成しましょう。
Step 8−最初のフィールドは重要なフィールドであり、レコードが関連付けられているクライアントを識別します。フィールドとして「Client」を入力し、データ要素として「MANDT」を入力します。システムは、データタイプ、長さ、小数、および簡単な説明を自動的に入力します。「クライアント」フィールドは、「キー」ボックスをチェックすることによってキーフィールドになります。
Step 9−次のフィールドは「顧客」です。チェックボックスをオンにしてキーフィールドにし、新しいデータエレメント 'ZCUSTNUM'を入力します。[保存]ボタンをクリックします。
Step 10−データエレメント 'ZCUSTNUM'はまだ存在しないため、作成する必要があります。新しいデータ要素をダブルクリックすると、[データ要素の作成]ウィンドウが表示されます。これに「はい」と答えると、「データ要素の保守」ウィンドウが表示されます。
Step 11− [簡単な説明]領域に「顧客番号」と入力します。「ドメイン」と呼ばれる基本データ型は、新しいデータ要素に対して定義する必要があります。したがって、「ZCUSTD1」と入力してダブルクリックし、加えた変更を保存することに同意します。「はい」を選択してドメインを作成し、「簡単な説明」ボックスにドメインの説明を入力します。
[定義]タブが自動的に開きます。最初のフィールドは「データ型」です。
Step 12−ボックス内をクリックし、ドロップダウンメニューから「NUMC」タイプを選択します。'番号に番号8を入力します。「文字数」フィールド(最大8文字)を入力し、「小数点以下の桁数」領域に0を入力します。8の出力長を選択して、Enterキーを押す必要があります。'NUMC'フィールドの説明が再表示され、これが有効なエントリであることを確認する必要があります。
Step 13 − [保存]ボタンをクリックして、オブジェクトをアクティブ化します。
Step 14− F3を押して、 'データエレメントの更新/変更'画面に戻ります。次のスナップショットに示すように、4つのフィールドラベルを作成します。この後、要素を保存してアクティブ化します。
Step 15−戻るボタンを押すと、テーブルメンテナンス画面に戻ります。[顧客]列には、正しいデータ型、長さ、小数、および簡単な説明があります。これは、Data要素と使用されるドメインが正常に作成されたことを示します。
同様に、NAME、TITLE、DOBなどの3つの追加フィールドを作成する必要があります。
Step 16−ツールバーから「技術設定」を選択します。「データクラス」にAPPL0を選択し、「サイズ」カテゴリに最初のサイズカテゴリ0を選択します。バッファリングオプションの場合、「バッファリングは許可されていません」を選択する必要があります。
Step 17− [保存]をクリックします。テーブルに戻り、アクティブ化します。次の画面が表示されます。
テーブル「ZCUSTOMERS1」がアクティブ化されます。
Structure は、メモリに次々に格納される任意のデータ型のコンポーネントで構成されるデータオブジェクトです。
構造体は、画面フィールドのペイントや、個別の数のフィールドによって定義された一貫した形式のデータの操作に役立ちます。
構造には実行時に1つのレコードしかない場合がありますが、テーブルには多くのレコードを含めることができます。
構造の作成
Step 1 −トランザクションSE11に進みます。
Step 2−画面の「データタイプ」オプションをクリックします。名前「ZSTR_CUSTOMER1」を入力し、「作成」ボタンをクリックします。
Step 3−次の画面でオプション「構造」を選択し、Enterキーを押します。「構造の保守/変更」ウィザードが表示されます。
Step 4 −次のスナップショットに示すように、簡単な説明を入力します。
Step 5 −コンポーネント(フィールド名)とコンポーネントタイプ(データ要素)を入力します。
Note:ここでは、SAPの推奨に従って、コンポーネント名はZで始まります。データベーステーブルに作成済みのデータ要素を使用してみましょう。
Step 6 −すべてのコンポーネントとコンポーネントタイプを指定した後、保存、チェック、およびアクティブ化する必要があります。
次の画面が表示されます-
Step 7−この「ZSTR_CUSTOMER1」が強調表示されているので、緑色のチェックマークボタンをクリックします。このウィンドウが消え、ステータスバーに「アクティブ」というメッセージが表示されます。
次のスナップショットに示すように、構造がアクティブ化されます。
ビューは、データベーステーブルのようにのみ機能します。ただし、ストレージスペースを占有することはありません。ビューは、仮想テーブル(物理的に存在しないテーブル)と同様に機能します。ビューは、アプリケーションオブジェクトに関する情報を含む1つ以上のテーブルのデータを組み合わせることによって作成されます。ビューを使用して、テーブルに含まれるデータのサブセットを表すことも、複数のテーブルを1つの仮想テーブルに結合することもできます。
アプリケーションオブジェクトに関連するデータは、データベースビューを使用して複数のテーブルに分散されます。内部結合条件を使用して、さまざまなテーブルのデータを結合します。メンテナンスビューは、アプリケーションオブジェクトに格納されているデータを表示および変更するために使用されます。すべてのメンテナンスビューには、メンテナンスステータスが関連付けられています。
投影ビューを使用して不要なフィールドをマスクし、関連するフィールドのみをテーブルに表示します。投影ビューは、単一の透明なテーブル上で定義する必要があります。投影ビューには、テーブルが1つだけ含まれています。投影ビューの選択条件を定義することはできません。
ビューの作成
Step 1−ABAPディクショナリの第一画面で[表示]ラジオボタンを選択します。作成するビューの名前を入力し、[作成]ボタンをクリックします。ビューの名前をZVIEW_TESTとして入力しました。
Step 2−ビュータイプを選択しながら投影ビューラジオボタンを選択し、[コピー]ボタンをクリックします。「辞書:ビューの変更」画面が表示されます。
Step 3 −次のスナップショットに示すように、[Short Description]フィールドに簡単な説明を入力し、[BasisTable]フィールドに使用するテーブルの名前を入力します。
Step 4 − [テーブルフィールド]ボタンをクリックして、ZCUSTOMERS1テーブルのフィールドをプロジェクションビューに含めます。
Step 5−テーブルZCUSTOMERS1からの項目選択画面が表示されます。次のスナップショットに示すように、投影ビューに含めるフィールドを選択します。
Step 6 − [コピー]ボタンをクリックすると、プロジェクションビューで選択したすべてのフィールドが[辞書:ビューの変更]画面に表示されます。
Step 7− [メンテナンスステータス]タブを選択して、アクセス方法を定義します。「データブラウザ/テーブルビューのメンテナンス」のドロップダウンメニューから、読み取り専用ラジオボタンと「制限付きで許可される表示/メンテナンス」オプションを選択します。
Step 8−保存してアクティブ化します。[辞書:ビューの変更]画面で、[ユーティリティ(M)]> [コンテンツ]を選択して、ZVIEW_TESTの選択画面を表示します。
Step 9−「実行」アイコンをクリックします。次のスクリーンショットに示すように、投影ビューの出力が表示されます。
テーブルZCUSTOMERS1は、5つのフィールドで構成されています。ここで表示されるフィールドは3(クライアント、顧客番号、名前)で、4つのエントリがあります。顧客番号は100001から100004で、適切な名前が付いています。
ABAPディクショナリの別のリポジトリオブジェクトである検索ヘルプを使用して、フィールドのすべての可能な値をリスト形式で表示します。このリストは、hit list。面倒でエラーが発生しやすい値を手動で入力する代わりに、このヒットリストからフィールドに入力する値を選択できます。
検索ヘルプの作成
Step 1−トランザクションSE11に進みます。検索ヘルプのラジオボタンを選択します。作成する検索ヘルプの名前を入力します。ZSRCH1という名前を入力しましょう。[作成]ボタンをクリックします。
Step 2−システムは、作成する検索ヘルプタイプの入力を求めます。エレメンタリー検索ヘルプを選択します。これはデフォルトです。次のスクリーンショットに示すような基本検索ヘルプを作成する画面が表示されます。
Step 3−選択方法では、データのソースがテーブルであるかビューであるかを示す必要があります。私たちの場合、それはたまたまテーブルです。テーブルはZCUSTOMERS1です。選択リストから選択されます。
Step 4−選択方法を入力すると、次のフィールドはダイアログタイプになります。これにより、制限ダイアログボックスの外観が制御されます。3つのオプションを含むドロップダウンリストがあります。「値をすぐに表示する」オプションを選択しましょう。
Step 5−次はパラメータエリアです。検索ヘルプのパラメータまたはフィールドごとに、要件に従ってこれらの列フィールドを入力する必要があります。
Search help parameter−これはデータソースからのフィールドです。テーブルのフィールドが選択リストに一覧表示されます。検索ヘルプに参加しているフィールドが、各行に1つずつ入力されます。CUSTOMERとNAMEの2つのフィールドを含めましょう。これらの2つのフィールドがどのように参加するかは、残りの列に示されています。
Import−このフィールドは、検索ヘルプパラメータがインポートパラメータであるかどうかを示すためのチェックボックスです。エクスポートまたはインポートは、検索ヘルプを参照しています。
Export−このフィールドは、検索ヘルプパラメータがエクスポートパラメータであるかどうかを示すためのチェックボックスです。エクスポートは、選択リストから画面フィールドへのフィールド値の転送になります。
LPos−その値は、選択リスト内の検索ヘルプパラメータまたはフィールドの物理的な位置を制御します。値1を入力すると、フィールドは選択リストの最初の位置に表示されます。
SPos−制限ダイアログボックスの検索ヘルプパラメータまたはフィールドの物理的な位置を制御します。値1を入力すると、フィールドは制限ダイアログボックスの最初の位置に表示されます。
Data element−すべての検索ヘルプパラメータまたはフィールドには、デフォルトで、データのソース(テーブルまたはビュー)で割り当てられたデータ要素が割り当てられます。このデータ要素名は表示モードで表示されます。
Step 6−整合性チェックを実行し、検索ヘルプを有効化します。F8を押して実行します。次のスクリーンショットに示すように、「テスト検索ヘルプZSRCH1」画面が表示されます。
Step 7−顧客の「inpの準備完了」画面フィールドに番号100004を入力しましょう。Enterキーを押します。
顧客番号100004、および名前「STEPHEN」が表示されます。
ロックオブジェクトは、複数のプログラムによる同じデータへのアクセスを同期するために使用されるABAPディクショナリによって提供される機能です。データレコードは、特定のプログラムの助けを借りてアクセスされます。SAPでは、データがデータベースに挿入またはデータベースで変更されたときの不整合を回避するために、ロックオブジェクトが使用されます。データレコードをロックするテーブルは、キーフィールドとともにロックオブジェクトで定義する必要があります。
ロック機構
以下は、ロック機構で実現される2つの主な機能です。
プログラムは、読み取りまたは変更しているデータレコードについて他のプログラムと通信できます。
プログラムは、別のプログラムによって変更されたばかりのデータを自分自身が読み取れないようにすることができます。
A lock requestプログラムによって最初に生成されます。次に、この要求はエンキューサーバーに送信され、ロックがロックテーブルに作成されます。エンキューサーバーがロックを設定し、プログラムは最終的にデータにアクセスする準備が整います。
ロックオブジェクトの作成
Step 1−トランザクションSE11に進みます。次の画面が開きます。
Step 2− [オブジェクトのロック]ラジオボタンをクリックします。Eで始まるロックオブジェクトの名前を入力し、[作成]ボタンをクリックします。ここではEZLOCK12を使用します。
Step 3 −簡単な説明フィールドに入力し、[テーブル]タブをクリックします。
Step 4 − [名前]フィールドにテーブル名を入力し、ロックモードを[書き込みロック]として選択します。
Step 5 − [パラメータのロック]タブをクリックすると、次の画面が表示されます。
Step 6−保存してアクティブ化します。自動的に2つの汎用モジュールが生成されます。汎用モジュールをチェックするには、移動→モジュールのロックを使用することができます。
Step 7 − [モジュールのロック]をクリックすると、次の画面が開きます。
ロックオブジェクトが正常に作成されました。
ロックオブジェクトに含まれるテーブルのキー項目はロック引数と呼ばれ、汎用モジュールの入力パラメータとして使用されます。これらの引数は、ロックオブジェクト定義によって生成されたロックを設定および削除するために使用されます。
プログラムをできるだけ自己完結型で読みやすいものにしておくことをお勧めします。開発者が他の気を散らすことなく集中できる個々のモジュールに各タスクを配置することにより、大きくて複雑なタスクを小さくて単純なタスクに分割してみてください。
SAP ABAP環境では、モジュール化には、プログラムをモジュラーユニットに編成することが含まれます。 logical blocks。作成中およびその後のメンテナンスサイクル中であっても、冗長性が低下し、プログラムの可読性が向上します。モジュール化により、同じコードの再利用も可能になります。ABAPにより、開発者は、モジュラー機能が比較的多く組み込まれているOOPSベースの言語よりも、モジュール化する、つまりプログラムを比較的多く編成する必要があります。モジュール化された小さなコードセクションが完成し、デバッグなどが行われると、その後に戻る必要はなく、開発者は次に進んで他の問題に集中できます。
ABAPプログラムは、モジュール化処理ブロックと呼ばれる処理ブロックで構成されています。彼らは-
プログラムの外部およびABAPランタイム環境から呼び出される処理ブロック(つまり、イベントブロックおよびダイアログモジュール)。
ABAPプログラムから呼び出された処理ブロック。
処理ブロックによるモジュール化とは別に、ソースコードモジュールは、マクロを介してソースコードをモジュール化し、プログラムを含めるために使用されます。
ソースコードレベルでのモジュール化-
- ローカルマクロ
- グローバルインクルードプログラム
ABAPプログラムから呼び出された処理ブロックによるモジュール化-
- Subroutines
- 汎用モジュール
ソースコードのモジュール化とは、一連のABAPステートメントをモジュールに配置することを意味します。モジュール化されたソースコードは、ユーザーの要件に応じてプログラムで呼び出すことができます。ソースコードモジュールは、ABAPプログラムの可読性と理解性を向上させます。個々のソースコードモジュールを作成することで、同じステートメントを何度も繰り返し書く必要がなくなり、コードを初めて使用する人にとってもコードが理解しやすくなります。
サブルーチンは、コードの再利用可能なセクションです。これは、関数がソースコードの形式でカプセル化されるプログラム内のモジュール化ユニットです。プログラムの一部をサブルーチンにページアウトして、メインプログラムの概要を把握し、次の図に示すように、対応する一連のステートメントを何度も使用します。
3つの異なるプログラムXがあります source code blocks。各ブロックには同じABAPステートメントがあります。基本的に、それらは同じコードブロックです。このコードの保守を容易にするために、コードをサブルーチンにカプセル化できます。このサブルーチンは、プログラム内で何度でも呼び出すことができます。サブルーチンは、FormステートメントとEndFormステートメントを使用して定義できます。
以下は、サブルーチン定義の一般的な構文です。
FORM <subroutine_name>.
<statements>
ENDFORM.
PERFORMステートメントを使用してサブルーチンを呼び出すことができます。コントロールは、サブルーチン<subroutine_name>の最初の実行可能ステートメントにジャンプします。ENDFORMが検出されると、制御はPERFORMステートメントに続くステートメントにジャンプして戻ります。
例
Step 1−トランザクションSE80に移動します。既存のプログラムを開き、プログラムを右クリックします。この場合は「ZSUBTEST」です。
Step 2− [作成]を選択してから、[サブルーチン]を選択します。フィールドにサブルーチン名を入力し、[続行]ボタンをクリックします。次のスクリーンショットに示すように、サブルーチン名は「Sub_Display」です。
Step 3−FORMおよびENDFORMステートメントブロックにコードを記述します。サブルーチンは正常に作成されました。
サブルーチンを呼び出すには、PERFORMステートメントを含める必要があります。コードを見てみましょう-
REPORT ZSUBTEST.
PERFORM Sub_Display.
* Form Sub_Display
* --> p1 text
* <-- p2 text
FORM Sub_Display.
Write: 'This is Subroutine'.
Write: / 'Subroutine created successfully'.
ENDFORM. " Sub_Display
Step 4−プログラムを保存、アクティブ化、および実行します。上記のコードは次の出力を生成します-
Subroutine Test:
This is Subroutine
Subroutine created successfully
したがって、サブルーチンを使用すると、プログラムがより機能指向になります。プログラムのタスクをサブ関数に分割するため、各サブルーチンは1つのサブ関数を担当します。関数への変更は多くの場合、サブルーチンに実装するだけでよいため、プログラムの保守が容易になります。
同じステートメントのセットをプログラムで複数回再利用する場合は、それらをマクロに含める必要があります。たとえば、マクロは、長い計算や複雑なWRITEステートメントの記述に役立ちます。マクロは、それが定義されているプログラム内でのみ使用できます。マクロの定義は、マクロをプログラムで使用する前に行う必要があります。
マクロはプレースホルダーに基づいて設計されています。プレースホルダーは、C言語のポインターのように機能します。DEFINE ... END-OF-DEFINITIONステートメント内でマクロを定義できます。
以下は、マクロ定義の基本的な構文です。
DEFINE <macro_name>. <statements>
END-OF-DEFINITION.
......
<macro_name> [<param1> <param2>....].
マクロを呼び出す前に、まずマクロを定義する必要があります。<param1>…。マクロ定義に含まれるABAPステートメントのプレースホルダー&1 ...を置き換えます。
マクロ定義のプレースホルダーの最大数は9です。つまり、プログラムが実行されると、SAPシステムはマクロを適切なステートメントに置き換え、プレースホルダー&1、&2、…。&9はパラメーターparam1、param2、.... param9に置き換えられます。別のマクロ内でマクロを呼び出すことはできますが、同じマクロを呼び出すことはできません。
例
トランザクションSE38に移動します。次のスクリーンショットに示すように、短いテキストフィールドの説明と、タイプやステータスなどの適切な属性を使用して、新しいプログラムZMACRO_TESTを作成します。
以下はコードです-
REPORT ZMACRO_TEST.
DEFINE mac_test.
WRITE: 'This is Macro &1'.
END-OF-DEFINITION.
PARAMETERS: s1 type C as checkbox.
PARAMETERS: s2 type C as checkbox.
PARAMETERS: s3 type C as checkbox default 'X'.
START-OF-SELECTION.
IF s1 = 'X'.
mac_test 1. ENDIF.
IF s2 = 'X'.
mac_test 2.
ENDIF.
IF s3 = 'X'.
mac_test 3.
ENDIF.
3つのチェックボックスがあります。プログラムの実行中に、S2チェックボックスを選択しましょう。
上記のコードは次の出力を生成します-
A Macro Program
This is Macro 2
すべてのチェックボックスが選択されている場合、コードは次の出力を生成します-
A Macro Program
This is Macro 1 This is Macro 2 This is Macro 3
汎用モジュールはSAPシステムの主要部分を構成します。これは、SAPが長年にわたって汎用モジュールを使用してコードをモジュール化し、コードの再利用を自分自身、開発者、および顧客が可能にしているためです。
汎用モジュールは、パラメータのインポートおよびエクスポートを伴う再利用可能なステートメントのセットを含むサブプログラムです。インクルードプログラムとは異なり、汎用モジュールは独立して実行することができます。SAPシステムには、任意のABAPプログラムから呼び出すことができるいくつかの定義済み汎用モジュールが含まれています。汎用グループは、論理的に一緒に属する多数の汎用モジュールの一種のコンテナとして機能します。たとえば、人事給与システムの汎用モジュールは、汎用グループにまとめられます。
汎用モジュールの作成方法を確認するには、汎用ビルダーを調べる必要があります。トランザクションコードSE37の関数ビルダーを見つけることができます。汎用モジュール名の一部をワイルドカード文字で入力するだけで、汎用モジュールを検索する方法を示すことができます。* amount *と入力し、F4キーを押します。
検索結果は新しいウィンドウに表示されます。汎用モジュールは背景が青色の行に表示され、それらの汎用グループはピンク色の線で表示されます。オブジェクトナビゲータ画面(トランザクションSE80)を使用して、汎用グループISOCをさらに調べることができます。汎用モジュールの一覧と、汎用グループに保持されているその他のオブジェクトを表示することができます。汎用モジュールSPELL_AMOUNTについて考えてみましょう。この汎用モジュールは、数値を単語に変換します。
新しいプログラムの作成
Step 1 −トランザクションSE38に移動し、Z_SPELLAMOUNTという新しいプログラムを登録します。
Step 2−値を入力して汎用モジュールに渡すことができるパラメータを設定できるように、コードを入力します。ここでのテキスト要素text-001は、「値の入力」と表示されます。
Step 3−このためのコードを書くには、CTRL + F6を使用します。この後、「CALLFUNCTION」がリストの最初のオプションであるウィンドウが表示されます。テキストボックスに「spell_amount」と入力し、[続行]ボタンをクリックします。
Step 4−一部のコードは自動的に生成されます。ただし、IFステートメントを拡張して、「関数モジュールがsy-subrcの値を返しました」というメッセージを画面に書き込むコードを含め、関数が正しい結果を書き出すようにELSEステートメントを追加する必要があります。モジュールは成功しました。ここでは、汎用モジュールから返された値を保持するために新しい変数を設定する必要があります。これを「結果」と呼びましょう。
以下はコードです-
REPORT Z_SPELLAMOUNT.
data result like SPELL.
selection-screen begin of line.
selection-screen comment 1(15) text-001.
parameter num_1 Type I.
selection-screen end of line.
CALL FUNCTION 'SPELL_AMOUNT'
EXPORTING
AMOUNT = num_1
IMPORTING
IN_WORDS = result.
IF SY-SUBRC <> 0.
Write: 'Value returned is:', SY-SUBRC.
else.
Write: 'Amount in words is:', result-word.
ENDIF.
Step 5−汎用モジュールが返す変数はIN_WORDSと呼ばれます。'result'というプログラムで対応する変数を設定します。LIKEステートメントを使用してIN_WORDSを定義し、SPELLと呼ばれる構造を参照します。
Step 6−プログラムを保存、アクティブ化、および実行します。次のスクリーンショットに示すように値を入力し、F8キーを押します。
上記のコードは次の出力を生成します-
Spelling the Amount
Amount in words is:
FIVE THOUSAND SIX HUNDRED EIGHTY
インクルードプログラムは、ソースコードをモジュール化するために使用されるグローバルリポジトリオブジェクトです。それらはあなたが異なるプログラムで同じソースコードを使用することを可能にします。インクルードプログラムを使用すると、複雑なプログラムを整然と管理することもできます。別のプログラムでインクルードプログラムを使用するには、次の構文を使用します-
INCLUDE <program_name>.
INCLUDEステートメントは、インクルードプログラム<program_name>のソースコードを別のプログラムにコピーするのと同じ効果があります。インクルードプログラムは独立して実行できないため、他のプログラムに組み込む必要があります。プログラムをネストすることもできます。
以下は、インクルードプログラムのコードを書く際のいくつかの制限です-
- インクルードプログラムは自分自身を呼び出すことはできません。
- インクルードプログラムには、完全なステートメントが含まれている必要があります。
以下は、インクルードプログラムを作成して使用する手順です。
Step 1− ABAPエディタに含めるプログラム(Z_TOBEINCLUDED)を登録します。ABAPエディタに含まれるコードは-
PROGRAM Z_TOBEINCLUDED.
Write: / 'This program is started by:', SY-UNAME,
/ 'The Date is:', SY-DATUM,
/ 'Time is', SY-UZEIT.
Step 2 −次のスクリーンショットに示すように、プログラムのタイプをINCLUDEプログラムに設定します。
Step 3 − [保存]ボタンをクリックして、プログラムをZINCL_PCKGという名前のパッケージに保存します。
Step 4−プログラムZ_TOBEINCLUDEDを使用する必要がある別のプログラムを作成します。ここでは、Z_INCLUDINGTESTという名前の別のプログラムを作成し、そのプログラムのタイプを実行可能プログラムとして割り当てました。
Step 5 − Z_INCLUDINGTESTプログラムのコーディングには、次のコードに示すように、INCLUDEステートメントを使用したZ_TOBEINCLUDEDプログラムが含まれています。
REPORT Z_INCLUDINGTEST.
INCLUDE Z_TOBEINCLUDED.
Step 6 −プログラムを保存、アクティブ化、および実行します。
上記のコードは次の出力を生成します-
This program is started by: SAPUSER
The Date is: 06.10.2015
Time is 13:25:11
オープンSQLは、現在のASABAPの中央データベース内のデータへの直接アクセスを可能にするABAPステートメントのサブセットを示します。オープンSQLステートメントは、すべてのデータベースシステムでサポートされているABAPのSQLのデータ操作言語機能をマップします。
Open SQLのステートメントは、データベースインターフェイスのOpenSQLインターフェイスでデータベース固有のSQLに変換されます。その後、データベースシステムに転送され、実行されます。オープンSQLステートメントを使用して、ABAPディクショナリで宣言されているデータベーステーブルにアクセスできます。AS ABAPの中央データベースはデフォルトでアクセスされ、他のデータベースへのアクセスはセカンダリデータベース接続を介して可能です。
これらのステートメントのいずれかがABAPプログラムで使用される場合は常に、実行されたアクションが成功したかどうかをチェックすることが重要です。データベーステーブルにレコードを挿入しようとして、正しく挿入されない場合は、プログラムで適切なアクションを実行できるようにするために知っておくことが非常に重要です。これは、すでに使用されているシステム項目、つまりSY-SUBRCを使用して行うことができます。ステートメントが正常に実行されると、SY-SUBRCフィールドに値0が含まれるため、これを確認して、プログラムが表示された場合は続行できます。
DATAステートメントは、作業領域を宣言するために使用されます。これに「wa_customers1」という名前を付けましょう。このために1つのデータ型を宣言するのではなく、テーブルを構成する複数のフィールドを宣言できます。これを行う最も簡単な方法は、LIKEステートメントを使用することです。
INSERTステートメント
wa_customers1作業領域は、ZCUSTOMERS1テーブルのようにここで宣言され、テーブル自体になることなく同じ構造を取ります。この作業領域には、1つのレコードしか保存できません。宣言されると、INSERTステートメントを使用して、作業領域とそれが保持するレコードをテーブルに挿入できます。ここのコードは「INSERTZCUSTOMERS1FROMwa_customers1」と読みます。
作業領域にはいくつかのデータを入力する必要があります。ZCUSTOMERS1テーブルのフィールド名を使用します。これは、フォワードナビゲーション、コード内のテーブル名のダブルクリック、または新しいセッションを開いてトランザクションSE11を使用することで実行できます。次に、テーブルの項目をコピーしてABAPエディタに貼り付けることができます。
以下はコードスニペットです-
DATA wa_customers1 LIKE ZCUSTOMERS1.
wa_customers1-customer = '100006'.
wa_customers1-name = 'DAVE'.
wa_customers1-title = 'MR'.
wa_customers1-dob = '19931017'.
INSERT ZCUSTOMERS1 FROM wa_customers1.
CHECKステートメントは次のように使用できます。これは、レコードが正しく挿入されている場合、システムがこれを示すことを意味します。そうでない場合は、ゼロに等しくないSY-SUBRCコードが表示されます。以下はコードスニペットです-
IF SY-SUBRC = 0.
WRITE 'Record Inserted Successfully'.
ELSE.
WRITE: 'The return code is ', SY-SUBRC.
ENDIF.
プログラムを確認し、保存してコードをアクティブ化してから、テストします。出力ウィンドウには、「レコードが正常に挿入されました」と表示されます。
CLEARステートメント
CLEARステートメントを使用すると、フィールドまたは変数をクリアして、その場所に新しいデータを挿入し、再利用することができます。CLEARステートメントは通常、プログラムで使用され、既存のフィールドを何度も使用できるようにします。
前のコードスニペットでは、作業領域構造にデータを入力して、ZCUSTOMERS1テーブルに挿入する新しいレコードを作成してから、検証チェックを実行しています。新しいレコードを挿入する場合は、CLEARステートメントを使用して、新しいデータを再度入力できるようにする必要があります。
UPDATEステートメント
テーブル内の1つ以上の既存のレコードを同時に更新する場合は、UPDATEステートメントを使用します。INSERTステートメントと同様に、作業領域が宣言され、プログラムの実行時にレコードに入れられる新しいデータが入力されます。以前にINSERTステートメントで作成されたレコードは、ここで更新されます。NAMEフィールドとTITLEフィールドに保存されているテキストを編集するだけです。次に、新しい行で、INSERTステートメントと同じ構造が使用されます。今回は、次のコードスニペットに示すようにUPDATEステートメントを使用します。
DATA wa_customers1 LIKE ZCUSTOMERS1.
wa_customers1-customer = '100006'.
wa_customers1-name = 'RICHARD'.
wa_customers1-title = 'MR'.
wa_customers1-dob = '19931017'.
UPDATE ZCUSTOMERS1 FROM wa_customers1.
UPDATEステートメントが実行されると、ABAPディクショナリでデータブラウザを表示して、レコードが正常に更新されたことを確認できます。
MODIFYステートメント
MODIFYステートメントは、INSERTステートメントとUPDATEステートメントの組み合わせと見なすことができます。これは、新しいレコードを挿入するか、既存のレコードを変更するために使用できます。これは、作業領域に入力されたデータからレコードを変更する際の前の2つのステートメントと同様の構文に従います。
このステートメントが実行されると、関連するキーフィールドがテーブル内のフィールドと照合されます。これらのキーフィールド値を持つレコードがすでに存在する場合は、更新されます。そうでない場合は、新しいレコードが作成されます。
以下は、新しいレコードを作成するためのコードスニペットです-
CLEAR wa_customers1.
DATA wa_customers1 LIKE ZCUSTOMERS1.
wa_customers1-customer = '100007'.
wa_customers1-name = 'RALPH'.
wa_customers1-title = 'MR'.
wa_customers1-dob = '19910921'.
MODIFY ZCUSTOMERS1 FROM wa_customers1.
この例では、CLEARステートメントを使用して、新しいエントリを作業領域に配置できるようにしてから、顧客(番号)100007を追加します。これは新しい一意のキーフィールド値であるため、新しいレコードが挿入され、別の検証チェックが実行されます。
これが実行され、データがデータブラウザで表示されると、顧客番号100007(RALPH)の新しいレコードが作成されます。
上記のコードは次の出力を生成します(テーブルの内容)-
「ネイティブSQL」という用語は、データベースインターフェイスのネイティブSQLインターフェイスに静的に転送できるすべてのステートメントを指します。ネイティブSQLステートメントはABAPの言語スコープに含まれず、ABAP構文に従いません。ABAPには、ネイティブSQLステートメントを一覧表示できるプログラムセクションを分離するためのステートメントが含まれているだけです。
ネイティブSQLでは、主にデータベース固有のSQLステートメントを使用できます。これらは、ネイティブSQLインターフェイスからデータベースシステムに変更されずに転送され、実行されます。関連するデータベースの完全なSQL言語スコープを使用でき、アドレス指定されたデータベーステーブルをABAPディクショナリで宣言する必要はありません。ネイティブSQLインターフェイスによって特定の方法で処理されるSAP固有のネイティブSQLステートメントの小さなセットもあります。
ネイティブSQLステートメントを使用するには、その前にEXEC SQLステートメントを置き、最後にENDEXECステートメントを付ける必要があります。
以下は構文です-
EXEC SQL PERFORMING <form>.
<Native SQL statement>
ENDEXEC.
これらのステートメントは、1つ以上のネイティブSQLステートメントを一覧表示できるABAPプログラムの領域を定義します。入力されたステートメントは、ネイティブSQLインターフェースに渡され、次のように処理されます。
アドレス指定されたデータベースシステムのプログラムインターフェイスに有効なすべてのSQLステートメント、特にDDL(データ定義言語)ステートメントは、EXECとENDEXECの間にリストできます。
これらのSQLステートメントは、ネイティブSQLインターフェイスからデータベースシステムにほとんど変更されずに渡されます。構文規則、特にデータベースオブジェクトの大文字と小文字を区別する規則は、データベースシステムによって指定されます。
構文で個々のステートメント間の区切り文字が許可されている場合は、EXECとENDEXECの間に多くのネイティブSQLステートメントを含めることができます。
SAP固有のネイティブSQL言語要素は、EXECとENDEXECの間で指定できます。これらのステートメントは、ネイティブSQLインターフェイスからデータベースに直接渡されませんが、適切に変換されます。
例
SPFLIは、フライトスケジュール情報を格納するために使用される標準のSAPテーブルです。これは、バージョンとリリースレベルに応じて、R / 3SAPシステム内で使用できます。この情報は、SE11やSE80などの関連するSAPトランザクションにテーブル名SPFLIを入力するときに表示できます。これらの2つのトランザクションを使用して、このデータベーステーブルに含まれるデータを表示することもできます。
REPORT ZDEMONATIVE_SQL.
DATA: BEGIN OF wa,
connid TYPE SPFLI-connid,
cityfrom TYPE SPFLI-cityfrom,
cityto TYPE SPFLI-cityto,
END OF wa.
DATA c1 TYPE SPFLI-carrid VALUE 'LH'.
EXEC SQL PERFORMING loop_output.
SELECT connid, cityfrom, cityto
INTO :wa
FROM SPFLI
WHERE carrid = :c1
ENDEXEC.
FORM loop_output.
WRITE: / wa-connid, wa-cityfrom, wa-cityto.
ENDFORM.
上記のコードは次の出力を生成します-
0400 FRANKFURT NEW YORK
2402 FRANKFURT BERLIN
0402 FRANKFURT NEW YORK
内部テーブルは実際には一時テーブルであり、実行中のABAPプログラムのレコードが含まれています。内部テーブルは、SAPプログラムの実行時にのみ存在します。これらは、ABAP言語を使用して大量のデータを処理するために使用されます。データベーステーブルからデータを取得する必要がある場合は、ABAPプログラムで内部テーブルを宣言する必要があります。
内部テーブルのデータは、行と列に格納されます。各行はと呼ばれますline 各列は field。内部テーブルでは、すべてのレコードの構造とキーが同じです。内部テーブルの個々のレコードには、インデックスまたはキーを使用してアクセスします。内部テーブルは関連するプログラムが実行されるまで存在するため、プログラムの実行が終了すると、内部テーブルのレコードは破棄されます。したがって、内部テーブルは、必要に応じてデータを変更できる一時ストレージ領域または一時バッファとして使用できます。これらのテーブルは、実行時にのみメモリを占有し、宣言時には占有しません。
内部テーブルはプログラムの実行中にのみ存在するため、コードを作成するときは、プログラムがそれを利用できるように内部テーブルを構造化する必要があります。内部テーブルは構造体と同じように動作することがわかります。主な違いは、構造には1行しかないのに対し、内部テーブルには必要な数の行を含めることができることです。
内部テーブルは、ABAPディクショナリの場合と同様に、テーブルの列に対応する複数のフィールドで構成できます。これは、いくつかのフィールドを使用してテーブルが作成された場合と同じです。キーフィールドは内部テーブルでも使用でき、これらの内部テーブルを作成する際に、わずかに柔軟性が高まります。内部テーブルを使用すると、一意でないキーを指定して、一意でないレコードをいくつでも保存でき、必要に応じて重複レコードを保存できます。
内部テーブルのサイズまたはそれに含まれる行数は固定されていません。内部テーブルのサイズは、内部テーブルに関連付けられているプログラムの要件に応じて変わります。ただし、内部テーブルはできるだけ小さくすることをお勧めします。これは、膨大な量のデータを処理するのに苦労するため、システムの実行速度が低下するのを防ぐためです。
内部テーブルは多くの目的で使用されます-
これらは、プログラムの後半で使用できる計算結果を保持するために使用できます。
内部テーブルはレコードとデータを保持することもできるため、データベーステーブルからこのデータにアクセスする必要はなく、すばやくアクセスできます。
それらは非常に用途が広いです。それらは、他の定義された構造をいくつでも使用して定義できます。
例
ユーザーが1つまたは複数の大きなテーブルからさまざまな顧客の連絡先番号のリストを作成したいとします。ユーザーは最初に内部テーブルを作成し、顧客テーブルから関連データを選択してから、そのデータを内部テーブルに配置します。他のユーザーは、プログラムの実行時に各操作を実行するデータベースクエリを作成する代わりに、この内部テーブルに直接アクセスして使用し、必要な情報を取得できます。
DATAステートメントは、内部テーブルを宣言するために使用されます。プログラムは、テーブルの開始位置と終了位置を通知する必要があります。したがって、BEGIN OFステートメントを使用してから、テーブル名を宣言します。この後、OCCURSの追加が使用され、その後に数字(ここでは0)が続きます。OCCURSはSAPに内部テーブルが作成されていることを通知し、0は最初はレコードが含まれないことを示します。その後、データが入力されると展開されます。
以下は構文です-
DATA: BEGIN OF <internal_tab> Occurs 0,
新しい行にフィールドを作成しましょう。たとえば、LIKEZCUSTOMERS1-nameとして宣言されている「name」を作成します。'dob'という別のフィールド、LIKEZCUSTOMERS1-dobを作成します。最初は、内部テーブルのフィールド名に、他の場所で作成された他のフィールドと同じ名前を付けると便利です。最後に、「END OF <internal_tab>」で内部テーブルの終わりを宣言します。次のコードに示すように-
DATA: BEGIN OF itab01 Occurs 0,
name LIKE ZCUSTOMERS1-name,
dob LIKE ZCUSTOMERS1-dob,
END OF itab01.
ここで、「itab01」は、SAPで一時テーブルを作成するときに一般的に使用される省略形です。OCCURS句は、テーブルのフィールドを宣言することにより、内部テーブルの本体を定義するために使用されます。OCCURS句を使用する場合、必要に応じて数値定数「n」を指定して、追加のデフォルトメモリを決定できます。OCCUR0句で使用されるメモリのデフォルトサイズは8KBです。これで内部テーブルの構造が作成され、コードを記述してレコードを入力できます。
内部テーブルは、ヘッダー行を使用して、または使用せずに作成できます。ヘッダー行を含む内部テーブルを作成するには、内部テーブルの定義で、OCCURS句の前にBEGIN OF句を使用するか、OCCURS句の後にWITH HEADERLINE句を使用します。ヘッダー行のない内部テーブルを作成するには、BEGINOF句のないOCCURS句を使用します。
TYPESステートメントを使用して、ローカルデータ型(現在のプログラムのコンテキストでのみ使用されるデータ型)として内部テーブルを作成することもできます。このステートメントは、TYPEまたはLIKE句を使用して、既存のテーブルを参照します。
ローカルデータ型として内部テーブルを作成するための構文は次のとおりです。
TYPES <internal_tab> TYPE|LIKE <internal_tab_type> OF
<line_type_itab> WITH <key> INITIAL SIZE <size_number>.
ここで、<internal_tab_type>は内部テーブル<internal_tab>のテーブルタイプを指定し、<line_type_itab>は内部テーブルの行のタイプを指定します。TYPESステートメントでは、TYPE句を使用して内部テーブルの行タイプをデータ型として指定し、LIKE句を使用して行タイプをデータオブジェクトとして指定できます。内部テーブルのキーの指定はオプションであり、ユーザがキーを指定しない場合、SAPシステムは任意のキーを使用してテーブルタイプを定義します。
INITIAL SIZE <size_number>は、初期量のメモリを割り当てることにより、内部テーブルオブジェクトを作成します。上記の構文では、INITIALSIZE句はsize_numberテーブル行用のメモリスペースを予約します。内部テーブルオブジェクトが宣言されている場合は常に、テーブルのサイズはテーブルのデータ型に属していません。
Note −内部テーブルに初めてデータを入力するときに消費されるメモリははるかに少なくなります。
例
Step 1− SE38トランザクションコードを実行して、ABAPエディタを開きます。ABAPエディタの第一画面が表示されます。
Step 2 −初期画面で、プログラムの名前を入力し、[ソースコード]ラジオボタンを選択し、[作成]ボタンをクリックして新しいプログラムを作成します。
Step 3−「ABAP:プログラム属性」ダイアログボックスで、「タイトル」フィールドにプログラムの簡単な説明を入力し、「属性」グループボックスの「タイプ」ドロップダウンメニューから「実行可能プログラム」オプションを選択します。[保存]ボタンをクリックします。
Step 4 −ABAPエディタで以下のコードを記述します。
REPORT ZINTERNAL_DEMO.
TYPES: BEGIN OF CustomerLine,
Cust_ID TYPE C,
Cust_Name(20) TYPE C,
END OF CustomerLine.
TYPES mytable TYPE SORTED TABLE OF CustomerLine
WITH UNIQUE KEY Cust_ID.
WRITE:/'The mytable is an Internal Table'.
Step 5 −通常どおり、プログラムを保存、アクティブ化、および実行します。
この例では、mytableは内部テーブルであり、Cust_IDフィールドに一意のキーが定義されています。
上記のコードは次の出力を生成します-
The mytable is an Internal Table.
内部テーブルでは、入力には、選択、挿入、追加などの機能が含まれます。この章では、INSERTステートメントとAPPENDステートメントに焦点を当てます。
INSERTステートメント
INSERTステートメントは、1行または1行のグループを内部テーブルに挿入するために使用されます。
以下は、内部テーブルに1行を追加するための構文です。
INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.
この構文では、INSERTステートメントはinternal_tab内部テーブルに新しい行を挿入します。internal_tabパラメーターの前にwork_area_itabINTO式を使用すると、新しい行を挿入できます。work_area_itab INTO式を使用すると、新しい行がwork_area_itab作業領域から取得され、internal_tabテーブルに挿入されます。ただし、work_area_itab INTO式を使用して行を挿入しない場合、その行はinternal_tabテーブルのヘッダー行から取得されます。
INDEX句を使用して内部テーブルに改行を挿入すると、挿入された行の後の行のインデックス番号が1ずつ増加します。内部テーブルに<index_num> -1行が含まれている場合、新しい行はテーブルの終わり。SAPシステムが内部テーブルに行を正常に追加すると、SY-SUBRC変数が0に設定されます。
例
以下は、insertステートメントを使用するサンプルプログラムです。
REPORT ZCUSLIST1.
DATA: BEGIN OF itable1 OCCURS 4,
F1 LIKE SY-INDEX,
END OF itable1.
DO 4 TIMES.
itable1-F1 = sy-index.
APPEND itable1.
ENDDO.
itable1-F1 = -96.
INSERT itable1 INDEX 2.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
LOOP AT itable1 Where F1 ≥ 3.
itable1-F1 = -78.
INSERT itable1.
ENDLOOP.
Skip.
LOOP AT itable1.
Write / itable1-F1.
ENDLOOP.
上記のコードは次の出力を生成します-
1
96-
2
3
4
1
96-
2
78-
3
78-
4
上記の例では、DOループは1から4までの数字を含む4行を追加します。ヘッダー行コンポーネントitable1-F1には、-96の値が割り当てられています。Insertステートメントは、ヘッダー行を新しい行として行3の前の本文に挿入します。既存の行3は、挿入後に行4になります。LOOP ATステートメントは、F1値が3以上の行を内部テーブルから取得します。各行の前に、Insertステートメントはそのヘッダー行から新しい行を挿入します。挿入前に、F1コンポーネントは-78を含むように変更されました。
各挿入ステートメントが実行された後、システムは挿入された行の下にあるすべての行のインデックスを再作成します。これにより、大きな内部テーブルの上部近くに行を挿入するときにオーバーヘッドが発生します。行のブロックを大きな内部テーブルに挿入する必要がある場合は、挿入する行を含む別のテーブルを準備し、代わりに挿入行を使用します。
itable1のループ内のitable1内に新しい行を挿入しても、内部テーブルにはすぐには影響しません。実際には、次のループパスで有効になります。現在の行の後に行を挿入している間、テーブルはENDLOOPで再インデックス付けされます。sy-tabixがインクリメントされ、次のループがsy-tabixが指す行を処理します。たとえば、2番目のループパスにいて、行3の前にレコードを挿入した場合、endloopが実行されると、新しい行は行3になり、古い行3は行4になります。Sy-tabixは1ずつインクリメントされ、次のループパスは新しく挿入されたレコードを処理します。
APPENDステートメント
APPENDステートメントは、既存の内部テーブルに単一の行または行を追加するために使用されます。このステートメントは、作業領域から1行をコピーし、内部テーブルの最後の既存の行の後に挿入します。作業領域は、ヘッダー行、または内部テーブルの行と同じ構造を持つその他のフィールド文字列のいずれかです。以下は、内部テーブルに1行を追加するために使用されるAPPENDステートメントの構文です。
APPEND <record_for_itab> TO <internal_tab>.
この構文では、<record_for_itab>式は、線種に変換可能な<work_area_itab>作業領域またはINITIALLINE句で表すことができます。ユーザーが<work_area_itab>作業領域を使用する場合、SAPシステムは<internal_tab>内部テーブルに新しい行を追加し、作業領域の内容を入力します。INITIAL LINE句は、テーブル構造の各フィールドの初期値を含む空白行を追加します。各APPENDステートメントの後に、SY-TABIX変数には追加された行のインデックス番号が含まれます。
一意でないキーを使用して標準テーブルとソート済みテーブルに行を追加すると、同じキーの行がテーブルにすでに存在するかどうかに関係なく機能します。つまり、エントリが重複する可能性があります。ただし、ユーザーが一意のキーを使用して並べ替えられたテーブルに重複エントリを追加しようとした場合、またはユーザーが並べ替えられたテーブルに行を追加して並べ替え順序に違反した場合、ランタイムエラーが発生します。
例
REPORT ZCUSLIST1.
DATA: BEGIN OF linv Occurs 0,
Name(20) TYPE C,
ID_Number TYPE I,
END OF linv.
DATA table1 LIKE TABLE OF linv.
linv-Name = 'Melissa'.
linv-ID_Number = 105467.
APPEND linv TO table1.
LOOP AT table1 INTO linv.
Write: / linv-name, linv-ID_Number.
ENDLOOP.
上記のコードは次の出力を生成します-
Melissa 105467
ヘッダー行のある内部テーブルからレコードを読み取ると、そのレコードはテーブル自体からヘッダー行に移動されます。その場合、プログラムが機能するのはヘッダー行です。新しいレコードを作成するときも同じことが言えます。これは、操作に使用するヘッダー行であり、そこから新しいレコードがテーブル本体自体に送信されます。
レコードをコピーするには、SELECTステートメントを使用してテーブルからすべてのレコードを選択してから、MOVEステートメントを使用して、レコードを元のテーブルから新しい内部テーブルの名前が対応するフィールドに移動します。
以下は、MOVEステートメントの構文です。
MOVE <table_field> TO <internal_tab_field>.
例
REPORT ZCUSLIST1.
TABLES: ZCUSTOMERS1.
DATA: BEGIN OF itab01 Occurs 0,
name LIKE ZCUSTOMERS1-name,
dob LIKE ZCUSTOMERS1-dob,
END OF itab01.
Select * FROM ZCUSTOMERS1.
MOVE ZCUSTOMERS1-name TO itab01-name.
MOVE ZCUSTOMERS1-dob TO itab01-dob.
ENDSELECT.
Write: / itab01-name, itab01-dob.
上記のコードは次の出力を生成します-
MARGARET 02.11.1994
selectループは、MOVEステートメントを使用してデータを1つのテーブルのフィールドから別のテーブルのフィールドに移動し、一度に1つずつ各フィールドに入力します。上記の例では、MOVEステートメントを使用して、ZCUSTOMERS1テーブルの内容を内部テーブルの対応するフィールドに移動しました。このアクションは、たった1行のコードで実行できます。MOVECORRESPONDINGステートメントを使用できます。
以下は、MOVE-CORRESPONDINGステートメントの構文です。
MOVE-CORRESPONDING <table_name> TO <internal_tab>.
これは、ZCUSTOMERS1のフィールドからitab01の対応するフィールドにデータを移動するようにシステムに指示します。
例
REPORT ZCUSTOMERLIST.
TABLES: ZCUSTOMERS1.
DATA: Begin of itab01 occurs 0,
customer LIKE ZCUSTOMERS1-customer,
name LIKE ZCUSTOMERS1-name,
title LIKE ZCUSTOMERS1-title,
dob LIKE ZCUSTOMERS1-dob,
END OF itab01.
SELECT * from ZCUSTOMERS1.
MOVE-Corresponding ZCUSTOMERS1 TO itab01.
APPEND itab01.
ENDSELECT.
LOOP AT itab01.
Write: / itab01-name, itab01-dob.
ENDLOOP.
上記のコードは次の出力を生成します-
MARK 21.05.1981
JAMES 14.08.1977
AURIELE 19.06.1990
STEPHEN 22.07.1985
MARGARET 02.11.1994
これは、両方のフィールド名が一致しているために可能になります。このステートメントを使用するときは、両方のフィールドのデータ型と長さが一致していることを確認する必要があります。これは、以前にLIKEステートメントを使用してここで実行されました。
READ TABLEステートメントの次の構文を使用して、テーブルの行を読み取ることができます。
READ TABLE <internal_table> FROM <work_area_itab>.
この構文では、<work_area_itab>式は、<internal_table>テーブルの線種と互換性のある作業領域を表します。次の構文に示すように、WITH KEY句を使用して、READステートメント内で検索キーを指定できますが、テーブルキーは指定できません。
READ TABLE <internal_table> WITH KEY = <internal_tab_field>.
ここでは、内部テーブルの行全体が search key。テーブルの行全体の内容が、<internal_tab_field>フィールドの内容と比較されます。<internal_tab_field>フィールドの値がテーブルの線種と互換性がない場合、これらの値はテーブルの線種に従って変換されます。検索キーを使用すると、構造化された行タイプを持たない内部テーブルのエントリを検索できます。つまり、行が単一のフィールドまたは内部テーブルタイプである場合です。
READステートメントの次の構文は、COMPARING句を使用して作業領域またはフィールドシンボルを指定するために使用されます。
READ TABLE <internal_table> <key> INTO <work_area_itab>
[COMPARING <F1> <F2>...<Fn>].
COMPARING句を使用すると、構造化明細タイプの指定されたテーブル項目<F1>、<F2> .... <Fn>が、移送される前に作業領域の対応する項目と比較されます。ALL FIELDS句が指定されている場合、SAPシステムはすべてのコンポーネントを比較します。SAPシステムがキーに基づいてエントリを検出すると、SY-SUBRC変数の値は0に設定されます。さらに、比較対象のコンテンツの場合、SY-SUBRC変数の値は2または4に設定されます。フィールドが同じでない場合、またはSAPシステムがエントリを見つけられない場合。ただし、SAPシステムは、比較の結果に関係なく、エントリが見つかるたびにエントリをターゲット作業領域にコピーします。
例
REPORT ZREAD_DEMO.
*/Creating an internal table
DATA: BEGIN OF Record1,
ColP TYPE I,
ColQ TYPE I,
END OF Record1.
DATA mytable LIKE HASHED TABLE OF Record1 WITH UNIQUE KEY ColP.
DO 6 Times.
Record1-ColP = SY-INDEX.
Record1-ColQ = SY-INDEX + 5.
INSERT Record1 INTO TABLE mytable.
ENDDO.
Record1-ColP = 4.
Record1-ColQ = 12.
READ TABLE mytable FROM Record1 INTO Record1 COMPARING ColQ.
WRITE: 'SY-SUBRC =', SY-SUBRC.
SKIP.
WRITE: / Record1-ColP, Record1-ColQ.
上記のコードは次の出力を生成します-
SY-SUBRC = 2
4 9
上記の例では、mytableはハッシュテーブルタイプの内部テーブルであり、作業領域としてRecord1が使用され、一意のキーとしてColPが使用されています。最初に、mytableには6行が入力されます。ここで、ColPフィールドにはSY-INDEX変数の値が含まれ、ColQフィールドには(SY-INDEX + 5)値が含まれます。
Record1作業領域には、ColPフィールドとColQフィールドの値としてそれぞれ4と12が入力されます。READステートメントは、COMPARING句を使用してColPキーフィールドの値をRecord1作業領域の値と比較した後、テーブルの行を読み取り、読み取った行の内容を作業領域にコピーします。ColPフィールドの値が4の場合、ColQの値は12ではなく9であるため、SY-SUBRC変数の値は2として表示されます。
DELETEステートメントは、内部テーブルから1つ以上のレコードを削除するために使用されます。内部テーブルのレコードは、テーブルキーまたは条件を指定するか、重複するエントリを見つけることによって削除されます。内部テーブルに一意でないキーがあり、重複するエントリが含まれている場合、テーブルの最初のエントリが削除されます。
以下は、DELETEステートメントを使用して内部テーブルからレコードまたは行を削除するための構文です。
DELETE TABLE <internal_table> FROM <work_area_itab>.
上記の構文では、<work_area_itab>式は作業領域であり、<internal_table>内部テーブルのタイプと互換性がある必要があります。削除操作は、作業領域コンポーネントから取得できるデフォルトのキーに基づいて実行されます。
次の構文を使用して、DELETETABLEステートメントでテーブルキーを明示的に指定することもできます。
DELETE TABLE <internal_table> WITH TABLE KEY <K1> = <F1>………… <Kn> = <Fn>.
この構文では、<F1>、<F2> .... <Fn>は内部テーブルのフィールドであり、<K1>、<K2> .... <Kn>はテーブルのキーフィールドです。DELETEステートメントは、式<K1> = <F1>、<K2> = <F2> ... <Kn> = <Fn>に基づいて、<internal_table>テーブルのレコードまたは行を削除するために使用されます。
Note − <F1>、<F2> .... <Fn>項目のデータ型が<K1>、<K2> ... <Kn>キー項目と互換性がない場合、SAPシステムはそれらを自動的に変換します。互換性のある形式。
例
REPORT ZDELETE_DEMO.
DATA: BEGIN OF Line1,
ColP TYPE I,
ColQ TYPE I,
END OF Line1.
DATA mytable LIKE HASHED TABLE OF Line1
WITH UNIQUE KEY ColP.
DO 8 TIMES.
Line1-ColP = SY-INDEX.
Line1-ColQ = SY-INDEX + 4.
INSERT Line1 INTO TABLE mytable.
ENDDO.
Line1-ColP = 1.
DELETE TABLE mytable: FROM Line1,
WITH TABLE KEY ColP = 3.
LOOP AT mytable INTO Line1.
WRITE: / Line1-ColP, Line1-ColQ.
ENDLOOP.
上記のコードは次の出力を生成します-
2 6
4 8
5 9
6 10
7 11
8 12
この例では、mytableにはColPとColQの2つのフィールドがあります。最初に、mytableには8行が入力され、ColPには値1、2、3、4、5、6、7、および8が含まれます。ColQには値5、6、7、8、9、10、11、およびColP値は毎回4ずつ増加するため、12です。
DELETEステートメントは、ColPキーフィールドの値が1または3であるmytableから行を削除するために使用されます。削除後、mytableのColPフィールドには、次のように値2、4、5、6、7、および8が含まれます。出力で。ColQフィールドには、値6、8、9、10、11、および12が含まれます。
オブジェクト指向は、ソフトウェア設計を簡素化して、理解、保守、および再利用を容易にします。 Object Oriented Programming(OOP)は、ソフトウェアを作成する際の異なる考え方を表しています。OOPの美しさは、そのシンプルさにあります。OOPの表現力により、高品質のソフトウェアコンポーネントを時間どおりに提供することが容易になります。
ソリューションは実際のオブジェクトの観点から設計されているため、プログラマーとビジネスアナリストは、共通のドメイン言語を使用する設計に関するアイデアや情報を交換することがはるかに簡単になります。これらのコミュニケーションの改善は、隠れた要件を明らかにし、リスクを特定し、開発中のソフトウェアの品質を向上させるのに役立ちます。オブジェクト指向のアプローチは、現実世界の抽象的なまたは具体的なものを表すオブジェクトに焦点を当てています。これらのオブジェクトは、内部構造と属性(データ)によって表される文字とプロパティによって定義されます。これらのオブジェクトの動作は、メソッド(つまり機能)によって記述されます。
手続き型プログラミングとオブジェクト指向プログラミングを比較してみましょう-
特徴 | 手順指向のアプローチ | オブジェクト指向アプローチ |
---|---|---|
強調 | 重点はタスクにあります。 | これらのタスクを実行することに重点が置かれています。 |
モジュール化 | プログラムは、関数と呼ばれる小さなプログラムに分割できます。 | プログラムはクラスとオブジェクトに編成され、機能はクラスのメソッドに埋め込まれます。 |
データセキュリティ | ほとんどの関数はグローバルデータを共有します。 | データは非表示にすることができ、外部ソースからアクセスすることはできません。 |
拡張性 | これは、既存の機能を変更および拡張するのに時間がかかります。 | 新しいデータや機能は、必要に応じて簡単に追加できます。 |
ABAPは当初、手続き型言語として開発されました(COBOLなどの以前の手続き型プログラミング言語とまったく同じです)。しかし、ABAPは、ABAPオブジェクトの導入により、オブジェクト指向パラダイムの原則を採用しました。クラス、オブジェクト、継承、ポリモーフィズムなどのABAPのオブジェクト指向の概念は、JavaやC ++などの他の最新のオブジェクト指向言語の概念と本質的に同じです。
オブジェクト指向が形になり始めると、各クラスは特定の役割の割り当てを引き受けます。この分業は、プログラミングモデル全体を簡素化するのに役立ち、各クラスが目前の問題の特定の部分の解決に特化できるようにします。このようなクラスはまとまりがあり、各クラスの操作は直感的な方法で密接に関連しています。
オブジェクト指向の主な機能は次のとおりです。
- 効果的なプログラミング構造。
- 実世界のエンティティは非常にうまくモデル化できます。
- データのセキュリティとアクセスに重点を置きます。
- コードの冗長性を最小限に抑えます。
- データの抽象化とカプセル化。
オブジェクトは、明確な特性と動作を持つ特殊な種類の変数です。オブジェクトの特性または属性は、オブジェクトの状態を説明するために使用され、動作またはメソッドは、オブジェクトによって実行されるアクションを表します。
オブジェクトは、クラスのパターンまたはインスタンスです。これは、人などの実世界のエンティティ、または変数や定数などのプログラミングエンティティを表します。たとえば、アカウントと学生は実際のエンティティの例です。しかし、コンピューターのハードウェアおよびソフトウェアコンポーネントは、プログラミングエンティティの例です。
オブジェクトには次の3つの主な特徴があります-
- 状態があります。
- 独自のアイデンティティを持っています。
- 動作を表示する場合と表示しない場合があります。
オブジェクトの状態は、属性とその値のセットとして説明できます。たとえば、銀行口座には、口座番号、名前、口座タイプ、残高、およびこれらすべての属性の値などの一連の属性があります。オブジェクトの動作とは、一定期間にその属性で発生する変更を指します。
各オブジェクトには、他のオブジェクトと区別するために使用できる一意のIDがあります。2つのオブジェクトは同じ動作を示し、同じ状態である場合とそうでない場合がありますが、同じIDを持つことはありません。2人の名前、年齢、性別は同じでもかまいませんが、同じではありません。同様に、オブジェクトのIDは、その存続期間を通じて変更されることはありません。
オブジェクトは、メッセージを送信することによって相互作用できます。オブジェクトには、データとデータを操作するためのコードが含まれています。オブジェクトは、クラスを使用してユーザー定義のデータ型として使用することもできます。オブジェクトは、型クラスの変数とも呼ばれます。クラスを定義した後、そのクラスに属するオブジェクトをいくつでも作成できます。各オブジェクトは、それが作成された型クラスのデータに関連付けられています。
オブジェクトの作成
オブジェクトの作成には通常、次の手順が含まれます-
クラスを参照して参照変数を作成します。構文は-
DATA: <object_name> TYPE REF TO <class_name>.
参照変数からオブジェクトを作成します。構文は-
CREATE Object: <object_name>.
例
REPORT ZDEMO_OBJECT.
CLASS Class1 Definition.
Public Section.
DATA: text1(45) VALUE 'ABAP Objects.'.
METHODS: Display1.
ENDCLASS.
CLASS Class1 Implementation.
METHOD Display1.
Write:/ 'This is the Display method.'.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
DATA: Class1 TYPE REF TO Class1.
CREATE Object: Class1.
Write:/ Class1->text1.
CALL METHOD: Class1->Display1.
上記のコードは次の出力を生成します-
ABAP Objects.
This is the Display method.
クラスはオブジェクトの形式を指定するために使用され、データ表現とそのデータを操作するためのメソッドを1つのきちんとしたパッケージに結合します。クラス内のデータと関数は呼び出されますmembers of the class。
クラスの定義と実装
クラスを定義するときは、データ型の青写真を定義します。これは実際にはデータを定義しませんが、クラス名の意味、クラスのオブジェクトの構成、およびそのようなオブジェクトに対して実行できる操作を定義します。つまり、属性、フィールド、プロパティなど、オブジェクトの抽象的な特性を定義します。
次の構文は、クラスを定義する方法を示しています-
CLASS <class_name> DEFINITION.
..........
..........
ENDCLASS.
クラス定義は、キーワードCLASSで始まり、その後にクラス名、DEFINITION、およびクラス本体が続きます。クラスの定義には、属性、メソッド、イベントなど、クラスのさまざまなコンポーネントを含めることができます。クラス宣言でメソッドを宣言するときは、メソッドの実装をクラスの実装に含める必要があります。次の構文は、クラスを実装する方法を示しています-
CLASS <class_name> IMPLEMENTATION.
...........
..........
ENDCLASS.
Note−クラスの実装には、そのすべてのメソッドの実装が含まれます。ABAPオブジェクトでは、クラスの構造には、属性、メソッド、イベント、タイプ、定数などのコンポーネントが含まれています。
属性
属性は、C、I、F、Nなどの任意のデータ型を持つことができるクラスのデータフィールドです。これらはクラス宣言で宣言されます。これらの属性は、インスタンス属性と静的属性の2つのカテゴリに分類できます。アンinstance attributeオブジェクトのインスタンス固有の状態を定義します。状態はオブジェクトごとに異なります。インスタンス属性は、DATAステートメントを使用して宣言されます。
Static attributesクラスのすべてのインスタンスによって共有されるクラスの共通の状態を定義します。つまり、クラスの1つのオブジェクトで静的属性を変更すると、その変更はクラスの他のすべてのオブジェクトにも表示されます。静的属性は、CLASS-DATAステートメントを使用して宣言されます。
メソッド
メソッドは、クラス内のオブジェクトの動作を表す関数またはプロシージャです。クラスのメソッドは、クラスの任意の属性にアクセスできます。メソッドの定義にパラメーターを含めることもできるため、メソッドが呼び出されたときにこれらのパラメーターに値を指定できます。メソッドの定義はクラス宣言で宣言され、クラスの実装部分に実装されます。METHODステートメントとENDMETHODステートメントは、メソッドの実装部分を定義するために使用されます。次の構文は、メソッドを実装する方法を示しています-
METHOD <m_name>.
..........
..........
ENDMETHOD.
この構文では、<m_name>はメソッドの名前を表します。 Note − CALLMETHODステートメントを使用してメソッドを呼び出すことができます。
属性とメソッドへのアクセス
クラスコンポーネントは、これらのコンポーネントへのアクセス方法を制御するパブリック、プライベート、または保護された可視性セクションで定義できます。プライベート可視性セクションは、クラス外からのコンポーネントへのアクセスを拒否するために使用されます。このようなコンポーネントには、メソッドなどのクラス内からのみアクセスできます。
公開可視性セクションで定義されたコンポーネントには、任意のコンテキストからアクセスできます。デフォルトでは、クラスのすべてのメンバーはプライベートになります。実際には、次のプログラムに示すように、クラスの外部から呼び出すことができるように、プライベートセクションでデータを定義し、パブリックセクションで関連するメソッドを定義します。
クラスのパブリックセクションで宣言された属性とメソッドは、そのクラスと、プログラムのサブクラスである他のクラスからアクセスできます。
属性とメソッドがクラスのProtectedセクションで宣言されている場合、それらにはそのクラスとサブクラス(派生クラス)からのみアクセスできます。
属性とメソッドがクラスのPrivateセクションで宣言されている場合、それらにはそのクラスのみがアクセスでき、他のクラスはアクセスできません。
例
Report ZAccess1.
CLASS class1 Definition.
PUBLIC Section.
Data: text1 Type char25 Value 'Public Data'.
Methods meth1.
PROTECTED Section.
Data: text2 Type char25 Value 'Protected Data'.
PRIVATE Section.
Data: text3 Type char25 Value 'Private Data'.
ENDCLASS.
CLASS class1 Implementation.
Method meth1.
Write: / 'Public Method:',
/ text1,
/ text2,
/ text3.
Skip.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data: Objectx Type Ref To class1.
Create Object: Objectx.
CALL Method: Objectx→meth1.
Write: / Objectx→text1.
上記のコードは次の出力を生成します-
Public Method:
Public Data
Protected Data
Private Data
Public Data
静的属性
静的属性は、ステートメントCLASS-DATAで宣言されます。すべてのオブジェクトまたはインスタンスは、クラスの静的属性を使用できます。静的属性には、class_name⇒name_1= 'SomeText'のようなクラス名を使用して直接アクセスします。
例
以下は、行番号4〜8回のテキストを印刷したいプログラムです。クラスclass1を定義し、パブリックセクションでCLASS-DATA(静的属性)とメソッドを宣言します。クラスとメソッドを実装した後、Start-Of-Selectionイベントの静的属性に直接アクセスします。次に、クラスのインスタンスを作成し、メソッドを呼び出します。
Report ZStatic1.
CLASS class1 Definition.
PUBLIC Section.
CLASS-DATA: name1 Type char45,
data1 Type I.
Methods: meth1.
ENDCLASS.
CLASS class1 Implementation.
Method meth1.
Do 4 Times.
data1 = 1 + data1.
Write: / data1, name1.
EndDo.
Skip.
EndMethod.
ENDCLASS.
Start-Of-Selection.
class1⇒name1 = 'ABAP Object Oriented Programming'.
class1⇒data1 = 0.
Data: Object1 Type Ref To class1,
Object2 Type Ref To class1.
Create Object: Object1, Object2.
CALL Method: Object1→meth1,
Object2→meth1.
上記のコードは次の出力を生成します-
コンストラクター
コンストラクターは、オブジェクトの作成中またはクラスのコンポーネントへのアクセス中に自動的に呼び出される特別なメソッドです。コンストラクターはオブジェクトが作成されるたびにトリガーされますが、一般的なメソッドをトリガーするにはメソッドを呼び出す必要があります。次の例では、2つのパブリックメソッドmethod1とコンストラクターを宣言しています。これらの方法はどちらも操作が異なります。クラスのオブジェクトを作成している間、コンストラクターメソッドはその操作をトリガーします。
例
Report ZConstructor1.
CLASS class1 Definition.
PUBLIC Section.
Methods: method1, constructor.
ENDCLASS.
CLASS class1 Implementation.
Method method1.
Write: / 'This is Method1'.
EndMethod.
Method constructor.
Write: / 'Constructor Triggered'.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data Object1 Type Ref To class1.
Create Object Object1.
上記のコードは次の出力を生成します-
Constructor Triggered
メソッドのME演算子
クラスのパブリックセクションで任意の型の変数を宣言すると、他の実装で使用できます。変数は、パブリックセクションで初期値を使用して宣言できます。異なる値を持つメソッド内で変数を再度宣言する場合があります。メソッド内に変数を書き込むと、システムは変更された値を出力します。変数の以前の値を反映するには、「ME」演算子を使用する必要があります。
このプログラムでは、パブリック変数text1を宣言し、値で開始しました。同じ変数を再度宣言しましたが、異なる値でインスタンス化されています。メソッド内では、以前に開始された値を取得するために、「ME」演算子を使用してその変数を記述しています。直接宣言することで変更値を取得します。
例
Report ZMEOperator1.
CLASS class1 Definition.
PUBLIC Section.
Data text1 Type char25 Value 'This is CLASS Attribute'.
Methods method1.
ENDCLASS.
CLASS class1 Implementation.
Method method1.
Data text1 Type char25 Value 'This is METHOD Attribute'.
Write: / ME→text1,
/ text1.
ENDMethod.
ENDCLASS.
Start-Of-Selection.
Data objectx Type Ref To class1.
Create Object objectx.
CALL Method objectx→method1.
上記のコードは次の出力を生成します-
This is CLASS Attribute
This is METHOD Attribute
オブジェクト指向プログラミングで最も重要な概念の1つは、継承の概念です。継承により、別のクラスの観点からクラスを定義できるため、アプリケーションの作成と保守が容易になります。これは、コード機能と迅速な実装時間を再利用する機会も提供します。
クラスを作成するとき、プログラマーは、完全に新しいデータメンバーとメソッドを作成する代わりに、新しいクラスが既存のクラスのメンバーを継承するように指定できます。この既存のクラスは、base class または super class、および新しいクラスは、 derived class または sub class。
あるクラスのオブジェクトは、別のクラスのプロパティを取得できます。
派生クラスは、スーパークラスのデータとメソッドを継承します。ただし、メソッドを上書きしたり、新しいメソッドを追加したりすることもできます。
継承の主な利点は再利用性です。
継承関係は、クラス定義ステートメントに「INHERITINGFROM」を追加して指定します。
以下は構文です-
CLASS <subclass> DEFINITION INHERITING FROM <superclass>.
例
Report ZINHERITAN_1.
CLASS Parent Definition.
PUBLIC Section.
Data: w_public(25) Value 'This is public data'.
Methods: ParentM.
ENDCLASS.
CLASS Child Definition Inheriting From Parent.
PUBLIC Section.
Methods: ChildM.
ENDCLASS.
CLASS Parent Implementation.
Method ParentM.
Write /: w_public.
EndMethod. ENDCLASS.
CLASS Child Implementation.
Method ChildM.
Skip.
Write /: 'Method in child class', w_public.
EndMethod.
ENDCLASS.
Start-of-selection.
Data: Parent Type Ref To Parent,
Child Type Ref To Child.
Create Object: Parent, Child.
Call Method: Parent→ParentM,
child→ChildM.
上記のコードは次の出力を生成します-
This is public data
Method in child class
This is public data
アクセス制御と継承
派生クラスは、その基本クラスのすべての非プライベートメンバーにアクセスできます。したがって、サブクラスのメンバー関数にアクセスできないスーパークラスメンバーは、スーパークラスでプライベートとして宣言する必要があります。次の方法で、誰がアクセスできるかによって、さまざまなアクセスタイプを要約できます。
アクセス | 公衆 | 保護されています | 民間 |
---|---|---|---|
同じcalss | はい | はい | はい |
派生クラス | はい | はい | 番号 |
クラス外 | はい | 番号 | 番号 |
スーパークラスからクラスを派生させる場合、パブリック、プロテクト、またはプライベートの継承を通じて継承できます。継承のタイプは、上記で説明したようにアクセス指定子によって指定されます。保護継承やプライベート継承はほとんど使用しませんが、パブリック継承が一般的に使用されます。次のルールは、さまざまなタイプの継承を使用するときに適用されます。
Public Inheritance−パブリックスーパークラスからクラスを派生させる場合、スーパークラスのパブリックメンバーはサブクラスのパブリックメンバーになり、スーパークラスの保護されたメンバーはサブクラスの保護されたメンバーになります。スーパークラスのプライベートメンバーは、サブクラスから直接アクセスすることはできませんが、スーパークラスのパブリックメンバーおよび保護されたメンバーへの呼び出しを通じてアクセスできます。
Protected Inheritance −保護されたスーパークラスから派生する場合、スーパークラスのパブリックメンバーと保護されたメンバーは、サブクラスの保護されたメンバーになります。
Private Inheritance −プライベートスーパークラスから派生する場合、スーパークラスのパブリックメンバーと保護されたメンバーはサブクラスのプライベートメンバーになります。
サブクラスのメソッドの再定義
スーパークラスのメソッドは、サブクラスで再実装できます。メソッドを再定義するいくつかのルール-
継承されたメソッドの再定義ステートメントは、元のメソッドの定義と同じセクションにある必要があります。
メソッドを再定義する場合、サブクラスにそのインターフェイスを再度入力する必要はなく、メソッドの名前のみを入力する必要があります。
再定義されたメソッド内で、スーパー参照を使用して直接スーパークラスのコンポーネントにアクセスできます。
疑似参照superは、再定義されたメソッドでのみ使用できます。
例
Report Zinheri_Redefine.
CLASS super_class Definition.
Public Section.
Methods: Addition1 importing g_a TYPE I
g_b TYPE I
exporting g_c TYPE I.
ENDCLASS.
CLASS super_class Implementation.
Method Addition1.
g_c = g_a + g_b.
EndMethod.
ENDCLASS.
CLASS sub_class Definition Inheriting From super_class.
Public Section.
METHODS: Addition1 Redefinition.
ENDCLASS.
CLASS sub_class Implementation.
Method Addition1.
g_c = g_a + g_b + 10.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Parameters: P_a Type I, P_b TYPE I.
Data: H_Addition1 TYPE I.
Data: H_Sub TYPE I.
Data: Ref1 TYPE Ref TO sub_class.
Create Object Ref1.
Call Method Ref1→Addition1 exporting g_a = P_a
g_b = P_b
Importing g_c = H_Addition1.
Write:/ H_Addition1.
F8を実行した後、値9と10を入力すると、上記のコードは次の出力を生成します。
Redefinition Demo
29
ポリモーフィズムという用語は、文字通り「多くの形式」を意味します。オブジェクト指向の観点からは、ポリモーフィズムは継承と連携して機能し、継承ツリー内のさまざまなタイプを交換可能に使用できるようにします。つまり、ポリモーフィズムは、クラスの階層があり、それらが継承によって関連付けられている場合に発生します。ABAPポリモーフィズムとは、メソッドを呼び出すと、そのメソッドを呼び出すオブジェクトのタイプに応じて、異なるメソッドが実行されることを意味します。
次のプログラムには、抽象クラス 'class_prgm'、2つのサブクラス(class_proceduralおよびclass_OO)、およびテストドライバークラス 'class_type_approach'が含まれています。この実装では、クラスメソッド 'start'を使用して、プログラミングのタイプとそのアプローチを表示できます。メソッド「start」のシグニチャをよく見ると、class_prgm型のインポートパラメータを受け取っていることがわかります。ただし、Start-Of-Selectionイベントでは、このメソッドは実行時にclass_procedural型とclass_OO型のオブジェクトで呼び出されています。
例
Report ZPolymorphism1.
CLASS class_prgm Definition Abstract.
PUBLIC Section.
Methods: prgm_type Abstract,
approach1 Abstract.
ENDCLASS.
CLASS class_procedural Definition
Inheriting From class_prgm.
PUBLIC Section.
Methods: prgm_type Redefinition,
approach1 Redefinition.
ENDCLASS.
CLASS class_procedural Implementation.
Method prgm_type.
Write: 'Procedural programming'.
EndMethod. Method approach1.
Write: 'top-down approach'.
EndMethod. ENDCLASS.
CLASS class_OO Definition
Inheriting From class_prgm.
PUBLIC Section.
Methods: prgm_type Redefinition,
approach1 Redefinition.
ENDCLASS.
CLASS class_OO Implementation.
Method prgm_type.
Write: 'Object oriented programming'.
EndMethod.
Method approach1.
Write: 'bottom-up approach'.
EndMethod.
ENDCLASS.
CLASS class_type_approach Definition.
PUBLIC Section.
CLASS-METHODS:
start Importing class1_prgm
Type Ref To class_prgm.
ENDCLASS.
CLASS class_type_approach IMPLEMENTATION.
Method start.
CALL Method class1_prgm→prgm_type.
Write: 'follows'.
CALL Method class1_prgm→approach1.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data: class_1 Type Ref To class_procedural,
class_2 Type Ref To class_OO.
Create Object class_1.
Create Object class_2.
CALL Method class_type_approach⇒start
Exporting
class1_prgm = class_1.
New-Line.
CALL Method class_type_approach⇒start
Exporting
class1_prgm = class_2.
上記のコードは次の出力を生成します-
Procedural programming follows top-down approach
Object oriented programming follows bottom-up approach
ABAPランタイム環境は、インポートパラメータclass1_prgmの割当中に暗黙的なナローイングキャストを実行します。この機能は、「start」メソッドを一般的に実装するのに役立ちます。オブジェクト参照変数に関連付けられた動的タイプ情報により、ABAPランタイム環境は、オブジェクト参照変数が指すオブジェクトで定義された実装にメソッド呼び出しを動的にバインドすることができます。たとえば、「class_type_approach」クラスのメソッド「start」のインポートパラメータ「class1_prgm」は、それ自体ではインスタンス化できない抽象型を参照しています。
class_proceduralやclass_OOなどの具象サブクラス実装でメソッドが呼び出されると、class1_prgm参照パラメーターの動的型がこれらの具象型の1つにバインドされます。したがって、メソッド 'prgm_type'および 'approach1'の呼び出しは、クラス 'class_prgm'で提供される未定義の抽象実装ではなく、class_proceduralまたはclass_OOサブクラスで提供される実装を参照します。
カプセル化は、オブジェクト指向プログラミング(OOP)の概念であり、データとデータを操作する関数を結合し、外部からの干渉や誤用から保護します。データのカプセル化は、データ隠蔽という重要なOOPの概念につながりました。カプセル化は、データとそれを使用する関数をバンドルするメカニズムであり、データの抽象化は、インターフェイスのみを公開し、実装の詳細をユーザーから隠すメカニズムです。
ABAPは、クラスと呼ばれるユーザー定義型の作成を通じて、カプセル化とデータ隠蔽のプロパティをサポートします。前に説明したように、クラスにはプライベート、保護、およびパブリックのメンバーを含めることができます。デフォルトでは、クラスで定義されているすべてのアイテムはプライベートです。
インターフェイスによるカプセル化
カプセル化とは、実際には、1つの属性とメソッドを異なるクラスで変更できることを意味します。したがって、データとメソッドは、クラスを分離するために非表示にできるさまざまな形式とロジックを持つことができます。
インターフェイスによるカプセル化について考えてみましょう。インターフェイスは、異なるクラスで異なる機能を持つ1つのメソッドを作成する必要がある場合に使用されます。ここでは、メソッドの名前を変更する必要はありません。同じメソッドを異なるクラス実装に実装する必要があります。
例
次のプログラムには、インターフェイスinter_1が含まれています。属性とメソッドmethod1を宣言しました。Class1とClass2のような2つのクラスも定義しました。したがって、両方のクラス実装でメソッド 'method1'を実装する必要があります。メソッド 'method1'は、クラスごとに異なる方法で実装されています。選択の開始では、2つのクラスに対して2つのオブジェクトObject1とObject2を作成します。次に、さまざまなオブジェクトによってメソッドを呼び出して、別々のクラスで宣言された関数を取得します。
Report ZEncap1.
Interface inter_1.
Data text1 Type char35.
Methods method1.
EndInterface.
CLASS Class1 Definition.
PUBLIC Section.
Interfaces inter_1.
ENDCLASS.
CLASS Class2 Definition.
PUBLIC Section.
Interfaces inter_1.
ENDCLASS.
CLASS Class1 Implementation.
Method inter_1~method1.
inter_1~text1 = 'Class 1 Interface method'.
Write / inter_1~text1.
EndMethod.
ENDCLASS.
CLASS Class2 Implementation.
Method inter_1~method1.
inter_1~text1 = 'Class 2 Interface method'.
Write / inter_1~text1.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data: Object1 Type Ref To Class1,
Object2 Type Ref To Class2.
Create Object: Object1, Object2.
CALL Method: Object1→inter_1~method1,
Object2→inter_1~method1.
上記のコードは次の出力を生成します-
Class 1 Interface method
Class 2 Interface method
カプセル化されたクラスには、外界への依存関係はあまりありません。さらに、外部クライアントとのやり取りは、安定したパブリックインターフェイスを介して制御されます。つまり、カプセル化されたクラスとそのクライアントは疎結合されています。ほとんどの場合、明確に定義されたインターフェースを持つクラスは、別のコンテキストにプラグインできます。正しく設計されると、カプセル化されたクラスは再利用可能なソフトウェア資産になります。
設計戦略
私たちのほとんどは、本当に公開する必要がない限り、デフォルトでクラスメンバーをプライベートにすることを苦い経験から学びました。それはちょうど良いカプセル化です。この知恵はデータメンバーに最も頻繁に適用され、すべてのメンバーにも等しく適用されます。
ABAPのクラスと同様に、インタフェースはオブジェクトのデータ型として機能します。インターフェイスのコンポーネントは、クラスのコンポーネントと同じです。クラスの宣言とは異なり、インターフェイスの宣言には可視性セクションが含まれていません。これは、インターフェイスの宣言で定義されたコンポーネントが常にクラスのパブリック可視性セクションに統合されているためです。
インターフェイスは、2つの類似したクラスに同じ名前のメソッドがあるが、機能が互いに異なる場合に使用されます。インターフェイスはクラスに似ているように見えるかもしれませんが、インターフェイスで定義された関数は、そのクラスのスコープを拡張するためにクラスに実装されます。継承機能を備えたインターフェースは、ポリモーフィズムの基盤を提供します。これは、インターフェイスで定義されたメソッドがクラスごとに異なる動作をする可能性があるためです。
以下は、インターフェースを作成するための一般的な形式です。
INTERFACE <intf_name>.
DATA.....
CLASS-DATA.....
METHODS.....
CLASS-METHODS.....
ENDINTERFACE.
この構文では、<intf_name>はインターフェースの名前を表します。DATAステートメントとCLASSDATAステートメントを使用して、インターフェースのインスタンス属性と静的属性をそれぞれ定義できます。METHODSステートメントとCLASS-METHODSステートメントを使用して、インターフェイスのインスタンスメソッドと静的メソッドをそれぞれ定義できます。インターフェイスの定義には実装クラスが含まれていないため、インターフェイスの宣言にDEFINITION句を追加する必要はありません。
Note−インターフェースのすべてのメソッドは抽象的です。それらはパラメータインターフェイスを含めて完全に宣言されていますが、インターフェイスには実装されていません。インターフェイスを使用するすべてのクラスは、インターフェイスのすべてのメソッドを実装する必要があります。それ以外の場合、クラスは抽象クラスになります。
クラスの実装部分で次の構文を使用します-
INTERFACE <intf_name>.
この構文では、<intf_name>はインターフェースの名前を表します。この構文は、クラスのパブリックセクションで使用する必要があることに注意してください。
次の構文は、クラスの実装内でインターフェイスのメソッドを実装するために使用されます-
METHOD <intf_name~method_m>.
<statements>.
ENDMETHOD.
この構文では、<intf_name〜method_m>は、<intf_name>インターフェースのメソッドの完全に宣言された名前を表します。
例
Report ZINTERFACE1.
INTERFACE my_interface1.
Methods msg.
ENDINTERFACE.
CLASS num_counter Definition.
PUBLIC Section.
INTERFACES my_interface1.
Methods add_number.
PRIVATE Section.
Data num Type I.
ENDCLASS.
CLASS num_counter Implementation.
Method my_interface1~msg.
Write: / 'The number is', num.
EndMethod.
Method add_number.
ADD 7 TO num.
EndMethod.
ENDCLASS.
CLASS drive1 Definition.
PUBLIC Section.
INTERFACES my_interface1.
Methods speed1.
PRIVATE Section.
Data wheel1 Type I.
ENDCLASS.
CLASS drive1 Implementation.
Method my_interface1~msg.
Write: / 'Total number of wheels is', wheel1.
EndMethod.
Method speed1.
Add 4 To wheel1.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data object1 Type Ref To num_counter.
Create Object object1.
CALL Method object1→add_number.
CALL Method object1→my_interface1~msg.
Data object2 Type Ref To drive1.
Create Object object2.
CALL Method object2→speed1.
CALL Method object2→my_interface1~msg.
上記のコードは次の出力を生成します-
The number is 7
Total number of wheels is 4
上記の例では、my_interface1は「msg」メソッドを含むインターフェースの名前です。次に、num_counterとdrive1の2つのクラスが定義され、実装されます。これらのクラスは両方とも、「msg」メソッドと、add_numberメソッドやspeed1メソッドなど、それぞれのインスタンスの動作を定義する特定のメソッドを実装しています。
Note − add_numberメソッドとspeed1メソッドは、それぞれのクラスに固有です。
アン event他のクラスのイベントハンドラーをトリガーするためにクラスで定義される結果のセットです。イベントがトリガーされると、任意の数のイベントハンドラーメソッドを呼び出すことができます。トリガーとそのハンドラーメソッド間のリンクは、実際には実行時に動的に決定されます。
通常のメソッド呼び出しでは、呼び出し側プログラムが、オブジェクトまたはクラスのどのメソッドを呼び出す必要があるかを判別します。固定ハンドラーメソッドはすべてのイベントに登録されているわけではないため、イベント処理の場合、ハンドラーメソッドはトリガーする必要のあるイベントを決定します。
クラスのイベントは、RAISE EVENTステートメントを使用して、同じクラスのイベントハンドラーメソッドをトリガーできます。イベントの場合、次の構文に示すように、FOR EVENT句を使用して、イベントハンドラメソッドを同じクラスまたは異なるクラスで定義できます。
FOR EVENT <event_name> OF <class_name>.
クラスのメソッドと同様に、イベントにはパラメーターインターフェイスを含めることができますが、出力パラメーターのみがあります。出力パラメーターは、入力パラメーターとして受け取るRAISEEVENTステートメントによってイベントハンドラーメソッドに渡されます。イベントは、SET HANDLERステートメントを使用して、プログラム内でそのハンドラーメソッドに動的にリンクされます。
イベントがトリガーされると、適切なイベントハンドラメソッドがすべての処理クラスで実行されることになっています。
例
REPORT ZEVENT1.
CLASS CL_main DEFINITION.
PUBLIC SECTION.
DATA: num1 TYPE I.
METHODS: PRO IMPORTING num2 TYPE I.
EVENTS: CUTOFF.
ENDCLASS.
CLASS CL_eventhandler DEFINITION.
PUBLIC SECTION.
METHODS: handling_CUTOFF FOR EVENT CUTOFF OF CL_main.
ENDCLASS.
START-OF-SELECTION.
DATA: main1 TYPE REF TO CL_main.
DATA: eventhandler1 TYPE REF TO CL_eventhandler.
CREATE OBJECT main1.
CREATE OBJECT eventhandler1.
SET HANDLER eventhandler1→handling_CUTOFF FOR main1.
main1→PRO( 4 ).
CLASS CL_main IMPLEMENTATION.
METHOD PRO.
num1 = num2.
IF num2 ≥ 2.
RAISE EVENT CUTOFF.
ENDIF.
ENDMETHOD.
ENDCLASS.
CLASS CL_eventhandler IMPLEMENTATION.
METHOD handling_CUTOFF.
WRITE: 'Handling the CutOff'.
WRITE: / 'Event has been processed'.
ENDMETHOD. ENDCLASS.
上記のコードは次の出力を生成します-
Handling the CutOff
Event has been processed
A report組織化された構造でのデータの表示です。多くのデータベース管理システムには、レポートの設計と生成を可能にするレポートライターが含まれています。SAPアプリケーションは、レポートの作成をサポートしています。
従来のレポートは、ループ内のWRITEステートメントの出力データを使用して作成されます。サブレポートは含まれていません。SAPは、クライアント間でテーブルをコピーするために使用されるRSCLTCOPやインスタンスパラメータを表示するために使用されるRSPARAMなどのいくつかの標準レポートも提供します。
これらのレポートは、出力として1つの画面のみで構成されます。INITIALIZATONやTOP-OF-PAGEなどのさまざまなイベントを使用してクラシックレポートを作成できます。各イベントは、クラシックレポートの作成時に独自の重要性を持っています。これらの各イベントは特定のユーザーアクションに関連付けられており、ユーザーがそのアクションを実行したときにのみトリガーされます。
以下は、イベントと説明を説明する表です-
S.No. | イベントと説明 |
---|---|
1 | INITIALIZATON 選択画面を表示する前にトリガーされます。 |
2 | AT SELECTION-SCREEN 選択画面でのユーザー入力の処理後にトリガーされます。このイベントは、プログラムの実行前にユーザー入力を確認します。ユーザー入力を処理した後、選択画面はアクティブモードのままになります。 |
3 | START-OF-SELECTION 選択画面の処理が終了した後にのみトリガーされます。つまり、ユーザーが選択画面の[実行]アイコンをクリックしたときです。 |
4 | END-OF-SELECTION START-OF-SELECTONイベントの最後のステートメントが実行された後にトリガーされます。 |
5 | TOP-OF-PAGE 新しいページにデータを表示するための最初のWRITEステートメントによってトリガーされます。 |
6 | END-OF-PAGE レポートのページの最後にテキストを表示するようにトリガーされます。このイベントはレポート作成中の最後のイベントであり、REPORTステートメントのLINE-COUNT句と組み合わせる必要があることに注意してください。 |
例
古典的なレポートを作成しましょう。ABAPエディタで一連のステートメントを使用して、標準データベースMARA(一般品目データを含む)に保存されている情報を表示します。
REPORT ZREPORT2
LINE-SIZE 75
LINE-COUNT 30(3)
NO STANDARD PAGE HEADING.
Tables: MARA.
TYPES: Begin of itab,
MATNR TYPE MARA-MATNR,
MBRSH TYPE MARA-MBRSH,
MEINS TYPE MARA-MEINS,
MTART TYPE MARA-MTART,
End of itab.
DATA: wa_ma TYPE itab,
it_ma TYPE STANDARD TABLE OF itab.
SELECT-OPTIONS: MATS FOR MARA-MATNR OBLIGATORY.
INITIALIZATION.
MATS-LOW = '1'.
MATS-HIGH = '500'.
APPEND MATS.
AT SELECTION-SCREEN. .
IF MATS-LOW = ' '.
MESSAGE I000(ZKMESSAGE).
ELSEIF MATS-HIGH = ' '.
MESSAGE I001(ZKMESSAGE).
ENDIF.
TOP-OF-PAGE.
WRITE:/ 'CLASSICAL REPORT CONTAINING GENERAL MATERIAL DATA
FROM THE TABLE MARA' COLOR 7.
ULINE.
WRITE:/ 'MATERIAL' COLOR 1,
24 'INDUSTRY' COLOR 2,
38 'UNITS' COLOR 3,
53 'MATERIAL TYPE' COLOR 4.
ULINE.
END-OF-PAGE.
START-OF-SELECTION.
SELECT MATNR MBRSH MEINS MTART FROM MARA
INTO TABLE it_ma WHERE MATNR IN MATS.
LOOP AT it_ma into wa_ma.
WRITE:/ wa_ma-MATNR,
25 wa_ma-MBRSH,
40 wa_ma-MEINS,
55 wa_ma-MTART.
ENDLOOP.
END-OF-SELECTION.
ULINE.
WRITE:/ 'CLASSICAL REPORT HAS BEEN CREATED' COLOR 7.
ULINE.
SKIP.
上記のコードは、標準テーブルMARA-からの一般的な材料データを含む次の出力を生成します。
ダイアログプログラミングは、複数のオブジェクトの開発を扱います。これらのオブジェクトはすべてメインプログラムに階層的にリンクされており、順番に実行されます。ダイアログプログラム開発では、ABAPワークベンチのツールを利用します。これらは、標準のSAPアプリケーション開発で使用されるものと同じツールです。
ダイアログプログラムの主なコンポーネントは次のとおりです-
- Screens
- モジュールプール
- Subroutines
- Menus
- Transactions
ツールセット
ダイアログプログラムは、各オブジェクトを明示的に指定しなくてもすべてのオブジェクトがメインプログラムにリンクされるように、オブジェクトブラウザ(トランザクション:SE80)で開発する必要があります。高度なナビゲーション技術は、あるオブジェクトから別のオブジェクトに移動するプロセスを強化します。
画面は、画面属性、画面レイアウト、フィールド、およびフローロジックで構成されています。モジュールプールは、ダイアログプログラムのインクルードプログラム内に配置されるモジュール化された構文で構成されます。これらのモジュールは、ダイアログプロセッサによって処理されるフローロジックによって呼び出すことができます。
新しいダイアログプログラムの作成
Step 1 −トランザクションSE80内で、ドロップダウンから 'プログラム'を選択し、カスタムSAPプログラムのZ名を 'ZSCREENEX'として入力します。
Step 2 − Enterキーを押し、「With TOP INCL」を選択して、「Yes」ボタンをクリックします。
Step 3 −トップインクルードの名前を「ZSCRTOP」と入力し、緑色のチェックマークをクリックします。
Step 4 −属性画面で、タイトルを入力して保存ボタンをクリックするだけです。
ダイアログプログラムへの画面の追加
Step 1 −プログラムに画面を追加するには、プログラム名を右クリックして、[作成]→[画面]オプションを選択します。
Step 2 −画面番号を「0211」と入力し、緑色のチェックマークをクリックします。
Step 3 −次の画面で、短いタイトルを入力し、通常の画面タイプに設定して、上部のアプリケーションツールバーの[保存]ボタンをクリックします。
画面レイアウトと「HelloWorld」テキストの追加
Step 1 −アプリケーションツールバー内のレイアウトボタンをクリックすると、スクリーンペインタウィンドウが表示されます。
Step 2 −テキストフィールドを追加し、「HelloWorld」などのテキストを入力します。
Step 3 −画面を保存してアクティブにします。
トランザクションの作成
Step 1 −プログラムのトランザクションコードを作成するには、プログラム名を右クリックして[作成]→[トランザクション]オプションを選択し、トランザクションコードを「ZTRANEX」として入力します。
Step 2 −作成したトランザクションテキスト、プログラム、および画面(ZSCREENEX&0211)を入力し、[GUIサポート]セクションの[SAPGUI forWindows]チェックボックスをオンにします。
プログラムの実行
すべてを保存してアクティブ化します。プログラムを実行できます。プログラムが実行されると、入力したテキストが次のスクリーンショットに示すように画面に表示されます。
SAP Smart Formsツールを使用して、ドキュメントを印刷および送信できます。このツールは、インターネット用のフォーム、PDFファイル、電子メール、およびドキュメントの開発に役立ちます。このツールは、フォームのレイアウトとロジックを構築および維持するためのインターフェイスを提供します。SAPは、顧客関係管理(CRM)、販売管理(SD)、財務会計(FI)、人事(HR)などで使用されるビジネスプロセス用のフォームも提供しています。
このツールを使用すると、プログラミングツールを使用する代わりに、単純なグラフィカルツールを使用してフォームを変更できます。つまり、プログラミングの知識がないユーザーでも、ビジネスプロセスのデータを使用してこれらのフォームを簡単に構成できます。
スマートフォームでは、データは静的テーブルと動的テーブルから取得されます。テーブルの見出しと小計は、トリガーされたイベントによって指定され、データは最終出力の前に並べ替えられます。スマートフォームを使用すると、フォームの一部または背景として表示できるグラフィックを組み込むことができます。フォームの印刷中に必要に応じて、背景グラフィックを非表示にすることもできます。
SAPシステムで利用可能な標準のスマートフォームの例は次のとおりです。
SF_EXAMPLE_01は、顧客の航空券予約用のテーブル出力を含む請求書を表します。
SF_EXAMPLE_02は、SF_EXAMPLE_01と同様の請求書を表しますが、小計があります。
SF_EXAMPLE_03は、SF_EXAMPLE_02と同様の請求書を指定しますが、アプリケーションプログラムで複数の顧客を選択できる請求書です。
フォームの作成
SAP SmartFormsツールを使用してフォームを作成しましょう。このチュートリアルでは、スマートフォームにノードを追加し、フォームをテストする方法も学習します。ここでは、SF_EXAMPLE_01フォームのコピーを作成することから始めます。SF_EXAMPLE_01フォームは、SAPシステムで使用できる標準のスマートフォームです。
Step 1− Smart Form Builderは、スマートフォームの作成に使用されるメインインターフェイスです。SAPSmartFormsの第一画面で利用できます。SAP Smart Formsの初期画面を開くには、コマンドフィールドに「SMARTFORMS」トランザクションコードを入力する必要があります。この画面で、[フォーム]フィールドにフォーム名SF_EXAMPLE_01を入力します。
Step 2 − [スマートフォーム]→[コピー]を選択するか、[コピー]アイコンをクリックして、[フォームまたはテキストのコピー]ダイアログボックスを開きます。
Step 3− [ターゲットオブジェクト]フィールドに、新しいフォームの名前を入力します。名前はYまたはZ文字で始まる必要があります。この場合、フォームの名前は「ZSMM1」です。
Step 4 − [続行]アイコンをクリックするか、[フォームまたはテキストのコピー]ダイアログボックスでENTERキーを押して、ZSMM1フォームが事前定義されたフォームSF_EXAMPLE_01のコピーとして作成されるようにします。
Step 5− [保存]アイコンをクリックします。フォームの名前は、SAP SmartFormsの第一画面の[フォーム]フィールドに表示されます。
Step 6− SAP SmartFormsの第一画面で「作成」ボタンをクリックします。ZSMM1フォームがフォームビルダーに表示されます。
Step 7−最初のドラフトページはメインウィンドウで作成されます。新しいフォームのすべてのコンポーネントは、SF_EXAMPLE_01の事前定義されたフォームに基づいています。ナビゲーションメニューでノードをクリックするだけで、そのコンテンツを表示できます。
フォームにテキストノードを作成する
Step 1 − SAPフォームビルダ画面の変更モードでフォームを開き、最初のページノードのメインウィンドウオプションを右クリックして、コンテキストメニューから登録→テキストを選択します。
Step 2−「テキスト」フィールドのテキストを「My_Text」に変更し、「意味」フィールドのテキストを「Text_Demo」に変更します。次のスナップショットに示すように、FormBuilderの中央フレームのテキスト編集ボックスに「HelloTutorialsPoint .....」というテキストを入力します。
Step 3 − [保存]ボタンをクリックして、ノードを保存します。
Step 4− [アクティブ化]アイコンと[テスト]アイコンをそれぞれクリックして、ノードをアクティブ化してテストします。FunctionBuilderの第一画面が表示されます。
Step 5−有効化アイコンと実行アイコンをクリックして、汎用モジュールを有効化してテストします。汎用モジュールのパラメータは、汎用ビルダの第一画面に表示されます。
Step 6−実行アイコンをクリックして汎用モジュールを実行します。[印刷]ダイアログボックスが表示されます。
Step 7 −出力デバイスを「LP01」として指定し、[印刷プレビュー]ボタンをクリックします。
上記の手順により、次の出力が生成されます-
SAPシステムのSAPscriptツールを使用して、請求書や発注書などのビジネスフォームを作成および管理できます。SAPscriptツールは、ビジネスフォームの設計を大幅に簡素化する多数のテンプレートを提供します。
SAPシステムには、SAP標準クライアント(通常はクライアント000)とともに提供される標準SAPscriptフォームが付属しています。以下は、クライアント000で提供される標準のSAPscriptフォームのいくつかの例です。
S.No. | フォームの名前と説明 |
---|---|
1 | RVORDER01 受注確認書 |
2 | RVDELNOTE 包装内容明細書 |
3 | RVINVOICE01 請求書 |
4 | MEDRUCK 注文書 |
5 | F110_PRENUM_CHCK 事前番号付きチェック |
SAPscriptフォームの構造は、2つの主要コンポーネントで構成されています-
Content −これは、テキスト(ビジネスデータ)またはグラフィック(会社のロゴ)のいずれかです。
Layout −これは、フォームのコンテンツが表示される一連のウィンドウによって定義されます。
SAPscript –フォームペインターツール
フォームペインタツールは、SAPscriptフォームのグラフィカルなレイアウトと、フォームを操作するためのさまざまな機能を提供します。次の例では、標準のSAPscriptフォームRVINVOICE01からレイアウト構造をコピーした後に請求書フォームを作成し、フォームペインタツールにアクセスしてレイアウトを表示します。
Step 1−フォームペインターを開きます。SAPメニューをナビゲートするか、SE71トランザクションコードを使用して、画面をリクエストすることができます。
Step 2−フォームペインタのリクエスト画面で、SAPscriptフォームの名前と言語を[フォーム]フィールドと[言語]フィールドにそれぞれ入力します。これらのフィールドにそれぞれ「RVINVOICE01」と「EN」を入力してみましょう。
Step 3 − [サブオブジェクト]グループボックスの[ページレイアウト]ラジオボタンを選択します。
Step 4− [ユーティリティ]→[クライアントからコピー]を選択して、RVINVOICE01フォームのコピーを作成します。「クライアント間でフォームをコピー」画面が表示されます。
Step 5−「クライアント間でフォームをコピー」画面で、フォームの元の名前「RVINVOICE01」を「フォーム名」フィールドに入力し、ソースクライアントの番号「000」を「ソースクライアント」フィールドに入力し、ターゲットの名前を入力します。 [ターゲットフォーム]フィールドに「ZINV_01」としてフォームします。他の設定が変更されていないことを確認してください。
Step 6−次に、「クライアント間でフォームをコピー」画面の「実行」アイコンをクリックします。[オブジェクトディレクトリエントリの作成]ダイアログボックスが表示されます。保存アイコンをクリックします。
次のスナップショットに示すように、ZINV_01フォームはRVINVOICE01フォームからコピーされ、「クライアント間でフォームをコピー」画面に表示されます。
Step 7 −戻るアイコンを2回クリックし、コピーしたフォームZINV_01の名前が含まれているフォームペインタ:リクエスト画面に戻ります。
Step 8 − [表示]ボタンをクリックすると、次のスクリーンショットに示すように、[フォームZINV_01:ページFIRSTのレイアウト]ウィンドウと[フォーム:ページレイアウトの変更:ZINV_01]画面が表示されます。
Step 9−「フォームZINV_01:ページFIRSTのレイアウト」ウィンドウには、フォームの初期レイアウトが表示されます。フォームのレイアウトには、HEADER、ADDRESS、INFO、INFO1、およびMAINの5つのウィンドウが含まれています。これらのウィンドウの説明には、PCエディターでアクセスできます。
たとえば、メインウィンドウを選択し、[フォーム:ページレイアウトの変更:ZINV_01]画面のテキストアイコンをクリックするだけで、次のスクリーンショットに示すようにすべてのマージン値を表示できます。
得意先出口は、SAP標準プログラムへのフックと見なすことができます。コードを記述するためにアクセスキーは必要ありません。また、SAP標準プログラムを変更する必要もありません。これらの出口には機能がなく、空です。さまざまなクライアント要件を満たすために、ビジネスロジックを追加できます。ただし、カスタマー出口はすべてのプログラムで使用できるわけではありません。
標準トランザクションの得意先出口
以下は、標準トランザクションに関する限り、顧客出口を見つけるための手順です。MM01(品目マスタ作成)で利用可能な得意先出口を識別してみましょう。
Step 1 −トランザクションMM01に移動し、上のスクリーンショットに示すように、メニューバー→システム→ステータスに移動して、MM01のプログラム名を識別します。
Step 2−ポップアップ画面からプログラム名を取得します。プログラム名は「SAPLMGMM」です。
Step 3 −トランザクションSE38に移動し、プログラム名を入力して、照会をクリックします。
Step 4 − [移動]→[プロパティ]に移動し、このプログラム名のパッケージを見つけます。
パッケージ名は「MGA」です。
Step 5−得意先出口を識別するために通常使用されるトランザクションコードSMODに移動します。ユーティリティ→検索(または)に移動し、トランザクションコードSMODでCtrl + Fを直接押すことができます。
Step 6 −「出口の検索」画面に移動した後、前に取得したパッケージ名を入力し、F8(実行)ボタンを押します。
上記の手順により、マテリアルマスターの作成で使用可能な出口のリストを含む次の出力が生成されます。
標準のSAPエクストラクタが、権限や時間チェックなどで期待されるデータや必要な機能を提供しない場合、ユーザExitが抽出で使用されます。ユーザー出口は、販売管理(SD)モジュールで一般的に使用されます。SAPは、販売、輸送、出荷、請求の分野で多くの出口を提供しています。ユーザー出口は、標準SAPがすべての要件を満たすことができない場合にいくつかの変更を加えるように設計されています。
販売の各領域で使用可能な出口にアクセスできるようにするには、IMG→販売管理→システム変更→ユーザー出口のパスを使用してIMGに移動します。SDの領域の各出口のドキュメントが徹底的に説明されています。
たとえば、販売伝票処理(契約、見積、または受注)でユーザExitを検索する場合は、上記のパスに従って、販売→ユーザExitのノードユーザExitを展開し続けます。アイコンドキュメントをクリックして、販売ドキュメント処理で使用可能なすべてのユーザー出口を表示します。
S.No. | ユーザー出口と説明 |
---|---|
1 | USEREXIT_FIELD_MODIFICATION 画面属性を変更するために使用されます。 |
2 | USEREXIT_SAVE_DOCUMENT ユーザーが[保存]をクリックしたときに操作を実行するのに役立ちます。 |
3 | USEREXIT_SAVE_DOCUMENT_PREPARE 入力フィールドをチェックしたり、フィールドに任意の値を入力したり、ユーザーにポップアップを表示したり、ドキュメントを確認したりするのに非常に便利です。 |
4 | USEREXIT_MOVE_FIELD_TO_VBAK ユーザーヘッダーの変更がヘッダー作業領域に移動されるときに使用されます。 |
5 | USEREXIT_MOVE_FIELD_TO_VBAP ユーザーアイテムの変更がSAPアイテムの作業領域に移動されるときに使用されます。 |
ユーザExitは、カスタマExitと同じ目的を果たしますが、SDモジュールでのみ使用できます。出口は、汎用モジュールへの呼び出しとして実装されます。ユーザー出口は、SAP標準プログラムの変更です。
例
REPORT ZUSEREXIT1.
TABLES:
TSTC, TSTCT,
TADIR, TRDIR, TFDIR, ENLFDIR,
MODSAPT, MODACT.
DATA:
JTAB LIKE TADIR OCCURS 0 WITH HEADER LINE,
field1(30),
v_devclass LIKE TADIR-devclass.
PARAMETERS:
P_TCODE LIKE TSTC-tcode OBLIGATORY.
SELECT SINGLE *
FROM TSTC
WHERE tcode EQ P_TCODE.
IF SY-SUBRC EQ 0.
SELECT SINGLE *
FROM TADIR
WHERE pgmid = 'R3TR' AND
object = 'PROG' AND
obj_name = TSTC-pgmna.
MOVE TADIR-devclass TO v_devclass.
IF SY-SUBRC NE 0.
SELECT SINGLE *
FROM TRDIR
WHERE name = TSTC-pgmna.
IF TRDIR-subc EQ 'F'.
SELECT SINGLE *
FROM TFDIR
WHERE pname = TSTC-pgmna.
SELECT SINGLE *
FROM ENLFDIR
WHERE funcname = TFDIR-funcname.
SELECT SINGLE *
FROM TADIR
WHERE pgmid = 'R3TR' AND
object = 'FUGR' AND
obj_name EQ ENLFDIR-area.
MOVE TADIR-devclass TO v_devclass.
ENDIF.
ENDIF.
SELECT *
FROM TADIR
INTO TABLE JTAB
WHERE pgmid = 'R3TR' AND
object = 'SMOD' AND
devclass = v_devclass.
SELECT SINGLE *
FROM TSTCT
WHERE sprsl EQ SY-LANGU AND
tcode EQ P_TCODE.
FORMAT COLOR COL_POSITIVE INTENSIFIED OFF.
WRITE:/(19) 'Transaction Code - ',
20(20) P_TCODE,
45(50) TSTCT-ttext.
SKIP.
IF NOT JTAB[] IS INITIAL.
WRITE:/(95) SY-ULINE.
FORMAT COLOR COL_HEADING INTENSIFIED ON.
WRITE:/1 SY-VLINE,
2 'Exit Name',
21 SY-VLINE ,
22 'Description',
95 SY-VLINE.
WRITE:/(95) SY-ULINE.
LOOP AT JTAB.
SELECT SINGLE * FROM MODSAPT
WHERE sprsl = SY-LANGU AND
name = JTAB-obj_name.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
WRITE:/1 SY-VLINE,
2 JTAB-obj_name HOTSPOT ON,
21 SY-VLINE ,
22 MODSAPT-modtext,
95 SY-VLINE.
ENDLOOP.
WRITE:/(95) SY-ULINE.
DESCRIBE TABLE JTAB.
SKIP.
FORMAT COLOR COL_TOTAL INTENSIFIED ON.
WRITE:/ 'No of Exits:' , SY-TFILL.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(95) 'User Exit doesn’t exist'.
ENDIF.
ELSE.
FORMAT COLOR COL_NEGATIVE INTENSIFIED ON.
WRITE:/(95) 'Transaction Code Does Not Exist'.
ENDIF.
AT LINE-SELECTION.
GET CURSOR FIELD field1.
CHECK field1(4) EQ 'JTAB'.
SET PARAMETER ID 'MON' FIELD sy-lisel+1(10).
CALL TRANSACTION 'SMOD' AND SKIP FIRST SCREEN.
処理中にトランザクションコード「ME01」を入力し、F8(実行)ボタンを押します。上記のコードは次の出力を生成します-
場合によっては、さまざまなアプリケーションの機能を強化するために、ソフトウェアアプリケーションで特別な機能を事前定義する必要があります。MSExcelの機能を改善するための多くのMicrosoftExcelアドインがあります。同様に、SAPは、以下を提供することにより、いくつかの事前定義された機能を容易にします。Business Add-Ins BADIとして知られています。
BADIは、SAPプログラマー、ユーザー、または特定の業界がSAPシステムの既存のプログラムにコードを追加するのを容易にする拡張手法です。標準またはカスタマイズされたロジックを使用して、SAPシステムを改善できます。SAPアプリケーションを拡張するには、最初にBADIを定義してから、実装する必要があります。BADIを定義する際に、インターフェースが作成されます。BADIはこのインターフェースによって実装され、このインターフェースは1つ以上のアダプタークラスによって実装されます。
BADI手法は、他の拡張手法と2つの点で異なります。
- エンハンスメントテクニックは一度だけ実装できます。
- この拡張技術は、多くのお客様が同時に使用できます。
フィルタBADIを作成することもできます。これは、BADIが、拡張手法では不可能なフィルタリングされたデータに基づいて定義されることを意味します。BADIの概念は、SAPリリース7.0で次の目標で再定義されました。
ABAP言語で「GETBADI」と「CALLBADI」の2つの新しい要素を追加することにより、SAPシステムの標準アプリケーションを拡張します。
SAPシステムの標準アプリケーションを拡張するためのコンテキストやフィルターなどの柔軟性の高い機能を提供します。
BADIが作成されると、インタフェースと、メニュー拡張および画面拡張の機能コードなどの他の追加コンポーネントが含まれます。BADIを作成すると、顧客は標準のSAPアプリケーションに独自の拡張機能を含めることができます。拡張、インターフェイス、および生成されたクラスは、適切なアプリケーション開発名前空間にあります。
したがって、BADIは、ABAPオブジェクトを使用してSAPコンポーネントに「事前定義されたポイント」を作成する拡張手法と見なすことができます。これらの事前定義されたポイントは、特定の要件に合わせて、個々の業界ソリューション、国のバリエーション、パートナー、および顧客によって実装されます。SAPは実際にリリース4.6AでBADI拡張技術を導入し、この技術はリリース7.0で再実装されました。
ABAP用のWebDynpro(WD)は、SAPAGによって開発されたSAP標準のユーザーインターフェイステクノロジです。これは、SAP開発ツールと概念を利用するSAPABAP環境でのWebベースのアプリケーションの開発に使用できます。これは、バックエンドSAP R / 3システムに直接接続して、レポート用のデータと機能にアクセスするためのフロントエンドWebユーザーインターフェイスを提供します。
Web Dynpro for ABAPは、ランタイム環境と、ABAPワークベンチ(トランザクション:SE80)に統合された特定の開発ツールを備えたグラフィカル開発環境で構成されています。
WebDynproのアーキテクチャ
次の図は、WebDynproの全体的なアーキテクチャを示しています。
以下は、WebDynproに関して留意すべきいくつかのポイントです。
Web Dynproは、ユーザーインターフェイス用のSAPNetWeaverプログラミングモデルです。
すべてのWebDynproアプリケーションは、Model View Controller(MVC)プログラミングモデルに従って構造化されています。
モデルはメインシステムへのインターフェースを定義し、WebDynproアプリケーションはシステムデータにアクセスできます。
ビューは、Webブラウザにデータを表示する役割を果たします。
コントローラは、ビューとモデルの間にあります。コントローラは、ビューに表示されるモデルデータをフォーマットします。ユーザーが作成したユーザーエントリを処理し、モデルに返します。
利点
Web Dynproは、アプリケーション開発者に次の利点を提供します-
グラフィカルツールを使用すると、実装の労力が大幅に削減されます。
コンポーネントを使用することにより、再利用と保守性の向上。
レイアウトとナビゲーションは、WebDynproツールを使用して簡単に変更できます。
ユーザーインターフェイスのアクセシビリティがサポートされています。
ABAP開発環境への完全統合。
WebDynproコンポーネントとウィンドウ
コンポーネントは、WebDynproアプリケーションプロジェクトのグローバルユニットです。Web Dynproコンポーネントの作成は、新しいWebDynproアプリケーションを開発するための最初のステップです。コンポーネントが作成されると、WebDynproオブジェクトリストのノードとして機能します。コンポーネント内に任意の数のコンポーネントビューを作成し、対応する任意の数のWebDynproウィンドウでそれらをアセンブルできます。
各WebDynproコンポーネントには、少なくとも1つのWebDynproウィンドウが含まれています。Web Dynproウィンドウには、フロントエンドWebアプリケーション内に表示されるすべてのビューが埋め込まれています。ウィンドウは、ABAPワークベンチのウィンドウエディタで処理されます。
Note
コンポーネントビューには、説明、アプリケーションを作成した人の名前、作成日、割り当てられた開発パッケージなど、アプリケーションのすべての管理上の詳細が表示されます。
Web Dynproアプリケーションは、ABAPワークベンチのオブジェクト一覧にある独立したオブジェクトです。ウィンドウとアプリケーション間の相互作用は、特定のウィンドウのインターフェイスビューによって作成されます。