NetCOBOLからSymfowareに接続する




富士通のNetCOBOLから、これまた富士通のデータベースサーバー
Symfowareに接続し、データを取得する方法を調べたのでメモ。

NetCOBOLのリファレンスを見ると、ODBC接続のサンプルソースが
あったのですが、今回はせっかくなのでSymfowareのサンプルを
試してみようと思います。


大まかなプログラム作成の流れは、

Symfowareに発行するSQLを含んだソースを作成。
この時点では、COBOLとしては解釈できない内容。
※これをsample.scobとします。

Symfoware付属の「SQLPCOB」コマンドにより、
上記で作成したsample.scobをsample.cobに変換。
これでCOBOLとして解釈できる内容となります。

後は、通常のソースと同じくコンパイル、リンクという作業を
実施します。


簡単な例として、
+-------------+---------------+
|番号[char(5)]|名前[nchar(20)]|
+-------------+---------------+
というフィールドを持つ、テーブルにアクセスしてみます。

データベース名:「TEST」
スキーマ名:「SC_TEST」、
テーブル名:「M_USER」
とします。

ソースはこんな感じ。
※ほとんどサンプルのままですが。

■sample.scob

000010 IDENTIFICATION   DIVISION.
000020 PROGRAM-ID.      SAMPLE_SYM.
000030 ENVIRONMENT      DIVISION.
000040  CONFIGURATION SECTION.
000050  SPECIAL-NAMES.
000060     CONSOLE IS CONS.
000070 DATA             DIVISION.
000080 WORKING-STORAGE  SECTION.
000090*
000100      EXEC SQL BEGIN DECLARE SECTION END-EXEC.
000110 01  SQLSTATE     PIC X(5).
000120 01  SQLMSG       PIC X(255).
000130 01  HCOMPWORD    PIC X(5).
000140 01  HNUMBER      PIC X(5).
000150 01  HNAME     PIC N(20).
000160      EXEC SQL END DECLARE SECTION END-EXEC.
000170*
000180 01  FLAG1        PIC X.
000190 01  COUNT1       PIC 9(4).
000200 01  COUNT2       PIC 9(9).
000210 01  WORK         PIC X(12).
000220*
000230 PROCEDURE        DIVISION.
000240 MAIN             SECTION.
000250      EXEC SQL DECLARE M_USER TABLE ON SC_TEST END-EXEC.
000260      EXEC SQL DECLARE CSR1 CURSOR FOR
000270                 SELECT * FROM M_USER
000280                   WHERE 番号 LIKE :HCOMPWORD END-EXEC.
000290      DISPLAY  "  入力された番号に該当するデータを取り出します".
000300 GET-TELNO.
000310      DISPLAY  "  番号を入力してください >> ".
000320      ACCEPT  HCOMPWORD FROM CONS.
000330      DISPLAY  "  番号" HCOMPWORD UPON CONS.
000340      DISPLAY  "  のデータでよろしいですか?".
000350      DISPLAY  "  よろしかったら(Y/y)を入力してください >>".
000360      ACCEPT  FLAG1.
000370      IF  FLAG1 NOT = "Y"  AND  FLAG1 NOT = "y"
000380        GO  TO  GET-TELNO
000390      END-IF.
000400      MOVE  0  TO  COUNT1.
000410      EXEC SQL WHENEVER SQLERROR GOTO :CONNECT-ERROR END-EXEC.
000420      EXEC SQL CONNECT TO 'TEST' END-EXEC.
000430      EXEC SQL WHENEVER SQLERROR GOTO :STM-ERROR END-EXEC.
000440      EXEC SQL WHENEVER NOT FOUND GOTO :NOT-FOUND-ERROR END-EXEC.
000450      EXEC SQL OPEN CSR1 END-EXEC.
000460      MOVE  0  TO  COUNT2.
000470 FETCH-CURSOR.
000480      EXEC SQL FETCH CSR1
000490         INTO :HNUMBER,:HNAME  END-EXEC.
000500      ADD  1  TO  COUNT2.
000510      DISPLAY  "  番号  名前".
000520      DISPLAY  HNUMBER "   " HNAME.
000530      GO  TO FETCH-CURSOR.
000540 NOT-FOUND-ERROR.
000550      IF  COUNT2 NOT = 0  DISPLAY "   該当データは" COUNT2 "件です."
000560        ELSE              DISPLAY  "  該当データはありません."
000570      END-IF.
000580      EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
000590      EXEC SQL ROLLBACK WORK END-EXEC.
000600      EXEC SQL DISCONNECT 'TEST' END-EXEC.
000610      MOVE  0  TO  PROGRAM-STATUS.
000620      EXIT PROGRAM.
000630 STM-ERROR.
000640      EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
000650      EXEC SQL ROLLBACK WORK END-EXEC.
000660      EXEC SQL DISCONNECT 'TEST' END-EXEC.
000670      EXIT PROGRAM.
000680 CONNECT-ERROR.
000690      DISPLAY  "SQLSTATE :"  SQLSTATE.
000700      DISPLAY  "SQLMSG :  "  SQLMSG.
000710      EXIT PROGRAM.



これをSymfo付属のSQLPCOBコマンドでCOBOLのソースに変換してやります。

SQLPCOB -g sample.scob


実行すると、sample.cobというソースが出来上がるかと思います。

後はコンパイルとリンクです。
COBOLプロジェクトマネージャを起動して、
「ツール」-「翻訳」を選択します。


WINCOB画面が表示されます。
参照を押して、作成したsample.cobファイルを選択します。


オプションボタンを押し、翻訳オプション画面を開きます。
翻訳オプションの追加を押します。


翻訳オプションの設定画面を開き、
「主プログラムとして翻訳する」
「MAIN-システムのコンソールを使用するアプリケーション」
の2つを選択してOK


翻訳オプション画面の翻訳オプションに
「MAIN(MAIN)」
が追加されていることを確認して、OKを押します。

最初のWINCOB画面に戻り「翻訳」を押すと、ビルドが実行されます。
これで、sample.objファイルが同一のフォルダに作成されます。


次にリンク作業を行い、exeを作成します。
COBOLプロジェクトマネージャから
「ツール」-「リンク」を選択します。

WINLINK[リンク]画面が表示されます。
リンク対象のファイルに
翻訳で作成したsample.objファイル
Symfowareのライブラリ
※デフォルトでC:\SFWCLNT\ESQL\LIB以下のファイル
を選択します。


この状態で、リンクを押すとsample.exeが作成されます。

早速実行してみると・・・

>SAMPLE.EXE
  入力された番号に該当するデータを取り出します
  番号を入力してください >>
JMP0201A-I [PID:00000FF4 TID:00000D44] データを入力して下さい.
00001
  番号00001
  のデータでよろしいですか?
  よろしかったら(Y/y)を入力してください >>
Y
  番号 名前
00001 登録した名前
  該当データは000000001件です.


こんな感じで実行されます。




もどる