通常であれば必要になることはまず無いですが、DFSORTを使えば可変長レコードのデータセットのRDWを再フォーマットすることもできます。スパンド形式ではない可変長レコードのRDWはレコード長のフィールドと予約フィールドで構成されますが、何らかの理由で予約フィールドがマニュアルで規定されるx0000になっていないような場合にはDFSORTでコピーし直せば簡単にRDWを再作成できます。
1 2 3 4 5 6 7 8 9 |
//PSCOPY EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DISP=SHR,DSN=input ps-dataset //SORTOUT DD DISP=(,CATLG),DSN=output ps-dataset,LIKE=input ps-dataset //SYSIN DD * OPTION COPY /* REFORMAT RDW */ INREC FIELDS=(1,4,5) // // |
INRECステートメントを指定することがポイントです。OPTION COPYステートメントだけでもコピーされますが、RDWも入力データセットのオリジナルの内容のままコピーされてしまいます。INRECのFIELDSで指定している(1,4,5)は、1バイト目(先頭バイト)から4バイト分がRDW、5バイト目から残り全部をコピーするという指示です。(可変長なので具体的なバイト数は指定できないから開始位置だけを指定している)
知人から相談を受けて見つけたものです。RDWの予約フィールドはマニュアルではx0000にするよう規定されてますが、実際はどんな値になっていようが関係なくデータセットにアクセスできます。ISPFで見ることもできるしIBMの各種ユーティリティーでなら処理することもできますが、RDWの形式の妥当性をチェックしているソフトがあって予約フィールド部分を修正する必要に迫られたようです。
DFSORTでコピーする以外にもGENERで一旦RECFM=VBSのデータセットにコピーしてからRECFM=VBのデータセットにコピーし直す方法もありますが、その場合は出力側VBSのBLKSIZEを入力側VBの最小レコード長(LRECLではなくデータセット内の実際のレコードの長さで)より短くしないと、入力側のRDWがSDWに変換されずそのままコピーされてしまいます。VBSはブロック長を超える可変長レコードを格納するデータセットですが、必要ならば1つのレコードを複数のブロックに分割するため、RDWはSDWとなり元のRDWの予約フィールド部分はセグメント種別を示すビット・フィールドとして使われるので再構成されます。それを元のVB形式のデータセットに再コピーすればSDWが再びRDWに変換されるため、RDWの予約フィールド部分も標準のx0000で設定されます。しかしこの方法は、仮作成するVBSデータセットが事実上の非ブロック化データセットになるため実行時間が長大になること、LRECLの値ではなく実際のレコードの長さを調べなければならない等かなり面倒です。無理矢理GENERでコピーする位なら、RDWを再作成してコピーするプログラムを作る方が早いでしょう。
可変長レコードのデータセットを作る際にRDWの予約フィールド部分をx0000にせず変な値を入れてしまっても、データセット自体にはアクセスできるので恐らく気付かないままになるのが殆どですからRDWの再作成を行うことなどまず無いと思いますが、DFSORTユーティリティーではこんなこともできる、ということで紹介したものです。(他にも意外な機能があったりするかも知れません)