以前の記事「ChatGPTでプログラムソースを生成する(Excel-VBA編)」に続き、COBOLのソースを生成してみました。
COBOLは事務処理用プログラミング言語として、汎用機やオフィスコンピュータで多く用いられました。
しかしOPEN化とダウンサイジングにより、汎用機からUNIXやWindows系に開発が以降する中で徐々に利用が減って来た言語です。
ただこれまでの資産としてまだ稼働中のシステムも多く、減ったながらも需要はある言語です。
ただ新たにCOBOL言語の学ぶ事は少なく、これまでに開発を担当してきた技術者も高齢化により減って来ています。
そこでChatGPTでソース生成が可能か試してみました。
COBOLソース生成1(データ処理)
先ずは基本的なデータ更新プログラムです。
想定したプログラム機能としては
「シーケンスファイルを順に読み込んで、そのレコードの顧客番号をキーとして顧客マスタを更新・生成」するです。
ChatGPTには以下の様に入力しました。
入力はシーケンスファイルのAファイルを読み込んで、Aファイルの顧客番号をKEYとしてランダムファイル構成の顧客マスタを更新するCOBOLプログラムソース
ここから生成されたソースがこちらです。
IDENTIFICATION DIVISION.
PROGRAM-ID. UpdateCustomerMaster.DATA DIVISION.
FILE SECTION.
FD InputAFile
LABEL RECORDS ARE STANDARD
RECORDING MODE IS F
BLOCK CONTAINS 0 RECORDS
RECORD CONTAINS 80 CHARACTERS.FD CustomerMasterFile
LABEL RECORDS ARE STANDARD
RECORDING MODE IS ISAM
RECORD CONTAINS 80 CHARACTERS
DATA RECORD IS CustomerRecord
KEY IS CustomerId.WORKING-STORAGE SECTION.
01 CustomerRecord.
05 CustomerId PIC X(10).
05 CustomerName PIC X(30).
05 CustomerBalance PIC 9(9)V99.01 WS-EOF PIC X(1) VALUE ‘N’.
PROCEDURE DIVISION.
OPEN INPUT InputAFile
OPEN I-O CustomerMasterFile.PERFORM UNTIL WS-EOF = ‘Y’
READ InputAFile
AT END
MOVE ‘Y’ TO WS-EOF
NOT AT END
PERFORM Process-A-Record
END-READ
END-PERFORM.CLOSE InputAFile
CLOSE CustomerMasterFile.STOP RUN.
Process-A-Record.
READ CustomerMasterFile
INVALID KEY
DISPLAY ‘Customer not found in Customer Master’
NOT INVALID KEY
PERFORM Update-Customer-Record
END-READ.EXIT.
Update-Customer-Record.
! ここで顧客マスタのデータを更新するロジックを追加します。
! 例えば、条件に基づいて顧客残高を変更したり、他のフィールドを更新したりします。! 更新が必要な場合、以下のように書き込みます。
REWRITE CustomerRecord.! あるいは、新しいレコードを追加する場合は、以下のように書き込みます。
! WRITE CustomerRecord.EXIT.
プログラムソースとしてはよく出来ていると思います。
プログラムソースとしてはスケルトンのような形で、「ここに○○な処理を書き込む」ような説明が記載されています。
プログラムの構造化もされていますの、このソースを活用する事で開発速度は速くなると思います。
COBOLソース生成2(曜日算出)
続いて西暦日付を入力して、その日付の曜日を求めるソースを生成しました。
ChatGPTには以下の様に入力しました。
COBOLで入力された日付の曜日を求めるソースを作成してください。
生成されたソースがこちらです。
IDENTIFICATION DIVISION.
PROGRAM-ID. DayOfWeekFinder.DATA DIVISION.
WORKING-STORAGE SECTION.
01 InputDate.
05 Year PIC 9(4).
05 Month PIC 99.
05 Day PIC 99.01 WeekDaysTable.
05 FILLER OCCURS 7 TIMES.
10 WeekDayName PIC X(9).01 DaysSince1900 PIC 9(8) VALUE 0.
01 DayOfWeek PIC 9.PROCEDURE DIVISION.
DISPLAY “Enter the date (YYYY MM DD): “
ACCEPT InputDate.PERFORM Validate-Date. PERFORM Calculate-Days-Since-1900. PERFORM Determine-Day-Of-Week. DISPLAY "The day of the week is: " WeekDayName(DayOfWeek). STOP RUN.
Validate-Date.
IF (Year NOT NUMERIC) OR (Month NOT NUMERIC) OR (Day NOT NUMERIC)
OR (Month < 1 OR Month > 12) OR (Day < 1 OR Day > 31)
OR (Year < 1900)
DISPLAY “Invalid date. Please enter a valid date.”
ACCEPT InputDate
PERFORM Validate-Date
END-IF.Calculate-Days-Since-1900.
MOVE Year TO DaysSince1900.
SUBTRACT 1900 FROM DaysSince1900.MOVE Month TO DaysSince1900. SUBTRACT 1 FROM DaysSince1900. MOVE Day TO DaysSince1900. IF Month > 2 SUBTRACT 1 FROM DaysSince1900 END-IF. MULTIPLY 365 BY DaysSince1900 GIVING DaysSince1900. ADD (Year - 1) / 4 TO DaysSince1900. SUBTRACT (Year - 1) / 100 FROM DaysSince1900. ADD (Year - 1) / 400 TO DaysSince1900.
Determine-Day-Of-Week.
DIVIDE DaysSince1900 BY 7 GIVING DayOfWeek REMAINDER DayOfWeek.
説明としてこちらも記載されています。
このプログラムでは、曜日の名前を
WeekDayName
テーブルに格納しています。日付の妥当性を確認し、日付から1900年1月1日までの日数を計算しています。最後に、曜日を計算し、WeekDayName
テーブルから該当する曜日の名前を表示しています。なお、このプログラムは1900年1月1日以降の日付に対応しています。
ChatGPTに入力した内容だけでここまで生成してくれます。
入力した日付に対し簡単だけれども入力日の妥当性を確認しています。そして日数についてはうるう年の考慮も行っています。
このソースがあれば曜日算出の基本は出来ると思います。
まとめ
COBOLに対しても精度の高いソースは生成されました。
このまま流量も可能なものだと思いますし、部品として組み込む参考ソースとしても十分使えるものです。
プログラミングの基本がわかる方でしたら、COBOLがわからなくてもなんとなく理解できるのではないでしょうか。
COBOLについては技術者も限られています。
ChatGPTを活用して保守に役立てるのも有効な事だと思いました。