Sap-abap-quick-guide

提供:Dev Guides
移動先:案内検索

SAP ABAP-概要

ABAPは、4GL(第4世代)言語であるAdvanced Business Application Programmingの略です。 現在、Javaとともに、SAPアプリケーションサーバープログラミングの主要言語として位置付けられています。

SAPシステムの高レベルアーキテクチャから始めましょう。 典型的なSAPシステムの3層のクライアント/サーバーアーキテクチャは次のように表されます。

3層クライアント/サーバーアーキテクチャ

  • プレゼンテーション層*は、SAPシステムの制御に使用できる任意の入力デバイスで構成されています。 これは、Webブラウザ、モバイルデバイスなどです。 すべての中央処理は*アプリケーションサーバー*で行われます。 アプリケーションサーバーは、それ自体が1つのシステムではなく、処理システムの複数のインスタンスである場合があります。 サーバーは、主にパフォーマンス上の理由とセキュリティのために、通常は別のサーバーに保持されている*データベースレイヤー*と通信します。 プレゼンテーション層からデータベースまで、システムの各層の間で通信が行われ、その後チェーンがバックアップされます。

注意-ABAPプログラムはアプリケーションサーバーレベルで実行されます。 ソフトウェアの技術的な配布は、物理的な場所とは無関係です。 つまり、基本的に3つのレベルすべてを1台のコンピューターに重ねてインストールしたり、各レベルを別のコンピューターまたはサーバーにインストールしたりできます。

ABAPプログラムはSAPデータベース内にあります。 これらは、SAPカーネルの一部であるランタイムシステムの制御下で実行されます。 ランタイムシステムはすべてのABAPステートメントを処理し、制御ロジックを制御し、ユーザーイベントに応答します。

そのため、C ++やJavaとは異なり、ABAPプログラムは個別の外部ファイルに保存されません。 データベース内では、ABAPコードは2つの形式で存在します-

  • ABAPワークベンチツールで表示および編集できる*ソース*コード。
  • 生成されたコード、これはバイナリ表現です。 Javaに精通している場合、この生成されたコードは、Javaバイトコードに多少匹敵します。

ランタイムシステムは、Java仮想マシンと同様に、仮想マシンと見なすことができます。 ABAPランタイムシステムの主要なコンポーネントは、データベースに依存しないステートメント(Open SQL)を、基礎となるデータベース(ネイティブSQL)が理解できるステートメントに変換するデータベースインターフェイスです。 SAPはさまざまなデータベースで動作し、同じABAPプログラムをそれらすべてで実行できます。

SAP ABAP-環境

レポートは、一般的なABAPの原則とツールに慣れるための良い出発点です。 ABAPレポートは多くの分野で使用されています。 この章では、簡単なABAPレポートの作成がいかに簡単かを説明します。

こんにちは、ABAP

一般的な「Hello World」の例から始めましょう。

各ABAPステートメントは、ABAPキーワードで始まり、ピリオドで終わります。 キーワードは少なくとも1つのスペースで区切る必要があります。 ABAPステートメントに1行または複数行を使用するかどうかは関係ありません。

SAP NetWeaver Application Server ABAP(「AS ABAP」とも呼ばれます)に付属のABAPツールの一部であるABAPエディターを使用してコードを入力する必要があります。

「AS ABAP」は、独自のデータベース、ABAPランタイム環境、およびABAPエディターなどのABAP開発ツールを備えたアプリケーションサーバーです。 AS ABAPは、ハードウェア、オペレーティングシステム、およびデータベースに依存しない開発プラットフォームを提供します。

ABAPエディターの使用

  • ステップ1 *-トランザクションSE38を開始して、ABAPエディター(次の章で説明)に移動します。 多くのABAPオブジェクトの1つであるレポートの作成を始めましょう。
  • ステップ2 *-エディターの初期画面で、入力フィールドPROGRAMにレポートの名前を指定します。 ZHELLO1として名前を指定できます。 名前にとって、先行するZは重要です。 Zは、レポートが顧客の名前空間にあることを保証します。

顧客の名前空間には、接頭辞YまたはZを持つすべてのオブジェクトが含まれます。 顧客またはパートナーがオブジェクト(レポートなど)を作成するときに常に使用され、これらのオブジェクトをSAPのオブジェクトと区別し、オブジェクトとの名前の競合を防ぎます。

  • ステップ3 *-レポート名は小文字で入力できますが、エディターはレポート名を大文字に変更します。 そのため、ABAPオブジェクトの名前では大文字と小文字が区別されません。
  • ステップ4 *-レポートの名前を指定した後、[作成]ボタンをクリックします。 ポップアップウィンドウABAP:PROGRAM ATTRIBUTESがポップアップ表示され、レポートに関する詳細情報を提供します。
  • ステップ5 *-レポートタイプとして「実行可能プログラム」を選択し、タイトル「My First ABAP Report」を入力し、[保存]を選択して続行します。 次に、CREATE OBJECT DIRECTORY ENTRYウィンドウが表示されます。 [ローカルオブジェクト]ボタンを選択すると、ポップアップが閉じます。

REPORTステートメントの下にWRITEステートメントを入力することにより、最初のレポートを完了することができます。これにより、完全なレポートには次の2行のみが含まれます-

REPORT ZHELLO1.
WRITE 'Hello World'.

レポートの開始

キーボード(Ctrl + S)または保存アイコン(コマンドフィールドの横の右側)を使用してレポートを保存できます。 ABAP開発はAS ABAPで行われます。

レポートの開始は、保存と同じくらい簡単です。 [アクティブ化]ボタン(開始アイコンの隣の左側)をクリックし、アイコンDIRECT PROCESSINGまたはF8ファンクションキーを使用してレポートを開始します。 タイトル「My First ABAP Report」とともに出力「Hello World」も表示されます。 ここに出力があります-

My First ABAP Report
Hello World

新しいレポートをアクティブにしたり、既存のレポートへの変更をアクティブにしない限り、そのユーザーには関係ありません。 これは、他の開発者がプロ​​ジェクトで使用するオブジェクトを操作できる中央開発環境では重要です。

既存のコードを表示する

フィールドProgramを見て、値ZHELLO1をダブルクリックすると、ABAPエディターにレポートのコードが表示されます。 これはフォワードナビゲーションと呼ばれます。 オブジェクトの名前をダブルクリックすると、適切なツールでそのオブジェクトが開きます。

SAP ABAP-画面ナビゲーション

SAP ABAPを理解するには、ログイン、ABAPエディター、ログアウトなどの画面に関する基本的な知識が必要です。 この章では、画面ナビゲーションと標準ツールバー機能に焦点を当てます。

ログイン画面

SAPサーバーにログオンすると、SAPログイン画面でユーザーIDとパスワードの入力が求められます。 有効なユーザーIDとパスワードを入力してEnterを押す必要があります(ユーザーIDとパスワードはシステム管理者から提供されます)。 ログイン画面は次のとおりです。

SAPログイン画面

ツールバーアイコン

以下はSAP画面のツールバーです。

SAP画面ツールバー

メニューバー-メニューバーはダイアログウィンドウの一番上の行です。

標準ツールバー-ページのトップ、ページの終わり、ページのアップ、ページのダウン、保存などのほとんどの標準機能がこのツールバーで使用できます。

タイトルバー-タイトルバーには、現在のアプリケーション/ビジネスプロセスの名前が表示されます。

アプリケーションツールバー-アプリケーション固有のメニューオプションはここで利用できます。

コマンドフィールド-メニュートランザクションをナビゲートせずにアプリケーションを起動でき、いくつかの論理コードがビジネスプロセスに割り当てられます。 アプリケーションを直接起動するには、コマンドフィールドにトランザクションコードを入力します。

ABAPエディター

トランザクションSE38を開始して(コマンドフィールドにSE38を入力)、ABAPエディターに移動できます。

ABAPエディター

標準のキーとアイコン

  • 終了キー*は、プログラム/モジュールを終了するか、ログオフするために使用されます。 また、最後にアクセスした画面に戻るためにも使用されます。

以下は、画像に示すようにSAPで使用される標準の終了キーです。

標準キーアイコン

レポートのチェック、アクティブ化、および処理のオプションは次のとおりです。

レポートの有効化と処理

ログオフ

作業が終了したら、ABAPエディターを終了するか、SAPシステムからログオフするか、常に実施することをお勧めします。

ABAPエディターのログオフ

SAP ABAP-基本構文

声明

ABAPソースプログラムは、コメントとABAPステートメントで構成されています。 ABAPのすべてのステートメントはキーワードで始まり、ピリオドで終わります。ABAPでは大文字と小文字が区別されません。

プログラムの最初の非コメント行は、REPORTという単語で始まります。 レポートは常に、作成された実行可能プログラムの最初の行になります。 ステートメントの後に、以前に作成されたプログラム名が続きます。 その後、回線は完全に停止して終了します。

構文は-

REPORT [Program_Name].

[Statements…].

これにより、ステートメントは必要なだけエディター内の行を使用できます。 たとえば、レポートは次のようになります-

REPORT Z_Test123_01.

ステートメントは、コマンドと、ピリオドで終わる変数とオプションで構成されます。 期間がステートメントの最後に表示されている限り、問題は発生しません。 文が終了する場所をマークするのはこの期間です。

コードを書きましょう。

REPORTステートメントの下の行に、次のステートメントを入力します。「ABAPチュートリアル」と記述します。

REPORT Z_Test123_01.

Write 'This is ABAP Tutorial'.

文を書く際に考慮すべき4つのこと-

  • 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
  • 部分行コメントは、ステートメントの後に二重引用符( ")を入力することにより示されます。 二重引用符に続くすべてのテキストは、システムによってコメントと見なされます。 部分的な行のコメントは、複数の行にまたがってはならないため、ピリオドで終了する必要はありません-
WRITE 'Hello'. "Here is the partial comment

注意-コメント付きのコードは、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

注意-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文字のメッセージテキストが関連付けられています。 メッセージ番号が呼び出されると、対応するテキストが表示されます。

以下は、Messageコマンドで使用する文字です-

Message Type Consequences
E Error The message appears and the application halts at its current point. If the program is running in background mode, the job is canceled and the message is recorded in the job log.
W Warning The message appears and the user must press Enter for the application to continue. In background mode, the message is recorded in the job log.
I Information A pop-up window opens with the message text and the user must press Enter to continue. In background mode, the message is recorded in the job log.
A Abend This message class cancels the transaction that the user is currently using.
S Success This provides an informational message at the bottom of the screen. The information displayed is positive in nature and it is just meant for user feedback. The message does not impede the program in any way.
X Abort This message aborts the program and generates an ABAP short dump.

通常、エラーメッセージは、ユーザーが行うべきではないことをユーザーが実行できないようにするために使用されます。 警告メッセージは、通常、ユーザーにアクションの結果を思い出させるために使用されます。 情報メッセージは、ユーザーに役立つ情報を提供します。

メッセージID ID ABのメッセージを作成すると、MESSAGEコマンド-MESSAGE E011は次の出力を与えます-

EAB011 This report does not support sub-number summarization.

SAP ABAP-データ型

ABAPでプログラミングしている間、さまざまな変数を使用してさまざまな情報を保存する必要があります。 変数は、値を保存するために予約されたメモリの場所に他なりません。 これは、変数を作成するときに、メモリ内にスペースを確保することを意味します。 文字、整数、浮動小数点などのさまざまなデータ型の情報を保存することができます。 変数のデータ型に基づいて、オペレーティングシステムはメモリを割り当て、予約メモリに保存できるものを決定します。

基本データ型

ABAPは、プログラマに固定長および可変長データ型の豊富な品揃えを提供します。 次の表は、ABAPの基本データ型を示しています-

Type Keyword
Byte field X
Text field C
Integer I
Floating point F
Packed number P
Text string STRING

フィールドと数字のいくつかは、次のように1つ以上の名前を使用して変更することができます-

  • byte
  • 数値
  • キャラクターのような

次の表は、データ型、メモリに値を格納するために必要なメモリ量、およびそのようなタイプの変数に格納できる最小値と最大値を示しています。

Type Typical Length Typical Range
X 1 byte Any byte values (00 to FF)
C 1 character 1 to 65535
N (numeric text filed) 1 character 1 to 65535
D (character-like date) 8 characters 8 characters
T (character-like time) 6 characters 6 characters
I 4 bytes -2147483648 to 2147483647
F 8 bytes 2.2250738585072014E-308 to 1.7976931348623157E+308 positive or negative
P 8 bytes [-10^(2len -1) +1] to [+10^(2len -1) 1] (where len = fixed length)
STRING Variable Any alphanumeric characters
XSTRING (byte string) Variable Any byte values (00 to 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桁を保存できます。

複合型および参照型

複合型は、*構造型*と*表型*に分類されます。 構造タイプ、基本タイプおよび構造(つまり、 構造に埋め込まれた構造)はグループ化されます。 基本タイプのグループ化のみを検討できます。 ただし、構造のネストの可用性に注意する必要があります。

基本タイプをグループ化すると、データ項目にグループ化されたデータ項目としてアクセスしたり、個々の基本タイプのデータ項目(構造フィールド)にアクセスしたりできます。 テーブル型は、他のプログラミング言語では配列としてよく知られています。 *配列*は、単純配列または構造配列です。 ABAPでは、配列は内部テーブルと呼ばれ、他のプログラミング言語と比較すると多くの方法で宣言および操作できます。 次の表は、内部テーブルの特性に応じたパラメーターを示しています。

S.No. Parameter & Description
1

Line or row type

内部テーブルの行は、基本、複合、または参照タイプにすることができます。

2

Key

テーブル行を識別する内部テーブルのキーとして、フィールドまたはフィールドのグループを指定します。 キーには、基本タイプのフィールドが含まれます。

3

Access method

ABAPプログラムが個々のテーブルエントリにアクセスする方法について説明します。

参照型は、クラス、インターフェイス、および実行時データ項目のインスタンスを参照するために使用されます。 ABAP OOPランタイムタイプサービス(RTTS)を使用すると、実行時にデータ項目を宣言できます。

SAP ABAP-変数

変数は、プログラムの割り当てられたメモリ領域内に値を格納するために使用される名前付きデータオブジェクトです。 名前が示すように、ユーザーはABAPステートメントを使用して変数の内容を変更できます。 ABAPの各変数には、変数のメモリのサイズとレイアウトを決定する特定のタイプがあります。そのメモリ内に保存できる値の範囲。変数に適用できる一連の操作。

すべての変数を使用する前に宣言する必要があります。 変数宣言の基本的な形式は-

DATA <f> TYPE <type> VALUE <val>.

ここで、<f>は変数の名前を指定します。 変数の名前は最大30文字です。 <type>は変数のタイプを指定します。 完全に指定された技術属性を持つデータ型は、<type>と呼ばれます。 <val>は、<f>変数の初期値を指定します。 基本の固定長変数を定義する場合、DATAステートメントは変数の値にタイプ固有の初期値を自動的に入力します。 <val>の他の可能な値は、リテラル、定数、またはIs INITIALなどの明示的な句です。

以下は、変数宣言の有効な例です。

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型を表します。

上記のコードは、次の出力を生成します-

ABAP辞書

参照変数

参照変数を宣言するための構文は-

DATA <ref> TYPE REF TO <type> VALUE IS INITIAL.
  • REF TOオプションは、参照変数refを宣言します。
  • REF TOの後の指定は、参照変数の静的型を指定します。
  • 静的型は、<ref>が参照できるオブジェクトのセットを制限します。
  • 参照変数の動的型は、現在参照しているデータ型またはクラスです。
  • 静的タイプは常により一般的であるか、動的タイプと同じです。
  • TYPEオプションは、バインドされた参照タイプを作成するために開始値として使用され、VALUE追加後に指定できるのはIS INITIALのみです。

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

SAP ABAP-定数とリテラル

リテラルは、プログラムのソースコード内で作成する名前のないデータオブジェクトです。 それらはその価値によって完全に定義されます。 リテラルの値を変更することはできません。 定数は、宣言ステートメントを使用して静的に作成された名前付きデータオブジェクトです。 定数は、プログラムのメモリ領域に格納されている値を割り当てることで宣言されます。 定数に割り当てられた値は、プログラムの実行中に変更できません。 これらの固定値もリテラルと見なすことができます。 リテラルには、数値と文字の2種類があります。

数値リテラル

数値リテラルは数字のシーケンスで、前に記号を付けることができます。 数値リテラルには、小数点区切り文字や仮数と指数を使用した表記はありません。

以下は、数値リテラルのいくつかの例です-

183.
-97.
+326.

文字リテラル

文字リテラルは、単一引用符で囲まれたABAPプログラムのソースコード内の英数字のシーケンスです。 引用符で囲まれた文字リテラルは、事前定義されたABAPタイプCを持ち、テキストフィールドリテラルとして記述されます。 「逆引用符」で囲まれたリテラルは、ABAPタイプSTRINGを持ち、文字列リテラルとして記述されます。 フィールドの長さは、文字数によって定義されます。

-テキストフィールドリテラルでは、末尾の空白は無視されますが、文字列リテラルでは考慮されます。

次に、文字リテラルの例をいくつか示します。

テキストフィールドリテラル

REPORT YR_SEP_12.
Write 'Tutorials Point'.
Write/'ABAP Tutorial'.

文字列フィールドリテラル

REPORT YR_SEP_12.
Write `Tutorials Point `.
Write/`ABAP Tutorial `.

出力は上記の両方のケースで同じです-

Tutorials Point
ABAP Tutorial

注意-定数の値を変更しようとすると、構文エラーまたは実行時エラーが発生する場合があります。 クラスまたはインターフェイスの宣言部分で宣言する定数は、そのクラスまたはインターフェイスの静的属性に属します。

定数声明

CONSTANTSステートメントを使用して、名前付きデータオブジェクトを宣言できます。

以下は構文です-

CONSTANTS <f> TYPE <type> VALUE <val>.

CONSTANTSステートメントは、DATAステートメントに似ています。

<f>は、定数の名前を指定します。 TYPE <type>は<f>という名前の定数を表し、既存のデータ型<type>と同じ技術属性を継承します。 VALUE <val>は、宣言された定数名<f>に初期値を割り当てます。

-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.

比較で定数参照を使用することも、プロシージャに渡すこともできます。

SAP ABAP-オペレーター

ABAPは、変数を操作するための豊富な演算子セットを提供します。 すべてのABAP演算子は4つのカテゴリに分類されます-

  • 算術演算子
  • 比較演算子
  • ビット演算子 *文字列演算子

算術演算子

算術演算子は、代数で使用されるのと同じ方法で数式で使用されます。 次のリストでは、算術演算子について説明します。 整数変数Aが20を保持し、変数Bが40を保持すると仮定します。

S.No. Arithmetic Operator & Description
1
  • PLUS (Addition)*

演算子の両側に値を追加します。 例:&plus; Bは60を渡します。

2

− (Subtraction)

左側のオペランドから右側のオペランドを減算します。 例:A-Bは-20になります。

3
  • (乗算) *

演算子の両側の値を乗算します。 例:A* Bは800を返します。

4

/(Division)

左側のオペランドを右側のオペランドで除算します。 例:B/Aは2を与えます。

5

MOD (Modulus)

左側のオペランドを右側のオペランドで除算し、剰余を返します。 例:B MOD Aは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. Comparison Operator & Description
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)は真です。

-変数のデータ型または長さが一致しない場合、自動変換が実行されます。 異なるデータ型の2つの値を比較しながら、一方または両方の値に対して自動型調整が実行されます。 変換タイプは、データタイプとデータタイプの優先順位によって決まります。

以下は優先順位です-

  • 1つのフィールドがタイプ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. Bitwise Operator & Description
1
  • BIT-NOT*

16進数のすべてのビットを反対の値に反転する単項演算子。 たとえば、ビットレベル値10101010を持つ16進数にこの演算子を適用します(例: 'AA')は01010101を返します。

2

BIT-AND

この二項演算子は、ブールAND演算子を使用して各フィールドをビットごとに比較します。

3

BIT-XOR

ブールXOR(排他的OR)演算子を使用して、各フィールドをビットごとに比較するバイナリ演算子。

4

BIT-OR

ブールOR演算子を使用してビットごとに各フィールドを比較する二項演算子。

たとえば、フィールドAおよびフィールドBに含まれる2ビット値に対してブールAND、OR、またはXOR演算子を適用したときに生成される値を示す真理値表は次のとおりです。

Field A Field B AND OR XOR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0

文字列演算子

以下は、文字列演算子のリストです-

S.No. Character String Operator & Description
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.

SAP ABAP-ループ制御

コードのブロックを数回実行する必要がある場合があります。 一般に、ステートメントは順番に実行されます。関数の最初のステートメントが最初に実行され、次に2番目のステートメントが実行されます。

プログラミング言語は、より複雑な実行パスを可能にするさまざまな制御構造を提供します。 * loopステートメント*を使用すると、ステートメントまたはステートメントのグループを複数回実行できます。ほとんどのプログラミング言語では、ループステートメントの一般的な形式は次のとおりです。

ループステートメント

ABAPプログラミング言語は、ループ要件を処理するために次のタイプのループを提供します。

S.No. Loop Type & Description
1

WHILE loop

特定の条件が真の場合、ステートメントまたはステートメントのグループを繰り返します。 ループ本体を実行する前に条件をテストします。

2

Do loop

DOステートメントは、特定のタスクを特定の回数繰り返す場合に役立ちます。

3

Nested loop

別のWHILEまたはDOループ内で1つ以上のループを使用できます。

ループ制御ステートメント

ループ制御ステートメントは、通常のシーケンスから実行を変更します。 ABAPには、ループを途中で終了させる制御ステートメントが含まれています。 以下の制御ステートメントをサポートしています。

S.No. Control Statement & Description
1

CONTINUE

ループが本体の残りをスキップし、次のループパスを開始します。

2

CHECK

条件が偽の場合、CHECKの後の残りのステートメントは無視され、システムは次のループパスを開始します。

3

EXIT

ループを完全に終了し、ループの直後のステートメントに実行を転送します。

SAP ABAP-決定

意思決定構造には、プログラムによって評価またはテストされる1つ以上の条件、条件が真であると判断された場合に実行されるステートメント、およびオプションで条件が実行された場合に実行される他のステートメントが含まれます。偽と判断されます。

以下は、ほとんどのプログラミング言語で見られる典型的な意思決定構造の一般的な形式です-

意思決定

ABAPプログラミング言語は、次のタイプの意思決定ステートメントを提供します。

S.No. Statement & Description
1

IF Statement

IFステートメントは、論理式とそれに続く1つ以上のステートメントで構成されます。

2

IF.. Else Statement

IFステートメントの後に、式が偽のときに実行されるオプションのELSEステートメントを続けることができます。

3

Nested IF Statement

1つのIFまたはELSEIFステートメントを別のIFまたはELSEIFステートメント内で使用できます。

4

CASE Control Statement

CASEステートメントは、2つ以上のフィールドまたは変数を比較する必要がある場合に使用されます。

SAP ABAP-文字列

ABAPプログラミングで広く使用されている*文字列*は、一連の文字です。

データ型Cの変数を使用して、英数字を保持します。最小1文字、最大65,535文字です。 デフォルトでは、これらは左に揃えられます。

文字列を作成する

次の宣言と初期化により、「Hello」という単語で構成される文字列が作成されます。 文字列のサイズは、単語「Hello」の文字数とまったく同じです。

Data my_Char(5) VALUE 'Hello'.

次のプログラムは、文字列を作成する例です。

REPORT YT_SEP_15.
DATA my_Char(5) VALUE 'Hello'.
Write my_Char.

上記のコードは、次の出力を生成します-

Hello

ストリングの長さ

文字列の長さを調べるには、* STRLENステートメント*を使用できます。 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. Statement & Purpose
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: finddevguides
Concatenation with Space: Tutorials Point
Condense with Gaps: Tutorials Point Limited
Condense with No Gaps: finddevguidesLimited

-

  • 連結の場合、「sep」はフィールド間にスペースを挿入します。
  • CONDENSEステートメントは、フィールド間の空白を削除しますが、1文字のスペースのみを残します。
  • 「NO-GAPS」は、すべてのスペースを削除するCONDENSEステートメントへのオプションの追加です。

SAP ABAP-日付と時刻

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. Data Type & Description
1

D

YYYYMMDD形式の組み込みの固定長日付型。 たとえば、値20100913は2010年9月13日を表します。

2

T

HHMMSS形式の組み込みの固定長時間型。 たとえば、値102305は時間10:23:05 AMを表します。

3
  • TIMESTAMP *(Type P – Length 8 No decimals)

このタイプは、YYYYMMDDhhmmss形式の短いタイムスタンプを表すために使用されます。 たとえば、値20100913102305は、2010年9月13日午前10時23分5秒の日付を表します。

4
  • TIMESTAMPL* (Type P - Length 11 Decimals 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ステートメントのTIME ZONEオプションを使用してタイムスタンプを表示しています。 この追加により、指定されたタイムゾーンの規則に従ってタイムスタンプの出力がフォーマットされます。 システムフィールドSY-ZONLOは、ユーザーの設定で設定されたローカルタイムゾーンを表示するために使用されます。

SAP ABAP-データのフォーマット

ABAPは、プログラムの出力をフォーマットするためのさまざまなタイプのフォーマットオプションを提供します。 たとえば、さまざまな色または書式設定スタイルのさまざまなアイテムを含むリストを作成できます。

WRITEステートメントは、画面にデータを表示するために使用されるフォーマットステートメントです。 WRITEステートメントにはさまざまなフォーマットオプションがあります。 WRITE文の構文は次のとおりです-

WRITE <format> <f> <options>.

この構文では、<format>は出力形式の仕様を表し、新しい行から始まる出力の表示を示すスラッシュ(/)にすることができます。 スラッシュに加えて、フォーマット仕様には列番号と列長が含まれます。 たとえば、WRITE/04(6)ステートメントは新しい行が列4で始まり、列の長さが6であることを示しますが、WRITE 20ステートメントは列20の現在の行を示します。 パラメーター<f>は、データ変数または番号付きテキストを表します。

次の表は、フォーマットに使用されるさまざまな句を説明しています-

S.No. Clause & Description
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. Clause & Description
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>を小数点の後に表示する必要があることを指定します。

たとえば、次の表は、日付フィールドのさまざまな書式設定オプションを示しています-

Formatting Option Example
DD/MM/YY 13/01/15
MM/DD/YY 01/13/15
DD/MM/YYYY 13/01/2015
MM/DD/YYYY 01/13/2015
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
finddevguides
112538
11:25:38

SAP ABAP-例外処理

  • 例外*は、プログラムの実行中に発生する問題です。 例外が発生すると、プログラムの通常のフローが中断され、プログラムアプリケーションが異常終了します。これは推奨されません。したがって、これらの例外は処理されます。

例外は、プログラムのある部分から別の部分に制御を移す方法を提供します。 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* -プログラムは、プログラム内の問題を処理する場所で例外ハンドラーを使用して例外をキャッチします。 CATCHキーワードは、例外のキャッチを示します。
*CLEANUP* -CLEANUPブロックのステートメントは、同じTRY-ENDTRYコンストラクトのハンドラーによってキャッチされないTRYブロックで例外が発生するたびに実行されます。 CLEANUP句内で、システムはオブジェクトを一貫した状態に復元したり、外部リソースを解放したりできます。 つまり、TRYブロックのコンテキストに対してクリーンアップ作業を実行できます。

例外を発生させる

例外は、メソッド、汎用モジュール、サブルーチンなどの任意の時点で発生する可能性があります。 例外を発生させることができる2つの方法があります-

  • ABAPランタイムシステムによって発生した例外。 +たとえば、Y = 1/0。 これにより、タイプCX_SY_ZERODIVIDEの実行時エラーが発生します。
  • プログラマーによって発生した例外。 +例外オブジェクトを同時に発生させて作成します。 最初のシナリオに既に存在する例外オブジェクトを使用して、例外を発生させます。 構文は次のとおりです。RAISEEXCEPTION exep。

例外をキャッチする

ハンドラーは、例外をキャッチするために使用されます。

コードスニペットを見てみましょう-

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. Attribute & Description
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

SAP ABAP-辞書

あなたが知っているように、SQLは2つの部分に分けることができます-

  • DML(データ操作言語)
  • DDL(データ定義言語)

DMLパーツは、SELECT、INSERT、UPDATE、DELETEなどのクエリおよび更新コマンドで構成されます。 およびABAPプログラムは、SQLのDML部分を処理します。 DDL部分は、CREATE TABLE、CREATE INDEX、DROP TABLE、ALTER TABLEなどのコマンドで構成されます。 ABAPディクショナリは、SQLのDDL部分を処理します。

ABAP辞書

ABAPディクショナリは、メタデータ(つまり、 データに関するデータ)は、データベースが保持するメタデータとともにSAPデータベースに存在します。 ディクショナリは、データ定義の作成と管理、およびテーブル、データ要素、ドメイン、ビュー、タイプの作成に使用されます。

ABAPディクショナリの基本タイプ

ABAPディクショナリの基本的なタイプは次のとおりです-

  • *データ要素*は、データ型、長さ、およびおそらく小数点以下の桁数を定義することにより、基本型を記述します。
  • 任意のタイプを持つことができるコンポーネントを持つ*構造*。
  • *テーブルタイプ*は、内部テーブルの構造を記述します。

ディクショナリ環境のさまざまなオブジェクトは、ABAPプログラムで参照できます。 辞書はグローバルエリアとして知られています。 ディクショナリ内のオブジェクトはすべてのABAPプログラムに対してグローバルであり、ABAPプログラム内のデータはこれらのディクショナリグローバルオブジェクトへの参照によって宣言できます。

DBO ABAP辞書

ディクショナリは、ユーザー定義タイプの定義をサポートし、これらのタイプはABAPプログラムで使用されます。 また、テーブル、ビュー、インデックスなどのデータベースオブジェクトの構造も定義します。 これらのオブジェクトは、オブジェクトがアクティブ化されると、その辞書定義の基になるデータベースに自動的に作成されます。 辞書には、検索ヘルプなどの編集ツールや、ロックオブジェクトなどのロックツールも用意されています。

辞書タスク

ABAP辞書は以下を達成します-

  • データの整合性を強化します。
  • 冗長性なしでデータ定義を管理します。
  • ABAP開発ワークベンチの他の部分と緊密に統合します。

複雑なユーザー定義型は、ディクショナリの3つの基本型から構築できます。 顧客データは、次の画像に示すように、名前、住所、電話のコンポーネントを含む構造「顧客」に保存されます。 名前は、コンポーネント、名、および姓の構造体でもあります。 これらのコンポーネントはどちらも基本です。なぜなら、それらのタイプはデータ要素によって定義されているからです。

顧客データ

コンポーネントAddressのタイプは、コンポーネントも構造である構造によって定義されます。顧客が複数の電話番号を持つことができるため、電話コンポーネントはテーブルタイプによって定義されます。 タイプはABAPプログラムで使用され、汎用モジュールのインターフェイスパラメータのタイプを定義するためにも使用されます。

SAP ABAP-ドメイン

ABAPディクショナリでデータを定義するための3つの基本オブジェクトは、ドメイン、データ要素、およびテーブルです。 ドメインは、フィールドタイプや長さなどのテーブルフィールドの技術的定義に使用され、データ要素はセマンティック定義(簡単な説明)に使用されます。 データ要素は、特定のビジネスコンテキストにおけるドメインの意味を記述します。 これには、主に画面のフィールドヘルプとフィールドラベルが含まれています。

ドメインはデータ要素に割り当てられ、データ要素はテーブルフィールドまたは構造フィールドに割り当てられます。 たとえば、MATNRドメイン(CHAR材料番号)は、MATNR_N、MATNN、MATNR_Dなどのデータ要素に割り当てられ、これらは多くのテーブルフィールドと構造フィールドに割り当てられます。

ドメインを作成する

新しいドメインを作成する前に、既存のドメインに、テーブルフィールドに必要なものと同じ技術仕様があるかどうかを確認してください。 その場合、既存のドメインを使用することになっています。 ドメインを作成する手順について説明します。

  • ステップ1 *-トランザクションSE11に進みます。
  • ステップ2 *-ABAPディクショナリの初期画面でドメインのラジオボタンを選択し、次のスクリーンショットに示すようにドメインの名前を入力します。 [作成]ボタンをクリックします。 顧客の名前空間の下にドメインを作成できます。オブジェクトの名前は常に「Z」または「Y」で始まります。

ドメインの作成

ステップ3 *-ドメインのメンテナンス画面の短いテキストフィールドに説明を入力します。 この場合、それは「顧客ドメイン」です。 *注意-この属性を入力するまで、他の属性は入力できません。

  • ステップ4 *-データタイプ、Noを入力します。 [定義]タブの[フォーマット]ブロックの文字数、および小数点以下の桁数。 出力長のキーを押すと、出力長が提案され表示されます。 提案された出力長を上書きすると、ドメインのアクティブ化中に警告が表示される場合があります。 会話を記入できます。 必要に応じて、ルーチン、署名、および小文字フィールド。 ただし、これらは常にオプションの属性です。
  • ステップ5 *-[値の範囲]タブを選択します。 ドメインが固定値のみに制限されている場合は、固定値または間隔を入力します。 このドメインを参照するフィールドの外部キーを定義するときに、システムがこのテーブルをチェックテーブルとして提案する必要がある場合は、値テーブルを定義します。 ただし、これらはすべてオプションの属性です。

辞書変更ドメイン

  • ステップ6 *-変更を保存します。 [オブジェクトディレクトリエントリの作成]ポップアップが表示され、パッケージを要求されます。 作業しているパッケージ名を入力できます。 パッケージがない場合は、Object Navigatorで作成するか、[ローカルオブジェクト]ボタンを使用してドメインを保存できます。
  • ステップ7 *-ドメインをアクティブにします。 [アクティブ化]アイコン(マッチスティックアイコン)をクリックするか、CTRL + F3を押してドメインをアクティブ化します。 ポップアップウィンドウが表示され、次のスナップショットに示すように、現在アクティブではない2つのオブジェクトが一覧表示されます-

アクティブドメイン

  • ステップ8 *-この時点で、ZSEP_18という名前の「DOMA」というラベルの付いた一番上のエントリがアクティブになります。 これが強調表示されたら、緑色のチェックボタンをクリックします。 このウィンドウは消え、ステータスバーに「オブジェクトがアクティブになりました」というメッセージが表示されます。

ドメインをアクティブ化したときにエラーメッセージまたは警告が発生した場合、アクティブ化ログが自動的に表示されます。 アクティベーションログには、アクティベーションフローに関する情報が表示されます。 また、Utilities(M)→Activation logでアクティベーションログを呼び出すこともできます。

SAP ABAP-データ要素

データ要素は、ABAPデータディクショナリの個々のフィールドを記述します。 これらは、複合型の分割不可能な最小単位であり、テーブルフィールドのタイプ、構造コンポーネント、またはテーブルの行タイプを定義するために使用されます。 テーブル項目の意味に関する情報、および対応する画面項目の編集に関する情報をデータ要素に割り当てることができます。 この情報は、データ要素を参照するすべての画面フィールドで自動的に利用可能です。 データ要素は、基本型または参照型を記述します。

データ要素

データ要素の作成

新しいデータ要素を作成する前に、既存のデータ要素がテーブルフィールドで必要なセマンティック仕様と同じかどうかを確認する必要があります。 その場合、既存のデータ要素を使用できます。 データ要素には、事前定義されたタイプ、ドメイン、または参照タイプを割り当てることができます。

以下は、データ要素を作成するための手順です-

  • ステップ1 *-トランザクションSE11に進みます。
  • ステップ2 *-ABAPディクショナリの初期画面でデータタイプのラジオボタンを選択し、以下に示すようにデータ要素の名前を入力します。
  • ステップ3 *-[作成]ボタンをクリックします。 顧客の名前空間の下にデータ要素を作成できます。オブジェクトの名前は常に「Z」または「Y」で始まります。

データ要素の作成

  • ステップ4 *-3つのラジオボタンで表示されるCREATE TYPEポップアップの[Data element]ラジオボタンをチェックします。

データ要素ラジオボタン

  • ステップ5 *-緑色のチェックマークアイコンをクリックします。 データ要素のメンテナンス画面が表示されます。

ステップ6 *-データ要素のメンテナンス画面の短いテキストフィールドに説明を入力します。 この場合、それは「顧客データ要素」です。 *注意-この属性を入力するまで、他の属性は入力できません。

顧客データ要素

  • ステップ7 *-データ要素にタイプを割り当てます。 基本タイプをチェックして基本データ要素を作成するか、参照タイプをチェックして参照データ要素を作成できます。 Elementary Type内のDomainまたはPredefined Typeにデータ要素を割り当て、Reference TypeまたはReference Type内の定義済みタイプへの参照を使用して、データ要素を割り当てることができます。
  • ステップ8 *-[フィールドラベル]タブで、短いテキスト、中程度のテキスト、長いテキスト、および見出しのフィールドを入力します。 Enterキーを押すと、これらのラベルの長さが自動的に生成されます。

データ要素フィールド

  • ステップ9 *-変更を保存します。 [オブジェクトディレクトリエントリの作成]ポップアップが表示され、パッケージを要求されます。 作業しているパッケージ名を入力できます。 パッケージがない場合は、Object Navigatorで作成するか、[ローカルオブジェクト]ボタンを使用してデータ要素を保存できます。
  • ステップ10 *-データ要素をアクティブにします。 [アクティブ化]アイコン(マッチスティックアイコン)をクリックするか、Ctrl + F3を押してデータ要素をアクティブ化します。 ポップアップウィンドウが表示され、次のスクリーンショットに示すように、現在アクティブでない2つのオブジェクトがリストされます。

アクティブなデータ要素

  • ステップ11 *-この時点で、Z_CUSTという名前の「DTEL」というラベルの付いた一番上のエントリがアクティブになります。 これが強調表示されたら、緑色のチェックボタンをクリックします。 このウィンドウは消え、ステータスバーに「オブジェクトがアクティブになりました」というメッセージが表示されます。

データ要素をアクティブ化したときにエラーメッセージまたは警告が発生した場合、アクティブ化ログが自動的に表示されます。 アクティベーションログには、アクティベーションフローに関する情報が表示されます。 また、Utilities(M)→Activation logでアクティベーションログを呼び出すこともできます。

SAP ABAP-テーブル

テーブルは、ABAPディクショナリのデータベースとは無関係に定義できます。 テーブルがABAPディクショナリで有効化されると、そのフィールドの同様のコピーもデータベースに作成されます。 テーブルの定義はSAPシステムで使用されるデータベースに依存するため、ABAPディクショナリで定義されたテーブルは、データベースと互換性のある形式に自動的に変換されます。

テーブルには1つ以上のフィールドを含めることができ、各フィールドはそのデータ型と長さで定義されます。 テーブルに保存された大量のデータは、テーブルで定義されたいくつかのフィールドに分散されます。

テーブルフィールドのタイプ

テーブルは多くのフィールドで構成され、各フィールドには多くの要素が含まれます。 次の表は、テーブルフィールドのさまざまな要素を示しています-

S.No. Elements & Description
1

Field name

これは、最大16文字を含むことができるフィールドに付けられた名前です。 フィールド名は、数字、文字、アンダースコアで構成されます。 文字で始まる必要があります。

2

Key flag

フィールドがキーフィールドに属するかどうかを決定します。

3

Field type

データ型をフィールドに割り当てます。

4

Field length

フィールドに入力できる文字数。

5

Decimal places

小数点の後に許可される桁数を定義します。 この要素は、数値データ型にのみ使用されます。

6

Short text

対応するフィールドの意味を説明します。

ABAPディクショナリでのテーブルの作成

  • ステップ1 *-トランザクションSE11に移動し、[データベーステーブル]ラジオボタンを選択して、作成するテーブルの名前を入力します。 この例では、ZCUSTOMERS1という名前を入力しています。 作成ボタンをクリックします。 辞書:テーブル更新画面が表示されます。 ここでは、デフォルトで[配信とメンテナンス]タブが選択されています。
  • ステップ2 *-短い説明フィールドに短い説明を入力します。
  • ステップ3 *-[配信クラス]フィールドの横にある[検索ヘルプ]アイコンをクリックします。 [A [アプリケーションテーブル(マスターおよびトランザクションデータ)]]オプションを選択します。
  • ステップ4 *-[データブラウザ/テーブルビューのメンテナンス]ドロップダウンメニューから[表示/メンテナンスを許可]オプションを選択します。 ディクショナリ:メンテナンステーブル画面が表示されます。

メンテナンステーブル

  • ステップ5 *-[フィールド]タブを選択します。 [フィールド]タブに関連するオプションを含む画面が表示されます。
  • ステップ6 *-[フィールド]列にテーブルフィールドの名前を入力します。 フィールド名には文字、数字、アンダースコアを含めることができますが、フィールド名は常に文字で始まり、16文字を超えてはなりません。

作成されるフィールドには、定義されたデータ要素からデータ型、長さ、小数点以下の桁数、短いテキストなどの属性を取得するため、データ要素も必要です。

  • ステップ7 *-フィールドをテーブルキーの一部にする場合は、[キー]列を選択します。 CLIENT、CUSTOMER、NAME、TITLE、DOBなどのフィールドを作成しましょう。
  • ステップ8 *-最初のフィールドは重要なフィールドであり、レコードが関連付けられているクライアントを識別します。 フィールドとして「クライアント」、データ要素として「MANDT」を入力します。 システムは、データタイプ、長さ、小数、および簡単な説明を自動的に入力します。 [クライアント]フィールドは、[キー]ボックスをオンにすることでキーフィールドになります。
  • ステップ9 *-次のフィールドは「顧客」です。 ボックスをチェックしてキーフィールドにし、新しいデータ要素「ZCUSTNUM」を入力します。 [保存]ボタンをクリックします。
  • ステップ10 *-データ要素「ZCUSTNUM」はまだ存在しないため、作成する必要があります。 新しいデータ要素をダブルクリックすると、「データ要素の作成」ウィンドウが表示されます。 これに「はい」と答えると、「データ要素の維持」ウィンドウが表示されます。
  • ステップ11 *-簡単な説明領域に「顧客番号」を入力します。 新しいデータ要素には、「ドメイン」という基本データ型を定義する必要があります。 「ZCUSTD1」と入力してダブルクリックし、行った変更を保存することに同意します。 [はい]を選択してドメインを作成し、[簡単な説明]ボックスにドメインの説明を入力します。

基本データ

[定義]タブが自動的に開きます。 最初のフィールドは「データタイプ」です。

  • ステップ12 *-ボックス内をクリックし、ドロップダウンメニューから[NUMC]タイプを選択します。 [いいえ]に8を入力します。 文字数」フィールド(最大8文字)を入力し、「小数点以下の桁数」エリアに0を入力します。 8の出力長を選択して、Enterを押す必要があります。 「NUMC」フィールドの説明を再表示して、これが有効なエントリであることを確認する必要があります。
  • ステップ13 *-[保存]ボタンをクリックして、オブジェクトをアクティブにします。
  • ステップ14 *-F3を押して、[データ要素の維持/変更]画面に戻ります。 次のスナップショットに示すように、4つのフィールドラベルを作成します。 この後、要素を保存してアクティブ化します。

データ要素の変更

  • ステップ15 *-戻るボタンを押して、テーブルメンテナンス画面に戻ります。 顧客列には、正しいデータ型、長さ、小数、簡単な説明が含まれています。 これは、データ要素の作成が成功したことと、使用されたドメインを示します。

テーブルの変更

同様に、NAME、TITLE、DOBなどの3つの追加フィールドを作成する必要があります。

  • ステップ16 *-ツールバーから「技術設定」を選択します。 「データクラス」にAPPL0を選択し、「サイズ」カテゴリに最初のサイズカテゴリ0を選択します。 バッファリングオプションの場合、「バッファリングを許可しない」を選択する必要があります。
  • ステップ17 *-[保存]をクリックします。 テーブルに戻ってアクティブにします。 次の画面が表示されます。

アクティブなテーブル

テーブル「ZCUSTOMERS1」がアクティブになります。

SAP ABAP-構造

  • 構造*は、メモリに次々に保存される任意のデータ型のコンポーネントで構成されるデータオブジェクトです。

構造

構造体は、画面フィールドをペイントしたり、個別のフィールド数で定義された一貫した形式のデータを操作したりするのに役立ちます。

構造体には実行時に単一のレコードしか含まれない場合がありますが、テーブルには多くのレコードが含まれることがあります。

構造を作成する

  • ステップ1 *-トランザクションSE11に進みます。
  • ステップ2 *-画面の[データタイプ]オプションをクリックします。 「ZSTR_CUSTOMER1」という名前を入力し、[作成]ボタンをクリックします。
  • ステップ3 *-次の画面でオプション「構造」を選択し、Enterを押します。 「構造の維持/変更」ウィザードが表示されます。
  • ステップ4 *-次のスナップショットに示すように、簡単な説明を入力します。

構造の説明

  • ステップ5 *-コンポーネント(フィールド名)とコンポーネントタイプ(データ要素)を入力します。

&minu;ここでは、SAPの推奨事項に従って、コンポーネント名はZで始まります。 データベーステーブルに既に作成したデータ要素を使用しましょう。

  • ステップ6 *-すべてのコンポーネントとコンポーネントタイプを提供した後、保存、確認、アクティブ化する必要があります。

次の画面が表示されます-

アクティブな構造

  • ステップ7 *-この 'ZSTR_CUSTOMER1’が強調表示されているので、緑色のチェックボタンをクリックします。 このウィンドウは消え、ステータスバーに「アクティブ」というメッセージが表示されます。

次のスナップショットに示すように、構造がアクティブになりました-

ZSTR Structure1

SAP ABAP-ビュー

ビューは、データベーステーブルのみのように機能します。 しかし、それはストレージスペースを占有しません。 ビューは、仮想テーブル(物理的に存在しないテーブル)と同様に機能します。 ビューは、アプリケーションオブジェクトに関する情報を含む1つ以上のテーブルのデータを組み合わせて作成されます。 ビューを使用して、テーブルに含まれるデータのサブセットを表すことも、複数のテーブルを単一の仮想テーブルに結合することもできます。

アプリケーションオブジェクトに関連するデータは、データベースビューを使用して複数のテーブルに分散されます。 内部結合条件を使用して、異なるテーブルのデータを結合します。 メンテナンスビューは、アプリケーションオブジェクトに保存されているデータを表示および変更するために使用されます。 すべてのメンテナンスビューには、メンテナンスステータスが関連付けられています。

投影ビューを使用して、不要なフィールドをマスクし、関連するフィールドのみを表に表示します。 投影ビューは、単一の透過テーブル上で定義する必要があります。 投影ビューには、テーブルが1つだけ含まれます。 投影ビューの選択条件を定義することはできません。

ビューを作成する

  • ステップ1 *-ABAPディクショナリの初期画面で[表示]ラジオボタンを選択します。 作成するビューの名前を入力し、[作成]ボタンをクリックします。 ビューの名前をZVIEW_TESTとして入力しました。
  • ステップ2 *-ビュータイプを選択しながら投影ビューのラジオボタンを選択し、[コピー]ボタンをクリックします。 「辞書:ビューの変更」画面が表示されます。
  • ステップ3 *-次のスナップショットに示すように、[短い説明]フィールドに短い説明を入力し、[基本テーブル]フィールドに使用するテーブルの名前を入力します。

ビューの作成

  • ステップ4 *-[テーブルフィールド]ボタンをクリックして、投影ビューにZCUSTOMERS1テーブルのフィールドを含めます。
  • ステップ5 *-テーブルZCUSTOMERS1画面からのフィールド選択が表示されます。 次のスナップショットに示すように、投影ビューに含めるフィールドを選択します。

フィールドテーブルZCUSTOMERS

  • ステップ6 *-[コピー]ボタンをクリックすると、投影ビューで選択したすべてのフィールドが[辞書:ビューの変更]画面に表示されます。

ビューの変更

  • ステップ7 *-アクセス方法を定義するには、[メンテナンスステータス]タブを選択します。 [データブラウザ/テーブルビューメンテナンス]のドロップダウンメニューから、読み取り専用ラジオボタンと[制限付きで許可された表示/メンテナンス]オプションを選択します。
  • ステップ8 *-保存してアクティブにします。 [辞書:ビューの変更]画面で、[ユーティリティ](M)> [コンテンツ]を選択して、ZVIEW_TESTの選択画面を表示します。
  • ステップ9 *-実行アイコンをクリックします。 次のスクリーンショットに示すように、投影ビューの出力が表示されます。

Zviewテーブル

テーブルZCUSTOMERS1は5つのフィールドで構成されています。 ここに表示されるフィールドは3(クライアント、顧客番号、名前)で、4つのエントリがあります。 顧客番号は100001〜100004で、適切な名前が付けられています。

SAP ABAP-検索ヘルプ

ABAPディクショナリの別のリポジトリオブジェクトである検索ヘルプを使用して、フィールドのすべての可能な値をリスト形式で表示します。 このリストは、*ヒットリスト*とも呼ばれます。 面倒でエラーが発生しやすい値を手動で入力する代わりに、このヒットリストからフィールドに入力する値を選択できます。

検索ヘルプの作成

  • ステップ1 *-トランザクションSE11に進みます。 検索ヘルプのラジオボタンを選択します。 作成する検索ヘルプの名前を入力します。 名前ZSRCH1を入力しましょう。 [作成]ボタンをクリックします。
  • ステップ2 *-作成する検索ヘルプタイプの入力を求められます。 デフォルトの基本検索ヘルプを選択します。 次のスクリーンショットに示すような基本検索ヘルプを作成する画面が表示されます。
  • ステップ3 *-選択方法では、データのソースがテーブルかビューかを示す必要があります。 私たちの場合、たまたまテーブルです。 テーブルはZCUSTOMERS1です。 選択リストから選択されます。
  • ステップ4 *-選択方法を入力した後、次のフィールドはダイアログタイプです。 これにより、制限ダイアログボックスの外観を制御します。 3つのオプションを含むドロップダウンリストがあります。 オプション「値をすぐに表示」を選択しましょう。

ヘルプデモの検索

  • ステップ5 *-次はパラメータ領域です。 検索ヘルプのパラメーターまたはフィールドごとに、これらの列フィールドを要件に従って入力する必要があります。
  • 検索ヘルプパラメータ-これはデータのソースからのフィールドです。 テーブルのフィールドが選択リストにリストされます。 検索ヘルプに参加するフィールドは、各行に1フィールドずつ入力されます。 2つのフィールドCUSTOMERとNAMEを含めましょう。 これら2つのフィールドがどのように関与するかは、残りの列に示されています。

ヘルプパラメータの検索

  • インポート-このフィールドは、検索ヘルプパラメータがインポートパラメータであるかどうかを示すチェックボックスです。 エクスポートまたはインポートは、検索ヘルプを参照しています。
  • エクスポート-このフィールドは、検索ヘルプパラメータがエクスポートパラメータであるかどうかを示すチェックボックスです。 エクスポートは、選択リストから画面フィールドへのフィールド値の転送です。
  • LPos -その値は、選択リスト内の検索ヘルプパラメータまたはフィールドの物理的な位置を制御します。 値1を入力すると、フィールドは選択リストの最初の位置に表示されます。
  • SPos -制限付きダイアログボックスの検索ヘルプパラメータまたはフィールドの物理的な位置を制御します。 値1を入力すると、制限ダイアログボックスの最初の位置にフィールドが表示されます。
  • データ要素-すべての検索ヘルプパラメータまたはフィールドには、デフォルトで、データのソース(テーブルまたはビュー)で割り当てられたデータ要素が割り当てられます。 このデータ要素名は表示モードで表示されます。
  • ステップ6 *-整合性チェックを実行し、検索ヘルプをアクティブにします。 F8を押して実行します。 次のスクリーンショットに示すように、「Test Search Help ZSRCH1」画面が表示されます。

テスト検索ヘルプ

  • ステップ7 *-CUSTOMERの[Ready for inp]画面フィールドに番号100004を入力しましょう。 Enterを押します。

値の変更の制限

顧客番号100004と名前「STEPHEN」が表示されます。

SAP ABAP-オブジェクトのロック

ロックオブジェクトは、複数のプログラムによる同じデータへのアクセスを同期するために使用されるABAPディクショナリによって提供される機能です。 データレコードには、特定のプログラムを使用してアクセスします。 ロックオブジェクトは、データがデータベースに挿入または変更されたときの不整合を回避するためにSAPで使用されます。 データレコードをロックするテーブルは、キーオブジェクトとともにロックオブジェクトで定義する必要があります。

ロック機構

以下は、ロック機構で達成される2つの主な機能です-

  • プログラムは、読み取りまたは変更中のデータレコードについて他のプログラムと通信できます。
  • プログラムは、別のプログラムによって変更されたばかりのデータを読み取らないようにすることができます。
  • ロック要求*は最初にプログラムによって生成されます。 次に、この要求はエンキューサーバーに送られ、ロックテーブルにロックが作成されます。 エンキューサーバーがロックを設定すると、プログラムは最終的にデータにアクセスする準備が整います。

ロック要求

ロックオブジェクトの作成

  • ステップ1 *-トランザクションSE11に進みます。 次の画面が開きます。

ロックオブジェクトの作成

  • ステップ2 *-[オブジェクトのロック]ラジオボタンをクリックします。 Eで始まるロックオブジェクトの名前を入力し、[作成]ボタンをクリックします。 ここでは、EZLOCK12を使用します。
  • ステップ3 *-簡単な説明フィールドに入力し、[テーブル]タブをクリックします。
  • ステップ4 *-[名前]フィールドにテーブル名を入力し、ロックモードを[書き込みロック]として選択します。
  • ステップ5 *-[パラメーターのロック]タブをクリックすると、次の画面が表示されます。

Lock Parameter Tab

  • ステップ6 *-保存してアクティブにします。 自動的に2つの汎用モジュールが生成されます。 汎用モジュールを確認するには、[ジャンプ]→[モジュールのロック]を使用できます。
  • ステップ7 *-[モジュールのロック]をクリックすると、次の画面が開きます。

汎用モジュールのロック

ロックオブジェクトが正常に作成されました。

ロックオブジェクトに含まれるテーブルのキー項目はロック引数と呼ばれ、汎用モジュールの入力パラメータとして使用されます。 これらの引数は、ロックオブジェクト定義によって生成されたロックを設定および削除するために使用されます。

SAP ABAP-モジュール化

プログラムを自己完結型で、できるだけ読みやすくすることをお勧めします。 個々のモジュールに各タスクを配置することで、大規模で複雑なタスクをより小さくシンプルなタスクに分割してみてください。

SAP ABAP環境では、モジュール化には、*論理ブロック*とも呼ばれるモジュール単位へのプログラムの編成が含まれます。 冗長性を減らし、作成中およびその後のメンテナンスサイクル中であっても、プログラムの可読性を高めます。 モジュール化により、同じコードの再利用も可能になります。 ABAPにより、開発者はモジュール化、つまり 比較的組み込みのモジュール機能を備えたOOPSベースの言語よりも、プログラムを比較的多く編成します。 コード化された小さなモジュール化されたセクションが完成し、デバッグなどが行われると、その後に戻る必要はなく、開発者は次に進んで他の問題に集中できます。

ABAPプログラムは、処理ブロックのモジュール化と呼ばれる処理ブロックで構成されています。 彼らは-

  • プログラムの外部およびABAPランタイム環境から呼び出される処理ブロック(イベントブロックやダイアログモジュールなど)。
  • ABAPプログラムから呼び出される処理ブロック。

処理ブロックによるモジュール化とは別に、ソースコードモジュールを使用して、マクロを介してソースコードをモジュール化し、プログラムを組み込みます。

ソースコードレベルでのモジュール化-

  • ローカルマクロ
  • グローバルインクルードプログラム

ABAPプログラムから呼び出される処理ブロックを介したモジュール化-

  • サブルーチン
  • 汎用モジュール

ソースコードのモジュール化とは、一連のABAPステートメントをモジュールに配置することを意味します。 モジュール化されたソースコードは、ユーザーの要件に従ってプログラムで呼び出すことができます。 ソースコードモジュールは、ABAPプログラムの読みやすさと理解しやすさを向上させます。 また、個々のソースコードモジュールを作成することで、同じステートメントを何度も繰り返し記述する必要がなくなるため、コードを初めて使用する人にとってコードが理解しやすくなります。

SAP ABAP-サブルーチン

サブルーチンは、コードの再利用可能なセクションです。 これは、プログラム内のモジュール化ユニットであり、関数はソースコードの形式でカプセル化されます。 次の図に示すように、プログラムの一部をサブルーチンにページアウトして、メインプログラムのより良い概要を取得し、対応する一連のステートメントを何度も使用します。

サブルーチン再利用可能セクション

プログラムXには3つの異なる*ソースコードブロック*があります。 各ブロックには同じABAPステートメントがあります。 基本的に、これらは同じコードブロックです。 このコードを保守しやすくするために、コードをサブルーチンにカプセル化できます。 このサブルーチンは、プログラムで何度でも呼び出すことができます。 サブルーチンは、FormおよびEndFormステートメントを使用して定義できます。

サブルーチン定義の一般的な構文は次のとおりです。

FORM <subroutine_name>.

<statements>

ENDFORM.

PERFORMステートメントを使用してサブルーチンを呼び出すことができます。 コントロールは、サブルーチン<subroutine_name>内の最初の実行可能ステートメントにジャンプします。 ENDFORMが検出されると、制御はPERFORMステートメントに続くステートメントにジャンプして戻ります。

  • ステップ1 *-トランザクションSE80に移動します。 既存のプログラムを開き、プログラムを右クリックします。 この場合、「ZSUBTEST」です。
  • ステップ2 *-[作成]を選択し、[サブルーチン]を選択します。 フィールドにサブルーチン名を入力して、続行ボタンをクリックします。 次のスクリーンショットに示すように、サブルーチン名は「Sub_Display」です。

サブルーチンの作成

  • ステップ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
  • ステップ4 *-プログラムを保存、アクティブ化、実行します。 上記のコードは、次の出力を生成します-
Subroutine Test:

This is Subroutine

Subroutine created successfully

したがって、サブルーチンを使用すると、プログラムがより機能指向になります。 プログラムのタスクをサブ関数に分割し、各サブルーチンが1つのサブ関数を担当するようにします。 多くの場合、関数の変更はサブルーチンに実装するだけで済むため、プログラムの保守が容易になります。

SAP ABAP-マクロ

プログラムで同じステートメントのセットを複数回再利用したい場合は、それらをマクロに含める必要があります。 たとえば、マクロは、長い計算や複雑な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を作成します-

新しいプログラムZMACRO

以下はコードです-

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 ABAP-汎用モジュール

SAPは長年にわたって機能モジュールを使用してコードをモジュール化しており、それ自体、開発者、および顧客によるコードの再利用を可能にしているため、機能モジュールはSAPシステムの主要部分を構成します。

汎用モジュールは、パラメータをインポートおよびエクスポートする再利用可能な一連のステートメントを含むサブプログラムです。 インクルードプログラムとは異なり、汎用モジュールは独立して実行できます。 SAPシステムには、任意のABAPプログラムから呼び出すことができる定義済みの汎用モジュールがいくつか含まれています。 汎用グループは、論理的に一緒に属する多数の汎用モジュールの一種のコンテナとして機能します。 たとえば、人事給与計算システムの汎用モジュールは、機能グループにまとめられます。

汎用モジュールの作成方法を調べるには、機能ビルダーを調べる必要があります。 関数ビルダーは、トランザクションコードSE37で見つけることができます。 汎用モジュール名の一部をワイルドカード文字で入力するだけで、汎用モジュールの検索方法を示すことができます。 amount と入力し、F4キーを押します。

汎用モジュールの作成

検索の結果が新しいウィンドウに表示されます。 汎用モジュールは、背景が青色の行に表示され、機能グループはピンク色の行で表示されます。 オブジェクトナビゲータ画面(トランザクションSE80)を使用して、機能グループISOCをさらに見ることができます。 汎用モジュールのリストと、汎用グループに保持されている他のオブジェクトを見ることができます。 汎用モジュールSPELL_AMOUNTを考えてみましょう。 この汎用モジュールは、数値を単語に変換します。

新しいプログラムを作成する

  • ステップ1 *-トランザクションSE38に移動して、Z_SPELLAMOUNTという新しいプログラムを作成します。
  • ステップ2 *-値を入力して汎用モジュールに渡すことができる場所にパラメーターを設定できるように、コードを入力します。 ここのテキスト要素text-001は、「値を入力してください」と表示されます。
  • ステップ3 *-このためのコードを書くには、CTRL + F6を使用します。 この後、「CALL FUNCTION」がリストの最初のオプションであるウィンドウが表示されます。 テキストボックスに「spell_amount」と入力し、[続行]ボタンをクリックします。

スペル量プログラム

  • ステップ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.
  • ステップ5 *-汎用モジュールが返す変数は、IN_WORDSと呼ばれます。 「result」というプログラムで対応する変数を設定します。 LIKEステートメントを使用して、SPELLと呼ばれる構造を参照することにより、IN_WORDSを定義します。
  • ステップ6 *-プログラムを保存、アクティブ化、実行します。 次のスクリーンショットに示すように値を入力し、F8を押します。

スペル量

上記のコードは、次の出力を生成します-

Spelling the Amount
Amount in words is:
FIVE THOUSAND SIX HUNDRED EIGHTY

SAP ABAP-プログラムを含める

インクルードプログラムは、ソースコードをモジュール化するために使用されるグローバルリポジトリオブジェクトです。 異なるプログラムで同じソースコードを使用できます。 インクルードプログラムを使用すると、複雑なプログラムを整然と管理することもできます。 別のプログラムでインクルードプログラムを使用するには、次の構文を使用します-

INCLUDE <program_name>.

INCLUDEステートメントには、インクルードプログラム<program_name>のソースコードを別のプログラムにコピーするのと同じ効果があります。 includeプログラムは独立して実行できないため、他のプログラムに組み込む必要があります。 インクルードプログラムをネストすることもできます。

以下は、インクルードプログラムのコードを記述する際のいくつかの制限です-

  • インクルードプログラムは自分自身を呼び出すことはできません。
  • インクルードプログラムには完全なステートメントが含まれている必要があります。

インクルードプログラムを作成して使用する手順は次のとおりです-

  • ステップ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.
  • ステップ2 *-次のスクリーンショットに示すように、プログラムのタイプをINCLUDEプログラムに設定します。

プログラムを含める

  • ステップ3 *-[保存]ボタンをクリックし、ZINCL_PCKGという名前のパッケージにプログラムを保存します。
  • ステップ4 *-プログラムZ_TOBEINCLUDEDを使用する必要がある別のプログラムを作成します。 ここで、Z_INCLUDINGTESTという名前の別のプログラムを作成し、実行可能プログラムとしてプログラムのタイプを割り当てました。
  • ステップ5 *-Z_INCLUDINGTESTプログラムのコーディングには、次のコードに示すように、INCLUDEステートメントの助けを借りたZ_TOBEINCLUDEDプログラムが含まれます。
REPORT Z_INCLUDINGTEST.
INCLUDE Z_TOBEINCLUDED.
  • ステップ6 *-プログラムを保存、アクティブ化、実行します。

上記のコードは、次の出力を生成します-

This program is started by: SAPUSER
The Date is: 06.10.2015
Time is 13:25:11

SAP ABAP-オープンSQLの概要

オープンSQLは、現在のAS ABAPの中央データベースのデータに直接アクセスできるようにするABAPステートメントのサブセットを示します。 オープンSQLステートメントは、すべてのデータベースシステムでサポートされているABAPのSQLのデータ操作言語機能をマップします。

Open SQLのステートメントは、データベースインターフェイスのOpen SQLインターフェイスでデータベース固有のSQLに変換されます。 その後、データベースシステムに転送され、実行されます。 オープンSQLステートメントを使用して、ABAPディクショナリで宣言されているデータベーステーブルにアクセスできます。 AS ABAPの中央データベースにはデフォルトでアクセスされますが、セカンダリデータベース接続を介して他のデータベースにもアクセスできます。

これらのステートメントのいずれかがABAPプログラムで使用される場合は常に、実行されたアクションが成功したかどうかを確認することが重要です。 データベーステーブルにレコードを挿入しようとしても正しく挿入されない場合は、プログラムで適切なアクションを実行できるように知ることが非常に重要です。 これは、すでに使用されているシステムフィールド、つまりSY-SUBRCを使用して実行できます。 ステートメントが正常に実行されると、SY-SUBRCフィールドの値は0になります。そのため、これを確認でき、プログラムが表示された場合はプログラムを続行できます。

DATAステートメントは、作業領域を宣言するために使用されます。 これに「wa_customers1」という名前を付けましょう。 このために1つのデータ型を宣言するのではなく、テーブルを構成するいくつかのフィールドを宣言できます。 これを行う最も簡単な方法は、LIKEステートメントを使用することです。

INSERTステートメント

wa_customers1ワークエリアは、ZCUSTOMERS1テーブルのようにここで宣言され、テーブル自体にならずに同じ構造を取ります。 この作業領域には、1つのレコードのみを保存できます。 宣言されると、INSERTステートメントを使用して、作業領域とそれが保持するレコードをテーブルに挿入できます。 ここのコードは「INSERT ZCUSTOMERS1 FROM wa_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ステートメント

SAP ABAP-ネイティブSQLの概要

「ネイティブSQL」という用語は、データベースインターフェースのネイティブSQLインターフェースに静的に転送できるすべてのステートメントを指します。 ネイティブSQLステートメントは、ABAPの言語スコープに含まれず、ABAP構文に従いません。 ABAPには、ネイティブSQLステートメントをリストできるプログラムセクションを分離するためのステートメントが含まれているだけです。

ネイティブ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/3 SAPシステム内で使用できます。 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

SAP ABAP-内部テーブル

内部テーブルは実際には一時テーブルであり、実行中のABAPプログラムのレコードが含まれています。 内部テーブルは、SAPプログラムの実行時にのみ存在します。 これらは、ABAP言語を使用して大量のデータを処理するために使用されます。 データベーステーブルからデータを取得する必要がある場合は、ABAPプログラムで内部テーブルを宣言する必要があります。

内部テーブルのデータは行と列に保存されます。 各行は line と呼ばれ、各列は field と呼ばれます。 内部テーブルでは、すべてのレコードは同じ構造とキーを持っています。 内部テーブルの個々のレコードには、インデックスまたはキーを使用してアクセスします。 関連するプログラムが実行されるまで内部テーブルが存在するため、プログラムの実行が終了すると内部テーブルのレコードは破棄されます。 したがって、内部テーブルは、必要に応じてデータを変更できる一時記憶領域または一時バッファとして使用できます。 これらのテーブルは実行時にのみメモリを占有し、宣言時にはメモリを占有しません。

内部テーブルはプログラムの実行中にのみ存在するため、コードを記述するときは、プログラムが使用できるように内部テーブルを構成する必要があります。 内部テーブルは構造と同じように動作することがわかります。 主な違いは、構造には1行しかないのに対して、内部テーブルには必要な数の行を含めることができることです。

内部テーブルは、ABAPディクショナリのように複数のフィールドを使用してテーブルが作成されたように、テーブルの列に対応する複数のフィールドで構成できます。 キーフィールドは内部テーブルでも使用でき、これらの内部テーブルを作成する際、柔軟性がわずかに向上します。 内部テーブルでは、一意でないキーを指定して、任意の数の一意でないレコードを保存し、必要に応じて重複するレコードを保存できます。

内部テーブルのサイズまたはそれに含まれる行数は固定されていません。 内部テーブルのサイズは、内部テーブルに関連付けられたプログラムの要件に従って変化します。 ただし、内部テーブルをできるだけ小さくすることをお勧めします。 これは、膨大な量のデータの処理に苦労するため、システムの実行速度が低下するのを防ぐためです。

内部テーブルは多くの目的に使用されます-

  • これらは、後でプログラムで使用できる計算結果を保持するために使用できます。
  • 内部テーブルにはレコードやデータも保持できるため、データベーステーブルからこのデータにアクセスするのではなく、迅速にアクセスできます。
  • 彼らは非常に汎用性があります。 他の定義された構造をいくつでも使用して定義できます。

ユーザーが1つまたは複数の大きなテーブルからさまざまな顧客の連絡先番号のリストを作成するとします。 ユーザーはまず内部テーブルを作成し、顧客テーブルから関連データを選択してから、内部テーブルにデータを配置します。 他のユーザーは、プログラムの実行中に各操作を実行するためのデータベースクエリを作成する代わりに、この内部テーブルに直接アクセスして目的の情報を取得できます。

SAP ABAP-内部テーブルの作成

DATAステートメントは、内部テーブルを宣言するために使用されます。 テーブルの開始位置と終了位置をプログラムに通知する必要があります。 そのため、BEGIN OFステートメントを使用してから、テーブル名を宣言します。 この後、OCCURSオプションが使用され、その後に数字が続きます(ここでは0)。 OCCURSは、内部テーブルが作成されていることをSAPに通知し、0は最初にレコードを含まないことを示します。 その後、データがいっぱいになると展開されます。

以下は構文です-

DATA: BEGIN OF <internal_tab> Occurs 0,

新しい行にフィールドを作成しましょう。 たとえば、LIKE ZCUSTOMERS1-nameとして宣言されている「名前」を作成します。 「dob」という別のフィールド、LIKE ZCUSTOMERS1-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」を指定できます。 OCCUR 0句で使用されるメモリのデフォルトサイズは8 KBです。 これで、内部テーブルの構造が作成され、コードを記述してレコードを埋めることができます。

内部テーブルは、ヘッダー行を使用して、または使用せずに作成できます。 ヘッダー行を含む内部テーブルを作成するには、内部テーブルの定義で、OCCURS句の前にBEGIN OF句を使用するか、OCCURS句の後にWITH HEADER LINE句を使用します。 ヘッダー行なしで内部テーブルを作成するには、BEGIN OF句なしで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>は、初期メモリ量を割り当てて内部テーブルオブジェクトを作成します。 上記の構文では、INITIAL SIZE句はsize_numberテーブル行用のメモリスペースを予約します。 内部テーブルオブジェクトが宣言されるたびに、テーブルのサイズはテーブルのデータ型に属しません。

-内部テーブルに初めてデータを入力するときに消費されるメモリははるかに少なくなります。

  • ステップ1 *-SE38トランザクションコードを実行してABAPエディターを開きます。 ABAPエディターの初期画面が表示されます。
  • ステップ2 *-初期画面で、プログラムの名前を入力し、[ソースコード]ラジオボタンを選択し、[作成]ボタンをクリックして新しいプログラムを作成します。
  • ステップ3 *-[ABAP:Program Attributes]ダイアログボックスの[Title]フィールドにプログラムの簡単な説明を入力し、[Attributes]グループボックスの[Type]ドロップダウンメニューから[Executable program]オプションを選択します。 [保存]ボタンをクリックします。
  • ステップ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'.
  • ステップ5 *-通常どおりプログラムを保存、アクティブ化、実行します。

この例では、mytableは内部テーブルであり、一意のキーはCust_IDフィールドで定義されています。

上記のコードは、次の出力を生成します-

The mytable is an Internal Table.

SAP ABAP-内部テーブルの生成

内部テーブルでは、入力には選択、挿入、追加などの機能が含まれます。 この章では、INSERTおよびAPPENDステートメントに焦点を当てます。

INSERTステートメント

INSERTステートメントは、単一行または行グループを内部テーブルに挿入するために使用されます。

以下は、内部テーブルに単一行を追加するための構文です-

INSERT <work_area_itab> INTO <internal_tab> INDEX <index_num>.

この構文では、INSERTステートメントはinternal_tab内部テーブルに新しい行を挿入します。 internal_tabパラメーターの前にwork_area_itab INTO式を使用して、新しい行を挿入できます。 work_area_itab INTO式を使用すると、work_area_itab作業領域から新しい行が取得され、internal_tabテーブルに挿入されます。 ただし、work_area_itab INTO式を使用して行を挿入しない場合、その行はinternal_tabテーブルのヘッダー行から取得されます。

INDEX句を使用して新しい行が内部テーブルに挿入されると、挿入された行の後の行のインデックス番号が1ずつ増加します。 内部テーブルに<index_num>-1行が含まれている場合、テーブルの最後に新しい行が追加されます。 SAPシステムが内部テーブルに行を正常に追加すると、SY-SUBRC変数は0に設定されます。

以下は、挿入ステートメントを使用するサンプルプログラムです。

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.

上記のコードは、次のoutpを生成します-

        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ステートメントは、既存の内部テーブルに単一の行または行を追加するために使用されます。 この命令は、作業領域から単一の行をコピーし、内部テーブルの最後の既存の行の後に挿入します。 作業領域は、ヘッダー行、または内部テーブルの行と同じ構造を持つ他のフィールド文字列のいずれかです。 以下は、内部テーブルに単一行を追加するために使用されるAPPENDステートメントの構文です-

APPEND <record_for_itab> TO <internal_tab>.

この構文では、<record_for_itab>式を<work_area_itab>作業領域で表すことができます。この作業領域は、行タイプまたはINITIAL LINE句に変換できます。 ユーザーが<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

SAP ABAP-内部テーブルのコピー

ヘッダー行を持つ内部テーブルからレコードを読み取ると、そのレコードはテーブル自体からヘッダー行に移動します。 これが、プログラムが使用するヘッダー行です。 新しいレコードを作成するときにも同じことが当てはまります。 これは、新しいレコードがテーブル本体自体に送信され、そこから送信されるヘッダー行です。

レコードをコピーするには、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

選択ループは、MOVEステートメントを使用してテーブルのフィールド間でデータを移動し、各フィールドを1つずつ埋めます。 上記の例では、MOCステートメントを使用して、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ステートメントを使用して行われました。

SAP ABAP-内部テーブルの読み取り

私たちは、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>.

ここでは、内部テーブルの行全体が*検索キー*として使用されます。 テーブルの行全体の内容は、<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に設定されます。 さらに、比較されるフィールドの内容が同じでない場合、またはSAPシステムがエントリを見つけることができない場合、SY-SUBRC変数の値は2または4に設​​定されます。 ただし、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作業領域の値を比較した後、テーブルの行を読み取り、作業領域の読み取り行の内容をコピーします。 SY-SUBRC変数の値は2として表示されます。これは、ColPフィールドの値が4の場合、ColQの値は12ではなく9であるためです。

SAP ABAP-内部テーブルの削除

DELETEステートメントは、内部テーブルから1つ以上のレコードを削除するために使用されます。 内部テーブルのレコードは、テーブルキーまたは条件を指定するか、重複エントリを見つけることにより削除されます。 内部テーブルに一意でないキーがあり、重複するエントリが含まれている場合、テーブルの最初のエントリが削除されます。

以下は、DELETEステートメントを使用して内部テーブルからレコードまたは行を削除する構文です-

DELETE TABLE <internal_table> FROM <work_area_itab>.

上記の構文では、<work_area_itab>式は作業領域であり、<internal_table>内部テーブルのタイプと互換性がある必要があります。 削除操作は、作業領域コンポーネントから取得できるデフォルトキーに基づいて実行されます。

次の構文を使用して、DELETE TABLEステートメントでテーブルキーを明示的に指定することもできます-

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>テーブルのレコードまたは行を削除するために使用されます。

-<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が含まれます。 ColP値は毎回4ずつ増加するため、ColQには値5、6、7、8、9、10、11、および12が含まれます。

DELETEステートメントは、ColPキーフィールドの値が1または3であるmytableから行を削除するために使用されます。 削除後、出力に示されているように、mytableのColPフィールドには値2、4、5、6、7、8が含まれます。 ColQフィールドには、値6、8、9、10、11、および12が含まれます。

SAP ABAP-オブジェクトの方向

オブジェクト指向により、ソフトウェア設計が簡素化され、理解、保守、再利用が容易になります。 オブジェクト指向プログラミング(OOP)は、ソフトウェアを書く際の異なる考え方を表します。 OOPの美しさは、そのシンプルさにあります。 OOPの表現力により、高品質のソフトウェアコンポーネントを予定どおりに簡単に提供できます。

ソリューションは実世界のオブジェクトの観点から設計されているため、プログラマーやビジネスアナリストは、共通のドメイン言語を使用する設計に関するアイデアや情報を交換することがはるかに容易になります。 これらのコミュニケーションの改善は、隠れた要件を明らかにし、リスクを特定し、開発中のソフトウェアの品質を向上させるのに役立ちます。 オブジェクト指向のアプローチは、現実世界の抽象的なまたは具体的なものを表すオブジェクトに焦点を当てています。 これらのオブジェクトは、その内部構造と属性(データ)で表される文字とプロパティによって定義されます。 これらのオブジェクトの動作は、メソッド(つまり、 機能性)。

手続き型プログラミングとオブジェクト指向プログラミングを比較しましょう-

Features Procedure Oriented approach Object Oriented approach
Emphasis Emphasis is on tasks. Emphasis is on things that does those tasks.
Modularization Programs can be divided into smaller programs known as functions. Programs are organized into classes and objects and the functionalities are embedded into methods of a class.
Data security Most of the functions share global data. Data can be hidden and can’t be accessed by external sources.
Extensibility This is more time consuming to modify and extend the existing functionality. New data and functions can be added effortlessly as and when required.

ABAPは当初、手続き型言語として開発されました(COBOLのような以前の手続き型プログラミング言語に似ています)。 しかし、ABAPは現在、オブジェクト指向パラダイムの原則をABAPオブジェクトの導入により適合させています。 クラス、オブジェクト、継承、ポリモーフィズムなどのABAPのオブジェクト指向の概念は、JavaやC ++などの他の最新のオブジェクト指向言語の概念と本質的に同じです。

オブジェクト指向が形になり始めると、各クラスは特定の役割の割り当てを引き受けます。 この分業により、プログラミングモデル全体が簡素化され、各クラスが特定の問題の解決に特化できるようになります。 このようなクラスには高い凝集度があり、各クラスの操作は何らかの直感的な方法で密接に関連しています。

オブジェクト指向の主な特徴は次のとおりです-

  • 効果的なプログラミング構造。
  • 実際のエンティティは非常にうまくモデル化できます。
  • データのセキュリティとアクセスに重点を置きます。
  • コードの冗長性を最小限にします。
  • データの抽象化とカプセル化。

SAP ABAP-オブジェクト

オブジェクトは、異なる特性と動作を持つ特別な種類の変数です。 オブジェクトの特性または属性はオブジェクトの状態を記述するために使用され、動作またはメソッドはオブジェクトによって実行されるアクションを表します。

オブジェクトは、クラスのパターンまたはインスタンスです。 これは、人や変数や定数などのプログラミングエンティティなどの実世界のエンティティを表します。 たとえば、アカウントと学生は実際のエンティティの例です。 しかし、コンピューターのハードウェアおよびソフトウェアコンポーネントは、プログラミングエンティティの例です。

オブジェクトには、次の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.

SAP ABAP-クラス

クラスはオブジェクトの形式を指定するために使用され、データ表現とそのデータを1つのきれいなパッケージに操作するためのメソッドを組み合わせます。 クラス内のデータと関数は、*クラスのメンバー*と呼ばれます。

クラスの定義と実装

クラスを定義するときには、データ型の設計図を定義します。 これは実際にはデータを定義しませんが、クラス名の意味、クラスのオブジェクトの構成要素、およびそのようなオブジェクトに対して実行できる操作を定義します。 つまり、属性、フィールド、プロパティなど、オブジェクトの抽象的な特性を定義します。

次の構文は、クラスを定義する方法を示しています-

CLASS <class_name> DEFINITION.
..........
..........
ENDCLASS.

クラス定義は、キーワードCLASSで始まり、クラス名、DEFINITION、およびクラス本体が続きます。 クラスの定義には、属性、メソッド、イベントなど、クラスのさまざまなコンポーネントを含めることができます。 クラス宣言でメソッドを宣言するとき、メソッド実装をクラス実装に含める必要があります。 次の構文は、クラスを実装する方法を示しています-

CLASS <class_name> IMPLEMENTATION.
...........
..........
ENDCLASS.

-クラスの実装には、そのすべてのメソッドの実装が含まれます。 ABAPオブジェクトでは、クラスの構造には、属性、メソッド、イベント、タイプ、定数などのコンポーネントが含まれます。

属性

属性は、C、I、F、Nなどの任意のデータ型を持つことができるクラスのデータフィールドです。 それらはクラス宣言で宣言されます。 これらの属性は、インスタンス属性と静的属性の2つのカテゴリに分類できます。 *インスタンス属性*は、オブジェクトのインスタンス固有の状態を定義します。 状態はオブジェクトごとに異なります。 インスタンス属性は、DATAステートメントを使用して宣言されます。

  • 静的属性*は、クラスのすべてのインスタンスによって共有されるクラスの共通状態を定義します。 つまり、クラスの1つのオブジェクトの静的属性を変更すると、その変更はクラスの他のすべてのオブジェクトにも表示されます。 静的属性は、CLASS-DATAステートメントを使用して宣言されます。

方法

メソッドは、クラス内のオブジェクトの動作を表す関数またはプロシージャです。 クラスのメソッドは、クラスの任意の属性にアクセスできます。 メソッドの定義にはパラメーターを含めることもできるため、メソッドが呼び出されたときにこれらのパラメーターに値を指定できます。 メソッドの定義は、クラス宣言で宣言され、クラスの実装部分で実装されます。 METHODおよびENDMETHODステートメントは、メソッドの実装部分を定義するために使用されます。 次の構文は、メソッドを実装する方法を示しています-

METHOD <m_name>.
..........
..........
ENDMETHOD.

この構文では、<m_name>はメソッドの名前を表します。 -CALL METHODステートメントを使用してメソッドを呼び出すことができます。

属性とメソッドへのアクセス

クラスコンポーネントは、これらのコンポーネントへのアクセス方法を制御するパブリック、プライベート、または保護された可視性セクションで定義できます。 プライベート可視性セクションは、クラス外からのコンポーネントへのアクセスを拒否するために使用されます。 このようなコンポーネントには、メソッドなどのクラス内からのみアクセスできます。

パブリック可視性セクションで定義されたコンポーネントには、どのコンテキストからもアクセスできます。 デフォルトでは、クラスのすべてのメンバーはプライベートです。 実際には、プライベートセクションでデータを定義し、パブリックセクションで関連メソッドを定義して、次のプログラムに示すようにクラスの外部から呼び出せるようにします。

  • クラスのPublicセクションで宣言された属性とメソッドには、そのクラスと他のクラス、プログラムのサブクラスからアクセスできます。
  • クラスの保護セクションで属性とメソッドが宣言されている場合、それらのクラスとサブクラス(派生クラス)のみがそれらにアクセスできます。
  • 属性とメソッドがクラスの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= 'Some Text’のようなクラス名を使用して直接アクセスします。

以下は、行番号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

SAP ABAP-継承

オブジェクト指向プログラミングで最も重要な概念の1つは、継承の概念です。 継承を使用すると、クラスを別のクラスの観点から定義でき、アプリケーションの作成と保守が簡単になります。 これにより、コード機能を再利用して実装時間を短縮することもできます。

クラスを作成するとき、プログラマは完全に新しいデータメンバーとメソッドを記述する代わりに、新しいクラスが既存のクラスのメンバーを継承するように指定できます。 この既存のクラスは「ベースクラス」または「スーパークラス」と呼ばれ、新しいクラスは「派生クラス」または「サブクラス」と呼ばれます。

  • あるクラスのオブジェクトは、別のクラスのプロパティを取得できます。
  • 派生クラスは、スーパークラスのデータとメソッドを継承します。 ただし、メソッドを上書きしたり、新しいメソッドを追加したりできます。
  • 継承の主な利点は再利用性です。

継承関係は、クラス定義ステートメントに「INHERITING FROM」オプションを使用して指定されます。

以下は構文です-

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

アクセス制御と継承

派生クラスは、その基本クラスのすべての非プライベートメンバーにアクセスできます。 したがって、サブクラスのメンバー関数にアクセスできないはずのスーパークラスのメンバーは、スーパークラスでprivateと宣言する必要があります。 私たちは、次の方法でそれらにアクセスできる人に応じてさまざまなアクセスタイプを要約することができます-

Access Public Protected Private
Same calss Yes Yes Yes
Derived class Yes Yes No
Outside class Yes No No

スーパークラスからクラスを派生させる場合、パブリック、保護、またはプライベート継承を介して継承できます。 継承のタイプは、上記のようにアクセス指定子によって指定されます。 保護された継承またはプライベートな継承はほとんど使用しませんが、パブリックな継承が一般的に使用されます。 異なるタイプの継承を使用している場合、次のルールが適用されます。

  • パブリック継承-クラスをパブリックスーパークラスから派生させると、スーパークラスのパブリックメンバーはサブクラスのパブリックメンバーになり、スーパークラスの保護メンバーはサブクラスの保護メンバーになります。 スーパークラスのプライベートメンバーは、サブクラスから直接アクセスすることはできませんが、スーパークラスのパブリックおよび保護されたメンバーへの呼び出しを介してアクセスできます。
  • 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を入力すると、上記のコードは次の出力を生成します-

再実装されたosサブクラス

Redefinition Demo
29

SAP ABAP-ポリモーフィズム

多型という用語は、文字通り「多くの形態」を意味します。 オブジェクト指向の観点から見ると、ポリモーフィズムは継承と連携して機能し、継承ツリー内のさまざまなタイプを互換的に使用できるようにします。 つまり、クラスの階層が存在し、それらが継承によって関連付けられている場合、ポリモーフィズムが発生します。 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の割り当て中に暗黙的なナローイングキャストを実行します。 この機能は、「開始」メソッドを一般的に実装するのに役立ちます。 オブジェクト参照変数に関連付けられた動的な型情報により、ABAPランタイム環境は、オブジェクト参照変数が指すオブジェクトで定義された実装にメソッド呼び出しを動的にバインドできます。 たとえば、 'class_type_approach’クラスのメソッド 'start’のインポートパラメーター 'class1_prgm’は、それ自体ではインスタンス化できない抽象型を参照します。

class_proceduralやclass_OOなどの具象サブクラス実装でメソッドが呼び出されるたびに、class1_prgm参照パラメーターの動的型はこれらの具象型のいずれかにバインドされます。 したがって、メソッド「prgm_type」および「approach1」の呼び出しは、クラス「class_prgm」で提供される未定義の抽象実装ではなく、class_proceduralまたはclass_OOサブクラスで提供される実装を参照します。

SAP ABAP-カプセル化

カプセル化はオブジェクト指向プログラミング(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

カプセル化されたクラスは、外部の世界にあまり依存していません。 さらに、外部クライアントとのやり取りは、安定したパブリックインターフェイスを通じて制御されます。 つまり、カプセル化されたクラスとそのクライアントは疎結合です。 ほとんどの場合、明確に定義されたインターフェイスを持つクラスは、別のコンテキストにプラグインできます。 正しく設計されると、カプセル化されたクラスは再利用可能なソフトウェア資産になります。

戦略の設計

私たちのほとんどは、実際にクラスメンバーを公開する必要がない限り、デフォルトではクラスメンバーをプライベートにするという苦い経験を​​通じて学んでいます。 それはちょうど良いカプセル化です。 この知恵は、データメンバーに最も頻繁に適用され、すべてのメンバーにも等しく適用されます。

SAP ABAP-インターフェース

ABAPのクラスと同様に、インターフェイスはオブジェクトのデータ型として機能します。 インターフェイスのコンポーネントは、クラスのコンポーネントと同じです。 クラスの宣言とは異なり、インターフェイスの宣言には可視性セクションは含まれません。 これは、インターフェイスの宣言で定義されたコンポーネントが常にクラスのパブリック可視性セクションに統合されるためです。

インターフェイスは、2つの類似したクラスに同じ名前のメソッドがあるが、機能が互いに異なる場合に使用されます。 インターフェイスはクラスに似ているように見えるかもしれませんが、インターフェイスで定義された関数はクラスに実装され、そのクラスのスコープを拡張します。 インターフェイスと継承機能は、ポリモーフィズムの基盤を提供します。 これは、インターフェイスで定義されたメソッドがクラスごとに異なる動作をする可能性があるためです。

以下は、インターフェイスを作成するための一般的な形式です-

INTERFACE <intf_name>.
DATA.....
CLASS-DATA.....
METHODS.....
CLASS-METHODS.....
ENDINTERFACE.

この構文では、<intf_name>はインターフェイスの名前を表します。 DATAおよびCLASSDATAステートメントを使用して、それぞれインターフェースのインスタンスおよび静的属性を定義できます。 METHODSおよびCLASS-METHODSステートメントは、インターフェースのインスタンスおよび静的メソッドをそれぞれ定義するために使用できます。 インターフェースの定義には実装クラスが含まれていないため、インターフェースの宣言にDEFINITION句を追加する必要はありません。

-インターフェイスのすべてのメソッドは抽象的です。 これらは、パラメーターインターフェイスを含めて完全に宣言されていますが、インターフェイスには実装されていません。 インターフェイスを使用するすべてのクラスは、インターフェイスのすべてのメソッドを実装する必要があります。 それ以外の場合、クラスは抽象クラスになります。

私たちはクラスの実装部分で次の構文を使用します-

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メソッドなど、それぞれのインスタンスの動作を定義する特定のメソッドを実装します。

-add_numberおよびspeed1メソッドは、それぞれのクラスに固有です。

SAP ABAP-オブジェクトイベント

  • イベント*は、他のクラスのイベントハンドラーをトリガーするためにクラスで定義される一連の結果です。 イベントがトリガーされると、イベントハンドラーメソッドをいくつでも呼び出すことができます。 トリガーとそのハンドラーメソッド間のリンクは、実際には実行時に動的に決定されます。

通常のメソッド呼び出しでは、呼び出し側プログラムは、オブジェクトまたはクラスのどのメソッドを呼び出す必要があるかを決定します。 固定ハンドラーメソッドはすべてのイベントに対して登録されるわけではないため、イベント処理の場合、ハンドラーメソッドはトリガーする必要があるイベントを決定します。

クラスのイベントは、RAISE EVENTステートメントを使用して、同じクラスのイベントハンドラーメソッドをトリガーできます。 イベントの場合、イベントハンドラメソッドは、次の構文に示すように、FOR EVENT句を使用して同じまたは異なるクラスで定義できます-

FOR EVENT <event_name> OF <class_name>.

クラスのメソッドと同様に、イベントはパラメーターインターフェイスを持つことができますが、出力パラメーターのみがあります。 出力パラメーターは、入力パラメーターとして受け取るRAISE EVENTステートメントによってイベントハンドラーメソッドに渡されます。 イベントは、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

SAP ABAP-レポートプログラミング

  • レポート*は、組織化された構造のデータのプレゼンテーションです。 多くのデータベース管理システムには、レポートの設計と生成を可能にするレポートライターが含まれています。 SAPアプリケーションはレポート作成をサポートします。

古典的なレポートは、ループ内のWRITEステートメントの出力データを使用して作成されます。 サブレポートは含まれていません。 SAPは、クライアント間でテーブルをコピーするために使用されるRSCLTCOPや、インスタンスパラメータを表示するために使用されるRSPARAMなどの標準レポートも提供します。

これらのレポートは、出力として1つの画面のみで構成されます。 INITIALIZATONやTOP-OF-PAGEなどのさまざまなイベントを使用してクラシックレポートを作成できます。各イベントは、クラシックレポートの作成中に独自の重要性を持ちます。 これらの各イベントは特定のユーザーアクションに関連付けられ、ユーザーがそのアクションを実行したときにのみトリガーされます。

以下は、イベントと説明を説明する表です-

S.No. Event & Description
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からの一般的な材料データを含む次の出力を生成します-

レポートプログラミング

SAP ABAP-ダイアログプログラミング

ダイアログプログラミングは、複数のオブジェクトの開発を扱います。 これらのオブジェクトはすべてメインプログラムに階層的にリンクされており、順番に実行されます。 ダイアログプログラムの開発では、ABAPワークベンチのツールを使用します。 これらは、標準のSAPアプリケーション開発で使用されるものと同じツールです。

ここにダイアログプログラムの主なコンポーネントがあります-

  • スクリーン
  • モジュールプール
  • サブルーチン
  • メニュー
  • トランザクション

ツールセット

ツールセット

すべてのオブジェクトが各オブジェクトを明示的に指す必要なくメインプログラムにリンクされるように、ダイアログプログラムはオブジェクトブラウザー(トランザクション:SE80)によって開発される必要があります。 高度なナビゲーション技術により、あるオブジェクトから別のオブジェクトに移動するプロセスが強化されます。

画面は、画面属性、画面レイアウト、フィールド、および制御ロジックで構成されています。 モジュールプールは、ダイアログプログラムのインクルードプログラム内に配置されるモジュール化された構文で構成されます。 これらのモジュールは、ダイアログプロセッサによって処理される制御ロジックによって呼び出すことができます。

新しいダイアログプログラムの作成

  • ステップ1 *-トランザクションSE80内で、ドロップダウンから[プログラム]を選択し、カスタムSAPプログラムのZ名を「ZSCREENEX」として入力します。
  • ステップ2 *-Enterキーを押して、[With Top INCL]を選択し、[Yes]ボタンをクリックします。

新しいダイアログプログラムの作成

  • ステップ3 *-トップインクルードの名前を「ZSCRTOP」として入力し、緑色のチェックマークをクリックします。
  • ステップ4 *-属性画面内で、タイトルを入力して[保存]ボタンをクリックするだけです。

ダイアログプログラムへの画面の追加

  • ステップ1 *-画面をプログラムに追加するには、プログラム名を右クリックして、[作成]→[画面]オプションを選択します。
  • ステップ2 *-画面番号を「0211」と入力し、緑色のチェックマークをクリックします。

ダイアログに画面を追加

  • ステップ3 *-次の画面で、短いタイトルを入力し、通常の画面タイプに設定して、上部のアプリケーションツールバーの保存ボタンをクリックします。

画面レイアウトと「Hello World」テキストの追加

  • ステップ1 *-アプリケーションツールバー内のレイアウトボタンをクリックすると、スクリーンペインタウィンドウが表示されます。
  • ステップ2 *-テキストフィールドを追加し、「Hello World」などのテキストを入力します。

Hello Worldを追加

  • ステップ3 *-画面を保存してアクティブにします。

トランザクションの作成

  • ステップ1 *-プログラムのトランザクションコードを作成するには、プログラム名を右クリックして、[作成]→[トランザクション]オプションを選択し、「ZTRANEX」としてトランザクションコードを入力します。

トランザクションの作成

  • ステップ2 *-作成したばかりのトランザクションテキスト、プログラム、および画面(ZSCREENEX&0211)を入力し、[GUIサポート]セクションの[SAPGUI for Windows]チェックボックスをオンにします。

プログラムの実行

すべてを保存してアクティブにします。 プログラムを実行できます。 プログラムが実行されると、次のスクリーンショットに示すように、入力したテキストが画面に表示されます。

プログラムの実行

SAP ABAP-スマートフォーム

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 Smart Formsツールを使用してフォームを作成しましょう。 このチュートリアルでは、スマートフォームにノードを追加してフォームをテストする方法も学習します。 ここでは、SF_EXAMPLE_01フォームのコピーを作成することから始めます。 SF_EXAMPLE_01フォームは、SAPシステムで利用可能な標準のスマートフォームです。

  • ステップ1 *-スマートフォームビルダーは、スマートフォームの構築に使用されるメインインターフェイスです。 SAPスマートフォームの第一画面で利用可能です。 SAPスマートフォームの第一画面を開くには、コマンドフィールドに「SMARTFORMS」トランザクションコードを入力する必要があります。 この画面で、「フォーム」フィールドにフォーム名SF_EXAMPLE_01を入力します。
  • ステップ2 *-[スマートフォーム]→[コピー]を選択するか、[コピー]アイコンをクリックして、[フォームまたはテキストのコピー]ダイアログボックスを開きます。
  • ステップ3 *-[ターゲットオブジェクト]フィールドに、新しいフォームの名前を入力します。 名前はYまたはZの文字で始まる必要があります。 この場合、フォームの名前は「ZSMM1」です。

SAPスマートフォーム

  • ステップ4 *-[続行]アイコンをクリックするか、[フォームまたはテキストのコピー]ダイアログボックスでEnterキーを押すと、ZSMM1フォームが定義済みフォームSF_EXAMPLE_01のコピーとして作成されます。
  • ステップ5 *-[保存]アイコンをクリックします。 フォームの名前は、SAPスマートフォームの第一画面のフォームフィールドに表示されます。
  • ステップ6 *-SAPスマートフォームの初期画面で[作成]ボタンをクリックします。 ZSMM1フォームがフォームビルダーに表示されます。
  • ステップ7 *-メインウィンドウで最初のドラフトページが作成されます。 新しいフォームのすべてのコンポーネントは、事前定義されたSF_EXAMPLE_01フォームに基づいています。 ナビゲーションメニューでノードをクリックするだけで、そのコンテンツを表示できます。

SAP Form Builder

フォームでのテキストノードの作成

  • ステップ1 *-SAP Form Builder画面の変更モードでフォームを開き、First PageノードのMain Windowオプションを右クリックして、コンテキストメニューからCreate→Textを選択します。
  • ステップ2 *-テキストフィールドのテキストを「My_Text」に変更し、「意味」フィールドのテキストを「Text_Demo」に変更します。 次のスナップショットに示すように、フォームビルダーの中央フレームのテキスト編集ボックスに「Hello finddevguides …​..」というテキストを入力します-

テキストノードの作成

  • ステップ3 *-[保存]ボタンをクリックして、ノードを保存します。
  • ステップ4 *-[アクティブ化]アイコンと[テスト]アイコンをクリックして、ノードをアクティブ化およびテストします。 機能ビルダの第一画面が表示されます。
  • ステップ5 *-[アクティブ化]および[実行]アイコンをクリックして、汎用モジュールをアクティブ化およびテストします。 汎用モジュールのパラメータは、汎用モジュールビルダの初期画面に表示されます。
  • ステップ6 *-実行アイコンをクリックして、汎用モジュールを実行します。 [印刷]ダイアログボックスが表示されます。
  • ステップ7 *-出力デバイスを「LP01」として指定し、[印刷プレビュー]ボタンをクリックします。

上記の手順は、次の出力を生成します-

印刷プレビュー

SAP ABAP-SAPscripts

SAPシステムのSAPscriptツールを使用して、請求書や発注書などのビジネスフォームを作成および管理できます。 SAPscriptツールは、ビジネスフォームの設計を大幅に簡素化する多数のテンプレートを提供します。

SAPシステムには、SAP標準クライアント(通常はクライアント000)で提供される標準SAPscriptフォームが付属しています。 以下は、クライアント000で提供される標準SAPscriptフォームのいくつかの例です-

S.No. Form Name & Description
1

RVORDER01

受注確認フォーム

2

RVDELNOTE

包装内容明細書

3

RVINVOICE01

請求書

4

MEDRUCK

注文書

5

F110_PRENUM_CHCK

事前番号付きチェック

SAPscriptフォームの構造は、2つの主要なコンポーネントで構成されています-

コンテンツ-これはテキスト(ビジネスデータ)またはグラフィック(会社のロゴ)のいずれかです。

レイアウト-これは、フォームのコンテンツが表示される一連のウィンドウによって定義されます。

SAPscript –フォームペインタツール

フォームペインタツールは、SAPscriptフォームのグラフィカルレイアウトと、フォームを操作するためのさまざまな機能を提供します。 次の例では、標準SAPscriptフォームRVINVOICE01からレイアウト構造をコピーした後に請求書フォームを作成し、フォームペインタツールにアクセスしてレイアウトを表示します。

  • ステップ1 *-フォームペインタを開きます。 SAPメニューをナビゲートするか、SE71トランザクションコードを使用して、画面を要求できます。
  • ステップ2 *-フォームペインタのリクエスト画面で、フォームおよび言語フィールドにSAPscriptフォームの名前と言語をそれぞれ入力します。 これらのフィールドにそれぞれ「RVINVOICE01」と「EN」を入力しましょう。

フォームペインタリクエスト

  • ステップ3 *-[サブオブジェクト]グループボックスで[ページレイアウト]ラジオボタンを選択します。
  • ステップ4 *-[ユーティリティ]→[クライアントからコピー]を選択して、RVINVOICE01フォームのコピーを作成します。 「クライアント間でフォームをコピー」画面が表示されます。
  • ステップ5 *-「クライアント間でフォームをコピー」画面で、フォームの元の名前「RVINVOICE01」を「フォーム名」フィールドに入力し、ソースクライアントの番号「000」を「ソースクライアント」フィールドに入力し、ターゲットフォームフィールドに「ZINV_01」としてターゲットフォームの名前。 他の設定が変更されていないことを確認してください。

クライアント間でフォームをコピー

  • ステップ6 *-次に、[クライアント間でフォームをコピー]画面の[実行]アイコンをクリックします。 [オブジェクトディレクトリエントリの作成]ダイアログボックスが表示されます。 保存アイコンをクリックします。

ZINV_01フォームはRVINVOICE01フォームからコピーされ、次のスナップショットに示されているように「クライアント画面間でフォームをコピー」に表示されます-

クライアント間でフォームをコピー

  • ステップ7 *-戻るアイコンを2回クリックし、コピーしたフォームZINV_01の名前を含むフォームペインタ:リクエスト画面に戻ります。
  • ステップ8 *-[表示]ボタンをクリックすると、次のスクリーンショットに示すように、[フォームZINV_01:ページの最初のレイアウト]ウィンドウと[フォーム:ページレイアウトの変更:ZINV_01]画面が表示されます。

ページレイアウト

  • ステップ9 *-「フォームZINV_01:ページの最初のレイアウト」ウィンドウに、フォームの初期レイアウトが表示されます。 フォームのレイアウトには、HEADER、ADDRESS、INFO、INFO1、およびMAINの5つのウィンドウが含まれます。 これらのウィンドウの説明は、PCエディターでアクセスできます。

たとえば、メインウィンドウを選択し、「フォーム:ページレイアウトの変更:ZINV_01」画面でテキストアイコンをクリックするだけで、次のスクリーンショットに示すようにすべてのマージン値を表示できます-

ページレイアウトの変更

SAP ABAP-顧客出口

顧客出口は、SAP標準プログラムへのフックと見なすことができます。 コードを記述するためにアクセスキーは必要なく、SAP標準プログラムを変更する必要もありません。 これらの出口には機能がなく、空です。 さまざまなクライアントの要件を満たすために、ビジネスロジックを追加できます。 ただし、すべてのプログラムで顧客出口を利用できるわけではありません。

標準取引の顧客出口

以下は、標準的なトランザクションに関する限り、顧客出口を見つける手順です。 MM01(Material Master Creation)で利用可能な顧客出口を特定しましょう。

マテリアルマスターの作成

  • ステップ1 *-トランザクションMM01に移動し、上のスクリーンショットに示すように、メニューバー→システム→ステータスに移動して、MM01のプログラム名を特定します。
  • ステップ2 *-ポップアップ画面からプログラム名を取得します。 プログラム名は「SAPLMGMM」です。
  • ステップ3 *-トランザクションSE38に移動し、プログラム名を入力して、[表示]をクリックします。
  • ステップ4 *-[移動]→[プロパティ]に移動し、このプログラム名のパッケージを見つけます。

関数プール

パッケージ名は「MGA」です。

  • ステップ5 *-顧客出口を識別するために通常使用されるトランザクションコードSMODに移動します。 [ユーティリティ]→[検索](または)に移動し、直接Ctrl&plus;を押します。トランザクションコードSMODのF。
  • ステップ6 *-[終了を検索]画面に移動した後、先ほど取得したパッケージ名を入力し、F8(実行)ボタンを押します。

出口の検索

上記の手順により、Material Master Creationで使用可能な出口のリストを含む次の出力が生成されます。

Exit Exit

SAP ABAP-ユーザー出口

標準のSAP抽出プログラムが、許可や時間チェックなど、予期されるデータや必要な機能を提供しない場合、抽出でユーザー出口が使用されます。 ユーザー出口は、一般に販売管理(SD)モジュールで使用されます。 SAPは、販売、輸送、出荷、および請求の分野で多くの出口を提供しています。 ユーザー出口は、標準SAPがすべての要件を満たすことができない場合にいくつかの変更を行うように設計されています。

各販売エリアで利用可能な出口にアクセスできるようにするには、次のパスを使用してIMGに移動します。IMG→販売管理→システム修正→ユーザー出口。 SDの領域の各出口のドキュメントについて詳しく説明しています。

たとえば、販売伝票処理(契約、見積、または受注)でユーザExitを検索する場合は、上記のパスに従って、ノードSales→User ExitsのユーザExitを展開し続けます。 アイコン文書をクリックして、販売伝票処理で利用可能なすべてのユーザー出口を確認します。

S.No. User Exit & Description
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アイテムの作業領域に移動されるときに使用されます。

ユーザー出口は、カスタマー出口と同じ目的を果たしますが、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(実行)ボタンを押します。 上記のコードは、次の出力を生成します-

image:/sap_abap/transaction_code_me01.jpg[トランザクションコード「ME01」

SAP ABAP-ビジネスアドイン

場合によっては、さまざまなアプリケーションの機能を強化するために、ソフトウェアアプリケーションで特別な機能を事前に定義する必要があります。 MS Excelの機能を改善するための多くのMicrosoft Excelアドインがあります。 同様に、SAPはBADIと呼ばれる*ビジネスアドイン*を提供することにより、いくつかの事前定義された機能を促進します。

BADIは、SAPプログラマー、ユーザー、または特定の業界がSAPシステム内の既存のプログラムにいくつかの追加コードを追加できるようにする拡張技術です。 SAPシステムを改善するために、標準またはカスタマイズされたロジックを使用できます。 BADIを最初に定義してから、SAPアプリケーションを強化するために実装する必要があります。 BADIの定義中に、インターフェースが作成されます。 BADIはこのインターフェースによって実装され、このインターフェースは1つ以上のアダプタークラスによって実装されます。

BADI手法は、2つの点で他の拡張手法とは異なります-

  • 拡張テクニックは一度だけ実装できます。
  • この拡張技術は、多くのお客様が同時に使用できます。

拡張テクニック

また、フィルターBADIを作成することもできます。つまり、BADIは、拡張手法では不可能なフィルター処理されたデータに基づいて定義されます。 BADIの概念は、SAPリリース7.0で次の目標とともに再定義されました-

  • ABAP言語の2つの新しい要素、つまり「GET BADI」と「CALL BADI」を追加して、SAPシステムの標準アプリケーションを強化します。
  • SAPシステムの標準アプリケーションを強化するためのコンテキストやフィルターなどの柔軟性の高い機能を提供します。

BADIが作成されると、インターフェイスおよびその他の追加コンポーネント(メニュー拡張や画面拡張の機能コードなど)が含まれます。 BADIの作成により、顧客は標準のSAPアプリケーションに独自の拡張機能を含めることができます。 拡張、インターフェース、および生成されたクラスは、適切なアプリケーション開発ネームスペースにあります。

したがって、BADIは、ABAPオブジェクトを使用してSAPコンポーネントに「事前定義されたポイント」を作成する拡張技術と見なすことができます。 これらの事前定義されたポイントは、特定の要件に合わせて、個々の業界ソリューション、国のバリエーション、パートナー、顧客によって実装されます。 SAPは実際にリリース4.6AでBADI拡張技術を導入し、この技術はリリース7.0で再実装されました。

SAP ABAP-Web Dynpro

Web Dynpro(WD)for ABAPは、SAP AGが開発したSAP標準ユーザーインターフェイステクノロジーです。 SAP開発ツールと概念を利用するSAP ABAP環境でのWebベースアプリケーションの開発に使用できます。 バックエンドSAP R/3システムに直接接続して、レポート用のデータと機能にアクセスするためのフロントエンドWebユーザーインターフェイスを提供します。

Web Dynpro for ABAPは、ランタイム環境と、ABAPワークベンチに統合された特定の開発ツールを備えたグラフィカル開発環境で構成されています(トランザクション:SE80)。

Web Dynproのアーキテクチャ

次の図は、Web Dynproの全体的なアーキテクチャを示しています-

Web Dynpro

以下は、Web Dynproに関して留意すべきいくつかのポイントです-

  • Web Dynproは、ユーザーインターフェイス用のSAP NetWeaverプログラミングモデルです。
  • すべてのWeb Dynproアプリケーションは、Model View Controller(MVC)プログラミングモデルに従って構成されています。
  • モデルはメインシステムへのインターフェースを定義し、Web Dynproアプリケーションはシステムデータにアクセスできます。
  • ビューは、Webブラウザーでデータを表示する役割を果たします。
  • コントローラーは、ビューとモデルの間に存在します。 コントローラーは、ビューに表示されるモデルデータをフォーマットします。 ユーザーが作成したユーザーエントリを処理し、モデルに返します。

利点

Web Dynproは、アプリケーション開発者に次の利点を提供します-

  • グラフィカルツールを使用すると、実装の労力が大幅に削減されます。
  • コンポーネントを使用することにより、再利用して保守性を向上させます。
  • レイアウトとナビゲーションは、Web Dynproツールを使用して簡単に変更できます。
  • ユーザーインターフェイスのアクセシビリティがサポートされています。
  • ABAP開発環境への完全な統合。

Web Dynproコンポーネントとウィンドウ

コンポーネントは、Web Dynproアプリケーションプロジェクトのグローバルユニットです。 Web Dynproコンポーネントの作成は、新しいWeb Dynproアプリケーションを開発する最初のステップです。 コンポーネントが作成されると、Web Dynproオブジェクトリストのノードとして機能します。 コンポーネント内に任意の数のコンポーネントビューを作成し、対応する任意の数のWeb Dynproウィンドウでそれらを組み立てることができます。

各Web Dynproコンポーネントには、少なくとも1つのWeb Dynproウィンドウが含まれています。 Web Dynproウィンドウには、フロントエンドWebアプリケーション内に表示されるすべてのビューが埋め込まれます。 ウィンドウは、ABAPワークベンチのウィンドウエディタで処理されます。

注意

  • コンポーネントビューには、説明、作成者の名前、作成日、割り当てられた開発パッケージなど、アプリケーションのすべての管理詳細が表示されます。
  • Web Dynproアプリケーションは、ABAPワークベンチのオブジェクト一覧内の独立したオブジェクトです。 ウィンドウとアプリケーション間の相互作用は、特定のウィンドウのインターフェイスビューによって作成されます。

Sap-abap-questions-answers