Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 TP1/Extension for .NET Framework 使用の手引


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

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

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

〈この項の構成〉

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

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

図4‒1 オブジェクト指向型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にする場合は,この方法が適しています。

図4‒2 手続き型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オプションを設定してください。