Procedures プロシージャとは
Proceduresは簡単に言うと再利用できる処理のまとまりのようなもの。
以下のような種類が存在する。
・サブルーチン
→プログラム内でのモジュール化(=プログラム内でのロジックの再利用)に使用することが多い。
・汎用モジュール
→複数のプログラムで再利用できるような処理に使用することが多い。(権限チェックなど)
・メソッド
→オブジェクト指向プログラミングで使用。詳細は後述する。
サブルーチン
この中で最も使用するのは「PERFORM」を使用して呼び出すサブルーチンだろう。
サブルーチンはFORM~ENDFORM.で書かれた処理のことで、PERFORM サブルーチン名で呼び出すことが可能だ。
PERFORM サブルーチン名.
もしほかのプログラムを使用したい場合は後ろにIN PROGRAM プログラム名.とすることで呼び出すことが可能だ。
PERFORM サブルーチン名 IN PROGRAM 呼び出すサブルーチンのあるプログラム名.
サブルーチン内はローカルとなり、サブルーチン内で宣言したデータオブジェクトなどはサブルーチンに入ったときに作成され、出るときに破棄される。
サブルーチン外からアクセスすることができないので注意しよう。
イメージは以下のような感じだ。
・値渡しについて
サブルーチン内で処理したデータをサブルーチン外で使用する方法は2つある。1つはグローバル変数を使用する方法、もう1つは値渡し・参照渡しを使用する方法だ。
値渡し・参照渡しをするときは以下のようにPERFORMの後ろにつけることで使用可能だ。
PERFORM サブルーチン名 USING 値渡しするデータオブジェクトなど
CHANGING 値渡しするデータオブジェクトなど
USINGとCHANGINGはそれぞれ次のような特徴がある。
USING→値渡し。グローバルからサブルーチンに値を渡す(一方通行)
CHANGING→参照渡し。サブルーチンに値を渡し、サブルーチンから値を返してもらう。参照渡しした場合、サブルーチン内で渡した先の値が変わるとそのタイミングで渡した元のデータも変更される。そのサブルーチンが途中で終了した場合でもこの値は元に戻らないので注意しよう。
USINGとCHANGINGはそれぞれ片方だけ使うことも可能だが、両方使うときはUSING→CHANGINGの順で書く必要があるので注意が必要だ。
USINGとCHANGINGの後ろのデータオブジェクトなどを実パラメータという。
この実パラメータに対応するものがサブルーチン側にも存在し、こちらは仮パラメータと呼ぶ。
実パラメータの数と仮パラメータの数は一致する必要があり、不一致の場合はエラーとなるので注意が必要だ。
データ型なども基本的には一致している必要があるのでこちらも注意が必要だ。
USING VALUEとCHANGING VALUEというものも存在する。 こちらは値渡し・参照渡しすること自体は変わらないが、渡したデータを変更しても元のデータがすぐに更新されないという違いがある。
元データが変更されるのはENDFORM,EXIT,CHECKが実行されたタイミングとなる。
便利ではあるがテーブルなどを渡した場合に件数が多すぎるとパフォーマンスが悪化するので注意が必要だ。
テーブルを渡すときはUSINGとCHANGINGのほかにTABLESというものも使用することが可能だが、現在廃止されているので、使用しない方がいいだろう。
テーブルを渡す場合は仮パラメータは型指定が必ず必要となる。型は渡す元のテーブルと同じ構造やテーブル型を指定しよう。LIKEを使ってグローバル内部テーブルを指定しても大丈夫だ。
汎用モジュール
汎用モジュールはすべてのプログラムで使用できるサブルーチンのようなもの。
トランザクションコードは「SE37」なので注意。
最初からSAPが用意した汎用モジュールがたくさん登録してあるので、うまくそれを使うことができれば開発にかかる時間を短縮することも可能だ。
基本的に汎用モジュールはほかのプログラムから呼び出して使用する。
汎用性の高いものであればそれだけ多くのプログラムで使用されているため、改修を行ったときに影響範囲も大きい。改修前に必ず使用先のプログラムを確認しよう。
・汎用モジュールのタブについて
汎用モジュールには以下の7つのタブがある。
属性
Import
Export
Changing
Tables
Exceptions
ソースコード
それぞれ以下のようなことを設定することが可能だ。
属性
汎用モジュールの処理の種類や名前などを設定。
Import
汎用モジュールを呼び出したプログラムから渡された値が格納される先のデータ型など設定。
Export
汎用モジュールを呼び出したプログラムに返す値のデータ型などを設定。
Changing
ImportとExportの両方と同じ働きをする。つまり、値を渡されることも返すことも可能だ。
Tables
内部テーブルを定義するために使用するが現在は廃止されているため、使用は禁止だ。(過去の汎用モジュールを使用するために残されている。)
LIKEを使用してDBテーブルや構造を指定して内部テーブルを定義できる。
Exceptions
汎用モジュールないで起こった例外処理について設定。
ソースコードないで「RAISE」というABAPキーワードを使用することでここに設定した例外処理を呼び出すことが可能だ。
ソースコード
汎用モジュールの処理ロジックを書くことが可能。FUNCTION~ENDFUNCTIONの間にロジックを書く。
・汎用モジュールの呼び出し方
SE38やSE80のアプリケーションツールバー(構文チェックや実行のボタンがある部分)の「パターン」というボタンを押すことで簡単にプログラム中に呼び出すことが可能だ。
「パターン」ボタンを押して表示されたポップアップウィンドウでラジオボタン「CALL FUNCTION」を選択し、呼び出したい汎用モジュールのIDを入力、「☑」を押すだけで呼び出せる。
呼び出すとプログラム中に
CALL FUNCTION 汎用モジュール名
EXPORTING
XXXX =
YYYY =
:
IMPORTING
ZZZZ =
:
EXCEPTIONS
AAAA =
:
OTEHRS =
というようなロジックが追加される。EXPORTINGやIMPORTINGの右側に呼び出し元プログラムから渡したい値、汎用モジュールから返してほしい値をそれぞれ設定することで汎用モジュールの呼び出しは完了だ。
ちなみにEXPORTINGがプログラムから渡す値、IMPORTINGが汎用モジュールから返される値がそれぞれ格納される。
呼び出し元から見ると反対になっている点に注意しよう。
メソッド
オブジェクト指向プログラミングでのプロシージャ。
SE24でグローバルクラスの作成が可能。
最初の3文字を「ZCL」にした場合、クラスを直接作成することが、「ZIF」にした場合、インターフェイスプールを直接作成することが可能だ。
ほかの名前で作った場合はどっちを作るか確認される。
インターフェイスプールには実行可能ステートメントは含まれない。
クラスにインターフェイスを実装するとインターファイス定義はクラス定義に暗黙的に含まれる。
保存ボタンを押すとエディターが開かれる。
メソッドタブを選択することで編集が可能だ。
各項目については次の通り。
・メソッド→メソッドの名前を設定
・レベル→インスタンスメソッドか静的メソッドか設定。
インスタンスメソッド→同じプログラムに複数のインスタンスを持つことが可能。
静的メソッド→汎用モジュールと似ている。同じプログラムに1つのインスタンスを持つことが可能。
・可視性→アクセスを許可するレベルを次の3種類のレベルで設定可能。
パブリック→どのプログラムからでも属性、メソッドにアクセス可能
プロテクト→同じクラスもしくはサブクラスのメソッドから属性、メソッドにアクセス可能
プライベート→同じクラスのメソッドからのみ属性、メソッドにアクセス可能
アドオンプログラムで使う場合はパブリックにしておこう。
Description→メソッドの説明テキスト。
IMPORTタブやEXPORTタブは汎用モジュールと同じ内容となっている。
メソッドタブにある「コード」ボタンを押すことでメソッドの処理ロジックを書くことが可能。METHOD~ENDMETHODの間にロジックを書く。
「署名」ボタンを押すとパラメータインターフェイスを表示することも可能だ。
・メソッドの呼び出し方
静的メソッドの場合は汎用モジュールの呼び出し方と似ていてパターンを使用して呼び出すことが可能だ。
インスタンスメソッドの場合は参照オブジェクトを作成、インスタンス化。その参照オブジェクトを使用してメソッドにアクセスする必要がある。
コメント