プログラム連携を使ったサンプルプログラムの作成
実際に簡単なプログラムを作成し、プログラム連携の機能について確認します。
サンプルプログラムの内容
メイン処理プログラムでメイン処理開始の表示を行います。メイン処理プログラムの中に連携先プログラムで使用するデータを設定し、連携先プログラムにおいて表示および更新を行います。連携先プログラムの処理終了後にメイン処理で、連携先プログラムで更新されたデータとメイン処理終了の表示を行います。
メイン処理プログラムの内容
メイン処理のプログラムでは、MAIN PROD(COBOL)
を表示し連携先プログラムで表示する内容を設定して表示します。連携先プログラムの実行終了後に、連携先プログラムで更新された内容を表示します。なお、プログラムの開始時と終了時にそれぞれMAIN-START
とMAIN-STOP
をあわせて表示します。
ソースの内容は次のとおりです。
000100*COPYRIGHT FUSEKAKO 000200 IDENTIFICATION DIVISION. 000300 PROGRAM-ID. cobmaincob. 000400 ENVIRONMENT DIVISION. 000500 DATA DIVISION. 000600 WORKING-STORAGE SECTION. 000700 01 SUB-SND. 000800 03 CNT PIC 99. 000900 03 MSG PIC X(20). 001000 PROCEDURE DIVISION. 001100 DISPLAY "MAIN-START". 001200 DISPLAY "MAIN PROD(COBOL)". 001300 MOVE 10 TO CNT. 001400 MOVE "SUB PROD(COBOL)" TO MSG. 001500 CALL "cobsubcob" USING SUB-SND. 001600 DISPLAY CNT. 001700 DISPLAY "MAIN-STOP". 001800 STOP RUN.
本例では、連携先プログラムに引き渡すデータを、01レベルで定義した複数のデータ項目を束ねるSUB-SND
にしています。もちろん、それぞれのデータ項目を個別に引き渡すこともできます。CALL文で個別にデータ項目を引き渡す例は、次のとおりです。
001500 CALL "cobsubcob" USING CNT MSG.
連携先プログラムの内容
連携先プログラムでは、メイン処理プログラムで設定した値であるSUB PROD(COBOL)
と数値を表示させるようにします。数値のみ、1減算しプログラムを終了します。
ソースの内容は次のとおりです。
000100*COPYRIGHT FUSEKAKO 000200 IDENTIFICATION DIVISION. 000300 PROGRAM-ID. cobsubcob. 000400 ENVIRONMENT DIVISION. 000500 DATA DIVISION. 000600 LINKAGE SECTION. 000700 01 SUB-REC. 000800 03 CNT PIC 99. 000900 03 MSG PIC X(20). 001000 PROCEDURE DIVISION USING SUB-REC. 001100 DISPLAY "SUB-START " 001200 DISPLAY MSG WITH NO ADVANCING. 001300 DISPLAY CNT. 001400 SUBTRACT 1 FROM CNT. 001500 DISPLAY "SUB-END". 001600 EXIT PROGRAM.
順序番号000300で指定するPROGRAM-IDは、メイン処理プログラムのCALL文で指定される連携先プログラム名と合わせる必要があります。
メイン処理で「データ項目を個別に引き渡すCALL文」とした場合は、処理部のUSING句の内容を変更してください。変更例は次のとおりです。
001000 PROCEDURE DIVISION USING CNT MSG.
連携先プログラムにおけるプログラム実行の終了は、「STOP RUN文」ではなく「EXIT PROGRAM文」とします。「STOP RUN文」にすると、メイン処理プログラムではなく、メイン処理プログラムを実行したシェルなどに制御が渡るので、注意が必要です。「EXIT PROGRAM文」は省略することができます。省略すると、連携先プログラムの最終行で「EXIT PROGRAM文」が指定された事と同じになります。
サンプルプログラムのコンパイル
今回、サンプルコードを用意したので、必要があればご利用ください。サンプルコードを適当なディレクトリ、ファイルに格納し、前述したコンパイルコマンドでメイン処理プログラムと連携先プログラムをコンパイルします。
以下は、メイン処理プログラム名を「cobmaincob.cob」、連携先プログラム名を「cobsubcob.cob」とした例です。
/usr/local/bin/cobc -x -o cobmaincobexe cobmaincob.cob cobsubcob.cob
/usr/local/bin/cobc -c -x -o cobmaincob.o cobmaincob.cob /usr/local/bin/cobc -c -o cobsubcob.o cobsubcob.cob /usr/local/bin/cobc -x -o cobmaincobbin cobmaincob.o cobsubcob.o
問題が無ければ、直接実行型ファイルを作成するコンパイル例では「cobmaincobexe」が、分割コンパイルによる実行型ファイルを作成するコンパイル例では、それぞれ「cobmaincob.o」「cobsubcob.o」「cobmaincobbin」が作成されるはずです。
[e-fuse@]$ ls -l -rwxrwxr-x 1 cobol cobol 11825 7月 27 14:50 cobmaincobbin -rw-rw-r-- 1 cobol cobol 4744 7月 27 08:48 cobmaincob.o -rw-rw-r-- 1 cobol cobol 5640 7月 27 13:50 cobsubcob.o [e-fuse@]$
環境構築の方法によっては、オブジェクトサイズが異なる場合があります。
通常は上記コマンドをコマンドラインで毎回打鍵することなく、make
コマンドによりコンパイルを行うことが多いと思います。今回のコンパイルをMakefileに記述する場合は、次のようになります。
cobmaincobbin: cobmaincob.o cobsubcob.o /usr/local/bin/cobc -x -o cobmaincobbin cobmaincob.o cobsubcob.o cobmaincob.o: cobmaincob.cob /usr/local/bin/cobc -c -x -o cobmaincob.o cobmaincob.cob cobsubcob.o: cobsubcob.cob /usr/local/bin/cobc -c -o cobsubcob.o cobsubcob.cob clean: rm cobmaincobbin cobmaincob.o cobsubcob.o
上記のMakefileを格納したディレクトリで、引数なしのmake
コマンドを実行することにより、コンパイルが必要なモジュールのみコンパイルされることになります。
サンプルプログラムの実行
前項で作成した実行型ファイルを実行します。実行例は次のとおりです。
もし、”error while loading shared...”と、エラーが出た場合は、適宜環境を整えて再度実行してください(COBOL言語をLinux環境で動かす)。
[e-fuse@]$ ./cobmaincobbin MAIN-START MAIN PROD(COBOL) SUB-START SUB PROD(COBOL) 10 SUB-END 09 MAIN-STOP [e-fuse@]$
意図した内容で表示される事が、確認できました。
まとめ
今回は、OpenCOBOL同士によるプログラム連携について、機能の確認を行いました。複数のOpenCOBOLプログラムの連携方法への理解が進んだかと思います。
次回は、OpenCOBOLとCによるプログラム連携について、稿を進めたいと思います。
参考
- OpenCOBOL Manual:OpenCOBOL
- COBOLプログラミング 基本編 :CodeZine(基本的なCOBOL言語の解説)