COBOL言語でSPP.NETを実装する方法として次の二つの方法があります。
ここでは,オブジェクト指向型SPP.NETおよび手続き型SPP.NETを作成する方法について説明します。
オブジェクト指向型SPP.NETは,SPP.NETの標準のアプリケーション開発形態である「オブジェクト指向」で作成します。サービスをクラスのメソッドとして記述し,複数のサービスを統括するクラス定義を記述します。
図4-1 オブジェクト指向型SPP.NETのクラス定義
オブジェクト指向でSPP.NETを作成する場合,サービスをクラスのメソッドとして記述します。メソッド名はサービス名と同じにします。
オブジェクト指向型SPP.NETを実装する場合は,次の規則に従ってクラスを実装します。
仮引数 | 渡し方 | 型 | 説明 |
---|---|---|---|
第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.
オブジェクト指向型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.
手続き型SPP.NETは,サービスプログラムを手続き型のプログラム定義を使って記述します。サーバプログラムは,オブジェクトサーバの形態を取る必要があるため,COBOL言語の手続き型プログラムであるサービスプログラムを呼び出すための,COBOL言語のクラス定義が必要になります。このクラス定義で構成されるCOBOL言語のプログラムを,手続き型用ラッパプログラムと呼びます。この手続き型用ラッパプログラムのクラス定義では,サービスプログラムと同じ名前のメソッドを定義します。そして,そのメソッドの中身は,メソッドの仮引数のバイト配列を英数字項目に変換する処理と,サービスプログラムをCALL文で呼び出すだけにします。既存のSPPをSPP.NETにする場合は,この方法が適しています。
図4-2 手続き型SPP.NETの定義と制御
手続き型SPP.NETを実装する場合は,次の規則に従ってクラスを実装します。
仮引数 | 渡し方 | 型 | 説明 |
---|---|---|---|
第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.
手続き型用ラッパプログラムは,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.
SPP.NETのコンパイルには,コマンドライン上でコンパイルする方法とVisual Studio上でコンパイルする方法があります。
次のようにコンパイルします。
Visual Studio上でコンパイルする場合は,通常のCOBOL2002 for .NET Frameworkのアプリケーションの作成と同様の方法でコンパイルしてください。
なお,次の点に注意してください。