このトピックでは、PDFファイル出力の方法を取り上げて説明します。 (このトピックは編集中です。)
PDFファイル作成
*スプール情報をPDFに変換 CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF' EXPORTING SRC_SPOOLID = '9999' “スプール番号 NO_DIALOG = ' ' IMPORTING PDF_BYTECOUNT = WK_SIZE “ファイルサイズ TABLES PDF = PDFTAB “PDFデータ EXCEPTIONS ERR_NO_ABAP_SPOOLJOB = 1 ERR_NO_SPOOLJOB = 2 ERR_NO_PERMISSION = 3 ERR_CONV_NOT_POSSIBLE = 4 ERR_BAD_DESTDEVICE = 5 USER_CANCELLED = 6 ERR_SPOOLERROR = 7 ERR_TEMSEERROR = 8 ERR_BTCJOB_OPEN_FAILED = 9 ERR_BTCJOB_SUBMIT_FAILED = 10 ERR_BTCJOB_CLOSE_FAILED = 11 OTHERS = 12.
このトピックでは、ABAPでUniCodeのシステムからSJISコードで固定長ファイル出力の方法を取り上げて説明します。
背景
ABAPで文字コードの関係でSJISコードで固定長ファイルを出力するには少し工夫する必要があります。 タブ区切りやカンマ区切りのファイル出力にするほうがだんぜん楽ですが、ふるい既存システムへの連携で固定長ファイルにしなければならない場面がしばしばあります。
固定長項目出力
固定長ファイル出力の基本は、項目を固定バイト長に出力させることです。
問題点
以下の構造体をファイルに出力することを例とします。
TYPES:
BEGIN OF typ_row,
col1 TYPE C LENGTH 10,
col2 TYPE C LENGTH 12,
END OF typ_row.Unicodeシステムのため、co1に定義されたLENGTH=10はバイト数ではなく文字数ですので、SJISで出力されるバイト数は可変になります。 一番少ないのは、すべて半角文字の場合であり、出力バイト数が10×1半角文字1バイト=10バイトになります。 一番多いのは、すべて全角文字の場合であり、出力バイト数が10×1全角文字2バイト=20バイトになります。 col1の固定長出力は以下の2パターンに分けることができます。
- 固定長>=20バイト
col1の実際の出力バイト数が20を超えることがないため、カットする処理は必要がありません。
但し、場合によって後ろにスペースを埋める必要があるため、col1の実際の出力バイト数を計算しなければなりません。 - 固定長<20バイト、例えば:10バイト
col1の実際の出力バイト数を計算して、10バイトに未満の場合のスペース埋め処理を実装するほか、10バイトを超えた場合の既存文字列のカット処理も実装しなければなりません。カットする際に、カットが全角文字の真ん中にならないように注意する必要があります。
対応方法
上記の課題を対応するポイントは以下になります。
- 出力バイト数計算処理
メソッドcl_abap_list_utilities⇒dynamic_output_lengthを利用して、出力バイト数を計算します。
このメソッドは各文字が全角文字か半角文字かを判断して、全角文字なら2、半角文字なら1というアルゴリズムで出力長を計算しています。 - 文字列カット処理
メソッドcl_abap_list_utilities⇒read_from_display_layoutを利用して、文字列のカット処理を行います。
このメソッドはカットされる箇所に全角文字が跨っている場合、文字化けにならないように該当全角文字を丸ごと捨てるようにしております。 - スペース埋め処理 \\ CONCATENATE命令は文字列を連結する際に、デフォルトで文字列の後ろのスペースを削除するため、スペース埋め処理を行う時は、RESPECTING BLANKSオプションをつける必要があります。
サンプルコード
固定バイト数で文字列を出力するサブルーチンのサンプルコードです。
*&---------------------------------------------------------------------*
*& Form F_OUTPUT_FIXED_BYTES
*&---------------------------------------------------------------------*
* 固定バイト数で文字列出力
*----------------------------------------------------------------------*
* -->U_LEN : 出力バイト長
* -->U_FIELD : 入力値
* -->C_STR : 出力文字列
*----------------------------------------------------------------------*
FORM f_output_fixed_bytes
USING
u_len TYPE i
u_field
CHANGING
c_str.
DATA:
l_len TYPE i, "length
l_cnt TYPE i,
l_rc TYPE abap_list_repl_rc.
CLEAR: c_str,
l_cnt.
- byte数取得
CALL METHOD cl_abap_list_utilities=>dynamic_output_length
EXPORTING
field = u_field
RECEIVING
len = l_cnt. - データ長が出力バイト長を超えた場合、出力バイト長で文字列をカット
IF l_cnt > u_len.
TRY.
CALL METHOD cl_abap_list_utilities=>read_from_display_layout
EXPORTING
display_data = u_field
display_offset = 0
display_length = u_len
IMPORTING
field = c_str
rc = l_rc.
CATCH cx_parameter_invalid_range .
ENDTRY. - byte数再取得 (カット箇所に全角文字が跨っているケースを考慮)
CALL METHOD cl_abap_list_utilities=>dynamic_output_length
EXPORTING
field = c_str
RECEIVING
len = l_cnt. - バイト数が足りない場合は、後ろにスペースを埋める
WHILE l_cnt < u_len.
CONCATENATE c_str
' '
INTO c_str
RESPECTING BLANKS.
l_cnt = l_cnt + 1.
ENDWHILE.
ENDIF.
ENDFORM.
このトピックでは、サーバ側にファイル入出力の方法を取り上げて説明します。
論理パスの使用
サーバ側でファイル入出力処理を実装するには、事前に論理パスを定義する必要があります。
格納テーブル
論理パス及び物理パスへのマッピングの定義は、以下二つのテーブルに格納されます。
- FILEPATH
論理パスの定義 - PATH
論理パスの物理パスの定義
トランザクション
論理パスの作成及び物理パスの定義は、FILEトランザクションを利用します。
入力パラメータの実装
選択画面でユーザに論理パスを指定できるようにするには、以下のようにパラメータを定義します。
p_filpth TYPE filepath-pathintern OBLIGATORY.
汎用モジュール
論理パスに関わる汎用モジュールは主に以下のものがあります。
- FILE_GET_NAME_USING_PATH
ファイル名と論理パスで完全ファイル名を生成する
ファイルの操作
ABAPにはファイルを操作するための命令が幾つか用意されております。
ファイルのオープン
アプリケーションサーバ上のファイルをオープンするには、OPEN DATASET命令を使用します。
ファイルの読み取り
アプリケーションサーバ上のファイルを読み取りするには、READ DATASET命令を使用します。
ファイルの書き込み
アプリケーションサーバ上のファイルを書き込みするには、TRANSFER命令を使用します。
ファイルのクローズ
アプリケーションサーバ上のファイルをクローズするには、CLOSE DATASET命令を使用します。
ファイルの削除
アプリケーションサーバ上のファイルを削除するには、DELETE DATASET命令を以下のように使用します。
業務アプリケーションでは、データベースを更新する際にデータの整合性を保つ必要があります。そこで重要なのが、次の二つです。
- トランザクション制御
- 排他制御
トランザクション制御
トランザクションとは、「ある意味をもった一連の処理のまとまり」のことで、完全に実行するか、またはまったく実行しないようにする必要がある原子性や、実行前後とも常にデータの整合性をを保持しなければならない一貫性という性質をもっております。
普通の意味では、アプリケーションの動作のうち、「ある意味を持った一連の処理のまとまり」のことをトランザクションといいます。そして、トランザクション制御とはこの一つのトランザクション内でデータの整合性が保たれるようにすることです。
SAP ERPでは、正式的な名称として、この「ある意味を持った一連の処理のまとまり」を「トランザクション」ではなく、「作業論理単位(Logical Unit of Work、略するとLUW)」と呼んでいます。関連がありますが、SAPの「トランザクション」は、トランザクションコードを使用して開始するアプリケーションプログラムのことと定義されています。
SAPでは、作業論理単位(LUW)はデータベース作業論理単位(DB LUW)とSAP作業論理単位(SAP LUW)と2種類が存在していますので、次にそれぞれ説明します。
DB LUW
データベース作業論理単位(DB LUW)
DB LUW は、データが常に整合性を持つようにするために、OracleやMSSQLなどのDBMS(データベース管理システム)が使用するメカニズムです。DBMS側では、一般的にこのDB LUWを「トランザクション」と呼んでいます。
- DB LUWは一つのワークプロセスの中に完結しなければなりません
- ワークプロセスが正常又は異常終了する際に、コミットされていないDB更新に対して、暗黙的なデータベースコミット又はロールバックを行います
- プログラムが汎用モジュール DB_COMMITを呼び出して明示的にデータベースコミットを行うことができます。
- プログラムがSAP LUWの命令(COMMIT WORK、ROLLBACK WORK)を呼び出してSAP LUWを終了する同時に、データベースLUWも終了します。
- 開始されるときや、前のDB LUW がコミット又はロールバックで終了するときに、新しいDB LUWが開始される
- DB LUW内で実行されるデータベース変更はデータベースロックを起こします、そのデータベースロックはLUWの終了に伴い、自動的に解放されます。
SAP LUW
SAP作業論理単位(SAP LUW)
DB LUWはデータベースに対して分割できない連続したデータ上の操作であり、完全に終了するか、まったく実行しないかのいずれかにする必要があります。SAP LUWは、システムに対して分割できない業務処理であり、その業務処理全体を完了するか、あるいはまったく実行しないかのいずれかにする必要があります。SAP-LUW は通常、複数のダイアログステップや複数のDB LUW に及ぶことがあります。 同じSAP LUW で発生したDBデータ変更要求は、全て最後にデータベースに反映されることになります。
SAP LUWの終了
SAP LUWは、DB LUWのように暗黙的に終了することがありません。「COMMIT WORK」や「ROLLBACK WORK」命令を発行して、明示的に終了させる必要があります。
SAP LUWの原子性
一つのSAP LUWの中の各更新は複数のダイアログステップに跨って発行されることがよくありますが、発行時に即時に実行されるとすれば、別々のDB LUWのDBデータ操作になりますので、トランザクションとしての原子性が完全に崩れてしまうことになります。
SAPは、それらの更新を即時実行せずに、「更新依頼」オブジェクトを登録しておきます。「commit work」命令でSAP LUWがコミットされる際に、登録された「更新依頼」を一つのデータベースLUWで実行することにより、トランザクションとしての原子性を維持します。
但し、下記「エラー処理とデータの整合性」節で説明するように、各更新依頼の種類により完全な原子性が出来ない場合も存在します。
SAP LUWとDB LUW
SAPはワークプロセスごとに、固定データベース接続1 つが割り当てられています。そのデータベース接続でデータベースLUWが実行されますので、ワークプロセスは常に一つのDB LUWと結び付いております。
一方、SAP LUWは論理的な単位を提供しています、SAP LUWにおける各更新依頼は、結局、DB LUWによりデータの変更をデータベースに反映しないといけないですが、そのDB LUWは新たに生成されるものではなく、更新依頼が実行されるワークプロセスの固有のDB LUWとなります。そのDB LUWで発行された別の即時DB更新がもしあれば、同時にコミットされます、なお、エラーが発生する場合も、一緒にロールバックされることになります。
SAP LUWの単位
SAP LUW毎に、違う更新キーが割り当てられます、更新依頼はその更新キーと一緒に更新キューに登録されますので、それにより同じSAP LUWのものかどうかを判断できます。
アプリケーションプログラム( TYPE 1、TYPE M)はそれぞれ別のSAP LUWをもっています。但し、トランザクション( 機能)ではなく、「ダイアログモジュール」として起動される場合は、呼び出し元のアプリケーションプログラムのSAP LUWで実行されることになります。
更新依頼の種類と同期化制御
あとから実行するように登録される更新依頼は、下記のように幾つかの種類が存在します。種類によって、処理が実行されるワークプロセスと同期・非同期の制御などが変ります。
(1)サブルーチン更新依頼
PERMFORM <サブルーチン名>命令でON COMMITオプションを付けておければ、そのサブルーチンは即時に実行されることがありません、代わりに更新依頼として登録されます。
そのサブルーチン処理は、SAP LUWがcommit work命令でコミットされる際に、COMMIT WORK 命令と同じデータベース LUW の中で、同じワークプロセスによってインラインで実行されます。
同じワークプロセスなので、COMMIT WORK命令はすべてのサブルーチン更新依頼が処理完了するまでブロックされ、つまり同期化になります。
(2)汎用モジュール更新依頼
CALL <汎用モジュール>命令でIN UPDATE TASKオプションを付けておければ、その汎用モジュールは即時に実行されることがありません、その代わりに更新依頼として、汎用モジュール名とそのインタフェースパラメータがVBLOG という名称の特別なデータベーステーブルに格納されます。
その汎用モジュール処理は、SAP LUWがcommit work命令でコミットされる際に、更新プログラムにより実行されます。
デフォルトは、更新プログラムはcommit work命令が発行されたワークプロセスと別に、更新プロセスと呼ばれているバックグラウンドワークプロセスで非同期に処理を実行します。よってcommit work命令は待たずに、すぐ次の処理に入ることになります。
なお、下記のような場合、汎用モジュール更新依頼の実行はcommit work命令と同期になります。
①commit work命令にand waitオプションを付ける 更新プロセスで実行されるままですが、commit work命令は、全ての汎用モジュール更新依頼が処理完了するまでブロックされますので、同期になります。
②SET UPDATE TASK LOCAL
SET UPDATE TASK LOCALでローカル更新スイッチをONに指定された場合、更新プログラムは更新プロセスではなく、perfom … on commitのように、commit workと同じワークプロセスで実行されることになります。
更新用の汎用モジュールはU1(優先順位が高い)とU2(優先順位が低い)との2種類に分けられ、作成時に属性として指定することができます。更新プロセスで実行される時も別々のワークプロセスで実行されることになります。
(3) バックグラウンド更新依頼
CALL <汎用モジュール>命令でIN BACKGROUND TASKオプションを付けておければ、その汎用モジュールは即時に実行されることがありません、その代わりに更新依頼として登録されます。
その汎用モジュール処理は、SAP LUWがcommit work命令でコミットされる際に、commit work命令が発行されたワークプロセスと別に、バックグラウンドプロセスと呼ばれているワークプロセスで非同期に処理を実行されます。
下記のイメージ図で示されるように、同じSAP LUWの各更新依頼は、(1)→(2)のU1→(2)のU2→(3)の前後順で処理されます。
更新マネージャ「トランザクションコード:SM13」を使えば、更新依頼の処理状況を照会したり、エラーで中止された更新を再実行させたりすることができます。
エラー処理とデータの整合性
SAP LUWにおける各更新は、実行時エラーによっていずれかが失敗した場合、更新システムは下記のように処理します。
(1)FORM ルーチン内( PERFORM ON COMMIT で呼び出し)
-現在の更新トランザクションですでに実行された更新はロールバックされます。
-他の FORM ルーチンは開始されません。
-更新タスクまたはバックグラウンドタスク機能が開始されることはありません。
-エラーメッセージが画面に表示されます。
(2)V1 更新タスク汎用モジュール内( IN UPDATE TASK を依頼)
- V1 機能ですでに実行された更新はロールバックされます。
-更新タスクの依頼 (V1 または V2) はすべて取り消されます。
-バックグラウンドタスク依頼もすべて取り消されます。
- PERFORM ON COMMIT によって呼び出された サブルーチンですでに実行された更新は、ロールバック されません。
-エラーメッセージを送るようにシステム設定されている場合は、エラーメッセージが画面に表示されます。
(3)V2 更新タスク汎用モジュール内( IN UPDATE TASK を依頼)
-現在の V2 機能ですでに実行された更新はロールバックされません。
-まだ実行しなければならない更新タスク依頼 (V2) はすべて実行します。
-まだ実行しなければならないバックグラウンドタスク依頼はすべて実行します。
-V1 または V2 機能ですでに実行された更新はロールバックされません。
-サブルーチン( ON COMMIT で呼び出し)ですでに実行された更新はロールバックされません。
-エラーメッセージを送るようにシステム設定されている場合は、エラーメッセージが画面に表示されます。
(4)バックグラウンドタスク汎用モジュール内( IN BACKGROUND TASK DESTINATION を依頼)
-同一の DESTINATION のバックグラウンドタスク依頼はすべて取り消しされます 。
-すでに実行された他の更新はロールバックされません。
-エラーメッセージは画面に表示されません。
このトピックでは、OpenSQLによりDBデータを検索する方法を取り上げて説明します。
SELECT命令
DBデータを検索するには、SELECT命令を使用します。SELECT命令は以下のような分類があります。
- 「SELECT SINGLE」命令: 一行読込
- 「SELECT・・・ENDSELECT」命令:一件ずつ複数行読込
- 「SELECT INTO TABLE」命令:内部テーブルによる複数行一括読込
- 「SELECT INTO TABLE PACKAGE SIZE ・・・ENDSELECT」命令:内部テーブルによる複数行分割読込
- 「OPEN CURSOR FOR SELECT」命令: カーソルによる読込
SELECT SINGLE
構文:
SELECT SINGLE 項目 INTO wa FROM テーブル名 ~.
この命令は、指定したデータベーステーブルから、指定した条件と一致するデータを1件のみ取得します。。INTO句の後ろでは、構造(wa)を指定する必要があります。
取得する事ができれば、システム項目「SY-SUBRC」には0が入ります。取得できたデータの件数(取得できていれば1)は、システム項目「SY-DBCNT」に格納されます。
SELECT...ENDSELECT
構文:
SELECT 項目 INTO wa FROM テーブル名 ~. 処理内容 ENDSELECT.
この命令は、指定したデータベーステーブルから、指定した条件と一致するデータを1件ずつ取得します。条件と一致するデータがなくなるまで、「ENDSELECT.」の間をループします。NTO句の後ろでは、構造(wa)を指定する必要があります。
1件でもデータを取得する事ができれば、システム項目「SY-SUBRC」には0が入ります。取得できたデータの件数は、システム項目「SY-DBCNT」に格納されます。
SELECT INTO TABLE
構文:
SELECT 項目 INTO TABLE it FROM テーブル名 ~.
この命令は、指定したデータベーステーブルから、指定した条件と一致するデータを一括で取得します。データをプログラム内で溜めて利用する事ができるのが特徴です。INTO句の後ろでは、内部テーブル(it)を指定する必要があります。
1件でもデータを取得する事ができれば、システム項目「SY-SUBRC」には0が入ります。取得できたデータの件数は、システム項目「SY-DBCNT」に格納されます。
SELECT INTO TABLE PACKAGE SIZE...ENDSELECT
構文:
SELECT 項目 INTO TABLE it. FROM テーブル名 PACKAGE SIZE 行数 ~. 処理内容 LOOP AT it into wa. 処理内容 ENDLOOP. 処理内容 ENDSELECT.
この命令は、指定したデータベーステーブルから、指定した条件と一致するデータを、PACKAGE SIZEで指定された行数単位で、複数のパッケージに分けて内部テーブルに読み込みます。
読み込むパッケージがなくなるまで、SELECT~ENDSELECTの間をループします。なお、内部テーブルには常に、いま読み込まれたパッケージの行のみが格納されます。(INTOの代わりにAPPENDINGキーワードを使えば、内部テーブルには各パッケージの行がどんどん溜まっていくことになります)
OPEN CURSOR FOR SELECT
構文:
OPEN CURSOR c FOR SELECT 項目 FROM テーブル名 ~. DO. FETCH NEXT CURSOR c INTO wa. 処理内容 ENDDO. CLOSE CURSOR c
記述詳細
WHERE句
全ての命令のSQL文ではWHERE句を記述することが可能です。
「SELECT SINGLE」命令では、WHERE句でプライマリキーが特定できない場合に警告が出力されます。
ORDERBY句
下記のように「○」が付いている命令のSQL文では、ORDERBY句を記述することが可能です。
- 「SELECT SINGLE」:×
- 「SELECT・・・ENDSELECT」:○
- 「SELECT INTO TABLE」:○
- 「SELECT INTO TABLE PACKAGE SIZE ・・・ENDSELECT」:○
- 「OPEN CURSOR FOR SELECT」:○
結合検索
全ての命令のSQL文では下記のような結合検索を記述することが可能です。
- INNER 別テーブル名 ON 結合条件
- LEFT OUTER JOIN 別テーブル名 ON 結合条件
集計問い合わせ
全ての命令では、下記の集計関数や句を含める集計問い合わせを記述することが可能です。
- COUNT
- SUM
- AVG
- MAX
- MIN
- GROUPBY句
- HAVING句
DISTINCT
下記のように「○」が付いている命令のSQL文では、DISTINCTを記述することが可能です。
- 「SELECT SINGLE」:×
- 「SELECT・・・ENDSELECT」:○
- 「SELECT INTO TABLE」:○
- 「SELECT INTO TABLE PACKAGE SIZE ・・・ENDSELECT」:○
- 「OPEN CURSOR FOR SELECT」:○
読み取る行数を制御
下記のように「○」が付いている命令のSQL文では、[UP TO <n> ROWS]オプションで読み込まれる行数を制限することが可能です。
- 「SELECT SINGLE」:×
- 「SELECT・・・ENDSELECT」:○
- 「SELECT INTO TABLE」:○
- 「SELECT INTO TABLE PACKAGE SIZE ・・・ENDSELECT」:○
- 「OPEN CURSOR FOR SELECT」:○
テーブル条件
SELECT 命令の WHERE 句には特殊バリアントがあり、内部テーブルの行および列から条件を導くことができます。
SELECT ...FOR ALL ENTRIES IN <itab> WHERE <cond> ...
<cond> は前述の方法で指定します。内部テーブル <itab> の項目を、条件のオペランドとして指定する場合は、内部テーブルのすべての行をアドレス指定します。その後で、内部テーブルの各行に対して比較が実行されます。各行に対して、条件を満たすデータベーステーブルからの行を選択します。SELECT 命令の結果セットは、内部テーブルの各行に対する個々の選択を結合したものです。重複する行は自動的に結果セットから除外されます。<itab> が空白の場合、オプション FOR ALL ENTRIES が無視され、すべてのエントリが読み込まれます。
内部テーブル <itab> には構造化された行データ型が必要であり、条件 <cond> に登場する各項目は、比較対象のデータベースの列と互換性がなければなりません。内部テーブル項目を使用する比較では、演算子 LIKE 、BETWEEN 、IN を使用しないでください。同じ SELECT 命令では ORDER BY 句を使用しません。
オプション FOR ALL ENTRIES を使用して、ネストされた選択ループを内部テーブルでの操作で置き換えます。これにより、選択したデータの多数のセットに対するパフォーマンスが大幅に向上します。
WHERE句での選択テーブルの使用
WHERE 句で選択テーブルを使用するには、次のように記述します。
......... WHERE <f> IN <seltab>.
<f> はデータベース列の名前で、<seltab> はその項目に割り当てられた選択テーブルです。このように WHERE 句を指定した OPEN SQL 命令は、データベーステーブルの列のうち、項目<f> の内容が <seltab> に格納されている選択基準に合致しているものだけにアクセスします。
REPORT DEMO. DATA WA_CARRID TYPE SPFLI-CARRID. SELECT-OPTIONS AIRLINE FOR WA_CARRID. SELECT CARRID FROM SPFLI INTO WA_CARRID WHERE CARRID IN AIRLINE. WRITE WA_CARRID. ENDSELECT.
選択テーブル AIRLINE はデータベーステーブル SPFLI の CARRID 列にリンクされています。SELECT 命令の WHERE 句により、CARRID 列の内容が AIRLINE に格納された選択基準を満たしているかどうかがチェックされます。
選択テーブルが次のように入力されているとします
| SIGN | OPTION | LOW | HIGH |
|---|---|---|---|
| I | BT | DL | UA |
| E | EQ | LH | - |
WHERE句でのRANGES テーブルの使用
RANGES テーブルは選択テーブルと同じデータ型を持ちますが、選択画面の入力項目にリンクされていません。
各命令の使い分け
下記のように目的に応じて各命令を使い分けることができます。
- 最大1件のみを取得する場合は「SELECT SINGLE」命令を使います。
- 複数件を取得し、且つ取得可能な件数が必ず一定の範囲に収まる場合は「SELECT INTO TABLE」命令を使います。
- 複数件を取得し、取得可能な件数は一定ではない場合は、基本的に「SELECT INTO TABLE PACKAGE SIZE ・・・ENDSELECT」命令を使います。
- 複数件を取得し、前の行の値によって次の行を取得するかどうかを判断する必要な場合は、「OPEN CURSOR FOR SELECT」命令を使います。
- 「SELECT・・・ENDSELECT」命令は、基本的に使いません。
SAP ECCシステムでは、数量はすべて数量単位と結びつけられます。
基本的な単位処理
単位は長さや広さなどの次元を元に管理されます。同じ次元の単位はシステムテーブルに定義された換算係数を元に換算することができます。なお、次元なしの単位も存在します。
SI単位取得
SI単位を取得するには、汎用モジュールSI_UNIT_GET(ステータス:リリース)を使用することができます。 単位と次元のどちらかをパラメータとして指定可能です。
次元取得又はチェック
次元の取得又はチェックするには、以下の汎用モジュールを使用することができます。
- DIMENSION_CHECK
内部測定単位が指定された次元に対応しているかどうかをチェックします。 - DIMENSION_GET_FOR_UNIT
内部測定単位の次元を取得します。 - UNIT_CORRESPONDENCE_CHECK
2つの単位が同じ次元に属するかどうかをチェックします。
換算係数取得
単位間の換算係数は、元情報がT006に定義されており、精度を維持するため、分子・分母により表現されます。 例えばインチとメトルの換算係数は、1平方インチ=(0.0254×0.0254=0.00064516)=125/193,752平米のように、分子125と分母193752で定義されています。
単位の換算係数を取得するには、汎用モジュールCONVERSION_FACTOR_GET(ステータス:リリース)を使用することができます。 変換には以下の式が使用されます。 (単位 UNIT_OUT の値) = (単位 UNIT_IN の値) *分子/分母 + 追加定数
REPORT Y_UNIT_TEST1.
DATA: UNIT_1 LIKE T006-MSEHI,
UNIT_2 LIKE T006-MSEHI,
VAR1 TYPE F,
ZAEHL TYPE F,
NENNR TYPE F,
ANDEC LIKE T006-ANDEC,
DIMID LIKE T006-DIMID.
UNIT_1 = 'IN2'.
UNIT_2 = 'M2'.
CALL FUNCTION 'CONVERSION_FACTOR_GET'
EXPORTING
UNIT_IN = UNIT_1
UNIT_OUT = UNIT_2
*NO_TYP_CHECK = ' '
IMPORTING
ADD_CONST = VAR1
NUMERATOR = ZAEHL
DENOMINATOR = NENNR
DECIMALS = ANDEC
DIMENSION = DIMID
EXCEPTIONS
CONVERSION_NOT_FOUND = 01
OVERFLOW = 02
TYPE_INVALID = 03
UNITS_MISSING = 04
UNIT_IN_NOT_FOUND = 05
UNIT_OUT_NOT_FOUND = 06.
WRITE :/ '平方インチから平米へ変換'.
WRITE :/ ' 次元キー:', DIMID.
WRITE :/ ' 変換係数(分子):',ZAEHL DECIMALS 0 EXPONENT 0.
WRITE :/ ' 変換係数(分母):',NENNR DECIMALS 0 EXPONENT 0.
WRITE :/ ' 追加定数:', VAR1 DECIMALS 0 EXPONENT 0.数量換算
異なる単位間の数量換算を行うには、以下の汎用モジュールを使用することができます。
- UNIT_CONVERSION_WITH_FACTOR(ステータス:リリース)
換算係数はパラメータにより指定されます。 - UNIT_CONVERSION_SIMPLE(ステータス:リリース)
換算係数はシステムテーブルT006から自動的に取得されます。
内部表現⇔外部表現変換
単位の内部表現と外部表現を変換するには、以下の汎用モジュールを使用することができます。
- CONVERSION_EXIT_CUNIT_INPUT
商用測定単位(3文字の外部測定単位)に対応する内部測定単位を取得します - CONVERSION_EXIT_CUNIT_OUTPUT
内部測定単位に対応する商用測定単位(3文字の外部測定単位)を取得します - CONVERSION_EXIT_LUNIT_INPUT
技術測定単位(6文字の外部測定単位)に対応する内部測定単位を取得します - CONVERSION_EXIT_LUNIT_OUTPUT
内部測定単位に対応する技術測定単位(6文字の外部測定単位)を取得します
SAP単位⇔ISO単位変換
SAP単位とISO単位変換を変換するには、以下の汎用モジュールを使用することができます。
- UNIT_OF_MEASURE_ISO_TO_SAP
ISO単位からSAP単位を取得します - UNIT_OF_MEASURE_SAP_TO_ISO
SAP単位からISO単位を取得します
品目の単位変換処理
品目は、品目固有の単位換算数式を品目マスタ画面で入力管理することができます。その情報を元に、品目の単位換算を行う汎用モジュールは標準から用意されております。
基本数量単位への変換
「基本数量単位への変換」を行なうには、汎用モジュール「MATERIAL_UNIT_CONVERSION」を使用します。
CALL FUNCTION 'MATERIAL_UNIT_CONVERSION' EXPORTING MATNR = vl_matnr "品目 INPUT = vl_source_value "変換数量 MEINH = vl_source_meinf "変換前数量単位 IMPORTING OUTPUT = vl_target_value "変換後数量 EXCEPTIONS OTHERS = 1.
数量単位間の変換
「基本単位に限らない二つの単位間の変換」をなうには、汎用モジュール「MD_CONVERT_MATERIAL_UNIT」を使用します。
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
i_matnr = vl_matnr "品目
i_in_me = vl_source_unit "変換前単位
i_out_me = vl_target_unit "変換後単位
i_menge = vl_source_value "変換前数量
IMPORTING
e_menge = vl_target_value "変換後数量
EXCEPTIONS
OTHERS = 1.参考一覧
ABAPにおける金額項目は常に特定の通貨と結び付けられています。異なる通貨の金額換算や、内部書式と外部書式間の変換など、SAP標準から様々な汎用モジュールを用意されています。 このトピックでは、金額処理に関わる様々な方法を目的毎に纏めて説明します。
通貨情報取得
通貨換算係数取得
CURRENCY_CONVERTING_FACTOR
通貨換算係数を取得する関数。
DATA: WK_WAERS TYPE VBRK-WAERK. DATA: WK_FACTOR TYPE P DECIMALS 3. CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR' EXPORTING CURRENCY = WK_WAERS “ 通貨コード IMPORTING FACTOR = WK_FACTOR ” 通貨換算係数 EXCEPTIONS TOO_MANY_DECIMALS = 1 OTHERS = 2.
為替レート換算係数取得
READ_EXCHANGE_RATE
為替レート取得
READ_EXCHANGE_RATE
金額換算
外貨通貨→国内通貨
外貨通貨金額から国内通貨金額を換算するには、汎用モジュールCONVERT_TO_LOCAL_CURRENCYを利用できます。
REPORT Y_TEST_XXXX.
DATA:
F_CURR TYPE TCURR-FCURR,
L_CURR TYPE TCURR-TCURR,
F_VALUE TYPE P LENGTH 8 DECIMALS 2,
L_VALUE TYPE P LENGTH 8 DECIMALS 2,
EX_RATE TYPE TCURR-UKURS,
F_FACTOR TYPE TCURR-FFACT,
L_FACTOR TYPE TCURR-TFACT.
F_CURR = 'JPY'.
L_CURR = 'THB'.
F_VALUE = '0.02'.
CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
EXPORTING
* CLIENT = SY-MANDT
DATE = SY-DATUM "為替レート自動取得時の基準日
FOREIGN_AMOUNT = F_VALUE "外貨通貨金額
FOREIGN_CURRENCY = F_CURR "外貨通貨
LOCAL_CURRENCY = L_CURR "国内通貨
* RATE = '29.36' "為替レートを指定する場合は、このパラメータを利用すると
"ともにREAD_TCURRを''にする
TYPE_OF_RATE = 'B' "為替レートタイプ B:
READ_TCURR = 'X' "'X':為替レートはTCURRより取得、'':為替レートは
"RATEパラメータの値を使用
IMPORTING
EXCHANGE_RATE = EX_RATE "換算時の為替レート
FOREIGN_FACTOR = F_FACTOR "換算時の換算係数(外貨)
LOCAL_AMOUNT = L_VALUE "換算後国内通貨金額
LOCAL_FACTOR = L_FACTOR "換算時の換算係数(国内通貨)
* EXCHANGE_RATEX =
* FIXED_RATE =
* DERIVED_RATE_TYPE =
* EXCEPTIONS
* NO_RATE_FOUND = 1
* OVERFLOW = 2
* NO_FACTORS_FOUND = 3
* NO_SPREAD_FOUND = 4
* DERIVED_2_TIMES = 5
* OTHERS = 6
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
WRITE:/'FOREIGN CURRENCY=', F_CURR,
/'FOREIGN_FACTOR=', F_FACTOR,
/'FOREIGN VALUE=', F_VALUE,
/'EXCHANGE_RATE=', EX_RATE,
/'LOCAL CURRENCY=', L_CURR,
/'LOCAL_FACTOR=', L_FACTOR,
/'LOCAL VALUE=', L_VALUE.
WRITE:/ F_CURR,F_VALUE CURRENCY F_CURR.
WRITE:/ L_CURR,L_VALUE CURRENCY L_CURR.国内通貨→外貨通貨
CONVERT_TO_FOREIGN_CURRENCY 国内通貨額の外貨への換算
REPORT Y_TEST_XXXX.
DATA:
F_CURR TYPE TCURR-FCURR,
L_CURR TYPE TCURR-TCURR,
F_VALUE TYPE P LENGTH 8 DECIMALS 2,
L_VALUE TYPE P LENGTH 8 DECIMALS 2,
EX_RATE TYPE TCURR-UKURS,
F_FACTOR TYPE TCURR-FFACT,
L_FACTOR TYPE TCURR-TFACT.
F_CURR = 'JPY'.
L_CURR = 'THB'.
L_VALUE = '3'.
CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
EXPORTING
* CLIENT = SY-MANDT
DATE = SY-DATUM "為替レート自動取得時の基準日
LOCAL_AMOUNT = L_VALUE "国内通貨金額
FOREIGN_CURRENCY = F_CURR "外貨通貨
LOCAL_CURRENCY = L_CURR "国内通貨
* RATE = '0.07' "為替レートを指定する場合は、このパラメータを利用すると
"ともにREAD_TCURRを''にする
TYPE_OF_RATE = 'B' "為替レートタイプ B:
READ_TCURR = 'X' "'X':為替レートはTCURRより取得、'':為替レートは
"RATEパラメータの値を使用
IMPORTING
EXCHANGE_RATE = EX_RATE "換算時の為替レート
FOREIGN_FACTOR = F_FACTOR "換算時の換算係数(外貨)
FOREIGN_AMOUNT = F_VALUE "換算後外貨金額
LOCAL_FACTOR = L_FACTOR "換算時の換算係数(国内通貨)
* EXCHANGE_RATEX =
* FIXED_RATE =
* DERIVED_RATE_TYPE =
* EXCEPTIONS
* NO_RATE_FOUND = 1
* OVERFLOW = 2
* NO_FACTORS_FOUND = 3
* NO_SPREAD_FOUND = 4
* DERIVED_2_TIMES = 5
* OTHERS = 6
.
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
WRITE:
/'LOCAL CURRENCY=', L_CURR,
/'LOCAL_FACTOR=', L_FACTOR,
/'LOCAL VALUE=', L_VALUE,
/'FOREIGN CURRENCY=', F_CURR,
/'FOREIGN_FACTOR=', F_FACTOR,
/'FOREIGN VALUE=', F_VALUE,
/'EXCHANGE_RATE=', EX_RATE
.
WRITE:/ L_CURR,L_VALUE CURRENCY L_CURR.
WRITE:/ F_CURR,F_VALUE CURRENCY F_CURR.任意通貨間の換算
任意通貨間の換算に関しては、標準から以下二つの汎用モジュールが提供されていますが、
- CONVERT_FOREIGN_TO_FOREIGN_CUR 外貨金額の別外貨通貨への換算
- CONVERT_CURRENCY_BY_RATE 与えられたレートを使用した通貨の変換
いずれも未リリースの属性状態であり、正しく動作しないようです。
書式変換
SAPシステムでは、多通貨が混在しているため、実際に内部管理された金額値は、通貨毎にそれぞれ異なります。例えば、JPYの通貨型項目は通常本来の値の1/100で内部格納されています。 そのため、金額を入出力する際に、内部⇔外部の間に都度書式を変換する必要があります。
外部書式→内部書式変換
汎用モジュール利用
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL' EXPORTING currency = 'JPY' amount_external = l_external_amount max_number_of_digits = 15 IMPORTING amount_internal = l_internal_amount.
内部書式→外部書式変換
汎用モジュール利用
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL' EXPORTING currency = 'JPY' amount_internal = l_internal_amount IMPORTING amount_external = l_external_amount.
命令利用
WRITE XXX TO XXX 'JPY'
参考一覧
このトピックでは、ABAPにおける日付の処理方法を纏めて説明します。
日付の計算
日付項目は文字型であり、数値型ではありません。但し、ABAPでは自動的にデータ型変換が実行されるため、日付項目でも数値演算を行うことができます。 なお、SAP標準から様々な日付を計算するための汎用モジュールが用意されているため、それらを利用することもできます。
日付の加減算を行う
指定された日付より何日前又は、何日後の日付を計算するには、日付項目と数値項目の加減算により簡単に実現できます。
DATA: W_DATE TYPE D, W_3DAY_BEFORE TYPE D, W_5DAY_AFTER TYPE D. W_DATE = SY-DATUM. W_DATE+6(2) = '01'.
日単位だけではなく、月又は年単位で日付の加減算を行うには、汎用モジュールRP_CALC_DATE_IN_INTERVALE(ステータス:未リリース)を使用することができます。
DATA: l_date TYPE d VALUE '20161201'.
DO 2 times.
CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL'
EXPORTING
date = l_date
days = 0
months = 1
signum = '+'
years = 0
IMPORTING
calc_date = l_date.
WRITE: / l_date.
ENDDO.月初や月末日付を取得
指定された日付の月初や月末日付を取得するには、汎用モジュールHR_JP_MONTH_BEGIN_END_DATE(ステータス:未リリース)を使用することができます。
DATA: W_DATE TYPE D, W_MONTH_FIRST_DATE TYPE D, W_MONTH_LAST_DATE TYPE D. W_DATE = SY-DATUM. CALL FUNCTION 'HR_JP_MONTH_BEGIN_END_DATE' EXPORTING IV_DATE = W_DATE IMPORTING EV_MONTH_BEGIN_DATE = W_MONTH_FIRST_DATE EV_MONTH_END_DATE = W_MONTH_LAST_DATE.
月初日付だけを取得する場合では、汎用モジュールよりも、日付を文字列としてDAYの部分を'01'に置き換えることで簡単に実現できます。 なお、月末日だけを取得する場合では、汎用モジュールLAST_DAY_OF_MONTHS(ステータス:未リリース)を利用することも可能です。
DATA: W_DATE TYPE D. W_DATE = SY-DATUM. W_DATE+6(2) = '01'.
週を取得
指定された日付がその年の1月1日から数えて何週目かを判断するには、汎用モジュール「DATE_GET_WEEK」を使用できます。 その何週目の情報は、年・週(yyyyww)の形式で汎用モジュールから返却されます。
DATA: W_DATE TYPE SCAL-DATE, W_WEEK TYPE SCAL-WEEK. WK_DATE = SY-DATUM. CALL FUNCTION 'DATE_GET_WEEK' EXPORTING DATE = W_DATE IMPORTING WEEK = W_WEEK EXCEPTIONS DATE_INVALID = 1 OTHERS = 2.
週の初日を取得
汎用モジュールWEEK_GET_FIRST_DAY(ステータス:リリース)を使用すれば、年と週番号から、該当の週の月曜日の日付を取得することができます。
DATA:
DATUM LIKE SCAL-DATE,
WOCHE LIKE SCAL-WEEK.
WOCHE = '201521'. "2015年21週目
CALL FUNCTION 'WEEK_GET_FIRST_DAY'
EXPORTING
WEEK = WOCHE
IMPORTING
DATE = DATUM "2015/05/18が戻される
EXCEPTIONS
WEEK_INVALID = 1.日付の妥当性をチェック
- DATE_CHECK_PLAUSIBILITY
入力された日付が正しいかチェックする
カレンダー機能
- DATE_COMPUTE_DAY
日付に対して平日を戻す
稼働日関連
- DATE_CONVERT_TO_FACTORYDATE
日付に対して稼働日カレンダを戻す - FACTORYDATE_CONVERT_TO_DATE
稼働日のシリアル番号とカレンダーから日付を返す
会計処理関連
- BAPI_CCODE_GET_FIRSTDAY_PERIOD
会計期間の初日を取得 - BAPI_COMPANYCODE_GET_PERIOD
会計年度と会計日付を取得
書式変換
- CONVERSION_EXIT_PDATE_OUTPUT
日付型の内部書式を外部書式(YYYY/MM/DD)に変換 - CONVERT_DATE_TO_INTERNAL
日付の文字列をR/3内部表現に変換する
このトピックでは、ABAP言語で文字列処理の方法を取り上げて説明します。
チェック関連
文字列の長さを取得
文字列の長さを取得するには、関数STRLENを使用することができます。
例:
DATA : l_v(20) TYPE C,
l_i TYPE I.
l_v = 'ABCDEFG'.
l_i = STRLEN( l_v ). "変数に「7」が保持されることになる全角半角チェック
文字列に全角文字や半角文字が入っていないかをチェックするには、以下の手順で行うことができます。
文字列の内容検索
文字列の内容を検索するには、命令FINDを使用することができます。 オプションを使って、探したい値の開始位置を調べるときに使うことが多いです。
演算関連
文字列のオフセット
文字列のオフセット処理は、ABAP言語固有の仕様に取り込まれています。 構文:文字列+開始位置(指定桁数) ※開始位置は0から
例:
DATA: l_v TYPE string,
l_r TYPE string.
l_v = 'w,f,mj'.
l_r = l_v+2(2)."変数に「f,」が保持されることになる
文字列の置換
文字列の一部を他の文字列で置換するには、命令REPLACEを使用することができます。 構文: REPLACE <置換前> WITH <置換後> INTO <置換対象文字列>.
例:
DATA: l_v TYPE string.l_v = 'w,f,mj'.
REPLACE ',' WITH ';' INTO l_v."変数に「w;f;mj」が保持されることになる
文字列の分割
一つの文字列を区切り文字の指定により複数の文字列に分割するには、命令SPLITを使用することができます。
例:
DATA: l_s1 TYPE string,
l_sx TYPE string.
DATA: lt_r TYPE TABLE CHAR10.
l_s1 = 'w,f,mj'.
l_sx = ','.
SPLIT l_s1 AT l_sx INTO TABLE lt_r.
- 「lt_r」には、1行目に「w」2行目に「f」3行目に「mj」が保持されることになる
文字列のシフト
文字列を指定文字数分移動するには、命令SHIFTを使用することができます。 構文: SHIFT <移動対象文字列> [BY <移動文字数> PLACES] [モード].
例:
DATA: l_v TYPE string.
l_v = 'abcdefghij''.
SHIFT l_v BY 3 PLACES CIRCULAR. "変数に「defghijabc」が保持されることになる
文字列の結合
2つ以上の文字列を一つに結合するには、命令CONCATENATEを使用することができます。
例:
DATA: l_s1 TYPE string,
l_s2 TYPE string,
l_s TYPE string.
l_s1 = 'w'.
l_s2 = 'f'.
CONCATENATE l_s1 l_s2 INTO l_s SEPARATED BY space. "変数に「w f」が保持されることになる
空白の削除
文字列に入っている空白を削除するには、命令CONDENSE を使用することができます。
例:
DATA: l_v TYPE string.
l_v = 'a bf c d'.
CONDENCE l_v."変数に「a bf c d」が保持されることになる、文字列と文字列の間に一つの空白が残る
CONDENCE l_v NO-GAPS."変数に「abfcd」が保持されることになる、すべての空白が削除される
ABAP言語の世界では、文が命令と呼ばれています。
命令の構文
ABAPの文(命令)はキーワードで始まり、プリオド(「.」)で終了します。
命令一覧
| カテゴリ | 命令 | 役割 | 例 |
|---|---|---|---|
| 宣言命令 | TYPES | データ型を定義します | - |
| DATA | データオブジェクトを宣言します | - | |
| TABLES | - | - | |
| 制御命令 | IF | IF-ELSE-ENDIF選択制御構造を実装する | - |
| ELSE | - | ||
| ELSEIF | - | ||
| ENDIF | - | ||
| CASE | CASE-WHEN-ENDCASE選択制御構造を実装する | - | |
| WHEN | - | ||
| ENDCASE | - | ||
| DO | DO-ENDDO反復制御構造を実装する | - | |
| ENDDO | - | ||
| WHILE | WHILE-ENDWHILE反復制御構造を実装する | - | |
| ENDWHILE | - | ||
| 呼出命令 | PERFORM | サブルーチンを呼び出す | - |
| CALL FUNCTION | 汎用モジュールを呼び出す | - | |
| CALL DIALOG | ダイアログモジュールを呼び出す | - | |
| CALL METHOD | ABAPオブジェクトのメソッドを呼び出す | - | |
| CALL METHOD OF | OLE2オブジェクトのメソッドを呼び出す | - | |
| CALL SCREEN | 画面を呼び出す | - | |
| CALL SELECTION-SCREEN | 選択画面を呼び出す | - | |
| CALL TRANSACTION | トランザクションを呼び出す | - | |
| SUBMIT | タイプ 1 の実行可能プログラムを呼び出す | - | |
| LEAVE SCREEN | 現在の画面の処理を中止し、次の画面を呼び出す | - | |
| LEAVE TO SCREEN | 現在の画面の処理を中止し、動的に定義された次の画面を呼び出す | - | |
| LEAVE [PROGRAM] | 現在のプログラムの処理を停止し、このプログラムが呼び出されたポイントに戻る | - | |
| LEAVE TO TRANSACTION | - | - | |
| モジュール化命令 | AT SELECTION SCREEN | - | - |
| START-OF-SELECTION | - | - | |
| AT USER-COMMAND | - | - | |
| FORM | サブルーチンの定義を開始する | - | |
| ENDFORM | サブルーチンの定義を終了する | - | |
| FUNCTION | 汎用モジュールの定義を開始する | - | |
| ENDFUNCTION | 汎用モジュールの定義を終了する | - | |
| MODULE | - | - | |
| ENDMODULE | - | - | |
| 操作命令 | WRITE | - | - |
| MOVE | - | - | |
| ADD | - | - | |
| COMPUTE | - | - | |
| オープンSQL | SELECT | データベーステーブルからのデータの読込 | - |
| INSERT | データベーステーブルへの行の追加 | - | |
| UPDATE | データベーステーブルの行コンテンツの変更 | - | |
| MODIFY | データベーステーブルへの行の追加、または既存行のコンテンツの変更 | - | |
| DELETE | データベーステーブルからの行の削除 | - | |
| OPEN CURSOR FETCH CLOSE CURSOR | カーソルによるデータベーステーブルからの行の読込 | - | |
| ネイティブSQL | EXEC SQL ENDEXEC | データベース固有のコマンドが全てできる | - |
| UI制御命令 | SET SCREEN | 次の画面を設定する | - |
| SET TITLEBAR | 画面タイトルを設定する | - | |
| SET PF-STATUS | GUIステータスを設定する | - | |
| SET CURSOR | 画面上でカーソルを設定する | - | |
| SET MARGIN | 印刷ページのマージンを設定する | - |
チェーン命令
複数の命令は最初の部分が同じであれば、1 つのチェーン命令で連結して書くことができます。 一連の命令を連結するには、同一部分を 1 回だけ書き、その後にコロン(:) を入れます。コロンの後に、個別命令の残りの部分を書いて、それぞれをカンマで区切ります。最後の部分の後にピリオド (.)を付けます。
ブロック
ABAP言語の世界で、ブロックは命令ブロックと呼ばれています。 命令ブロックは制御種類により以下のように分類することができます。
分岐
If-then文
IF <条件式> <命令ブロック> ENDIF.
If-then-else文
IF < 条件1>. < 命令ブロック> ELSEIF < 条件2> < 命令ブロック>. ELSEIF < 条件3>. < 命令ブロック> ..... ELSE. < 命令ブロック> ENDIF.
Case-when文
Switch文 CASE <f>.
WHEN <f11> [OR <f12> OR ...].
< 命令ブロック>
WHEN <f21>.[OR <f22> OR ...]
< 命令ブロック>
WHEN ...
......
WHEN OTHERS.
< 命令ブロック>
ENDCASE.
ループ
Do文
DO [<n> TIMES] [VARYING <f> FROM <f1> NEXT <f2>]. < 命令ブロック> ENDDO.
While文
WHILE < 条件> [VARY <f> FROM <f1> NEXT <f2>]. < 命令ブロック> ENDWHILE.
例外
* Try-catch-endtry * Try-catch-cleanup-endtry
このトピックでは、ABAPの式を取り上げて説明します。
概要
式とは
式というのは結果として値を返すものです。
ABAPは命令ベースの言語であり、命令文に式を使うことができます。
式の構成
式は1つ以上のオペランド、ゼロ以上の演算子、およびゼロ以上の括弧の組み合わせから成ります。 オペランドと演算子や括弧の間に必ずスペースをあけなければなりません。
式の種別
ABAPの式はおもに以下のものがあります。
算術式
算術式とは
算術式とは、算術演算を行う式です。 算術式は結果として単一の算術値をもたらします。
実行順序
ABAPでは、算術式を以下の順序で解釈します。
算術式の結果代入
式の計算結果を変数に代入するには、COMPUTE 命令または代入演算子(
を使用します。
COMPUTE <n> = <expression>.
COMPUTE はオプションなので、以下のように命令を記述することもできます。
<n> = <expression>.
<expression> で指定した算術演算の結果は、項目 <n> に代入されます。
論理式
論理式とは
論理式とは、真偽値を返す式です。
関係演算子の使用
関係演算子を使用する論理式では、2つのオペランドが関係演算子を使用する関係式にリンクしています。
論理式では、関係演算子に従って、2つのオペランドの内容が比較されます。
論理式の結合順序
ABAPでは、AND、OR 、NOTを使うことで、いくつかの論理式をつの論理式にまとめることができます。 結合は以下の順序で解釈します。
- 括弧
- NOT
- AND
- OR
論理式の結果代入
ABAPには値が真または偽のブールデータ型がないため、論理式を変数に代入することができません。
論理式の使用
論理式は、プログラムフローの制御に使用されます。
このトピックでは、ABAP言語の定数と変数を取り上げて説明します。
定数
ABAP定数は、CONSTANTS 命令を使用して宣言します。
CONSTANTS <name> TYPE <type> VALUE [<value> | IS INITIAL]
CONSTANS 命令の構文は、以下の例外を除いて DATA 命令とまったく同じです。
- CONSTANTS命令では VALUE オプションを使用しなければなりません。
VALUE オプションで指定した開始値をプログラムの実行中に変更することはできません。 - XSTRINGS 、参照、内部テーブル、または内部テーブルを含む構造に対して定数を定義することはできません。
変数
ABAP定数は、DATA命令を使用して宣言します。
DATAS <name> TYPE <type> VALUE [<value> | IS INITIAL]
完全に定義されたデータ型<type>の他に、もう1つのデータオブジェクト<obj>と同じデータ型の変数<f>を宣言することもできます。
スコープと生存期間
データ型は定義される場所により、スコープが変わります。
| データ型 | 変数 | 定数 | ||
|---|---|---|---|---|
| スコープ | グローバル(システムレベル) | ○※1 | × | × |
| グローバル(プログラムレベル) | ○※2 | ○※2 | ○※2 | |
| ローカル | ○※3 | ○※3 | ○※3 | |
| 生存期間 | 自動記憶域期間 | - | ○※4 | - |
| 静的記憶域期間 | - | ○※5 | - |
- ※1
ABAPディクショナリーで定義されているデータ型は、全てのABAPプログラムで参照することが可能です。 - ※2
ABAPプログラムの「グローバルデータ宣言部分」で定義されているデータ型、変数及び定数は、当プログラムの中でどこでも参照することができます。 - ※3
ABAPプログラムのプロシージャの中で定義されているデータ型、変数及び定数は、当プロシージャの内部でしか参照できません。 - ※4
プロシージャの中で定義された非statics変数の生存期間はプロシージャのの実行が完了するまでです。 - ※5
ABAPプログラムの「グローバルデータ宣言部分」で定義されている変数や、プロシージャの中で定義されたstatics変数の生存期間は、プログラムの実行開始から終了までです。
このトピックでは、ABAP言語のデータ型を取り上げて説明します。
データ型階層
基本タイプ
組込みデータ型とも呼ばれます。 基本タイプは言語により事前定義されています。
| カテゴリ | 型 | 初期項目長 | 有効項目長 | 初期値 | 意味 | JAVA | C# |
|---|---|---|---|---|---|---|---|
| 数値 | I | 4 | 4 | 0 | 整数 | int | Int32(int) |
| F | 8 | 8 | 0 | 浮動小数 | double | Doubleクラス(double) | |
| P | 8 | 1-16 | 0 | 4ビットで一桁を表現し、最後の4ビットを使って符号と小数点を表現する | BigDecimalクラス | Decimal構造体 | |
| 文字 | C | 1 | 1-65535 | ’ … ’ | テキスト項目(英数字) | Stringクラス | Stringクラス(string) |
| D | 8 | 8 | '00000000' | 日付項目( 書式: YYYYMMDD) | Dateクラス | DateTime構造体 | |
| N | 1 | 1-65535 | '0 … 0' | テキスト項目(数字) | Stringクラス | Stringクラス(string) | |
| T | 6 | 6 | '000000' | 時刻項目(書式: HHMMSS) | Timeクラス | DateTime構造体 | |
| バイト | X | 1 | 1-65535 | '0 … 0' | バイト項目 | - | - |
| XString | 0 | 可変長 | - | - |
参照タイプ
参照タイプは、他のデータを参照するポイントのことです。
複合タイプ
ABAPの複合タイプは構造体や内部テーブルがあります。typesコマンドより宣言することができます。
構造体
構造体とは,「いろいろな種類の互いに関連するデータをまとめて, 1つのかたまりにしたもの」です。 例えば、「コード、名称、単位、単価」などのデータを一品目分だけまとめて定義すれば、一つの構造体になります。
ABAPでは、構造体を構成する要素がコンポーネントと呼ばれています。 構造体の個別コンポーネントを参照するには、<structure name>-<component name>のように、構造名と要素名の間にハイフンを入れます。
内部テーブル
内部テーブルはABAP固有のデータ型であり、一言でいうと、メモリ上のデータベーステーブルのことです。
非常に簡単に言うと、プログラムとは、区切り文字で区切られた一連のトークンです。 トークンとは、基本的な構文要素としてプログラム内で意味を持つテキストの最小単位であり、字句ともいいます。 トークンを組み合わせて、式や宣言や文を組み立てます。 文とは、プログラム内で実行可能なアルゴリズム動作を記述したものです。 式は、文の中に現れる構文単位で、1 つの値を表します。 宣言では、式や文の中で利用できる識別子(関数や変数の名前など)を定義し、必要に応じて識別子用のメモリを割り当てます。
このトピックでは、ABAP言語の文字集合を紹介し、以下のようなトークンを宣言するための構文を説明します。
- 識別子
- リテナル
- 演算子
- 区切文字
- キーワード
- コメント
文字集合
文字集合は,ソース・プログラムで使用可能か有効文字を定義します。 リリース 6.10 以降のABAPシステムは、ユニコード文字集合 とANSI文字集合が 両方ともサポートされるようになっております。
識別子
識別子は,次の項目の名前を表す文字シーケンスです。
- 変数名
- 定数名
- 型名
- サブルーチン名
- クラス名
- インタフェース名
識別子には,次の規則が適用されます。
- 長さが最大 30 文字です
- + . ,: ( ) を使うことができません
- すべて数字で構成することはできません
リテナル
以下のようなリテナルがあります。
| 分類 | 定義 | 例 |
|---|---|---|
| 文字列 | 文字列リテラルは、一重の逆向き引用符 (`) に囲まれた文 字列であり、そのデータ型は STRING です | 'abc3d3’ |
| 数値 | 数字リテラルは、(0 から 9 までの) 連続した数字で構成され、数字の直前に正 (+) または負 (-) の符号を付けることができます | 123 -93 +456 3455555555 |
| 小数部 がある数値や科学表記によ る数値をリテラルとして表 示できるようにするには、 文字リテラルを使用する必 要があります | '1234567890567890' '+0.58498' '-8473.67' '+12.3E-4' | |
| 日付 | 'YYYYMMDD'フォーマットのような文字リテナルで定義する必要があります | '20140218' |
| 時間 | 'HH24MMSS'フォーマットのような文字リテナルで定義する必要があります | '133359' |
演算子
演算子は1つ,または複数のオペランドでの演算を示すトークンであり,ある結果を返してきます。 演算子は以下のようなものがあります。
| 分類 | 演算子 | 用途 | ABAP命令 | |
|---|---|---|---|---|
| 代入 | = | 代入 | MOVE~TO~ | |
| ?= | ワイドキャスト代入(参照型の場合 | MOVE~?TO~ | ||
| 算術 | + | 加算 | ADD~TO~ | |
| - | 減算 | SUBTRACT~FROM~ | ||
| * | 掛け算 | MULTIPLY~BY~ | ||
| / | 割り算 | DIVIDE~BY~ | ||
| ** | 累乗 | - | ||
| MOD | 整数除算の余り | - | ||
| DIV | 整数除算 | - | ||
| 関係 | =, EQ | 等号 | - | |
| <>, NE | 不等号 | - | ||
| <, LT | 未満 | - | ||
| >, GT | 超過 | - | ||
| ⇐, LE | 以下 | - | ||
| >=, GE | 以上 | - | ||
| CO | Contains Only | - | ||
| CN | Contains Not Only | - | ||
| CA | Contains Any: | - | ||
| NA | Contains Not Any | - | ||
| CS | Contains String | - | ||
| NS | Contains No String | - | ||
| CP | Covers Pattern | - | ||
| NP | No Pattern | - | ||
| 論理 | OR | 論理和 | - | |
| AND | 論理積 | - | ||
| NOT | 否定 | - | ||
| ビット | BIT-AND | ビット単位AND | - | |
| BIT-OR | ビット単位OR | - | ||
| BIT-XOR | ビット単位XOR | - | ||
| BIT-NOT | ビット単位NOT | - | ||
| リテナル | & | 2つのリテラルを結んで1つのリテラルにする | - | - |
区切文字
ABAPの文字のいくつかは区切り記号として使用され,構文および意味上で独自の機能を持っています
| 分類 | 区切り記号 | 用途 | 例 |
|---|---|---|---|
| 終端子 | .(ピリオド) | 文の終了 | - |
キーワード
ABAP言語で文は命令とよばれています。命令の先頭の ABAP 用語は ABAP キーワードです。 ABAPキーワードはある種のプログラ ミング言語でのように予約された名称ではありません。 命名規則で ABAP キーワードを使用するのは禁止され ていませんが、可能なら避 けてください。 以下はABAPキーワードの一覧表です。
| ABAP-SOURCE | ABBREVIATED | ABS | ABSTRACT | ACCEPT |
| ACCEPTING | ACCORDING | ACOS | ACTIVATION | ACTUAL |
| ADD | ADD-CORRESPONDING | ADJACENT | AFTER | ALIASES |
| ALL | ALLOCATE | ANALYSIS | ANALYZER | AND |
| ANY | APPEND | APPENDAGE | APPENDING | APPLICATION |
| ARCHIVE | AREA | ARITHMETIC | AS | ASCENDING |
| ASIN | ASSERT | ASSIGN | ASSIGNED | ASSIGNING |
| AT | ATAN | ATTRIBUTES | AUTHORITY | AUTHORITY-CHECK |
| AVG | BACK | BACKGROUND | BACKUP | BACKWARD |
| BADI | BEFORE | BEGIN | BETWEEN | BIG |
| BINARY | BIT | BIT-AND | BIT-NOT | BIT-OR |
| BIT-XOR | BLACK | BLANK | BLANKS | BLOCK |
| BLOCKS | BLUE | BOUND | BOUNDARIES | BOUNDS |
| BREAK-POINT | BT | BUFFER | BY | BYPASSING |
| BYTE | BYTE-CA | BYTE-CN | BYTE-CO | BYTE-CS |
| BYTE-NA | BYTE-NS | BYTE-ORDER | C | CA |
| CALL | CALLING | CASE | CASTING | CATCH |
| CEIL | CENTERED | CHAIN | CHAIN-INPUT | CHAIN-REQUEST |
| CHANGE | CHANGING | CHAR-TO-HEX | CHARACTER | CHARLEN |
| CHECK | CHECKBOX | CIRCULAR | CLASS | CLASS-CODING |
| CLASS-DATA | CLASS-EVENTS | CLASS-METHODS | CLASS-POOL | CLEANUP |
| CLEAR | CLIENT | CLIKE | CLOCK | CLOSE |
| CN | CO | CODE | CODEPAGE | CODING |
| COL_BACKGROUND | COL_GROUP | COL_HEADING | COL_KEY | COL_NEGATIVE |
| COL_NORMAL | COL_POSITIVE | COL_TOTAL | COLLECT | COLOR |
| COLUMN | COMMENT | COMMENTS | COMMIT | COMMON |
| COMMUNICATION | COMPARING | COMPONENT | COMPONENTS | COMPRESSION |
| COMPUTE | CONCATENATE | CONDENSE | CONDITION | CONNECT |
| CONNECTION | CONSTANTS | CONTEXT | CONTEXTS | CONTINUE |
| CONTROL | CONTROLS | CONVERSION | CONVERT | COPIES |
| COPY | CORRESPONDING | COS | COSH | COUNT |
| COUNTRY | COVER | CP | CPI | CREATE |
| CS | CSEQUENCE | CURRENCY | CURRENT | CURSOR |
| CURSOR-SELECTION | CUSTOMER-FUNCTION | D | DATA | DATABASE |
| DATAINFO | DATASET | DATE | DAYLIGHT | DBMAXLEN |
| DD/MM/YY | DD/MM/YYYY | DDMMYY | DEALLOCATE | DECIMALS |
| DEFAULT | DEFERRED | DEFINE | DEFINING | DEFINITION |
| DELETE | DELETING | DEMAND | DEPARTMENT | DESCENDING |
| DESCRIBE | DESTINATION | DETAIL | DIALOG | DIRECTORY |
| DISCONNECT | DISPLAY | DISPLAY-MODE | DISTANCE | DISTINCT |
| DIV | DIVIDE | DIVIDE-CORRESPONDING | DO | DUMMY |
| DUPLICATE | DUPLICATES | DURING | DYNAMIC | DYNPRO |
| E | EDIT | EDITOR-CALL | ELSE | ELSEIF |
| ENABLED | ENABLING | ENCODING | END | END-ENHANCEMENT-SECTION |
| END-LINES | END-OF-DEFINITION | END-OF-FILE | END-OF-PAGE | END-OF-SELECTION |
| ENDAT | ENDCASE | ENDCATCH | ENDCHAIN | ENDCLASS |
| ENDDO | ENDENHANCEMENT | ENDEXEC | ENDFORM | ENDFUNCTION |
| ENDIAN | ENDIF | ENDING | ENDINTERFACE | ENDLOOP |
| ENDMETHOD | ENDMODULE | ENDON | ENDPROVIDE | ENDSELECT |
| ENDTRY | ENDWHILE | ENHANCEMENT | ENHANCEMENT-POINT | ENHANCEMENT-SECTION |
| ENHANCEMENTS | ENTRIES | ENTRY | ENVIRONMENT | EQ |
| ERRORMESSAGE | ERRORS | ESCAPE | ESCAPING | EVENT |
| EVENTS | EXCEPTION | EXCEPTION-TABLE | EXCEPTIONS | EXCLUDE |
| EXCLUDING | EXEC | EXECUTE | EXISTS | EXIT |
| EXIT-COMMAND | EXP | EXPAND | EXPIRATION | EXPLICIT |
| EXPONENT | EXPORT | EXPORTING | EXTENDED | EXTENSION |
| EXTRACT | F | FETCH | FIELD | FIELD-GROUPS |
| FIELD-SYMBOLS | FIELDS | FILE | FILTER | FILTERS |
| FINAL | FIND | FIRST | FIRST-LINE | FIXED-POINT |
| FKEQ | FKGE | FLOOR | FLUSH | FONT |
| FOR | FORM | FORMAT | FORWARD | FOUND |
| FRAC | FRAME | FRAMES | FREE | FRIENDS |
| FROM | FTO | FUNCTION | FUNCTION-POOL | GAPS |
| GE | GENERATE | GET | GIVING | GKEQ |
| GKGE | GLOBAL | GREEN | GROUP | GROUPS |
| GT | HANDLE | HANDLER | HASHED | HAVING |
| HEAD-LINES | HEADER | HEADERS | HEADING | HELP-ID |
| HELP-REQUEST | HIDE | HIGH | HINT | HOLD |
| HOTSPOT | I | ICON | ID | IDENTIFICATION |
| IDENTIFIER | IDS | IF | IGNORING | IMMEDIATELY |
| IMPLEMENTATION | IMPLEMENTATIONS | IMPORT | IMPORTING | IN |
| INCLUDE | INCLUDES | INCLUDING | INCREMENT | INDEX |
| INDEX-LINE | INFOTYPES | INHERITING | INIT | INITIAL |
| INITIALIZATION | INNER | INOUT | INPUT | INSERT |
| INSTANCES | INTENSIFIED | INTERFACE | INTERFACE-POOL | INTERFACES |
| INTERNAL | INTERVALS | INTO | INVERSE | INVERTED-DATE |
| IS | JOB | JOIN | KEEP | KEEPING |
| KERNEL | KEY | KEYS | KEYWORDS | KIND |
| LANGUAGE | LAST | LATE | LAYOUT | LE |
| LEADING | LEAVE | LEFT | LEFT-JUSTIFIED | LEGACY |
| LENGTH | LEVEL | LEVELS | LIKE | LINE |
| LINE-COUNT | LINE-SELECTION | LINE-SIZE | LINEFEED | LINES |
| LIST | LIST-PROCESSING | LISTBOX | LITTLE | LOAD |
| LOAD-OF-PROGRAM | LOCAL | LOCALE | LOG | LOG-POINT |
| LOG10 | LOGFILE | LOOP | LOW | LOWER |
| LPI | LT | M | MAIN | |
| MAJOR-ID | MARGIN | MARK | MASK | MATCH |
| MATCHCODE | MAX | MAXIMUM | MEMORY | MESSAGE |
| MESSAGE-ID | MESSAGES | METHOD | METHODS | MIN |
| MINIMUM | MINOR-ID | MM/DD/YY | MM/DD/YYYY | MMDDYY |
| MOD | MODE | MODIF | MODIFIER | MODIFY |
| MODULE | MOVE | MOVE-CORRESPONDING | MULTIPLY | MULTIPLY-CORRESPONDING |
| N | NA | NAME | NAMETAB | NATIVE |
| NB | NE | NESTING | NEW | NEW-LINE |
| NEW-PAGE | NEW-SECTION | NEXT | NO | NO-DISPLAY |
| NO-EXTENSION | NO-EXTENSIONS | NO-GAP | NO-GAPS | NO-GROUPING |
| NO-HEADING | NO-SCROLLING | NO-SIGN | NO-TITLE | NO-TOPOFPAGE |
| NO-ZERO | NODE | NODES | NON-UNICODE | NON-UNIQUE |
| NOT | NP | NS | NULL | NUMBER |
| NUMERIC | NUMOFCHAR | O | OBJECT | OBJECTS |
| OBLIGATORY | OCCURRENCE | OCCURRENCES | OCCURS | OF |
| OFF | OFFSET | OLE | ON | ONLY |
| OPEN | OPTION | OPTIONAL | OPTIONS | OR |
| ORDER | OTHERS | OUT | OUTER | OUTPUT |
| OUTPUT-LENGTH | OVERFLOW | OVERLAY | P | PACK |
| PACKAGE | PADDING | PAGE | PAGES | PARAMETER |
| PARAMETER-TABLE | PARAMETERS | PART | PATTERN | PERCENTAGE |
| PERFORM | PERFORMING | PERSON | PF | PF-STATUS |
| PINK | PLACES | POOL | POSITION | PRECOMPILED |
| PREFERRED | PRESERVING | PRIMARY | PRINT-CONTROL | |
| PRIORITY | PRIVATE | PROCEDURE | PROCESS | PROGRAM |
| PROPERTY | PROTECTED | PROVIDE | PUBLIC | PUSHBUTTON |
| PUT | QUEUE-ONLY | QUICKINFO | RADIOBUTTON | RAISE |
| RAISING | RANGE | RANGES | READ | READ-ONLY |
| RECEIVE | RECEIVED | RECEIVER | RECEIVING | RED |
| REDEFINITION | REF | REFERENCE | REFRESH | REGEX |
| REJECT | RENAMING | REPLACE | REPLACEMENT | REPLACING |
| REPORT | REQUEST | REQUESTED | RESERVE | RESET |
| RESOLUTION | RESPECTING | RESPONSIBLE | RESULT | RESULTS |
| RETURN | RETURNCODE | RETURNING | RFC | RIGHT |
| RIGHT-JUSTIFIED | ROLLBACK | ROUND | ROWS | RUN |
| SAP | SAP-SPOOL | SAVING | SCAN | SCREEN |
| SCROLL | SCROLL-BOUNDARY | SCROLLING | SEARCH | SECONDS |
| SECTION | SELECT | SELECT-OPTIONS | SELECTION | SELECTION-SCREEN |
| SELECTION-SET | SELECTION-SETS | SELECTION-TABLE | SELECTIONS | SEND |
| SEPARATE | SEPARATED | SET | SHARED | SHIFT |
| SHORTDUMP-ID | SIGN | SIMPLE | SIN | SINGLE |
| SINH | SIZE | SKIP | SKIPPING | SMART |
| SOME | SORT | SORTABLE | SORTED | SOURCE |
| SPECIFIED | SPLIT | SPOOL | SPOTS | SQL |
| SQRT | STABLE | STAMP | STANDARD | START-OF-SELECTION |
| STARTING | STATE | STATEMENT | STATEMENTS | STATIC |
| STATICS | STATUSINFO | STEP-LOOP | STOP | STRING |
| STRLEN | STRUCTURE | STRUCTURES | SUBKEY | SUBMATCHES |
| SUBMIT | SUBROUTINE | SUBSCREEN | SUBSTRING | SUBTRACT |
| SUBTRACT-CORRESPONDING | SUFFIX | SUM | SUMMARY | SUMMING |
| SUPPLIED | SUPPLY | SUPPRESS | SWITCH | SWITCHSTATES |
| SYMBOL | SYNCPOINTS | SYNTAX-CHECK | SYNTAX-TRACE | SYSTEM-CALL |
| SYSTEM-EXCEPTIONS | SYSTEM-EXIT | T | TAB | TABBED |
| TABLE | TABLES | TABLEVIEW | TABSTRIP | TAN |
| TANH | TASK | TEST | TESTING | TEXT |
| TEXTPOOL | THEN | TIME | TIMES | TITLE |
| TITLE-LINES | TITLEBAR | TO | TOKENIZATION | TOKENS |
| TOP-LINES | TOP-OF-PAGE | TRACE-FILE | TRACE-TABLE | TRAILING |
| TRANSACTION | TRANSFER | TRANSFORMATION | TRANSLATE | TRANSPORTING |
| TRMAC | TRUNC | TRUNCATE | TRUNCATION | TRY |
| TYPE | TYPE-POOL | TYPE-POOLS | TYPES | ULINE |
| UNASSIGN | UNDER | UNICODE | UNIQUE | UNIT |
| UNIX | UNPACK | UNTIL | UP | UPDATE |
| UPPER | USER | USER-COMMAND | USING | UTF-8 |
| VALID | VALUE | VALUE-REQUEST | VALUES | VARY |
| VARYING | VERIFICATION-MESSAGE | VERSION | VIA | VISIBLE |
| WAIT | WARNING | WHEN | WHENEVER | WHERE |
| WHILE | WIDTH | WINDOW | WINDOWS | WITH |
| WITH-HEADING | WITH-TITLE | WITHOUT | WORD | WORK |
| WRITE | X | XML | XSEQUENCE | XSTRING |
| XSTRLEN | YELLOW | YYMMDD | Z | ZONE |
コメント
コメントは、ある記号から行末までをコメントとして扱う行コメントと、2つの記号で前後を括りその内部をコメントとして扱うブロックコメントに大別されることができます。 ABAP言語は、行コメントのみをサポートしております。行全体をコメントにする場合は、行の先頭にアスタリスク (*) を入れます。1 行の一部をコメントにする場合は、コメントの前に二重引用符 (“) を入れます。
************************************************ * REPORT DEMO_HELLO_WORLD * * WRITTEN BY LI WENFENG, 02/18/2014 * * LAST CHANGED BY LI WENFENG, 02/18/2014 * ************************************************ REPORT DEMO_HELLO_WORLD. * Selection Screen PARAMETERS input(12) TYPE c DEFAULT 'Hello World!'. * Dynpro CALL SCREEN 100. * List SKIP TO LINE 10. " sets the line POSITION 40. " sets the position WRITE input. " output<span style="background-color:rgb(255, 255, 255);white-space:normal;font-family:"Trebuchet MS", "Helvetica Neue", Helvetica, Tahoma, sans-serif;font-size:16px"></span><span style="background-color:rgb(255, 255, 255);white-space:normal;font-family:"Trebuchet MS", "Helvetica Neue", Helvetica, Tahoma, sans-serif;font-size:16px"></span>
このトピックでは、ABAP開発のオブジェクト指向要素を取り上げて説明します。
オブジェクト指向とは
プログラミングにおけるオブジェクト指向とは、いかのようなコンセプトでプログラムを構築する手法で。
- プログラムをオブジェクトに分割して、オブジェクト間のコラボレーションによりアプリケーション機能を実現
- オブジェクトはデータを内蔵しており、それをアクセスできる属性やメソッドをインタフェースとして外部に提供
- オブジェクトは継承することにより、汎用化することができる
クラスとインタフェース
クラスとはデータとその操作手順であるメソッドをまとめたオブジェクトの雛型を定義したものです。 クラスはインスタンス化することができます。
インタフェースとは、クラスのアクセスインタフェースを明確に定義したものです。 インタフェースからインスタンスを作成することができません。
クラスの種類
クラスは、ローカルクラスとグローバルクラスの2種類があります。
- ローカルクラス
ローカルクラスは、レポートプログラムやダイアログプログラムなど、個別プログラムの内部で実装されるクラスです。
ローカルクラスは外部のプログラムに不可視です。 - グローバルクラス
グローバルクラスのソースコードはクラスビルダを使って記述し、システム全体のクラスライブラリに格納されます。
グローバルクラスはどのプログラムからも使うことができます。
ローカルクラスとグローバルクラスはスコープが異なりますが、その以外の違いはとくにありません。
属性
属性は、オブジェクトに関連付けられているデータに対するインタフェースです。 属性はクラスのインスタンスに作用するインスタンス属性と、クラスそのものに作用する静的属性があります。
メソッド
メソッドは、クラスに関連付けられているサブルーチンです。大半のメソッドは、クラスのインスタンスに作用します。中には、クラスそのものに作用するメソッドもあります、これは静的メソッドと呼ばれます。
クラスのインスタンス化
クラスをインスタンス化するには、CREATE OBJECT命令を使用します。
このトピックでは、ABAP開発の構造化手法を取り上げて説明します。構造化手法はモジュール化とも呼ばれます。
概要
ABAPプログラムの処理ロジックは処理ブロックで構成されます。
処理ブロックには、ABAP 実行システムによって外部プログラムから呼び出される処理ブロックと、ABAPプログラムの ABAP 命令による呼出が可能な処理ブロックの2種類があります。
ABAP命令による呼出が可能な処理ブロックは、プロシージャと呼ばれます。
| カテゴリ | 処理ブロック | 呼出元 | ローカルデータ領域 |
|---|---|---|---|
| 画面制御 | ダイアログモジュール | PBO、PAI (個別画面) | 無 |
| イベントブロック | PBO、PAI (標準の選択、一覧画面) | 無 | |
| プロシージャ | サブルーチン | 有 | |
| 汎用モジュール | 有 | ||
| メソッド | 有 |
処理ブロックは分離不可能な構文的モジュール化単位であり、他の処理ブロックを含むことはできません。
ダイアログモジュール
ダイアログモジュールは、画面の初期表示時やユーザがなんらかのアクションを起こした後に、ABAP実行環境(ダイアログプロセッサ) から、Dynno制御ロジックのPAI、PBOを通して、呼び出されます。
ダイアログモジュールは MODULE 命令によって導入され、ENDMODULE 命令によって終了します。
以下の図でダイアログモジュールの呼出イメージを示します。
ここのダイアログモジュールはcall dialogで呼ばれている「ダイアログモジュール」とは別物です。
call dialogで呼ばれている「ダイアログモジュール」はアプリケーションプログラムを通常の「Transaction」ではなく、呼出元のプログラムのSAP LUWの中に動く「dilalog」として呼び出すための名称というものです。
以下の図でダイアログモジュールの実装イメージを示します。
イベントブロック
サブルーチン
サブルーチンは、主としてローカルなモジュール化で使用されます。一般に、サブルーチンは、そのサブルーチンが定義されているプログラムから呼び出されます。サブルーチンを使用して、プログラム内で繰り返し使用する機能を記述することができます。
サブルーチンは 全てのABAPプログラムで定義することができます。
汎用モジュール
汎用モジュールは、グローバルなモジュール化で使用され、常に別のログラムから呼び出されます。
汎用モジュールは汎用グループで定義する必要があり、任意のプログラムから呼び出すことができます。
汎用モジュールにより、データ交換の固定インタフェースが処理されます。たとえば、入力パラメータにデフォルトの値を割り当てることができます。また、このインタフェースでは例外処理もサポートしています。これによって、エラーを検出し、そのエラーを対処するため呼び出し元プログラムに返し、処理させることができます。
汎用モジュールは独自のメモリ領域を使用します。呼び出し元プログラムと汎用モジュールとが、共有メモリ領域を使ってデータ交換を行うことはできません。汎用モジュールインタフェースを使用しなければなりません。
このトピックでは、ABAPプログラム実行時のメモリ構造を取り上げて説明します。
メインセッション
サーバへログインすると、ユーザに1つの「ユーザセッション」が開かれます。 ユーザが同時に最大6つのウィンドウを開くとができます。これらのウィンドウはそれぞれ、アプリケーションサーバ上で共有メモリの専用領域を使用する「メインセッション」に対応しています。
内部セッション
メインセッションで起動した最初のアプリケーションプログラムによって、メインセッション内の内部セッションが開きます.
上記の図で示した通り、プリケーションプログラム(TYPE 1、TYPE M)が呼び出されるたびに、新しい内部セッションが作成されます。その他プログラムは新しい内部セッションを作成することがなく、必ず呼び出し元のアプリケーションプログラムの内部セッションで動作します。
共有メモリ
ABAPプログラムの間にデータを共有できるメモリは、SAPメモリとABAPメモリの2種類がありまして、それぞれスコープが異なります。
- SAPメモリ
同じユーザセッション内にすべて可視です。別々のメインセッションで起動された各プログラムは同じSAPメモリを共有できます。 - ABAPメモリ
同じメインセッション内なら可視です。同じメインセッションで動作する各プログラムは同じABAPメモリを共有しています。
このトピックでは、ABAPプログラムの構成を取り上げて説明します。
プログラムの構成
大きく分けるとABAPプログラムは、処理ロジックと各画面コンポーネントから構成されます。GUIをもっていないプログラムは、処理ロジックのみとなります。
SAPのドキュメントでは、処理ロジックのみをABAPプログラムと呼ぶことも多く見受けられます。
処理ロジック
以下の図ではABAPプログラムの処理ロジックの構造を示します。
- プログラム導入部
独立した ABAPプログラムは常に導入命令から始まります。導入命令はプログラムのタイプによって異なります。 - グローバル宣言部
すべての ABAP プログラムにおいて、プログラム導入部の後ろにグローバルデータ、クラス、および選択画面のための宣言部が続きますグローバルデータ、クラス、選択画面のための宣言部 - 処理ブロック
プログラムのソースコード内のグローバル宣言部の下には、任意の順序で ABAP プログラムの処理ブロックを列挙することができます.
以下の下のタイプの処理ブロックが利用可能です。
●ダイアログモジュール (ローカルデータ領域なし)
●イベントブロック (ローカルデータ領域なし、2 つの例外あり)
●プロシージャ (メソッド、サブルーチン、汎用モジュール。独自のローカルデータ領域を使用)
画面コンポーネント
画面を構成するコンポーネントはいかのようなものがあります。
- Dynpro
- GUIステータス
- GUI表題
- メッセージ
- WebDynpro
それぞれ独立したオブジェクトとして存在します。
SAPが標準で用意した各モジュールやアドオンとして開発された各アプリケーションは、すべてSAPのプログラムとして、アプリケーションサーバのワークプロセスに対して、 アプリケーションサーバ内で実行されます。
ABAPプログラムには以下のプログラムタイプがあります。
- TYPE 1: 実行可能プログラム
- TYPE M: モジュールプール
- TYPE F: 汎用グループ
- TYPE K: クラスプール
- TYPE J: インタフェースプール
- TYPE S: サブルーチンプール
- TYPE T: タイププール
- TYPE I: インクルードプログラム
WebDynproは、処理ロジックを記述するにクラスプールとインタフェースプールを利用してるため、 新たなプログラムタイプの追加はありません。
ABAPプログラムの概説は、以下のリンクからご参考くださ。
企業とは、個人が営んでいる事業や集団で資金を募って形成された組織などの、経済的な活動をしている主体をさします。間違いやすいですが、法人だけではなく個人事業主も企業のうちに含まれます。
概説
日本企業の形態は、大きく分けて公企業と私企業に分けることができますが、私企業については、さらに個人企業(個人事業主)と共同企業に分けることができます。共同企業には、法人格を有する法人企業と法人格をもたない組合(匿名組合、民法上の組合)や権利能力のない社団などの非法人企業があります。
法人企業には、営利法人としての会社があり、公益法人としての社団法人、財団法人、そして、両者の中間に位置付けられる中間法人として信用金庫等があります。
会社
会社とは、法人の中でも特に営利目的のものをさします。厳密には「会社法に基づいて設立された法人」と言った意味があります。
以下4種類の会社があります。
- 株式会社
株主は、各自有する株式の引受価額を限度とする出資義務を負うだけで、会社債権者に対しては直接に責任を負わない(間接有限責任)会社 - 合名会社
「直接無限責任」社員のみで構成される会社(社員全員が、会社債権者に対して、直接、連帯して無限責任を負う) - 合資会社
「直接無限責任」社員と「直接有限責任」社員からなる二元的組織の会社 - 合同会社
「間接有限責任」社員のみで構成され、会社の内部関係においては民法上の組合と同様の規律が適用されている会社
ちなみに2006年(平成18年)に施行された新会社法に伴い廃止となり、現在は新たに設立することができなくなった有限会社も会社といった区分の1つになります。
個人事業主
個人事業主とは、法人を設立せず個人として事業を営むための開業届を出している人のことを指します。
個人事業主が特に大きくかかわってくるのが納税手続きで、法人の立場と個人事業主の立場とではとるべき手続きが全く異なってきます。
個人事業主と似た意味でつかわれる言葉で「自営業」や「フリーランス」という呼称も用いられることがありますが、個人事業主が法律に基づいた呼び名であることに対して、「自営業」と「フリーランス」は社会的な呼び名に過ぎません。
(自営業)
自営業とは、自分で事業を起こし、営業を行うことの総称を指します。
自営業は、個人事業主のほかに、法人を設立しているオーナー社長も含められます。
法人の場合は、売上は法人の事業所得として申告し、個人事業主は個人の事業所得として申告するなど、税金の納め方が異なってきます。
(フリーランス)
フリーランスとは、企業には属さずに独立して仕事を請け負う人のことです。
フリーランスのうち、個人事業主もいれば、会社を作って法人化を取った人もいます。
要は、フリーランスは働き方を指す言葉であり、時間と場所を選ばずに仕事ができることや、1つの企業に属さず複数の企業などと取引があるという特徴があります。
そのため、個人事業主のうち、プログラムやカメラマンのようにフリーランスと呼べる人もいれば、個人商店を経営していてフリーランスと呼べない人もいます。








