4.8.1 COBOL言語でのSPP.NETの実装

COBOL言語でSPP.NETを実装する方法として次の二つの方法があります。

ここでは,オブジェクト指向型SPP.NETおよび手続き型SPP.NETを作成する方法について説明します。

<この項の構成>
(1) オブジェクト指向型SPP.NET
(2) 手続き型SPP.NET
(3) SPP.NETのコンパイル

(1) オブジェクト指向型SPP.NET

オブジェクト指向型SPP.NETは,SPP.NETの標準のアプリケーション開発形態である「オブジェクト指向」で作成します。サービスをクラスのメソッドとして記述し,複数のサービスを統括するクラス定義を記述します。

図4-1 オブジェクト指向型SPP.NETのクラス定義

[図データ]

オブジェクト指向でSPP.NETを作成する場合,サービスをクラスのメソッドとして記述します。メソッド名はサービス名と同じにします。

(a) オブジェクト指向型SPP.NETを実装する場合の規則

オブジェクト指向型SPP.NETを実装する場合は,次の規則に従ってクラスを実装します。

(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にする場合は,この方法が適しています。

図4-2 手続き型SPP.NETの定義と制御

[図データ]

(a) 手続き型SPP.NETを実装する場合の規則

手続き型SPP.NETを実装する場合は,次の規則に従ってクラスを実装します。

(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のアプリケーションの作成と同様の方法でコンパイルしてください。

なお,次の点に注意してください。