最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

a.10. 2000年問題 其の拾

[ Previous ] [ HOME ] [ Upper ] [ Next ]


変換ばっちり

データ変換(移行)ツールは大きく分けて2つのパートに分かれます。

  1. 新旧のファイルのレイアウトを比較して、同一フィールドの桁数が違うフィールドを、旧から新ファイルへ転送するRPGを自動生成。(CVTY2K)
  2. この自動生成されたプログラムに、日付判定しながら、年4桁に変換する外部サブルーチン(CVTY2K2)。

いろいろなデータで調べたけど、うまくいってる。こんな感じのソースが自動的に生成されました。よしよし。でも、もっと調べなきゃ。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点問題を見つけました。

  • 日付の桁数が7桁のものがある。

    だれだ!こんなことしたのは。恥ずかしながら、「私」です。だって、パックなんだもん。

  • 8桁で、桁数が変わらないけど、中身が、00981210みたいになっているので、例外的に、変換対象にしたいものがある。

    これは、前に別の理由でレイアウト変更したとき、ついでに8桁にしたもの。余計なことしてしまった。8桁は新旧とも8桁なので、自動判定できない。

  • フィールド名が7文字以上のがあった。

    ILE用だった。こまった。自動生成するソースタイプは、RPG(OPM)だ。もうこれは、手作業にしよう。ワーニングでも出そうか。

解決

  • 日付7桁でも、自動判定できる。でも、8桁中、最初の1桁が0なら7桁と判定すると、MMDDYYYYに抵触する。これをさけるルーチンを外サブに「むりやり」入れた。
  • 桁数が変わらなくても、テキストの先頭に@@@があったら、無条件に外サブをコールするソースを出すようにした。(これは、ソースジェネレータ側)
  • さらに、判定の精度を高めるため、月や日も判定に含めるようにした。この方が、安心感がある(無駄な判定となるが)。

以上をまとめなおしたのが、以下のもの。(なお、書き忘れていましたが、日付形式はYMDに変更することになりまた(QDATFMT)。

赤いセルを判定して、数字の桁と日付の形式を判定(修正版 V1.1。この前のバージョンは1.0としよう)

2桁の場合

青いセルがもし、月ならば、01から12だし、日ならば、01から31となるはず。そこで、青いセルが、80以上の場合なら、年YYとして、変換対象とした。

(1) YY

0 0 0 0 0 0 9 7

4桁の場合

前提から、MMYYはない。もし、変換済みの年ならば、19と入っているはず。そこで、青いセルが、80以上でかつ、緑の部分(月)が01から12の場合、YYMMと判定する。そのほかはYYYYなので、変換不要。(YYYYは判定しない)

(2) YYMM

0 0 0 0 9 7 0 1

(3) YYYY

0 0 0 0 1 9 9 7

6桁の場合

(4)と(5)は、青いセルが80以上、緑が01から12、茶色が01から31ならば、そのレイアウトでYYMMDDもしくはMMDDYYと判定する。
(4)(5)以外で、(6)青いセルが1980以上ならば、年四桁のYYYYMMとする。

(4) YYMMDD

0 0 9 7 0 1 0 1

(5) MMDDYY

0 0 0 1 0 1 9 7

(6) YYYYMM

0 0 1 9 9 7 0 1

8桁の場合

青いセルが、1980以上で、緑が01から12で、茶色が01から31の場合、そのレイアウトに応じて、YYYYMMDDで、01から12ならばYYYYMMDDと判断する。

(7) YYYYMMDD

1 9 9 7 0 1 0 1

(8) MMDDYYYY(無いだろうけど)

0 1 0 1 1 9 9 7

7桁の場合

赤いセルだけが0だと、(8)の01月から09月と同じになるので、青い部分が980以上で、緑が01から12、茶色が01から31ならば、YYYMMDDと判断する。

(9) YYYMMDD

0 9 9 7 0 1 0 1

年を4桁へ

(a) YYの場合。 + 1900

(b) YYMMの場合。 +190000

(c) YYMMDDの場合。 +19000000

(d) MMDDYYの場合。 YYMMDDに変換して、+19000000

(e) YYYYMMDDの場合。なにもしない。

(f) YYYYMMの場合。なにもしない。

(g) MMDDYYYYの場合。YYYYMMDDに変換するのみ。

(h) YYYMMDDの場合。 +10000000。

以下は、さらに、修正を加えた、外サブです。また、変更されるかもしれません。昨日のより、精度というか、無駄に月日を判定して、正確性を高めた、つもりです。また、判定した日付形式を戻します。

     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                           :      

これが、おわったら、変換前と変換後のデータに一覧が出るように、考える。どーやろうか?

  続く...

 


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

Ads by TOK2