さらに、自動化出来ました。
まず、Y2KCTLPというファイルを作成しました。
A C1REFD 1 COLHDG('REFERED')
A C1SEQ 5S 0 COLHDG('SEQ')
A C1FILE 10 COLHDG('対象ファイル名')
A*
A C1WRKF 10 COLHDG('作業ファイル名')
A C1LIB 10 COLHDG('FILEライブラリー名')
A C1SCRL 10 COLHDG('新ファイルDDS LIB')
A*
A C1PGM 10 COLHDG('変換PGM名')
A C1PGML 10 COLHDG('変換PGM LIB名')
A C1PSRC 10 COLHDG('変換PGM SRC MBR名')
A C1PSRL 10 COLHDG('変換PGM S.LIB名')
A DFT('Y2KSRC')
A C1HOLD 1 COLHDG('HOLD FLAG')
A*
A C1PIC 10 COLHDG('担当')
その後、このファイルに変換対象のファイル名や、条件を追加。この追加もプログラムでするようにして、なるべく手軽にしました。
このファイルを読みながら、(&C1PIC='KAKEFUDA'だけ)
DSPDBRのAPIで、ライブラリーUSRSPCに、対象ファイルの従属論理ファイル情報をもつ、ユーザスペースをセットする。
そのユーザースペースの名前は、対象ファイルと同じ名前にする。もし、その名前のユーザースペースがすでに存在していたら、なにもしない。これは、このシーケンスの中で、論理ファイルを削除しているためで、リトライすると、論理ファイルなしのデータがユーザースペースに出来てしまうからです。(このユーザースペースは、ずーっとはとっておけません。なぜなら、異なるライブラリーの、同一ファイルがあるからです。同じファイル名=同じユーザースペース名で違う内容になるのです。過去のヒストリーファイルなどが、該当します。※実は悩んでいます。この変換のシーケンスをパラレルに実行したかったのです。どうしようかなぁ。ユーザースペースをファイルが登録されたライブラリーに作ろうかなぁ。)
旧レイアウトのファイルをリネームする。
RNMOBJ を利用します。名前は上記ファイル内の&C1WRKFに変更されます。ここは、リトライの時は、元の名前に、マニュアルで戻します。
旧レイアウトに従属する論理ファイルを削除する。
これは、先ほど作成したユーザースペース
の内容を、CLPで、取り出しながら、DLTFをしてゆきます。APIコーナーに掲げた、DSPDBRのAPIを、ユーザースペース作成と、ユーザースペース読みとりに、分解しての利用です。(外部サブルーチンとしています。パラメータで、このDLTFと、後のCRTLFに動きが変わります。)また、早めに削除するのは、ディスクスペースの圧迫を緩和したい(この後、物理データはディスクの上で、倍になる)
新レイアウトの作成。
CRTPF &C1LIB/&C1FILE &C1SCRL/QDDSSRC SIZE(*NOMAX)。ほんとは、*NOMAXは望ましくないのですが、時間があれば、このあたりのパラメータも、上記Y2KCTLPに含めようと思います。とにかく、今は、テストしたいのです。それから、FORMAT()やREF()は、当然参照されるファイルが先に出来ていなくては、ならないので、Y2KCTLPのC1REFDで順番を細工しています。(尚、メンバーは、この後でADDPFMするので、この時点では追加しません。)
変換プログラムの作成
CRTRPGPGM &C1PGML/&C1PGM &C1PSRL/&C1PSRC
。これは、予め準備された、プログラムです。作業ファイルが9文字以上になってしまった場合は、OVRDBFを、CRTRPGPGMの前にします。(この変換プログラムは、事前に変換結果が正しいか、十分テストをしてあることが前提です。)
変換作業の開始。
ここでは、APIのメンバーリスト取り出し(CLP)を使い、&C1WRKF(旧ファイル)のメンバー一つに対して、以下を繰り返す。
- もし、メンバー件数が2個以上ならば、CHGPF &C1LIB/&C1FILE
MAXMBR(*NOMAX)
- ADDPFM &C1LIB/&C1FILE MBR(&MBRNAME) TEXT(&MBRTEXT)
- OVRDBF &C1WRKF &C1LIB/&C1WRKF MBR(&MBRNAME)
- OVRDBF &C1FILE &C1LIB/&C1FILE MBR(&MBRNAME)
- CALL &C1PGML/&C1PGM
- DLTOVR (&C1WRKF &C1FILE)
- 転送元と転送先の件数が一致したか確認する。違えばエラーを出して、論理ファイルを作成しないで、エラー終了。
DDSの修正開始
さて、このプログラムもできて、DDSの修正に取りかかりました。最初は、すべての物理ファイルのDDSを修正します。その次に、RPGの修正ですが、サブシステム単位に、あるランク付け(たぶん難易度)でファイル単位に修正する。このとき、転送プログラムソースの自動生成によりログを取っているので、修正対象ファイルや、フィールドはデータとして落ちることになる。プログラムの修正はこれを参照する。そして、この転送プログラムソースの自動生成ツールは、新旧のDDSを比較して、異なるフィールドや属性を検出して、RPGソースを作ります。つまり、このDDSの変更作業は、今後の作業に取って、とても大事なのです。
以前、FNDSTRPDMをしたときに、該当ソースメンバーが出て来たので、それを当てにしました。でも、以下のことに注意です。
- ネットワークに対しての送受信は、相手のレコードレイアウトが変わらない限り、変更できない。
もちろん、これは、直接データストリームを受信して、フィールドに分解する部分の話で、その後の、累積ファイルなどへは、西暦4桁でいいわけです。もし相手が6桁の日付ならば、8桁を6桁に桁を減らして送信だし、受信は6桁から8桁に桁を増やして受信累積する事になります。つまり、桁を修正してはいけないファイルがあるのです。
- 外部DSも下手に直すと、上記のデータ送受信で使われているかもしれないので、注意。これは、RPGを見るしかありません。
- なるべく、DDSには、EDTWRD(' / / ')やEDTWRD('
/ ')などを、入れること。
こうすると、後でQRYが見やすい。今度はやたら桁が長いのに、編集コードが無い。それから、データタイプLは見送ろうと思う。10バイトはきついのだ。また、OPMでは限界がある。ディスクをもっと増やして、すべてをILEにしたなら、使えそうです。
- コンパイル用ワークファイルは、予め、作成しておき、本番以降でも楽なように、ライブラリーを分ける。
実は、元々、コンパイル用のワークファイルは、WRKDBFというライブラリーに作成さてあるのですが、この新レイアウト版をどこかに作成して置くのです。でないと、まれにコンパイルが通ってしまい、実行するとOVRDBFで旧レイアウトを新レイアウトにしてファイルオープンしようとして、エラーを起こす可能性があります。
修正手順
修正対象の物理ファイルのDDSを見つけたら、
- そのソースを、Y2KSRC/QDDSSRC(新レイアウト専用DDS)にコピー。
- 元となった、ソースメンバーを\XXXXXXXXと、頭に\をつけて、リネーム。この後、もし、参照ファイルも対象ならば、SEUでFORMAT(),REF()を\付きのファイルに変更する。
- Y2KSRC/QDDSSRCのメンバーを修正。
- Y2KCTLPにデータを追加。
- 以上を、CLPにして作成して、PDMのユーザーオプションに登録した。
本日、午後狂ったように、DDSを修正しました。120本くらい。8桁のものも対象にしたので、ファイル内の全フィールド8桁済みのものもありました。あとで分かったのですが、修正しないでいい、フィールドまで、間違えて、桁を修正していました。注意しなくては。
この後、DDSのリコンパイルを、Y2KCTLPを順次に読み込むCLPを作成して、流しました。さらに、その後、変換ソースを生成して、その、コンパイルまで出来ました。それから、データで、旧レイアウトでも8桁ですが、中身が00981229となっているものもあるので、これを探さなくてはいけません。
あとは、この実行と、実行結果の確認です。たしか、QRY管理で、ソースを作成すれば、出来たような気がする。NEWS400に出ていたかも。でも、今日はもう、くたくたなので、調べるのは明日にしようと思います。あしたは、取りあえず、残った、物理ファイルのソース(\のついてないもの)を再度検索します。とにかく、テスト機でのデータ移行は、今月中にやるぞ!
続く... |