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件です.
こんな感じで実行されます。
もどる