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