4.8.1 COBOL言語でのSPP.NETの実装
COBOL言語でSPP.NETを実装する方法として次の二つの方法があります。
-
オブジェクト指向でSPP.NETを作成する(オブジェクト指向型SPP.NET)
-
手続き型のプログラム定義でSPP.NETを作成する(手続き型SPP.NET)
ここでは,オブジェクト指向型SPP.NETおよび手続き型SPP.NETを作成する方法について説明します。
(1) オブジェクト指向型SPP.NET
オブジェクト指向型SPP.NETは,SPP.NETの標準のアプリケーション開発形態である「オブジェクト指向」で作成します。サービスをクラスのメソッドとして記述し,複数のサービスを統括するクラス定義を記述します。
|
オブジェクト指向でSPP.NETを作成する場合,サービスをクラスのメソッドとして記述します。メソッド名はサービス名と同じにします。
(a) オブジェクト指向型SPP.NETを実装する場合の規則
オブジェクト指向型SPP.NETを実装する場合は,次の規則に従ってクラスを実装します。
-
PROPAGATE翻訳指令を使って例外自動伝播(propagate)をOFFにしてください。PROPAGATE翻訳指令の詳細については,マニュアル「COBOL2002 for .NET Framework 言語」を参照してください。
-
Hitachi.OpenTP1.Server.SPPBaseクラスを継承します。
-
リポジトリ段落で,継承するHitachi.OpenTP1.Server.SPPBaseクラスとサービスメソッドの仮引数で使用するSystem.Byte配列を参照するように指定します。
-
PUBLICクラスとして宣言します。
-
SPP.NETのサービスメソッドをPUBLICメソッドとして実装します。なお,メソッド名はSPP.NETのサービス名になります。
-
SPP.NETの初期化処理はInitializeSPPメソッド,終了時処理はFinalizeSPPメソッドで実装します。それぞれの処理が不要な場合はInitializeSPPメソッド,またはFinalizeSPPメソッドを実装する必要はありません。
-
SPP.NETのサービスメソッドとするために,TP1RPCMETHOD指令を付加する必要があります。TP1RPCMETHOD指令については,マニュアル「COBOL2002 for .NET Framework 言語」を参照してください。
-
サービスメソッドの仮引数は,常に次の四つの引数を指定します。
仮引数
渡し方
型
説明
第1引数
値渡し
バイト配列オブジェクト
入力パラメタのバイト配列
第2引数
値渡し
PIC S9(9) COMP-5
入力パラメタ長
第3引数
値渡し
バイト配列オブジェクト
出力パラメタのバイト配列
第4引数
参照渡し
PIC S9(9) COMP-5
出力パラメタ長
引数の定義例を次に示します。
REPOSITORY. CLASS BYTE-ARRAY AS 'System.Byte' IS ARRAY. … LINKAGE SECTION. 01 INDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 INDATA-LEN PIC S9(9) COMP-5. 01 OUTDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING BY VALUE INDATA INDATA-LEN OUTDATA BY REFERENCE OUTDATA-LEN.
(b) オブジェクト指向型SPP.NETのコーディング例
オブジェクト指向型SPP.NETのコーディング例を次に示します。
>> PROPAGATE OFF IDENTIFICATION DIVISION. CLASS-ID. MYSPP AS "MYAPPLICATION.MYSPP" IS PUBLIC INHERITS SPPBASE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS SPPBASE AS 'Hitachi.OpenTP1.Server.SPPBase'. CLASS BYTE-ARRAY AS 'System.Byte' IS ARRAY. IDENTIFICATION DIVISION. OBJECT. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. * SPP初期化および終了処理メソッドの実装 IDENTIFICATION DIVISION. METHOD-ID. InitializeSPP IS PUBLIC OVERRIDE. PROCEDURE DIVISION. * SPPの初期化処理 END METHOD InitializeSPP. IDENTIFICATION DIVISION. METHOD-ID. FinalizeSPP IS PUBLIC OVERRIDE. PROCEDURE DIVISION. * SPPの終了処理 END METHOD FinalizeSPP. * サービスメソッド定義 (引数の並びは固定です) * クライアントからRPCで呼び出されます >> TP1RPCMETHOD IDENTIFICATION DIVISION. METHOD-ID. SERVICE1 IS PUBLIC. DATA DIVISION. LINKAGE SECTION. 01 INDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 INDATA-LEN PIC S9(9) COMP-5. 01 OUTDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING BY VALUE INDATA INDATA-LEN OUTDATA BY REFERENCE OUTDATA-LEN. * SERVICE1の処理 END METHOD SERVICE1. >> TP1RPCMETHOD IDENTIFICATION DIVISION. METHOD-ID. SERVICE2 IS PUBLIC. DATA DIVISION. LINKAGE SECTION. 01 INDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 INDATA-LEN PIC S9(9) COMP-5. 01 OUTDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING BY VALUE INDATA INDATA-LEN OUTDATA BY REFERENCE OUTDATA-LEN. * SERVICE2の処理 END METHOD SERVICE2. * SPP内部メソッドの実装(自由に実装できます) * RPCで呼び出すことはできません IDENTIFICATION DIVISION. METHOD-ID. GETUSERINFO IS PUBLIC. DATA DIVISION. LINKAGE SECTION. PROCEDURE DIVISION. * 処理 END METHOD GETUSERINFO. IDENTIFICATION DIVISION. METHOD-ID. PUTERRORLOG IS PRIVATE. DATA DIVISION. LINKAGE SECTION. PROCEDURE DIVISION. * 処理 END METHOD PUTERRORLOG. END OBJECT. END CLASS MYSPP.
(2) 手続き型SPP.NET
手続き型SPP.NETは,サービスプログラムを手続き型のプログラム定義を使って記述します。サーバプログラムは,オブジェクトサーバの形態を取る必要があるため,COBOL言語の手続き型プログラムであるサービスプログラムを呼び出すための,COBOL言語のクラス定義が必要になります。このクラス定義で構成されるCOBOL言語のプログラムを,手続き型用ラッパプログラムと呼びます。この手続き型用ラッパプログラムのクラス定義では,サービスプログラムと同じ名前のメソッドを定義します。そして,そのメソッドの中身は,メソッドの仮引数のバイト配列を英数字項目に変換する処理と,サービスプログラムをCALL文で呼び出すだけにします。既存のSPPをSPP.NETにする場合は,この方法が適しています。
|
(a) 手続き型SPP.NETを実装する場合の規則
手続き型SPP.NETを実装する場合は,次の規則に従ってクラスを実装します。
-
Hitachi.OpenTP1.Server.SPPBaseクラスを継承します。
-
リポジトリ段落で,継承するHitachi.OpenTP1.Server.SPPBaseクラスとサービスメソッドの仮引数で使用するSystem.Byte配列を参照するように指定します。
-
PUBLICクラスとして宣言します。
-
SPP.NETのサービスメソッドをPUBLICメソッドとして実装します。なお,メソッド名はSPP.NETのサービス名になります。
-
SPP.NETの初期化処理はInitializeSPPメソッド,終了時処理はFinalizeSPPメソッドで実装します。それぞれの処理が不要な場合はInitializeSPPメソッド,またはFinalizeSPPメソッドを実装する必要はありません。
-
SPP.NETのサービスメソッドとするために,TP1RPCMETHOD指令を付加する必要があります。TP1RPCMETHOD指令については,マニュアル「COBOL2002 for .NET Framework 言語」を参照してください。
-
サービスメソッドの仮引数は,常に次の四つの引数を指定します。
仮引数
渡し方
型
説明
第1引数
値渡し
バイト配列オブジェクト
入力パラメタのバイト配列
第2引数
値渡し
PIC S9(9) COMP-5
入力パラメタ長
第3引数
値渡し
バイト配列オブジェクト
出力パラメタのバイト配列
第4引数
参照渡し
PIC S9(9) COMP-5
出力パラメタ長
引数の定義例を次に示します。
REPOSITORY. CLASS BYTE-ARRAY AS 'System.Byte' IS ARRAY. … LINKAGE SECTION. 01 INDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 INDATA-LEN PIC S9(9) COMP-5. 01 OUTDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING BY VALUE INDATA INDATA-LEN OUTDATA BY REFERENCE OUTDATA-LEN.
-
サービスをプログラム定義で記述します。プログラム名はサービス名と同じにします。また,引数は次のようにします。
仮引数
渡し方
型
説明
第1引数
参照渡し
PIC X(n)または集団項目
入力パラメタのバイト列
第2引数
参照渡し
PIC S9(9) COMP-5
入力パラメタ長
第3引数
参照渡し
PIC X(m)または集団項目
出力パラメタのバイト列
第4引数
参照渡し
PIC S9(9) COMP-5
出力パラメタ長
引数の定義例を次に示します。
LINKAGE SECTION. 01 INDATA PIC X(n). 01 INDATA-LEN PIC S9(9) COMP-5. 01 OUTDATA PIC X(m). 01 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING INDATA INDATA-LEN OUTDATA OUTDATA-LEN.
(b) 手続き型SPP.NETのコーディング例
■ 手続き型用ラッパプログラム
手続き型用ラッパプログラムは,SPP.NETの実装クラスを定義し,各サービスプログラムを呼び出すためのプログラムです。手続き型用ラッパプログラムのコーディング例を次に示します。
IDENTIFICATION DIVISION. CLASS-ID. MYSPP AS "MYAPPLICATION.MYSPP" IS PUBLIC INHERITS SPPBASE. ENVIRONMENT DIVISION. CONFIGURATION SECTION. REPOSITORY. CLASS SPPBASE AS 'Hitachi.OpenTP1.Server.SPPBase'. CLASS BYTE-ARRAY AS 'System.Byte' IS ARRAY. IDENTIFICATION DIVISION. OBJECT. DATA DIVISION. WORKING-STORAGE SECTION. PROCEDURE DIVISION. * SPP初期化および終了処理メソッドの実装 IDENTIFICATION DIVISION. METHOD-ID. InitializeSPP IS PUBLIC OVERRIDE. PROCEDURE DIVISION. * SPPの初期化処理 END METHOD InitializeSPP. IDENTIFICATION DIVISION. METHOD-ID. FinalizeSPP IS PUBLIC OVERRIDE. PROCEDURE DIVISION. * SPPの終了処理 END METHOD FinalizeSPP. * サービスメソッド定義 (引数の並びは固定です) * クライアントからRPCで呼び出されます >> TP1RPCMETHOD IDENTIFICATION DIVISION. METHOD-ID. SERVICE1 IS PUBLIC. DATA DIVISION. LOCAL-STORAGE SECTION. 01 INDATA-X PIC X(n). 01 OUTDATA-X PIC X(m). LINKAGE SECTION. 01 INDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 INDATA-LEN PIC S9(9) COMP-5. 01 OUTDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING BY VALUE INDATA INDATA-LEN OUTDATA BY REFERENCE OUTDATA-LEN. * バイト配列から英数字項目への変換 CALL 'CBLBYTEARRAYTOX' USING INDATA INDATA-LEN INDATA-X. * サービスプログラムの呼び出し CALL 'SERVICE1' USING INDATA-X INDATA-LEN OUTDATA-X OUTDATA-LEN. * 英数字項目からバイト配列への変換 CALL 'CBLXTOBYTEARRAY' USING OUTDATA-X OUTDATA OUTDATA-LEN. END METHOD SERVICE1. >> TP1RPCMETHOD IDENTIFICATION DIVISION. METHOD-ID. SERVICE2 IS PUBLIC. DATA DIVISION. LOCAL-STORAGE SECTION. 01 INDATA-X PIC X(n). 01 OUTDATA-X PIC X(m). LINKAGE SECTION. 01 INDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 INDATA-LEN PIC S9(9) COMP-5. 01 OUTDATA USAGE OBJECT REFERENCE BYTE-ARRAY. 01 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING BY VALUE INDATA INDATA-LEN OUTDATA BY REFERENCE OUTDATA-LEN. * バイト配列から英数字項目への変換 CALL 'CBLBYTEARRAYTOX' USING INDATA INDATA-LEN INDATA-X. * サービスプログラムの呼び出し CALL 'SERVICE2' USING INDATA-X INDATA-LEN OUTDATA-X OUTDATA-LEN. * 英数字項目からバイト配列への変換 CALL 'CBLXTOBYTEARRAY' USING OUTDATA-X OUTDATA OUTDATA-LEN. END METHOD SERVICE2. END OBJECT. END CLASS MYSPP.
■ サービスプログラム
サービスプログラムは手続き型のプログラムとして作成します。既存のSPPからSPP.NETに移行する場合,SPPのサービスプログラムはそのままSPP.NETのサービスプログラムとして使用できます。サービスプログラムの詳細については,マニュアル「OpenTP1 プログラム作成リファレンス COBOL言語編」を参照してください。
引数の定義例を次に示します。
IDENTIFICATION DIVISION. PROGRAM-ID. SERVICE1. DATA DIVISION. WORKING-STORAGE SECTION. LINKAGE SECTION. 77 INDATA PIC X(n). 77 INDATA-LEN PIC S9(9) COMP-5. 77 OUTDATA PIC X(m). 77 OUTDATA-LEN PIC S9(9) COMP-5. PROCEDURE DIVISION USING INDATA INDATA-LEN OUTDATA OUTDATA-LEN. * SERVICE1の処理 END PROGRAM SERVICE1.
(3) SPP.NETのコンパイル
SPP.NETのコンパイルには,コマンドライン上でコンパイルする方法とVisual Studio上でコンパイルする方法があります。
(a) コマンドラインでのコンパイル方法
次のようにコンパイルします。
- 注※1
-
手続き型SPP.NETプログラムで作成する場合に指定します。
- 注※2
-
COBOL言語のプログラムの中で従来のSPPで使用していたTP1/ServerのCOBOL言語のサービスルーチンを利用する場合に指示ファイルを指定します。詳細については,「4.8.3 TP1/ServerのCOBOL言語のサービスルーチンの利用」を参照してください。
(b) Visual Studio上でコンパイルする場合
Visual Studio上でコンパイルする場合は,通常のCOBOL2002 for .NET Frameworkのアプリケーションの作成と同様の方法でコンパイルしてください。
なお,次の点に注意してください。
-
必ず[プロジェクト]−[参照の追加]で,コンポーネント名「TP1/Extension for .NET Framework Class Library」を選択してください。
-
TP1/ServerのCOBOL言語のサービスルーチンを利用する場合には,コンパイラオプションの設定で,P/Invoke指示ファイルを引数とした-PInvokeオプションを設定してください。