Hスペック・コピーブックでRPGデフォルトをセットアップする
IBM は RPG の下位互換性を保つために多大な努力をしています。このプラットフォームの最も大きな強みでもありますが、最も大きな弱みでもあります。優れた機能が RPG にしばしば追加されますが、デフォルトでは無効にされています。互換性を失うからです。それらを有効にするには、キーワードを H スペックに追加する必要があります。
そのため、自分の H スペックにコピーブックを作成し、すべての新しいプログラムでそのコピーブックを使用するのが便利だとわかりました。以下に H スペック・キーワードをいくつか提案しています。
OPTION(*SRCSTMT):
このオプションを指定しないと、RPG はコードのコンパイル時に新しいステートメント番号を生成します。プログラムでエラーが発生すると、「Error occurred at line 123.」というメッセージが表示されます。123 はソース・コードのステートメントではなく、再番号付けされた行番号であるため、エラーがどこにあるのか確認するにはコンパイル・リストが必要です。OPTION(*SRCSTMT) を指定すると、エラー・メッセージはソース・コードと同じ行番号を使用します。
OPTION(*NODEBUGIO):
このオプションを指定しないと、たとえファイルが外部定義されていても、RPG コンパイラーは各ファイルの入力仕様で各フィールドのデバッグ手順を生成します。デバッグでコードを、手順を追って見てゆく場合、入力仕様のすみずみまで個別に手順を追う必要があり、非常に面倒なことになります。OPTION(*NODEBUGIO) を指定すれば、デバッガーは入力仕様や出力仕様で停止することはありません。
EXTBININT(*YES):
このオプションを指定しないと、外部定義ファイルの 2 進整数は RPG でデータ型 B に変換されます。RPG のデータ型 B は、計算のため一時的に整数をパック 10 進数フィールドに変換し、保存時に元に変換するという奇妙な動物のような存在です。ネイティブ整数サポートより遅く、整数でサポートされるような全範囲はサポートしません。DDS と SQL 両方が全整数範囲をサポートしていても、RPG はそれを全整数範囲をサポートしないフィールドに変換します。EXTBININT(*YES) を有効にすると、真の整数フィールドが使用され、パフォーマンスの向上とより多くの値のサポートが実現します。これこそ、すべての人にとってデフォルトでなければならないでしょう、絶対に!
DFTACTGRP(*NO):
このオプションを指定しないと、デフォルト値では RPG プログラムは OPM 互換モードになります。それらはデフォルトの活動化グループで動作するだけでなく、OPM プログラムのような働きをし、ILE 機能を使用して、プログラムを頻繁に使用不能化することがなくなります。DFTACTGRP(*NO) は、RPG コードを真の ILE プログラムにして、パフォーマンスを向上させ、ILE 機能を使用したいときにそれらの機能へのアクセスできるようにすることでこの問題を解決します。
BNDDIR('MAIN':'QC2LE'):
このオプションを指定しないと、CRTPGM、CRTSRVPGM、または CRTBNDxxx コマンドで起動される ILE バインド・プログラムは、コマンドまたは System API Binding Directory (QUSAPIBD) で明示的にリストしているモジュール、またはサービス・プログラムのサブプロシージャーのみを検索します。このオプションを指定すると、さらに検索するバインディング・ディレクトリーを指定できます。私のショップでは、MAIN というバンディング・ディレクトリーがあり、サービス・プログラムはすべてそこに保存しています。BNDDIR('MAIN') を指定すると、サブプロシージャーとして利用できるツールをシステムが自動的に検索するため、より簡単にプログラムを作成できるようになります。QC2LE バインディング・ディレクトリーには多数の便利な IBM 提供ツールが入っています。IBM i 6.1 からは、自動的に検索されるため、QC2LE をここで指定する必要はありません。
注:
バインディング・ディレクトリーをアプリケーションに追加しても、プログラムのサイズが増えたり、バインディング・ディレクトリーのすべてのサービス・プログラムにバインドされるわけではありません。むしろ、バインディング・ディレクトリーは、欠けているサブプロシージャーを見つけるために使用されます。サブプロシージャーを呼び出しても、コードで見つからない場合、要求されたプロシージャーを含むサービス・プログラムが見つかるまで、バインディング・ディレクトリーが検索されます。必要なプロシージャーを提供するサービス・プログラムまたはモジュールは実際は、使用しているプログラムにバインドされます。
目的の H スペック・キーワードを提供するコピーブックを作成することをお勧めします。そのコピーブック中のコードの例を次に示します。
H OPTION(*SRCSTMT:*NODEBUGIO) EXTBININT(*YES)
H BNDDIR('MAIN': 'QC2LE')
/if defined(*CRTBNDRPG)
H DFTACTGRP(*NO)
/endif
DFTACTGRP オプションは CRTBNDRPG コマンド (または、影でCRTBNDRPG を起動するCRTSQLRPGI) でのみ使用できます。CRTRPGMOD コマンドで DFTACTGRP を指定しようとすると、エラーになります。CRTBNDRPG コマンドを使用しない場合、/if defined(*CRTBNDRPG) ロジックでは DFTACTGRP オプションは必要ありません。
例があるので、先行している H スペックをコピーブックに配置し、メンバー DFTHSPEC の名前をつけることにしましょう。RPG アプリケーションからコピーブックを使用するには、コードのこの行を先頭に配置します。
H/copy DFTHSPEC
このオプションを指定すると、デフォルト値はより理にかなった形式でセットアップされます。アプリケーションでさらに H スペックを指定する必要がある場合でも問題ありません。それらは以降の行で指定できます。
H/copy DFTHSPEC
H ACTGRP(*CALLER) NOMAIN
RPG はコピーブックとその下のコード両方からすべての H スペックを使用して、必要なオプションをセットアップします。これらのオプションは、現在のコードに合ったデフォルト値を指定します。