a.9. 2000年問題 其の玖 |
2000年の対応は、ファイルの桁数を修正するのはもちろん、そのデータの移行も考えねばなりません。データ移行は、面倒だし、簡単なプログラムですが、ポカミスが出そうです。そこで、古いファイルのフィールドと新しいファイルのフィールドを比較して、違っているフィールドの、転送命令を含む、RPGソースを、自動生成するツールを作ることにしました。でも、これは、あくまで、面倒な部分を、「手助け」するのみの「お助け」ツールのつもりです。最後はやはり、ある程度目で追いかけるのは、覚悟の上です。 今、9割できたのですが、その概況を、記録します。 ソースジェネレートRPGのソースを作るというのは、普通に物理ファイルに、データを書き出す要領です。そのデータが、RPGソースというわけです。RPGの各カラムは、内部記述で対応します。
の繰り返しです。ただし、SRCDTAの中には、可変的に変わる、コードが含まれます。ソース生成すると、以下のような、感じのソースを落としたいのです。
もちろん、コンパイルを通すために、F仕様書や、場合によっては、i仕様書も、一緒に必要です。 注意すべきこと同じようなツールを自作するかたへ、注意点を述べます。
日付形式と年4桁への移行日付の形式は、大丈夫ですか?YYMMDDなら問題ありません。でも、MMDDYYだったら、どうするのでしょう。実は、私が今の会社に入る前から、日付形式は、MMDDYYだったのです(QDATFMT)。悔しいことに、膨大な量の日付があり、AS/400への移行の時は、YYMMDDへ統一は断念しました。今回はどうしましょう。MMDDYYだと、単純な足し算では無くなりますね。結局、外サブを作り、自動生成の中に CALL 外サブを組み込みました。きっと、パフォーマンス悪いでしょう。でも、200個以上ミス無く、修正するのなら、たとえ、遅くても確実な方がいいのでは。 ところで、この外サブを作っていて、気づいたのですが、もし、すでに、年4桁対応していたら、大丈夫でしょうか。たぶん、フィールドの桁数の変更にならないので、出てこないはずですが、はっきり断言できません。もし、YYYYMMDDをYYYYMMに変更していれば、フィールド桁数変更にヒットします。 いろいろパターンを考えているうちに、はた、と気づきました。年月が、MMYYYYとあるものを識別する場合は、不可能なことに気づいたのです。121998は、12/19/98(98年12月19日)ともとれるし、12/1998(1998年12月)ともとれるのです。ほかにもたくさんあるでしょう。19日が困るのです。でも、年月とフィールドを、MMYYYYとする人って、いるのでしょうか。いないですよねぇ(たぶん)。まあ、自分の常識からすると、やっぱり、YYYYMMが普通ではないかと。 さて、この判定部分は結構面倒です。 数字タイプの日付形式と、加算値。MMYY,MMYYYYは考えない、のを前提とします。また、DDMMYYは無いものとします。 外サブで、日付を受け取るのですが、このパラメータを、8バイト文字にします。最初は、CHEKRで、文字の長さを判定していたのですが、もし、すでに、8バイトなのに、00981219と入っていたら、実際の数字の桁数を判定できません。そこで、以下のように考えました(いま、デバッグ中なので、間違いあるかもしれません。)また、以下はすべて、数字タイプです。 (1) YY
(2) YYMM
(3) YYYY
(4) YYMMDD
(5) MMDDYY
(6) YYYYMM
(7) YYYYMMDD
(8) MMDDYYYY(無いだろうけど)
上記の、赤いセルを判定して、数字の桁と日付の形式を判定します。(1) 2桁
(2)(3) 4桁
(4)(5)(6) 6桁
(7)(8) 8桁
年を4桁へ
以下は、今日出来立てのソース。ボリュームテストでは、よかったのだが。どうかな?それから、YYYYMMの判定をしてないので、後で追加。(まだデバッグ中です!) H************************************************************** H* * H* YMDかMDYかの判断 * H* * H* PROGRAMMER . . . . . KAKEFUDA * H* CREATION . . . . . . 1998/05/12 * H* MODIFICATION . . . . * H* * H* MMYYYYとMMDDYYは識別つかない * H* * H* 121998 = 12/19/98 OR 12/1998 * H* * H* MMYY,MMYYYYありえないのが前提 * H* DDMMYYは無いのが前提 * H* * H* * H* * H* * H* * H************************************************************** H Y/ 1 I****************************************************** I* D E F I N E I N P U T F I E L D * I****************************************************** I DS I 1 80DSDAT I 1 10DSDT1 I 2 20DSDT2 I 3 30DSDT3 I 4 40DSDT4 I 5 50DSDT5 I 6 60DSDT6 I 7 70DSDT7 I 8 80DSDT8 I* IDSYMD DS I 1 2 DSYY1 I 3 4 DSMM1 I 5 6 DSDD1 I* IDSMDY DS I 1 2 DSMM2 I 3 4 DSDD2 I 5 6 DSYY2 I* IDSYYMD DS I 1 4 DSYY5 I 5 6 DSMM5 I 7 8 DSDD5 I* IDSMDYY DS I 1 2 DSMM6 I 3 4 DSDD6 I 5 8 DSYY6 C****************************************************** C* DEFINITION MODULE ( PLIST FIELD KLIST ) * C****************************************************** C* : C* DEFINE ENTRY : C* : C *ENTRY PLIST : C PARM PBDAT 8 : C****************************************************** C* M A I N - R O U T I N E : C****************************************************** C MOVE PBDAT W1DAT 80 : C MOVE PBDAT DSDAT : C MOVE *BLANK W1FMT 5 : C Z-ADD0 W1PTN 10 : C* : B001 C W1DAT IFNE 0 : 001 C EXSR @PTN : B002 C W1PTN CASEQ2 @CHK2 : +002 C W1PTN CASEQ4 @CHK4 : +002 C W1PTN CASEQ6 @CHK6 : +002 C W1PTN CASEQ8 @CHK8 : E002 C END : 001 C* : 001 C MOVE PBDAT W1RSLT 80 : B002 C W1FMT CASEQ'Y ' @Y : +002 C W1FMT CASEQ'YM ' @YM : +002 C W1FMT CASEQ'YMD ' @YMD : +002 C W1FMT CASEQ'MDY ' @MDY : +002 C W1FMT CASEQ'YYMD ' @YYMD : +002 C W1FMT CASEQ'MDYY ' @MDYY : E002 C END : 001 C* : E001 C END : C* : B001 C W1RSLT IFNE 0 : 001 C MOVE W1RSLT PBDAT : E001 C END : C* : C************ MOVE *ON *INLR : C RETRN : C****************************************************** C* S U B - R O U T I N E C****************************************************** C*----------------------------------------------------* C @PTN BEGSR : C*----------------------------------------------------* B001 C SELEC : 001 C DSDT1 WHEQ 0 : *001 C DSDT2 ANDEQ0 : *001 C DSDT3 ANDEQ0 : *001 C DSDT4 ANDEQ0 : *001 C DSDT5 ANDEQ0 : *001 C DSDT6 ANDEQ0 : 001 C Z-ADD2 W1PTN : 001 C DSDT1 WHEQ 0 : *001 C DSDT2 ANDEQ0 : *001 C DSDT3 ANDEQ0 : *001 C DSDT4 ANDEQ0 : 001 C Z-ADD4 W1PTN : 001 C DSDT1 WHEQ 0 : *001 C DSDT2 ANDEQ0 : 001 C Z-ADD6 W1PTN : 001 C DSDT1 WHNE 0 : *001 C DSDT2 ORNE 0 : 001 C Z-ADD8 W1PTN : E001 C END : C* : C ENDSR : C*----------------------------------------------------* C @CHK2 BEGSR : C*----------------------------------------------------* C Z-ADDW1DAT W1CHK2 20 : C* : B001 C W1CHK2 IFGE 80 : 001 C MOVE 'Y ' W1FMT : E001 C END : C* : C ENDSR : C*----------------------------------------------------* C @CHK4 BEGSR : C*----------------------------------------------------* C Z-ADDW1DAT W1CHK4 40 : C* : B001 C W1CHK4 IFGE 8001 : *001 C W1CHK4 ANDLE9912 : 001 C MOVE 'YM ' W1FMT : E001 C END : C* : C ENDSR : C*----------------------------------------------------* C @CHK6 BEGSR : C*----------------------------------------------------* C Z-ADDW1DAT W1CHK6 60 : C MOVE W1DAT DSYMD : C* : B001 C DSYY1 IFGE '80' : 001 C MOVE 'YMD ' W1FMT : +001 C ELSE : B002 C DSDD1 IFGE '80' : 002 C MOVE 'MDY ' W1FMT : E002 C END : E001 C END : C* : C ENDSR : C*----------------------------------------------------* C @CHK8 BEGSR : C*----------------------------------------------------* C Z-ADDW1DAT W1CHK8 80 : C MOVE W1DAT DSMDYY : C* : B001 C DSMM6 IFEQ '19' : 001 C MOVE 'YYMD ' W1FMT : +001 C ELSE : B002 C DSMM6 IFGE '01' : *002 C DSMM6 ANDLE'12' : 002 C MOVE 'MDYY ' W1FMT : E002 C END : E001 C END : C* : C ENDSR : C*----------------------------------------------------* C @Y BEGSR : C*----------------------------------------------------* C 1900 ADD W1CHK2 W1RSLT : C* : C ENDSR : C*----------------------------------------------------* C @YM BEGSR : C*----------------------------------------------------* C 190000 ADD W1CHK4 W1RSLT : C* : C ENDSR : C*----------------------------------------------------* C @YMD BEGSR : C*----------------------------------------------------* C 19000000 ADD W1CHK6 W1RSLT : C* : C ENDSR : C*----------------------------------------------------* C @MDY BEGSR : C*----------------------------------------------------* C MOVE W1DAT DSMDY : C MOVE DSYY2 DSYY1 : C MOVE DSMM2 DSMM1 : C MOVE DSDD2 DSDD1 : C MOVE DSYMD W1CHK6 : C* : C 19000000 ADD W1CHK6 W1RSLT : C* : C ENDSR : C*----------------------------------------------------* C @YYMD BEGSR : C*----------------------------------------------------* C Z-ADDW1CHK8 W1RSLT : C* : C ENDSR : C*----------------------------------------------------* C @MDYY BEGSR : C*----------------------------------------------------* C MOVE W1DAT DSMDYY : C MOVE DSYY6 DSYY5 : C MOVE DSMM6 DSMM5 : C MOVE DSDD6 DSDD5 : C MOVE DSYYMD W1CHK8 : C* : C Z-ADDW1CHK8 W1RSLT : C* : C ENDSR : ソースジェネレータは、これをCALLする。あと、日付の形式もパラメータで戻す予定。 はー、やれやれ、これを、一個一個、手作業なんて、とんでもないですよね。それから、移行後のデータの内容検査プログラムも自動生成しようか。途中まで、00980101できて、ある日以降19980101って言う場合は、やっぱり、元の値の大きさで判定しなくてはなりませんよね。 続く... |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||