7.4で提供されるRPGの新機能
すでにご存知のこととは思いますが、IBMは先日、IBM iのバージョン7.4を発表しました。Db2 Mirrorのような大きな機能強化とともに、新たなRPG機能も数多く提供されています。この記事では、PTFを通じて7.3ですでに利用可能になっている機能について説明します。7.4でのみ提供される機能強化については、今後の記事で取り上げる予定です。
7.3の機能の説明に入る前に、7.4で導入される機能強化について簡単に触れておきます。7.4では、IBMで可変次元配列として知られる、長く待ち望まれていた動的配列が導入されます。メモリー使用量と安全性の間での妥協は必要なくなります。その他にも、これによって容易に行えるようになることが多数あります。ところが、素晴らしい機能ではあるものの、サポートするために必要となる変更が複雑であることから、この機能は7.3にPTFで提供される予定はありません。そのため、大半のユーザーは、1~3か月間はその機能を利用できません。そのようなわけで、この最初の記事では、7.3ですでに利用できるRPGの機能強化について説明することとし、配列の機能強化については今後の記事で取り上げることとします。
PSDSのアップデート
RPGでは、PSDSに2つの新たなフィールドが追加されました。この機能は7.2リリースでも利用可能です。利用することが多いと思われるものは、8文字の「システム名」で、396~403桁目に位置します。もうひとつは16バイトの「内部ジョブID」で、380~395桁目に位置します。このIDは、特にソケット通信やジョブのスプール ファイル情報の取得で使用されます。以前は、このIDを取得する最も簡単な方法は、QUSRJOBI APIを呼び出すことでした。PSDSですぐにアクセスできることで、はるかに取得しやすくなるのは明らかです。以下に例を示します。
// Internal job ID, in positions 380 to 395
// System name, in positions 396 - 403
Dcl-Ds PSDS;
jobId Char(16) Pos(380);
systemName Char(8) Pos(396);
End-Ds;
新しいSAMEPOSキーワード
一見、シンプルに見えますが、SAMEPOSキーワードには非常に多くの潜在的な用途があります。ほとんどの場合、以前はできなかったことを行うわけではありませんが、より簡単で分かりやすく行えるようになります。まずは、OVERLAYキーワードとざっと比較してみましょう。
以下の2つの構造を見てください。どちらのケースでも、それぞれ別個の日、月、および年のフィールドが、1つの日付フィールドにグループ化されます。1つ目のケースでは、最初に日付フィールドが定義され、コンポーネントとなるフィールドは、日付フィールドをオーバーレイするように指定されます。問題なく動作はしますが、不体裁に見えます。
Dcl-DS overlayDS;
orderDate char(8);
orderDay zoned(2) Overlay( orderDate );
orderMonth zoned(2) Overlay( orderDate: *Next );
orderYear zoned(4) Overlay( orderDate: *Next );
End-Ds;
Dcl-DS samePosDS;
orderDay zoned(2);
orderMonth zoned(2);
orderYear zoned(4);
// Overlay day, month and year as single field
orderDate char(8) SamePos(orderDay);
End-Ds;
2つ目のケースでは、コンポーネントとなるフィールドが最初に指定され、結合される日付フィールドは、SAMEPOSを使用してorderDayフィールドと同じ位置で始まることが指定されます。2つ目の方がずっと簡潔だとご賛同いただけるのではないでしょうか。
これらのサンプルが示しているように、OVERLAYとSAMEPOSとの主な違いは、OVERLAYでは、定義されるフィールドは、参照される親フィールド内に完全に含まれる必要があるという点です。SAMEPOSでは、定義されるフィールドは、参照されるフィールドと「同じ位置から始まる」というだけです。つまり、SAMEPOSは、絶対位置ではなくフィールド名を指定する、POSキーワードの「ソフト」バージョンということです。そして、ハードコーディングの回避に役立つものであるのなら、それは何でも良いものです。
実際にSAMEPOSが真価を発揮するのは、外部記述データ構造で使用されるときです。たとえば、上の例で、それぞれ別個の日、月、および年のフィールドがデータベースにあるとします。その場合でも、以下のように、SAMEPOSを使用してorderDateフィールドを作成することができます。
Dcl-Ds orderData Ext;
orderDate Char(8) SamePos(orderDay);
End-Ds;
同じような方法で、SAMEPOSを使用して一連のフィールドにわたる配列を作成することもできます。小誌の読者のデータベースが、完全に正規化されていないデータベースだというわけではありませんが、念のため . . . 。
表に、曜日別の売上の数量および価格のフィールドがあるとします。つまり、MONQUANTITY、MONVALUE、TUEQUANTITY、TUEVALUEから、SUNVALUEまでのフィールドです。SAMEPOSを使用して、以下のように、メインのDS内にDS配列を作成することができます。
Dcl-Ds dailySales Ext Qualified;
Dcl-Ds daySales Dim(7) SamePos(MONQUANTITY);
quantity Like(MONQUANTITY);
value Like(MONVALUE);
End-Ds;
/End-Ds;
これで、各曜日の日別の数量および価格のフィールドが、配列要素としてアクセスできるようになります。
もうひとつ、ぱっと頭に浮かんだ使用法は、マルチフォーマット データの処理への適用に関するものです。すなわち、レコードの固定部分(おそらく、顧客番号およびオーダー番号や、レコードID、ヘッダー、詳細、合計など)があるケースです。これは、パンチ カードや磁気テープとともに過去に置いてきたスタイルのデータ定義だと思われるかもしれませんが、引き続き使用されています。特に、最近ではEDIデータで目にすることがあります。
SAMEPOSを使用することで、データを適切に定義されたレイアウトへコピーする方法や、ポインターを使用して同じデータに異なるレイアウトへマッピングする方法に比べて、このような定義をはるかに簡潔にすることができます。基本的には、以下のような形になります。
Dcl-Ds Record Qualified;
RecordType Char(1);
// Additional common data such as customer Id
Dcl-Ds HeaderInfo;
// Definitions for header layout
End-Ds;
Dcl-Ds DetailInfo SamePos(HeaderInfo);
// Definitions for detail layout
End-Ds;
Dcl-Ds TotalInfo SamePos(HeaderInfo);
// Definitions for total layout
End-Ds;
End-Ds;
まとめ
ご覧のように、この新たなサポートによって行えるようになることは多数あります。必要となるPTF番号についての詳細は、RPG Cafeでご覧になれます。リンクは、ibm.biz/rpg_samepos_keywordおよびibm.biz/rpg_psds_int_job_sys_nameです。
次回の記事では、新たな配列サポートについて取り上げます。