RPG

158. サービス・プログラム識別を明示的な名前で

CRTSRVPGM で サービス・プログラムを作成するときに識別子( SIGNATURE ) を
読者はどのように扱われているのだろうか ?
例えば

    STRPGMEXP PGMLVL(*CURRENT) SIGNATURE(*GEN)

のような SIGNATURE( *GEN ) となる記述が省略値であるが
このままで CRTSRVPGM を行うと 識別子( SIGNATURE )は、 *GEN の指定として
毎回、記号が自動生成される。
上位でこのサービス・プログラムを使用しているプログラム(*PGM) は
この識別子( SIGNATURE )を参照しているのでサービス・プログラムを再コンパイルすると
識別子( SIGNATURE )も *GEN によって変更されてしまうので
上位のプログラムも再コンパイルしなければ実行時にエラーとなってしまう。
これはサービス・プログラムの本来の使用として不便であるので
一般には初めてサービス・プログラムをコンパイルしたときには
DSPSRVPGM によって、そのサービス・プログラムの識別子( SIGNATURE )を調べてから

    STRPGMEXP  PGMLVL(*CURRENT) +             
          SIGNATURE(X'0D04F40990F788CF0BFC092452F9BAF4')

のようにバインダー・ソース(QSRVSRC)のソースを明示的な値に変更してから
サービス・プログラム をもう一度、再コンパイルしてやればよい。
これ以降では サービス・プログラムを何度、コンパイルしても 識別子( SIGNATURE )の
値は変更されないのでサービス・プログラムの再コンパイルによる上位のプログラムの
再コンパイルは全く必要ではなくなる。
EnterpriseServer のように製品を「RPGエンジン」として サービス・プログラムを
提供する場合もこの手法が使用されている。
PTF として再コンパイルされた 「RPGエンジン」を何度、提供しても
ユーザー・プログラムの再コンパイルは全く必要とはならない。
( 他社製品ではリリース・アップの都度、すべてのユーザー・プログラムの
再コンパイルが必要となるものもある !? )

さてユーザーが サービス・プログラムを開発するような場合において
識別子( SIGNATURE ) を毎回、コピーするのも面倒かも知れない。
そのような場合では始めから 識別子( SIGNATURE )を好みの名前にしておくことも
実はできるのである。
例えば、

    STRPGMEXP  PGMLVL(*CURRENT) SIGNATURE('GETAIRPORT') 

としても良いのである。
この手法は珍しいものではなく米国では良く使用されている方法でもある。