9桁文字列型日付を7桁数値型日付に変換するCOBOLソース例
平成の改元という時代において、いまだにCOBOLのメンテをしています。
お察しください。
今回は「H30. 1.15」→「4300115」「R 1. 5.20」→「5010520」
みたいなこと。
9桁文字列型「H30. 1.15」から7桁数値型「4300115」への変換です。
実際の処理の流れは、
9桁文字型和暦の文字列を先頭からチェックして、
数字相当文字がある場合にそれを変換し、
7桁文字型和暦へのセットを繰り返します。
項目の定義はこんな感じ。
01 WK-9WAREKI X(9).
01 WK-7WAREKI-GROUP.
03 WK-7WAREKIX X(7).
03 WK-7WAREKI9 REDEFINES WK-7WAREKIX 9(7).
01 XA 9(2).
01 XB 9(2).
セット済7桁文字型和暦をREDEFINESで再利用して
7桁数値型和暦を取得します。
では処理ソースへ。
PERFORM VARYING XA FROM 1 BY 1 UNTIL XA > 9
EVALUATE XA
WHEN 1
EVALUATE WK-9WAREKI (XA:1)
WHEN 'M'
MOVE 1 TO WK-7WAREKIX (XA:1)
WHEN 'T'
MOVE 2 TO WK-7WAREKIX (XA:1)
WHEN 'S'
MOVE 3 TO WK-7WAREKIX (XA:1)
WHEN 'H'
MOVE 4 TO WK-7WAREKIX (XA:1)
WHEN 'R'
MOVE 5 TO WK-7WAREKIX (XA:1)
END-EVALUATE
WHEN 2
WHEN 3
IF WK-9WAREKI (XA:1) = SPACE
MOVE '0' TO WK-7WAREKIX (XA:1)
ELSE
MOVE WK-9WAREKI (XA:1) TO WK-7WAREKIX (XA:1)
END-IF
WHEN 5
WHEN 6
MOVE XA TO XB
ADD -1 TO XB
IF WK-9WAREKI (XA:1) = SPACE
MOVE '0' TO WK-7WAREKIX (XB:1)
ELSE
MOVE WK-9WAREKI (XA:1) TO WK-7WAREKIX (XB:1)
END-IF
WHEN 8
WHEN 9
MOVE XA TO XB
ADD -2 TO XB
IF WK-9WAREKI (XA:1) = SPACE
MOVE '0' TO WK-7WAREKIX (XB:1)
ELSE
MOVE WK-9WAREKI (XA:1) TO WK-7WAREKIX (XB:1)
END-IF
END-EVALUATE
END-PERFORM.
以上の処理によって、
7桁文字列型 WK-7WAREKIX を再利用した、
7桁数値型WK-7WAREKI9 を得ます。
ポイントは以下。
・PERFORMで◯文字目を順々に進める。
・EVALUATEで◯文字目の処置を分岐させ、それぞれ記述する。
・1文字目は元号符号(MTSHR)なので、EVALUATEで分岐させ、
対応する数字を7桁和暦へ送る。
・9桁和暦の先頭から2・3文字目は、
7桁和暦2・3文字目へ送る。(XA→XA)
・9桁和暦の先頭から5・6文字目は、
7桁和暦4・5文字目へ送る。(XA→XB)
・9桁和暦の先頭から8・9文字目は、
7桁和暦6・7文字目へ送る。(XA→XB)
・空白は0で送る。以上です。
おつかれしたー。