bea ホーム | 製品 | dev2dev | support | askBEA |
![]() |
![]() |
|
![]() |
e-docs > Tuxedo > COBOL を使用した Tuxedo アプリケーションのプログラミング > 型付きレコードの管理 |
COBOL を使用した Tuxedo アプリケーションのプログラミング
|
型付きレコードの管理
ここでは、次の内容について説明します。
型付きレコードの概要
ほかのアプリケーション・プログラムにデータを送信する場合、送信元プログラムはまず送信データをレコードに格納します。BEA Tuxedo システムのクライアントは、型付きレコードを使用してサーバにメッセージを送ります。「型付きレコード」とは、データ・レコードと補助型レコードが対になった COBOL 言語のレコードです。データ・レコードは、静的領域内に定義され、別のアプリケーション・プログラムに渡すアプリケーション・データが入ります。データ・レコードには、補助型レコードが付加されます。補助型レコードは、異機種システム間で情報をやり取りする場合に、BEA Tuxedo システムで使用されるデータ・レコードの解釈と変換の規則を指定します。型付きレコードは、BEA Tuxedo システムでサポートされる分散プログラミング環境の基本要素の 1 つです。
なぜ「型付き」レコードを使用するのでしょうか。分散環境では、アプリケーションが異機種システムにインストールされ、異なるプロトコルを使用して複数のネットワーク間で通信が行われます。レコード・タイプが異なると、初期化、メッセージの送受信、およびデータの符号化/復号化にそれぞれ別のルーチンが必要になります。各レコードに特定のタイプが割り当てられていると、プログラマが介在しなくても、そのタイプに対応するルーチンを自動的に呼び出すことができます。
以下に示す表は、BEA Tuxedo システムでサポートされる型付きレコードと、そのレコードが次の条件を満たしているかを示しています。
ルーティング用のルーチンが必要な場合は、アプリケーション・プログラマが用意します。
すべてのレコード・タイプは、$TUXDIR/lib ディレクトリの tmtypesw.c ファイルに定義されています。クライアント・プログラムとサーバ・プログラムで認識されるレコード・タイプは、tmtypesw.c に定義されているものだけです。tmtypesw.c ファイルを編集して、レコード・タイプを追加したり削除できます。また、UBBCONFIG の BUFTYPE パラメータを使用して、特定のサービスで処理できるタイプとサブタイプを制限できます。
tmtypesw.c ファイルは、共用オブジェクトやダイナミック・リンク・ライブラリのビルドに使用されます。このオブジェクトは、BEA Tuxedo 管理サーバ、およびアプリケーション・クライアントとアプリケーション・サーバによって動的にロードされます。
関連項目
型付きレコードの定義
TPTYPE-REC COBOL 構造体は、アプリケーション・データの送受信に必ず使用されます。
次の表は、TPTYPE-REC 構造体のフィールドを示しています。
次のコード例は、TPTYPE データ構造体を示しています。
05 REC-TYPE PIC X(8).
88 X-OCTET VALUE “X_OCTET”.
88 X-COMMON VALUE “X_COMMON”.
05 SUB-TYPE PIC X(16).
05 LEN PIC S9(9) COMP-5.
88 NO-LENGTH VALUE 0.
05 TPTYPE-STATUS PIC S9(9) COMP-5.
88 TPTYPEOK VALUE 0.
88 TPTRUNCATE VALUE 1.
VIEW 型レコード
VIEW 型レコードには 2 種類あります。1 つは FML VIEW で、FML レコードから生成される COBOL レコードです。もう 1 つは、単なる非依存型 COBOL レコードです。
FML レコードを COBOL レコードに変換して再び元に戻す理由 (および FML VIEW 型レコードを使用する目的) は、FML 関数が COBOL プログラミング環境では使用できないからです。
FML 型レコードの詳細については、『BEA Tuxedo FML リファレンス』を参照してください。
VIEW 型レコードを使用するには、次の手順に従います。
VIEW 型レコードの環境変数の設定
アプリケーションで VIEW 型レコードを使用するには、次の環境変数を設定します。
表 3-2 VIEW 型レコードの環境変数
VIEW 記述ファイルの作成 VIEW 型レコードを使用するには、VIEW 記述ファイルに COBOL レコードを定義する必要があります。VIEW 記述ファイルには、各エントリの VIEW、および COBOL プロシージャのマッピングと FML 変換パターンを記述した VIEW が定義されています。VIEW の名前は、COBOL プログラムに含まれる copy ファイルの名前に相当します。 VIEW 記述ファイルの各レコードは、次の形式で定義します。 $ /* VIEW 構造体 */ 次の表は、VIEW 記述ファイルに指定する必要がある各 COBOL レコードのフィールドを示しています。
VIEW viewname
type cname fbname count flag size null
行頭に # または $ 文字を付けてコメント行を挿入できます。行頭に $ が挿入されたコード行は、.h ファイルに出力されます。 次のコード例は、FML レコードに基づく VIEW 記述サンプル・ファイルの一部です。このコード例では、fbname フィールドを指定する必要があり、この値は対応するフィールド・テーブル・ファイルの値と一致していなければなりません。CARRAY1 フィールドのオカレンス・カウントが 2 に設定されていること、C フラグが設定されて追加のカウント・エレメントの作成が定義されていることに注目してください。また、L フラグが設定され、アプリケーションが CARRAY1 フィールドを格納するときの文字数を示す長さエレメントが定義されています。 コード リスト 0-1 FML VIEW の VIEW 記述ファイル 次のコード例は、同じ VIEW 記述ファイルで非依存型 VIEW のものを示しています。 コード リスト 0-2 非依存型 VIEW の VIEW 記述ファイル この形式は FML 依存型 VIEW と同じです。ただし、fbname フィールドと null フィールドには意味がなく、viewc コンパイラで無視されます。これらのフィールドには、プレースホルダとしてダッシュ (-) などの値を挿入する必要があります。 VIEW コンパイラの実行 VIEW 型レコードをコンパイルするには、引数として VIEW 記述ファイルの名前を指定して viewc -C コマンドを実行します。非依存型 VIEW を指定するには、-n オプションを使用します。生成される出力ファイルを書き込むディレクトリを指定することもできます (省略可能)。デフォルトでは、出力ファイルはカレント・ディレクトリに書き込まれます。 たとえば、FML 依存型 VIEW をコンパイルするには、次のようにコンパイラを実行します。 注記 VIEW32 型レコードをコンパイルするには、viewc32 -C コマンドを実行します。 非依存型 VIEW の場合、コマンド行で次のように -n オプションを指定します。 viewc コマンドでは、次が出力されます。
$ /* VIEW 構造体 */
VIEW MYVIEW
#type cname fbname count flag size null
float float1 FLOAT1 1 - - 0.0
double double1 DOUBLE1 1 - - 0.0
long long1 LONG1 1 - - 0
short short1 SHORT1 1 - - 0
int int1 INT1 1 - - 0
dec_t dec1 DEC1 1 - 9,16 0
char char1 CHAR1 1 - - '¥0'
string string1 STRING1 1 - 20 '¥0'
carray carray1 CARRAY1 2 CL 20 '¥0'
END$ /* VIEW データ構造体 */
VIEW MYVIEW
#type cname fbname count flag size null
float float1 - 1 - - -
double double1 - 1 - - -
long long1 - 1 - - -
short short1 - 1 - - -
int int1 - 1 - - -
dec_t dec1 - 1 - 9,16 -
char char1 - 1 - - -
string string1 - 1 - 20 -
carray carray1 - 2 CL 20 -
ENDviewc -C myview.v
viewc -C -n myview.v
注記 Microsoft Windows など、大文字と小文字が区別されないプラットフォームでは、バイナリ・バージョンのソース記述ファイル名には、拡張子 vv (myview.vv など) が使用されます。
次のコード例は、viewc によって生成される COBOL の COPY ファイルを示しています。
コード リスト 0-3 COBOL の COPY ファイルのコード例
* VIEWFILE: "myview.v"
* VIEWNAME: "MYVIEW"
05 FLOAT1 USAGE IS COMP-1.
05 DOUBLE1 USAGE IS COMP-2.
05 LONG1 PIC S9(9) USAGE IS COMP-5.
05 SHORT1 PIC S9(4) USAGE IS COMP-5.
05 FILLER PIC X(02).
05 INT1 PIC S9(9) USAGE IS COMP-5.
05 DEC1.
07 DEC-EXP PIC S9(4) USAGE IS COMP-5.
07 DEC-POS PIC S9(4) USAGE IS COMP-5.
07 DEC-NDGTS PIC S9(4) USAGE IS COMP-5.
* DEC-DGTS は実際のパック 10 進値です。
07 DEC-DGTS PIC S9(1)V9(16) COMP-3.
07 FILLER PIC X(07).
05 CHAR1 PIC X(01).
05 STRING1 PIC X(20).
05 FILLER PIC X(01).
05 L-CARRAY1 OCCURS 2 TIMES PIC 9(4) USAGE IS COMP-5.
* CARRAY1 の長さ
05 C-CARRAY1 PIC S9(4) USAGE IS COMP-5.
* CARRAY1 のカウント
05 CARRAY1 OCCURS 2 TIMES PIC X(20).
05 FILLER PIC X(02).
VIEW に対する COBOL の COPY ファイルは、COPY 文を使用してクライアント・プログラムとサービス・サブルーチンに含める必要があります。
このコード例では、コンパイラは FILLER ファイルを読み込んで、COBOL 言語コードでのフィールドの配置を C 言語コードでの配置と一致させています。
パック 10 進値の DEC1 は、5 つのフィールドから構成されます。このうちの DEC-EXP、DEC-POS、DEC-NDGTS、および FILLER フィールドは、C 言語だけで使用され、dec_t 型で定義されます。これらのフィールドは、COBOL レコードの配置を満たすために取り込まれます。COBOL アプリケーションでは、これらのフィールドを使用しないでください。
5 番目のフィールド (DEC-DGTS) には、システムによって実際のパック 10 進値が格納されます。COBOL プログラムではこの値を使用する必要があります。ATMI 呼び出しは、DEC-DGTS フィールドに以下の操作を行います。
唯一の制約として、COBOL 言語プログラムでは、ATMI インターフェイス外から C 言語関数に直接レコードを渡すことはできません。COBOL 言語プログラムと C 言語関数では 10 進数の形式が異なるからです。
最後に、COBOL の COPY サンプル・ファイルで L-CARRAY1 長さフィールドが 2 回使用されていることに注目してください。つまり、CARRAY1 と C-CARRAY1 カウント・フィールドに対して 1 回ずつ使用されています。
viewc は、C 言語バージョンのヘッダ・フィルを生成します。このファイルを使用すると、C と COBOL 言語のサービスやクライアント・プログラムを混在させることができます。
関連項目
FML 型レコード
FML インターフェイスは、C 言語で使用されるように設計されたものです。COBOL 言語に対しては、ルーチンが提供されています。そのため、受信した FML 型レコードを COBOL レコードに変換して処理した後で、FML 型に再度変換できます。
FML 型レコードを使用するには、次の手順に従います。
FML ルーチンは、フィールド化レコードから C 構造体への変換、またその逆の変換など、型付きレコードを操作する場合に使用します。これらの関数を使用すると、データ構造やデータの格納状態がわからなくても、データ値にアクセスしたり更新できます。FML ルーチンの詳細については、『BEA Tuxedo FML リファレンス』を参照してください。
FML 型レコードの環境変数の設定
アプリケーション・プログラムで FML 型レコードを使用するには、次の環境変数を設定する必要があります。
表 3-4 FML 型レコードの環境変数
フィールド・テーブル・ファイルの作成 FML 型レコードや FML 依存型 VIEW を使用する場合は、常にフィールド・テーブル・ファイルが必要です。フィールド・テーブル・ファイルは、FML 型レコードのフィールドの論理名をそのフィールドを一意に識別する文字列にマッピングします。 FML フィールド・テーブルの各フィールドは、次の形式で定義します。 次の表は、FML フィールド・テーブルに指定する必要がある FML フィールドを示しています。 表 3-5 フィールド・テーブル・ファイルのフィールド$ /* FML 構造体 */
*base value
name number type flags comments
すべてのフィールドは省略可能です。また、複数個使用できます。 コード リスト 0-4 FML VIEW のフィールド・テーブル・ファイル 型付きレコードの初期化 FML 型レコードは、FINIT プロシージャを使用して初期化する必要があります。TPINIT プロシージャは、指定された FML レコード (できればワード境界に配置されているレコード) を使用し、FMLINFO レコードの FML-LENGTH フィールドに長さとして指定された値を使用します。 TPNOCHANGE が設定されている場合は、プログラムによって (作成されたのではなく) 受信された FML レコードが自動的に初期化されます。その場合、FINIT を呼び出す必要はありません。 次のコード例は、初期化の方法を示しています。 コード リスト 0-5 FML/VIEW 変換 このコード例では、FVSTOF プロシージャで FML レコードを VIEW レコードに変換しています。VIEW を定義するために、VIEW コンパイラによって生成された copy ファイルが読み込まれています。FML-REC レコードには VIEWNAME と FML-MODE 転送モードがあり、転送モードには FUPDATE、FOJOIN、FJOIN、または FCONCAT を設定できます。これらのモードで行われる処理は、Fupdate、Fupdate32(3fml)、Fojoin、Fojoin32(3fml)、Fjoin、Fjoin32(3fml)、Fconcat、Fconcat32(3fml) での処理と同じです。 FVFTOS プロシージャは、VIEW レコードを FML レコードに変換しています。パラメータは FVSTOF プロシージャのパラメータと同じですが、FML-MODE を設定する必要はありません。各フィールドは、VIEW のエレメントの記述に基づいて、フィールド化レコードから構造体にコピーされます。フィールド化レコードのフィールドに対応するエレメントが COBOL レコードに存在しない場合、そのフィールドは無視されます。COBOL レコードに指定されたエレメントに対応するフィールドがフィールド化レコードに存在しない場合、そのエレメントに NULL 値がコピーされます。使用する NULL 値は、エレメントごとに VIEW 記述ファイルに定義できます。 フィールドの複数のオカレンスを COBOL レコードに格納するには、レコード・エレメントを OCCURS で定義します。レコードのフィールドのオカレンス数がエレメントのオカレンス数より少ない場合は、余分なエレメントには NULL 値が割り当てられます。また、レコードのフィールドのオカレンス数がエレメントのオカレンス数より多い場合は、余分なオカレンスは無視されます。 FML32 および VIEW32 では、FINIT32、FVSTOF32、および FVFTOS32 プロシージャを使用する必要があります。 正常終了した場合は、FML-STATUS に FOK が設定されます。エラーが発生した場合は、FML-STATUS に 0 以外の値が設定されます。 FML ヘッダ・ファイルの作成 クライアント・プログラムやサービス・サブルーチンで FML 型レコードを使用するには、FML ヘッダ・ファイルを作成し、アプリケーションの #include 文にそのヘッダ・ファイルを指定する必要があります。 フィールド・テーブル・ファイルから FML ヘッダ・ファイルを作成するには、mkfldhdr(1) コマンドを使用します。たとえば、myview.flds.h というファイルを作成するには、次のコマンドを入力します。 FML32 型レコードの場合は、mkfldhdr32 コマンドを使用します。 次のコード例は、mkfldhdr コマンドによって作成される myview.flds.h ヘッダ・ファイルを示しています。 コード リスト 0-6 myview.flds.h ヘッダ・ファイル アプリケーションの #include 文に新しいヘッダ・ファイルを指定します。ヘッダ・ファイルがインクルードされると、シンボリック名でフィールドを参照できるようになります。 関連項目# name number type flags comments
FLOAT1 110 float - -
DOUBLE1 111 double - -
LONG1 112 long - -
SHORT1 113 short - -
INT1 114 long - -
DEC1 115 string - -
CHAR1 116 char - -
STRING1 117 string - -
CARRAY1 118 carray - -WORKING-STORAGE SECTION.
*レコード・タイプおよび長さ
01 TPTYPE-REC.
COPY TPTYPE.
*呼び出しの状態
01 TPSTATUS-REC.
COPY TPSTATUS.
* サービス呼び出しフラグ/レコード
01 TPSVCDEF-REC.
COPY TPSVCDEF.
* TPINIT フラグ/レコード
01 TPINFDEF-REC.
COPY TPINFDEF.
* FML 呼び出しフラグ/レコード
01 FML-REC.
COPY FMLINFO.
*
*
* アプリケーション FML レコード - 配置
01 MYFML.
05 FBFR-DTA OCCURS 100 TIMES PIC S9(9) USAGE IS COMP-5.
* アプリケーション VIEW レコード
01 MYVIEW.
COPY MYVIEW......
* MYVIEW へのデータの移動
.....
* FML レコードの初期化
MOVE LENGTH OF MYFML TO FML-LENGTH.
CALL "FINIT" USING MYFML FML-REC.
IF NOT FOK
MOVE "FINIT Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM
END-IF.* VIEW の FML レコードへの変換
SET FUPDATE TO TRUE.
MOVE "MYVIEW" TO VIEWNAME.
CALL "FVSTOF" USING MYFML MYVIEW FML-REC.
IF NOT FOK
MOVE "FVSTOF Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM
END-IF.
* FML レコードを使用したサービスの呼び出し
MOVE "FML" TO REC-TYPE IN TPTYPE-REC.
MOVE SPACES TO SUB-TYPE IN TPTYPE-REC.
MOVE LENGTH OF MYFML TO LEN.
CALL "TPCALL" USING TPSVCDEF-REC
TPTYPE-REC
MYFML
TPTYPE-REC
MYFML
TPSTATUS-REC.
IF NOT TPOK
MOVE "TPCALL MYFML Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM
END-IF.
* FML レコードの MYVIEW への再変換
CALL "FVFTOS" USING MYFML MYVIEW FML-REC.
IF NOT FOK
MOVE "FVFTOS Failed" TO LOGMSG-TEXT
PERFORM DO-USERLOG
PERFORM EXIT-PROGRAM
END-IF.mkfldhdr myview.flds
/* fname fldid */
/* ----- ----- */
#define FLOAT1 ((FLDID)24686) /* 番号 : 110 タイプ : float */
#define DOUBLE1 ((FLDID)32879) /* 番号 : 111 タイプ : double */
#define LONG1 ((FLDID)8304) /* 番号 : 112 タイプ : long */
#define SHORT1 ((FLDID)113) /* 番号 : 113 タイプ : short */
#define INT1 ((FLDID)8306) /* 番号 : 114 タイプ : long */
#define DEC1 ((FLDID)41075) /* 番号 : 115 タイプ : string */
#define CHAR1 ((FLDID)16500) /* 番号 : 116 タイプ : char */
#define STRING1 ((FLDID)41077) /* 番号 : 117 タイプ : string */
#define CARRAY1 ((FLDID)49270) /* 番号 : 118 タイプ : carray */
XML 型レコード
XML 型レコードを使用すると、BEA Tuxedo アプリケーションで XML を使用して、アプリケーション内やアプリケーション間でデータを交換できるようになります。BEA Tuxedo アプリケーションでは、単純な XML 型レコードの送受信や、それらのレコードを適切なサーバにルーティングできます。解析など、XML 文書のすべての処理ロジックはアプリケーション側にあります。
XML 文書は、次の要素から構成されます。
イベント処理で行われるフォーマット処理とフィルタ処理は、STRING 型レコードが使用されている場合はサポートされますが、XML 型レコードではサポートされません。そのため、XML 型レコードのレコード・タイプ・スイッチ内の _tmfilter と _tmformat のポインタは、LOW-VALUE に設定されます。
BEA Tuxedo システムの XML パーサは、次の操作を行います。
XML 型レコードでは、データ依存型ルーティングがサポートされています。XML 文書のルーティングは、エレメントの内容、またはエレメントのタイプと属性値に基づいて行われます。使用される文字符号化は XML パーサによって判別されます。符号化が BEA Tuxedo のコンフィギュレーション・ファイル (UBBCONFIG と DMCONFIG) で使用されるネイティブな文字セット (US-ASCII または EBCDIC) と異なる場合、エレメントと属性名は US-ASCII または EBCDIC に変換されます。
XML 文書には、ルーティング用に設定する属性を含めなければなりません。属性がルーティング基準として設定されていても XML 文書に含まれていない場合、ルーティング処理は失敗します。
エレメントの内容と属性値は、ルーティング・フィールド値の構文とセマンティクスに従っていることが必要です。また、ルーティング・フィールド値のタイプも指定しなければなりません。XML でサポートされるのは文字データだけです。範囲フィールドが数値の場合、そのフィールドの内容や値はルーティング処理時に数値に変換されます。
関連項目
![]() |
![]() |
![]() |
![]() |
||
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |