Net Express 技術情報(FAQ)


COBOL と帳票ツールの連携方法を教えてください

COBOLから印刷帳票を出力する方法として一般的なのは、

  • ページ体裁をLINAGE句で定義した行順編成ファイルへの WRITE AFTER文
  • REPORT SECTION構文で定義し GENERATE文で印刷する

    でしたが、別の技術情報でも述べているように、Windows上でのプリント出力はすべてプリントマネージャがコントロールすることが標準になっているため、上記のような伝統的な印刷方法では、Windowsの機能のほとんどが使用できません。

    Windowsの印刷機能を簡単に活用できるように、多くの帳票ツールがサードベンダーから販売されており、このなかのいくつかは、Micro Focus製品とのインタフェースをサポートしています。ここでは、そのようなツールを使用して、どのように帳票フォームを定義し、どのようにCOBOLプログラムから制御して行くことができるかを解説します。

    なお、ここでは一例として 株式会社エイチ・オー・エス様 (https://www.hos.co.jp/) のシー・オー・リポーツ を題材として取り上げます。シー・オー・リポーツについては、エイチ・オー・エス様までお問い合わせ下さい。


帳票レイアウトの定義

ここで取り上げているのは、ページプリンタに印刷される定型フォームを持つ帳票です。まず、定義ツールを使用してレイアウトを定義します。以下に、シー・オー・リポーツが提供するフォームエディタの作業画面の一例を示します。


このような定義ツールを使用して対話式に、各フィールドの位置、属性を定義します。同時に固定テキスト、罫線、バーコードなども定義できます。


COBOLインタフェースの定義

各帳票ツールは、それぞれ独自のプログラミングインタフェースを持っています。定義された帳票レイアウトに COBOLプログラムから印刷するためには、このインタフェースを使用して COBOLプログラムからリクエストを発行する必要があります。通常はシステムサブルーチンの呼び出しを行います。一方で、フォームの可変フィールドにCOBOLプログラムから代入するデータの値を格するための連絡領域を COBOLで宣言しておく必要があります。この宣言の方法もツールによって異なります。シー・オー・リポーツの場合、各印刷フィールドに対して、例えば以下のように宣言します:

      01  PRINT-RECORD.
        03  TUKI.
          05  TUKI-dat   pic x(2).
          05  filler   pic x value low-value.
        03  SITEN.
          05  SITEN-dat   pic x(8).
          05  filler   pic x value low-value.
        03  SIBU.
          05  SIBU-dat   pic x(6).
          05  filler   pic x value low-value.


各フィールド毎に宣言されている FILLER項目は、シー・オー・リポーツのランタイムルーチンに渡すデータが ナル文字で止められていなければならないために必要となります。


COBOLアプリケーションの作成

COBOLプログラムの手続き部で、印刷属性の設定を行い、印刷フィールドにデータを渡したうえで、実際の印刷指示を発行します。これらの指示は 各ツールが用意しているプログラミングインタフェースによってなされます。例として シー・オー・リポーツの場合、以下のようなプログラミングになります。

      PROCEDURE DIVISION.
      MAIN-SHORI.
     * 初期化処理
          perform SHOKIKA-SHORI.
     * フォームの表示を行なう 1st page
          call "CO-PRINTFORM"  returning ret.
     * color-mono
          move  PRINT-COLOR to nindex.
          move  COLOR-MONO to param.
          call "CO-SETLONG" using  CO-SETLONG-PARM
                 returning         ret.
     *    保険(サンプル)1st page
          move "4" to TUKI-dat.
          move "熱田支店" to SITEN-dat.
          move "名古屋" to SIBU-dat.
          perform  SET-DATAFIELD.
     * 改頁処理
          call "CO-PRINTOUT"  returning  ret.
     * フォームの印刷 2nd page 
          call "CO-PRINTFORM"  returning ret.
     * 終了処理
          call "CO-TERM"      returning  ret.
          stop run.
     * 項目値の設定
      SET-DATAFIELD.
          move "TUKI" to field
          call "CO-PRINTDATAFIELD" using field TUKI returning ret.
          move "SITEN" to field
          call "CO-PRINTDATAFIELD" using field SITEN returning ret.
          move "SIBU" to field
          call "CO-PRINTDATAFIELD" using field SIBU returning ret.