RPG

84. %PADDR の使用方法

V3R2M0 からのBIFFコードとしてプロシージャーのポインターを示す %PADDR があるが

どのような使用目的があるのかが、よくわからない人も多いと思われる。

直接、プロシージャーを呼べばよいものを、何故ポインターを指定する必要があるのかが

明確でないのかも知れない。

%PADDR を使用する目的は不明な汎用的なプロシージャーの実行を可能にすることである。

例えばある親プログラムから子の *SRVPGM を呼び出すことを想定しよう。

PGMA はデータ・ベース MYFILE をアクセスして一覧表を印刷する。

PGMB はデータ・ベース MYFILE をアクセスして画面に表示する。

そこでデータ・ベースをアクセスする部分は共通しているので、ひとつの *SRVPGM

まとめるものとする。処理は次のようになる。

PGMA から開始 » SRVPGMA で MYFILE をアクセス » PGMA に戻って一覧表を印刷

PGMB から開始 » SRVPGMA で MYFILE をアクセス » PGMB に戻って画面表示

いずれの場合も MYFILE をアクセスする SRVPGMA にキーなどのレコードを取得するための

情報を渡すことになるが、同時に次の処理としての「一覧表印刷」や「画面表示」の処理だけ

をプロシージャーとして定義しておいて、SRVPGMA にプロシージャーのポインターを渡してやり、

PGMA や PGMB に戻ってからプロシージャーを実行するのではなくSRVPGMA の中で

親プログラムのプロシージャーを呼び出すように記述することができる。

つまり SRVPGMA のプロシージャーを呼び出すときに

CALLP  CHILD(SHCODE:%PADDR('MYPRINT')

のようにして親PGM の MYPRINT というプロシージャーのポインターも渡してやる。

子*SRVPGM では MYFILE を SHOCDE を使ってアクセスした後で

CALLB  PROC

のようにして、親PGM のプロシージャーを子自身が実行することができるのである。

さて、このような処理にどのような利点があるのであろう?

読者は処理を複雑にしているだけのように思われるかも知れない。

この処理の意味は MVS である処理の分離である。

親PGM はユーザー・インター・フェースの部分しか行っていない。

これに対して子SRVPGM はデータ・アクセスの部分しか行っていない。

さらにはプロシージャーを直接、呼ぶよりは繰り返し処理となるとポインタによる操作のほうが

パフォーマンスが向上する利点もある。

不明な名前のプロシージャーを動的に実行できる汎用性を備えたいのであれば%PADDR

使用が必要となる。