[解説10]
RRN01は任意に命名できる、極めて特殊なフィールドです。サブファイルを処理する場合は、必ずここに指定します。面白いことに、DDS内ではこれに対応するキーワードも標識も存在しません。RRNとはRelative Record Numberのアクロニム(頭字語)です。何のレコード番号かというと、そうです、サブファイル(DDS上の名前はSFL01)です。ここに、数字を入れて書き出せば、そのレコード番号のレコードが書き出されます。レコードをREADC,CHAINでゲットすれば、ここにレコード番号が勝手に入ります。まるで、到着順の物理ファイルにRRNで処理をしているようですね。確かにそっくりですが、あくまで書き出されたレコードはメモリに保持されて、実際にファイルに書き出すのはプログラマーが、そうのようにコーディングしなくてはなりません。また、サブファイルに指定できるレコード処理命令は、WRITE,UPDAT,CHAINとREADCだけです。SETLL,SETGT,READP,REDPEは使用できません。(DELETは使ったことが無いのですが、使えないと思います。READ,EXFMTはサブファイルコントロールレコードに対してのみ有効です。

[解説20]
AID用です。

[解説30] AID用です。

[解説40]
F仕様書のINFDSはここで、フィールドとしてプログラムに取り込まれます。ODPの内容が取り込まれます。

[解説50]
ここは、特殊なDSで、「勝手に」プログラム名やジョブ名やユーザー名が取り込まれます。

[解説60]
レコードの表示開始位置が入力されると、ここで、最初の処理へ戻ります。

[解説70]
READC命令は、RRNが0;つまり、レコードなしだとプログラムエラーを起こします。

[解説80]
RRNの定義はプログラム内で行います。DDS内ではありません。4桁までです。 レコード件数は、9999までです。これを越えると、エラーになります。注意して下さいね。これを切り抜けるためには、工夫が必要です。

[解説90]
画面上部のオプション項目の表示を制御しています。

[解説100]
DDSソースを見るとわかりますが、SFLCTLのレコード様式の中に、標識62でSFLCLRが指定されています。このCTL01はSFLCTL(SFL01)とキーワードで指定されているので、このCTL01に対するすべての命令はSFL01にも及びます。この標識をONにして、SFLCTLをWRITEすれば、サブファイルは、消去されます。SFLDLTとSFLCLRは、DLTFとCLRPFMに各々対応します。通常の適用業務の作成でSFLDLTを使うことは希です。サブファイルの数の制限を超える場合、不要なサブファイルを削除する場合に使うのがSFLDLTです。多分ODPの再作成を招くので、SFLCLRが望ましいものとなります。

[解説110]
ここでは、パターン1ですので、レコード全件をサブファイルにロードします。標識63は、右下にでるメッセージ「続く..」や「終わり」というメッセージを出す役目をしています。

[解説120]
ここで、F仕様書に定義した、RRNをカウントアップして、1レコードを書き出します。

[解説130]
H1SRCDは、DDSのSFLRCDNBRというキーワードと結びついています。ここに含まれた数字と同じ相対レコード番号(Relative Record Number;RRN)を含むページが表示されます。ここでは、RRN=1のレコードを含むページを最初に表示しようとしています。また、このキーワードがSFLRCDNBR(CURSOR)と指定されていると、カーソルは、そのレコードに位置づけされます。注意してほしいのは、このフィールドにセットできるの数字が、

1≦ H1SRCD ≦サブファイルレコードの最大のRRN

となることです。H1SRCDに0が入っていると、エラーになります。ここに入っている数字のRRNが表示されるのですから、当然ですね。尚、フィールドがHで始まるのは、Hidden(隠し)フィールドを意味しています。(単純なネーミングルールを私なりに作っただけです。フィールド名は、何でもいいのです。)

[解説140]
ここは、単に、画面上部のオプション内容をどれにするか出しているだけです。

[解説150]
標識61はSFLCTL内で、SFLDSPCTLと結びついています。これがONならば、SFLCTLのレコードを表示します。サブファイルレコードが無くて表示しようとしてもエラーにはなりません。あくまでこれはCTLの方です。

[解説160]
標識60は、SFLCTL内で、キーワードSFLDSPと結びついています。これがONならば、SFLレコードを表示します。サブファイルレコードが無いのにONにすると、プログラムエラーになります。(こんな風に、プログラムと画面ファイルは、DDSでキーワードと結びつけられた標識や特殊フィールド(DDSに無い特殊ないフィールドはRRN;RPGのF仕様書で定義される)とやり取りすることで、画面を制御します。プログラムと画面ファイルが、このような標識やフィールドでやり取りする姿を頭の中でイメージしてみて下さい。)

[解説170]
これは、メッセージがあるならその内容を表示フィールドにセットする、というだけで、サブファイルとは関係ありません。

[解説180]
DDSで、CTL01はキーワードでSFLCTL(SFL01)として、サブファイルSFL01と結びついていますので、CTL01を表示すれば、SFL01も出てきます。この時、標識61がオンならばCTL01は表示され、標識60がオンならばSFL01も出てきます。

[解説190]
このEXFMTで、CTL01のレコード内容が取り込まれます。サブファイルレコードは、この後、CHAINもしくは、READC命令で取り込まれます。(タイミングは違いますが、この命令のあとで、CTL01もSFL01も取り込めます。)また、WRITE CTL01 + READ CTL01(標識必須)も可能です。

[解説200]
SFLDSPCTLやSFLDSPはここでオフにしておきます。SFLCLRのときにオンだとおかしなことになるので、この標識制御の標識が不用になったこの時点でオフにしてしまいます。

[解説210]
ここは、ロールアップを押して、5ページ目を表示してから、実行キーを押して、H1SRCD=1のままでは、また、第一ページを表示しないようにしています。DSRRNはINFODSのフィールドで、実行キーを押されたときの、そのページの先頭のRRNを返してきます。これを利用しています。本来は、SFLCSRRRNを使いたいところですが、これはパターン2やパターン3で説明します。

[解説220]
CHAINまたは、READCでレコードを取り出します。CHAINはサブファイル全件を読み込みます。(DOループで、片っ端からCHAINをいしていく)READCはOSが変更のあったレコードを管理していて、変更レコードのみ返していきます。変更レコードがなくなると、EOFの標識がオンになります。これも、通常のファイル操作に似ています。しかし、このREADCはサブファイルに対してのみ有効(READC = READ CHANGED RECORD)で反対にSETLLやREADはサブファイルには使えません。また、READCは順次にレコードを取り出すので、途中でCHAIN命令を入れると、あたかも、ファイルカーソルの位置がずれたのと同じことになります。READCとCHAIN命令は混在して使用しない方が無難です。

[解説230]
DDS内のキーワードSFLNXTCHGは、READCで一度読み込んだ後、OSが管理する変更フラグがオフになっても、再び読み込めるようにするキーワードです。このキーワードは、CHAINでは関係ありません。別に簡単な説明がありますので、そちらも見て下さい。これは重要なキーワードです。例えば、1回目のREADCのループで内容検査をして、2回目のREADCのループで、レコードを書き出そうとしても、SFLNXTCHGがOFFだと、2回目は一つもヒットしませんので、レコードを書き出せない、という状況になります。これを解決するのが、キーワードSFLNXTCHGです。但し、気を付けねばならないのは、ファイル上のレコードを読み込んで、表示して、レコードを修正して、いったんファイル上のレコードを全件デリートしてから、サブファイル上のレコードを書き出す場合です。これが、できるのは、パターン1のみで、パターン2やパターン3ではできません。(パターン3など1ページ分しかレコードを書き出せません。)さらに、パターン1でも、READCでは、変更分のレコードのみ書き出してしまいますので、あたかも、変更の無いレコードが削除されてしまうのと同じ結果にないります。この場合はCHAIN命令 を使います。

(例)CHAINの場合 maxrrnはプログラム内で、最大RRN番号をとっておく。

                B001 C           1         DO   maxrrn    RRN01            :
                 001 C           RRN01     CHAINSFL01                95    :
                B002 C           *IN95     IFEQ *ON                        :
                 002 C                     LEAVE                           :
                +002 C                     ELSE                            :
                 002 C                     ....                            :
                E002 C                     END                             :
                E001 C                     END   

[解説240]
ここの更新は、フィールドS1OPTをブランクにするのと、SFLNXTCHGの標識をサブファイルに埋め込むのと、両方の目的を持っています。

[解説250]
指定されたレコードを次のSFL01の表示で、画面に最初に表示できるように、H1SRCDに処理予定のRRN01をセットします。

[解説260]
オプションの処理へ。

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送