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
|
|
|||
|
|