a.10. 2000年問題 其の拾 |
変換ばっちりデータ変換(移行)ツールは大きく分けて2つのパートに分かれます。
いろいろなデータで調べたけど、うまくいってる。こんな感じのソースが自動的に生成されました。よしよし。でも、もっと調べなきゃ。5月中には、DDSをすべて変更して、データ移行をしてしまいたい。間に合うかな? H****************************************************** H* 2000年変換自動生成 * H* CALL CVTY2K2 00000098 -> 00001998 Y * H* PARM A(8) 00009801 -> 00199801 YM * H* PARM A(5) 00980101 -> 19980101 YMD * H* 00010198 -> 19980101 MDY * H* 00199801 -> 00199801 YYM * H* 19980101 -> 19980101 YYMD * H* 01011998 -> 19980101 MDYY * H****************************************************** H Y/ 1 F\#MNUHEDIP E K DISK F #MNUHEDR KRENAMEINPUT F#MNUHEDPO E DISK F #MNUHEDR KRENAMEOUTPUT I****************************************************** I* D E F I N E I N P U T F I E L D * I****************************************************** IINPUT I MHQDAT @HQDAT C****************************************************** C* M A I N - R O U T I N E : C****************************************************** C EXSR @TODB : C* : C WRITEOUTPUT : C CLEAROUTPUT : CLR RETRN : C*----------------------------------------------------* C @TODB BEGSR : C*----------------------------------------------------* C*====================================================* C*旧フィ−ルド< RENAME > C* ・MHQDAT (P006.00) < @HQDAT > C* ・TEXT(QDATE) C*新フィ−ルド C* ・MHQDAT (P008.00) C* ・TEXT(QDATE) C*====================================================* C MOVE @HQDAT PBDAT : C CALL 'CVTY2K2' :変換PGM C PARM PBDAT 8 : C PARM PIFMT 5 : C MOVE PBDAT MHQDAT : C* : C ENDSR : こうなってくると、楽を覚えて、中身をあまり見なくなってくるでしょう。そこで、いろいろ見ているうちに、2点問題を見つけました。
解決
以上をまとめなおしたのが、以下のもの。(なお、書き忘れていましたが、日付形式はYMDに変更することになりまた(QDATFMT)。 赤いセルを判定して、数字の桁と日付の形式を判定(修正版 V1.1。この前のバージョンは1.0としよう)2桁の場合青いセルがもし、月ならば、01から12だし、日ならば、01から31となるはず。そこで、青いセルが、80以上の場合なら、年YYとして、変換対象とした。 (1) YY
4桁の場合前提から、MMYYはない。もし、変換済みの年ならば、19と入っているはず。そこで、青いセルが、80以上でかつ、緑の部分(月)が01から12の場合、YYMMと判定する。そのほかはYYYYなので、変換不要。(YYYYは判定しない) (2) YYMM
(3) YYYY
6桁の場合(4)と(5)は、青いセルが80以上、緑が01から12、茶色が01から31ならば、そのレイアウトでYYMMDDもしくはMMDDYYと判定する。 (4) YYMMDD
(5) MMDDYY
(6) YYYYMM
8桁の場合青いセルが、1980以上で、緑が01から12で、茶色が01から31の場合、そのレイアウトに応じて、YYYYMMDDで、01から12ならばYYYYMMDDと判断する。 (7) YYYYMMDD
(8) MMDDYYYY(無いだろうけど)
7桁の場合赤いセルだけが0だと、(8)の01月から09月と同じになるので、青い部分が980以上で、緑が01から12、茶色が01から31ならば、YYYMMDDと判断する。 (9) YYYMMDD
年を4桁へ
以下は、さらに、修正を加えた、外サブです。また、変更されるかもしれません。昨日のより、精度というか、無駄に月日を判定して、正確性を高めた、つもりです。また、判定した日付形式を戻します。 H*************************************************** H* * H* YMDかMDYかの判断 * H* * H* PROGRAMMER . . . . . KAKEFUDA * H* CREATION . . . . . . 1998/05/12 * H* MODIFICATION . . . . * H* * H* YYYYMMとMMDDYYは識別つかない * H* * H* 121998 = 12/19/98 OR 12/1998 * H* * H* MMYY,MMYYYYありえないのが前提 * H* * 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* IDSYYM DS I 1 4 DSYY3 I 5 6 DSMM3 I* IDSYM DS I 1 2 DSYY4 I 3 4 DSMM4 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 I* IDSYMD7 DS I 1 3 DSYY7 I 4 5 DSMM7 I 6 7 DSDD7 C****************************************************** C* DEFINITION MODULE ( PLIST FIELD KLIST ) * C****************************************************** C* : C* DEFINE ENTRY : C* : C *ENTRY PLIST : C PARM PBDAT 8 : C PARM POFMT 5 : 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 Z-ADD0 W1RSLT 80 : 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 CASEQ7 @CHK7 : +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'YYM ' @YYM : +002 C W1FMT CASEQ'YYMD ' @YYMD : +002 C W1FMT CASEQ'MDYY ' @MDYY : +002 C W1FMT CASEQ'YMD7 ' @YMD7 : E002 C END : 001 C* : E001 C END : C* : B001 C W1RSLT IFNE 0 : 001 C MOVE W1RSLT PBDAT : 001 C MOVE W1FMT POFMT : 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 WHEQ 0 : 001 C MOVE W1DAT DSYMD7 : B002 C DSMM7 IFEQ '19' : *002 C DSDD7 ANDGE'80' : 002 C Z-ADD8 W1PTN : +002 C ELSE : 002 C Z-ADD7 W1PTN : E002 C END : +001 C OTHER : 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 MOVE W1DAT DSYM : C* : B001 C DSYY4 IFGE '80' : *001 C DSMM4 ANDGE'01' : *001 C DSMM4 ANDLE'12' : 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 MOVE W1DAT DSMDY : C MOVE W1DAT DSYYM : C* DSYMD : B001 C DSYY1 IFGE '80' : *001 C DSMM1 ANDGE'01' : *001 C DSMM1 ANDLE'12' : *001 C DSDD1 ANDGE'01' : *001 C DSDD1 ANDLE'31' : 001 C MOVE 'YMD ' W1FMT : +001 C ELSE : 001 C* DSMDY : B002 C DSYY2 IFGE '80' : *002 C DSMM2 ANDGE'01' : *002 C DSMM2 ANDLE'12' : *002 C DSDD2 ANDGE'01' : *002 C DSDD2 ANDLE'31' : 002 C MOVE 'MDY ' W1FMT : +002 C ELSE : 002 C* DSYYM : B003 C DSYY3 IFGE '1980' : *003 C DSMM3 ANDGE'01' : *003 C DSMM3 ANDLE'12' : 003 C MOVE 'YYM ' W1FMT : E003 C END : E002 C END : E001 C END : C* : C ENDSR : C*----------------------------------------------------* C @CHK7 BEGSR : C*----------------------------------------------------* C Z-ADDW1DAT W1CHK7 70 : C MOVE W1DAT DSYMD7 : C* : B001 C DSYY7 IFGE '980' : *001 C DSMM7 ANDGE'01' : *001 C DSMM7 ANDLE'12' : *001 C DSDD7 ANDGE'01' : *001 C DSDD7 ANDLE'31' : 001 C MOVE 'YMD7 ' W1FMT : E001 C END : C* : C ENDSR : C*----------------------------------------------------* C @CHK8 BEGSR : C*----------------------------------------------------* C Z-ADDW1DAT W1CHK8 80 : C MOVE W1DAT DSYYMD : C MOVE W1DAT DSMDYY : C* : B001 C DSYY5 IFGE '1980' : *001 C DSMM5 ANDGE'01' : *001 C DSMM5 ANDLE'12' : *001 C DSDD5 ANDGE'01' : *001 C DSDD5 ANDLE'31' : 001 C MOVE 'YYMD ' W1FMT : +001 C ELSE : 001 C* : B002 C DSYY6 IFGE '1980' : *002 C DSMM6 ANDGE'01' : *002 C DSMM6 ANDLE'12' : *002 C DSDD6 ANDGE'01' : *002 C DSDD6 ANDLE'31' : 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 @YYM BEGSR : C*----------------------------------------------------* C Z-ADDW1CHK6 W1RSLT : C* : C ENDSR : C*----------------------------------------------------* C @YMD7 BEGSR : C*----------------------------------------------------* C 10000000 ADD W1CHK7 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 : これが、おわったら、変換前と変換後のデータに一覧が出るように、考える。どーやろうか? 続く...
|
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||