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

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

よく使うマニュアルです

Wiki

updated on 2004.06.23

a.9. 2000年問題 其の玖

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


2000年の対応は、ファイルの桁数を修正するのはもちろん、そのデータの移行も考えねばなりません。データ移行は、面倒だし、簡単なプログラムですが、ポカミスが出そうです。そこで、古いファイルのフィールドと新しいファイルのフィールドを比較して、違っているフィールドの、転送命令を含む、RPGソースを、自動生成するツールを作ることにしました。でも、これは、あくまで、面倒な部分を、「手助け」するのみの「お助け」ツールのつもりです。最後はやはり、ある程度目で追いかけるのは、覚悟の上です。

今、9割できたのですが、その概況を、記録します。

ソースジェネレート

RPGのソースを作るというのは、普通に物理ファイルに、データを書き出す要領です。そのデータが、RPGソースというわけです。RPGの各カラムは、内部記述で対応します。

   C              MOVEL SRC,1     SRCDTA
   C              ADD   100       SRCSEQ
   C              Z-ADDUDATE      SRCDAT
   C              EXCPT#SRC                     

の繰り返しです。ただし、SRCDTAの中には、可変的に変わる、コードが含まれます。ソース生成すると、以下のような、感じのソースを落としたいのです。

   F XXXXXXX IP           DISK
   F              XXXXX       RENAME INPUT 
   F YYYYYYYYO            DISK
   F              YYYYY       RENAME OUTPUT

   IINPUT
   I               AAAAA          OLDFD1  

   C                MOVE OLDFD1    PBDAT
   C                CALL 'Y2KCVT2'
   C                PARM           PBDAT
   C                PARM  .....
   C                MOVE PBDAT     NEWFD1
        .....
   C                UPDAT OUTPUT                     
   C LR             RETURN                    

もちろん、コンパイルを通すために、F仕様書や、場合によっては、i仕様書も、一緒に必要です。

注意すべきこと

同じようなツールを自作するかたへ、注意点を述べます。

  • 新旧ファイルが同じ名前だと、できたソースをコンパイルで通すのに、手間がかかります。(ファイル名が同じだから。あらかじめ、OVRDBFしてから、コンパイル。)命名ルールを決めて、新旧別名ファイルにした方が楽です。
  • レコード様式名をRENAMEしなくてはなりません。新旧ファイルは、同じレコード様式名であろうから。
  • 同じフィールド名で、新旧で、桁の変わったものを、上記の様に、ソース出力するのだから、i仕様書で、フィールドのRENAMEをせねばなりません。(同じフィールド名で、桁が値が違うので。新旧どちらか一方で済むけど。)
  • いろいろ考えて、年を2桁から、4桁に膨らませるのは、外サブにしました。この方が、文字でも、数字でも、外サブ内部で、すべて数字にして、加算して、パラメータで戻すだけです。パフォーマンスの悪いことは、覚悟の上です。

日付形式と年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

0 0 0 0 0 0 9 7

(2) YYMM

0 0 0 0 9 7 0 1

(3) YYYY

0 0 0 0 1 9 9 7

(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

(7) YYYYMMDD

1 9 9 7 0 1 0 1

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

0 1 0 1 1 9 9 7

上記の、赤いセルを判定して、数字の桁と日付の形式を判定します。

(1) 2桁

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

(2)(3) 4桁

前提から、MMYYはない。もし、変換済みの年ならば、19と入っているはず。そこで、青いセルが、80以上の場合、YYMMと判定する。

(4)(5)(6) 6桁

紫のセルが、01から12ならば、MMDDYYで、青いセルが80以上ならば、YYMMDDと判定する。もし、青いセルが19ならば、年四桁のYYYYMMとする。

(7)(8) 8桁

青いセルが、19ならば、YYYYMMDDで、01から12ならばYYYYMMDDと判断する。

年を4桁へ

(a) YYの場合。 + 1900

(b) YYMMの場合。 +190000

(c) YYMMDDの場合。 +19000000

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

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

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

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

以下は、今日出来立てのソース。ボリュームテストでは、よかったのだが。どうかな?それから、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って言う場合は、やっぱり、元の値の大きさで判定しなくてはなりませんよね。

続く...


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

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

 

Ads by TOK2