フリーフォームRPGで「プログラム記述」レポート印刷プログラムにトライ! ~連載|RPG Ⅳの魅力と可能性◎第9回

フリーフォームになると
今までできたことができなくなる?

 RPGⅣの魅力を紹介する本連載が始まって2年が経とうとしています。月日の移り変わりはほんとうに速く、この2年間でフリーフォームRPGへの関心が高まり、関連のセミナーは大変な盛況になっているようです。アイ・ラーニングでも「RPGⅢプログラマーのためのフリーフォーマットRPG」を新規コースとして立ち上げました。今後は、RPGⅢプログラマーだけでなくプログラミングの初心者向けにも、フリーフォームRPGのコースを立ち上げていきたいと考えています。どうぞご期待ください。

 今回もフリーフォームRPGについてですが、すごく役に立つ話、ではなく、ちょっとした箸休めのような、こういうこともできる、というお話です。というのも、フリーフォームRPGになって「今までできたことができなくなる」という不安を、多くの方がおもちではないかと思うからです。

 完全フリーフォームでは、制御仕様書、ファイル仕様書、定義仕様書、演算仕様書がフリーフォームに対応しました。入力仕様書、出力仕様書が含まれていないということは、プログラム記述の印刷装置ファイル(よく使われるのがQPRINT)が使えないことを意味しています。しかしプログラム記述の印刷装置ファイルは、出力仕様書を使わずともコーディングが可能です。フリーフォームRPGにおける「プログラム記述」レポート印刷を、順を追って紹介していきます。

 

出力仕様書を使わない
レポート印刷の記述

 まず制御仕様書に該当するCTL-OPTステートメントは、DATEDITキーワードで日付の形式を指定します。*YMDは年月日形式です。今回は、データベースへのアクセスはSQLを使わず、全手順とします。

 ファイル仕様書に該当するDCL-FステートメントのデフォルトではUSAGE(*INPUT)、DISK(*EXT)になり、読み取り専用、外部記述DISKファイルになります。QPRINTはPRINTERキーワードにレコード長を指定すればプログラム記述ファイルとなり、自動的にUSAGE(*OUTPUT)になります(図表1)

 

 印刷装置ファイルには、オーバーフロー標識をOFLINDで指定できます。ただし、QPRINTなどのプログラム記述印刷装置ファイルに*INOFが使えません。外部記述印刷装置ファイル同様、*IN01から*IN99までの標識を指定します。図表1の例ではOFLINDキーワードでオーバーフロー標識に*IN80を使っています。

 そして印刷行のレイアウトは、デーや構造を使って定義します。イメージとしてはCOBOLのDATA DIVISIONで定義する集団項目と同じ、と考えてよいでしょう。印刷行を132文字とした場合、変数、固定情報、その間にある空白もすべてフィールド定義し、ページタイトル行、見出し行、明細行を構成します。まずページタイトル行のデータ構造は図表2のようになります。

データ構造の開始・終了、見出しの印字

 データ構造の開始はDCL-DS、終了はEND-DSです。サブフィールドには、フィールド名、属性を指定します。INZキーワードは省略時の値を指定するもので、これを固定情報に使用します。DCL-Cで名前付き固定情報を使ったほうが理にかなっているようにも思えますが、ここは文字変数にINZを使ったほうが便利なようです。CHAR(20)で20バイトの文字フィールドでも、シングルクォーテーションで囲った文字が8文字の時には左寄せで文字が代入され、残った12バイトは空白に初期化され、表示位置の調整には便利です。

 次にページタイトルの下に印字される見出し行です(図表3)。

 フィールド名はすべてFILLERXXにしています。この名前だと、先にページタイトル行でも同じ名前を使って重複してしまいますが、これを解決するのがページタイトル行でも使われていたQUALIFIEDキーワードです。

 QUALIFIEDキーワードは、ファイルまたはデータ構造上のサブフィールドを使用する際に、ファイル名やデータ構造名を修飾名にします。この例では、FILLER01は、「HED02_DS. FILLER01」という形で表現します。これによって各データ構造で同じ名前があっても、一意のフィールド名とみなされます。固定情報に使うフィールド名をすべてのデータ構造で、FILLER01、FILLER02……という形に統一化すると便利です。

 明細行は、RPG Ⅳでは定義仕様書でLIKEキーワードを使い、定義済みフィールドの属性をコピーしてフィールドを定義できます(図表4)。これは外部記述の印刷装置ファイルをDDSでコーディングする際のREFFLDキーワードに該当します。また、//はコメントを記述する際に使用します。ステートメントの後でも、また行のすべてをコメントだけで記述することも可能で、そういう意味ではCLプログラムのコメントの記入の仕方に似ています。

改ページ、改行の制御

 さて、問題は改ページ、改行制御です。データ構造は、変数と固定情報の集合体で、出力仕様書と違って改ページや改行を制御する情報はもっていません。

 ここで登場するのがRPGⅢプログラマーもご存じのPRTCTLです。すでにお気づきの方もいると思いますが、図表1のDCL-FでQPRINTの指定にPRTCTLキーワードがあります。このPRTCTLキーワードで指定されたデータ構造LINE_DSが図表5になります。

 

 このデータ構造を使って改行、改ページの制御を行います。PRTCTLデータ構造は15バイトで、1バイト目から順番に、前スペース(文字3バイト)、後スペース(文字3バイト)、前スキップ(文字3バイト)、後スキップ(文字3バイト)、印刷行数(数字3バイト)となります。1〜12桁目までは、RPG Ⅳ出力仕様書の40〜51桁目とまったく同じ構造です。たとえば前スキップで3行目に印刷したい場合はデータ構造の7〜9バイトに‘003’を代入し、印刷装置ファイルにWRITE命令を発行します。13〜15桁の印刷行数には印字中の行数が自動的に更新して入りますが、今回は使用しません。

 

演算仕様書についての記述

 それでは、いよいよ演算仕様書についての記述です。最初のメイン・ルーチンは、RPGプログラマーであれば違和感なく読めると思います。%EOF関数は、従来の結果の標識に代わって使用される関数で、READ命令がEOF(ファイルの終わり)を受け取った時に真になります(図表6)。

 

 そして見出し印字サブルーチン(@HEAD)、明細印字サブルーチン(@DTL)が図表7になります。

 

 印刷にはWRITE命令を使用します。WRITE命令の1番目の引数にファイル名、2番目の引数にはデータ構造を指定します。このデータ構造が、それぞれページタイトル行(HED01_DS)、見出し行(HED02_DS)、明細行(DTL01_DS)、になり、WRITE命令実行時に印字したい情報が記述されたデータ構造名をQRPINTの次に指定すればよいだけです。これもCOBOLのWRITE命令と同じやり方です。もちろんWRITEの前に、各行のフィールドには必要な情報をセットしておく必要があります。

 数字変数は、%EDITC関数を使って編集し、文字変数に代入します。このページタイトル行では、日付とページ数は演算仕様書上で%EDITC関数を使って代入されています。ここで注意しなければならないのは、オーバーフロー標識に使った*IN80で、あふれ行に達した時は自動的にオンになりますが、*INOFなどの予約語標識と違い、改ページ時に自動的にオフになってくれません。したがってSETOFF命令などでこの*IN80をオフにしなければなりません。

 また、予約語のPAGEもQPRINTと関連付けができませんので自動的にカウントアップしません。ここではPAGE_COUNTというフィールドをページ数に使い、改ページ時にはカウントアップしています。

 いかがでしょうか。データ構造とPRTCTL制御を理解していれば、フリーフォームRPGでもプログラム記述の印刷プログラムがコーディングできます。とはいえ、これは「こんなこともできる」という一例です。どちらかと言うと、従来のRPGというよりもCOBOLのようなスタイルになってしまった観もありますが、レポート印刷プログラムをコーディングしやすいというRPG本来のコンセプトはなくなっていません。書き方によっては従来のRPGのように、また書き方によってはJavaやCのように、いろいろなスタイルに変化し、対応できるのがフリーフォームRPGであると言えるでしょう。

 

 

著者|中村 潤 氏

株式会社アイ・ラーニング
IT研修本部 IBM製品研修部
ラーニング・アドバイザー

[i Magazine 2016年2月号掲載]

・・・・・・・・

◎ 連載|RPG Ⅳの魅力と可能性 目次