短期的解決策

アプリケーションおよびデータのすべてを 2000 年までに変更できない場合には、 データだけを残しておき、2 桁年を 4 桁年として解釈するようアプリケーションを変更することができます。 このタイプの手法を、通常、ウィンドウ操作といいます。 この手法により、2 桁年を採用しながら、事前定義済みの 100 年ウィンドウに基づいて 4 桁年を判別できます。 たとえば、1940 〜 2039 というウィンドウを考えてみます。

ILE COBOL でウィンドウ操作を行う方法は 2 つあります。 ILE COBOL 組み込み関数を使用することによってユーザー自身でウィンドウ操作を実行することもできますし、 あるいは数値日付または文字日付を日付データ項目に変更することによって ILE COBOL にウィンドウ操作を実行させることもできます。

ユーザー自身でウィンドウ操作を行いたい場合、ILE COBOL は世紀ウィンドウ組み込み関数の集まりを提供します。 これにより、2 桁年は 1 つの 100 年ウィンドウの中で解釈されます (どの 2 桁数値も 100 年に一度しか現れないからです)。 期間を選択し、組み込み関数に 2 桁年、または 2 桁年を使用した日付または日数を指定すると、 組み込み関数はその 100 年ウィンドウの範囲内の 4 桁年の該当する値を戻します。

ILE COBOL コンパイラーは、YEAR-TO-YYYY、DAY-TO-YYYYDDD、 DATE-TO-YYYYMMDD という 3 つの世紀ウィンドウ組み込み関数を提供しています。 YEAR-TO-YYYY 組み込み関数は 2 桁年で、指定した 100 年ウィンドウの 4 桁年を戻します。 他の 2 つの組み込み関数は 2 桁年を含んだ日付を引き数として取り、指定した 100 年ウィンドウの 4 桁年を含んだ日付を戻します。 DAY-TO-YYYYDDD 組み込み関数の場合、 その日付として ACCEPT FROM DAY ステートメントの日付形式と同じ 5 桁数値を指定します。 同様に、DATE-TO-YYYYMMDD 組み込み関数には、ACCEPT FROM DATE ステートメントの日付形式と同じ 6 桁数値を指定します。

世紀ウィンドウ組み込み関数については、「WebSphere Development Studio: ILE COBOL 解説書」を参照してください。

ILE COBOL にウィンドウ操作を実行させるには、文字または数値での日付を日付データ項目に変更する必要があります。 以下に示す一部分のコーディングには、日付を表す数字項目が 2 つあります。 このコードは、現在日付が満了日を過ぎるとメッセージを表示します。

  01  my-dates.
* expiration-date is year 1997, month 10, day 9
      05  expiration-date  PIC S9(6)  VALUE 971009
              USAGE PACKED-DECIMAL.
* current-date-1 is year 2002, month 8, day 5
      05  current-date-1   PIC S9(6)  VALUE 020805
              USAGE PACKED-DECIMAL.
     IF current-date-1 > expiration-date THEN
       DISPLAY "items date is past expiration date"
     END-IF.

上記のコードでは、2002 が 1997 より大きいにもかかわらず、 数値 020805 は 971009 より大きくないため、IF の評価は FALSE となり、DISPLAY ステートメントは実行されません。 しかし、数値日付を日付データ項目に変更すると、DISPLAY ステートメントは実行されます。 expiration-datecurrent-date-1 は両方ともサイズ (バイト単位) が変わっていないことに注意してください。

  01  my-dates.
* expiration-date is year 1997, month 10, day 9
     05  expiration-date  FORMAT DATE "%y%m%d" VALUE "971009"
              USAGE PACKED-DECIMAL.
* current-date-1 is year 2002, month 8, day 5
     05  current-date-1   FORMAT DATE "%y%m%d" VALUE "020805"
              USAGE PACKED-DECIMAL.
     IF current-date-1 > expiration-date THEN
       DISPLAY "items date is past expiration date"
     END-IF.

短期的解決策の利点

短期的解決策の利点は、変更を要するプログラムが少なくてすみ、データベースは変更しなくてもよい点にあります。 この方法のほうが、長期的解決策よりも安上がりで、手早く、簡単です。

しかし、世紀ウィンドウ組み込み関数を使用して、 データベースやファイルを 2 桁年日付から 4 桁年日付に変換することもできます。 これを行うには、2 桁年日付を読み取って 4 桁年に変換し、 オリジナルのコピーを 4 桁年日付用に拡張して、そこにデータを再び書き込みます。 こうして、すべての新データを新ファイルまたは新データベースに入れます。

短期的解決策の欠点

この方法では、アプリケーションによってはほんの数年しかもちません。 そうなると、やはりすべての日付プログラムおよびデータベースを変更する必要が生じます。

2 桁年が固有であるのは特定の 100 年間だけなので、世紀ウィンドウは永久に使用できるわけではありません。 いずれ、100 年以上のデータ・ウィンドウが必要になります。 実際にそれを必要としている企業は少なくありません。

世紀ウィンドウが役立つのは、ILE COBOL コードの特定のセクションに関して、 ある日付が古い (過去のもの) かどうか、 あるいは期限がまだ来ていない (未来のもの) かどうかといったことを識別するかどうかがわかっているときです。 その場合、その知識を使用して世紀ウィンドウの設定方法を決めることができます。

しかし限界があります。 たとえば、世紀ウィンドウでは、タイム・スパンが 100 年を超えるような場合に、 得意先がどれほどの間、自分の会社と取引しているのか割り出すことはできず、 年号の下 2 桁しか知ることができません。 もう一つの例はソートです。 日付でソートするレコードは、みな 4 桁年日付でなければなりません。 これらの問題やその他の問題を考慮するなら、4 桁年を戻す ACCEPT ステートメント、組み込み関数、または ILE 日付サービスを使用する必要があります。