スキーマ・ファイルの構造

メインフレーム・データセットをOpenFrameデータセットに変換する場合は、ソース・データセットのレイアウトを分析することが最も重要です。そのため、COBOLコピーブックまたはPL/Iインクルード・ファイルを参照して、データセット変換スキーマ・ファイルを作成する必要があります。

本付録では、作成されたスキーマ・ファイル(v7.1)の構造とデータセットの変換に必要な項目について説明します。

1. スキーマ・ファイルの構造(v7.1)

OpenFrameでは、cobgenschpligenschsqlgenschツールを使用してスキーマ・ファイルを作成することができます。

スキーマには、一般変換スキーマ動的変換スキーマがあります。

  • 一般変換スキーマ

    * Schema Version 7.1
     Label, Level, Field Name, Conversion Type, Sign Type, Length, Occurs, ODO Field
    
     * Condition
     Label, "Value", ( Label List )
  • 動的変換スキーマ

    動的変換スキーマには、一般変換スキーマに加えて、Redefine Group IDとRedefine Element IDが追加されています。以下は、動的変換スキーマ・ファイルの構造です。

    * Schema Version 7.1 - Dynamic conversion
     Label, Level, Field Name, Conversion type, Sign type, Length, Occurs, ODO Field, Redefine Group ID, Redefine Element ID
    
     * Condition
     Label, "Value", ( Label List )
  1. cobgensch、pligensch、sqlgenschツールについての詳細は、OpenFrame Base『ツールリファレンスガイド』を参照してください。

  2. 最新のOpenFrame/Baseツールのうちsqlgenschを使用して作成されたスキーマ・ファイルのバージョンは7.1バージョンと同じではないため、そのスキーマ・ファイルは移行に使用することができません。

以下は、スキーマ・ファイルの各項目についての説明です。

項目 説明

Label

フィールドの一意のラベル値です。

Level

フィールドのレベルです。

Field Name

フィールド名です。

Conversion Type

フィールドのデータ型です。

  • EBC_ASC : 1バイト文字

  • COPY : バイナリ

  • PACKED : パック10進数

  • U_PACKED : 符号なしパック10進数

  • ZONED : ゾーン10進数

  • U_ZONED : 符号なしゾーン10進数

  • GRAPHIC : 2バイト文字

Sign Type

数字フィールドに対してCOBOLのSIGN IS句で定義された符号タイプです。デフォルト値はTRAILINGです。

  • TRAILING : 2ビットの符号がフィールドの後に表示されます。

  • LEADING : 2ビットの符号がフィールドの前に表示されます。

  • TRAILING_SEPARATE : 1バイトの符号がフィールドの後に分離して表示されます。

  • LEADING_SEPARATE : 1バイトの符号がフィールドの前に分離して表示されます。

Length

フィールドの長さです。

Occurs

繰り返し回数です。

ODO Field

Occurs Depending Onが指しているフィールド名です。

Redefine Group ID

REDEFINES文を使用したグループIDです。

Redefine Element ID

Redefine Group ID内の各エレメントのIDです。

COND文

スキーマ・ファイルの条件句は、コピーブックのCOND文によって作成されます。COND文の構造は以下のとおりです。

$$COND : FIELD_01 : VALUE_01 (, VALUE02 … ) [: FIELD_02 : VALUE_03 (, VALUE04 ) … ] : REDEFINE_NAME [...]

「FIELD_# : VALUE_#」条件を複数指定する場合は、コロン(:)で区切ることが可能であり、各フィールドでは、条件値(VALUE)を複数比較することができます。条件値と一致すると、REDEFINES文が使用されます。

REDEFINES文の詳細については、REDEFINES文が使用されたデータセットを参照してください。

条件句

$$COND文に対応するスキーマ・ファイルの条件句の構造について説明します。

L#1, "VALUE_01" "VALUE02" …  [, L#2, "VALUE_03" "VALUE04 … ], ( Label List )
項目 説明

Label(L#)

REDEFINES文で定義されたフィールドのラベル番号です。

条件値(VALUE_#)

REDEFINES文で定義されたラベルのフィールド値と比較される値(VALUE)です。一致する場合は、ラベル・リストの順でレイアウトが構成されます。

1つのラベルのフィールド値を複数の条件値と比較できます。そのとき、条件値はORで結合されていると考えられます。複数のラベルの条件文をコンマ(,)で区切って条件値と比較することもできます。

Label List

ラベルのフィールド値と条件値が一致するときに構成されるラベルの順序リストです。

1.1. ODO(Occurs Depending On)項目

ODO句は、他のフィールドに保存されている値を参照して、OCCURS回数を決めるときに使用できるオプション項目です。下記のコピーブックは、ODOオプションを使用した例です。

ODO句で指定するOCCURS回数は、最小値/最大値(1つだけが指定されている場合は最大値)を表しており、実際の繰り返し回数ではありません。ODO句を追加しない場合は、OCCURS回数のデフォルト値として1が設定されます。

現在OpenFrameでは、レイアウト内に定義されているフィールドに対してのみODOフィールドを指定できます。レイアウト外に定義されたフィールドに対しては指定できません。

以下は、ODO項目が含まれているCOBOLコピーブックと作成されたスキーマ・ファイルの例です。

<COBOLコピーブック>

01 ROOT.
   03 AAA PIC X(1).
   03 ODO OCCURS 10 DEPENDING ON AAA.
     05 BBB PIC S9(2).
   03 CCC PIC X(1) OCCURS 5.

<スキーマ・ファイル>

* Schema Version 7.1
L1, 01, ROOT, NULL, NULL, 0, 1:1,
L2, 03, AAA, EBC_ASC, NULL, 1, 1:1,
L3, 03, ODO, NULL, NULL, 0, 1:10, AAA
L4, 05, BBB, ZONED, TRAILING, 2, 1:1,
L5, 03, CCC, EBC_ASC, NULL, 1, 1:5,

* Condition
L0, "\0", ( L1 L2 L3 L4 L5 )

上記の例では、L0で始まる条件文は、デフォルトのレイアウト順序リストを示しています。詳細については、REDEFINES文を参照してください。

1.2. REDEFINES文

REDEFINES文が含まれているレイアウトを持つデータセットは、分岐条件に関する情報が必要です。

REDEFINES文の詳細については、REDEFINES文が使用されたデータセットを参照してください。

以下は、REDEFINES文が使用されたCOBOLコピーブックとスキーマ・ファイルの例です。

<COBOLコピーブック>

01 ROOT.
   03 AAA PIC X(2).
   03 BBB PIC X(3).
   03 BBB-1 PIC S9(3) REDEFINES BBB.
   03 CCC PIC X(3).
   03 CCC-1 PIC 9(5) COMP-3 REDEFINES CCC.

$$COND : AAA : "AB" : BBB-1 ( multiple redefines can be defined here!)
$$COND : CCC : T"PACKED" : CCC-1

<スキーマ・ファイル>

* Schema Version 7.1
L1, 01, ROOT, NULL, NULL, 0, 1:1,
L2, 03, AAA, EBC_ASC, NULL, 2, 1:1,
L3, 03, BBB, EBC_ASC, NULL, 3, 1:1,
L4, 03, BBB-1, ZONED, TRAILING, 3, 1:1,  # REDEFINES BBB
L5, 03, CCC, EBC_ASC, NULL, 3, 1:1,
L6, 03, CCC-1, U_PACKED, NULL, 3, 1:1,  # REDEFINES CCC

* Condition
L2, "AB", ( L1 L2 L4 L5 )
L5, T"PACKED", ( L1 L2 L3 L6 )
L0, "\0", ( L1 L2 L3 L5 )

上記の例で、コピーブックとスキーマ・ファイルの最初の条件文を比較すると、AAAというフィールド名に対応するのがL2(Label2)であり、このフィールドに該当する条件値が"AB"の場合にREDEFINES文が実行されるため、L1、L2、L4、L5の順にフィールド・レイアウトが構成されます。2番目の条件文を比較すると、CCCというフィールド名に対応するのがL5(Label5)であり、このフィールドに該当する条件値がT"PACKED"の場合、つまり、L5に対応するオフセット値がパック10進数である場合にREDEFINES文が実行されるため、L1、L2、L3、L6の順にフィールド・レイアウトが構成されます。最後のL0は、デフォルトで構成されるレイアウト順序リストを表します。

1.3. 条件値(VALUE)のタイプ

コピーブックの$$COND文に対応されるスキーマ・ファイルの条件句の条件値は、複数のタイプで指定して必要に応じてフィールド・タイプを変換することができます。この場合、条件値を囲む二重引用符(" ")の前にユーザー指定のタイプを指定できます。

以下は、ユーザー指定のフィールド・タイプです。

タイプ 説明

! (感嘆符)

NOT EQUALITYをチェックします。

'(empty)'

フィールドのデフォルト・タイプに変換します。

'A'

入力値をASCII文字のまま使用します。

'E'

EBCDIC文字に変換します。

'P' または 'UP'

パック10進数または符号なしパック10進数フォーマットに変換します。

'Z' または 'UZ'

ゾーン10進数または符号なしゾーン10進数フォーマットに変換します。

'G'

GRAPHIC(2バイト)文字に変換します。

'H'

入力値を16進数値に変換します。(例: H"123" → 0x7B)

'X'

入力した2バイト値を1バイトの16進数値に変換します。(例: X"12AB" → 0x12 0xAB)

'T'

フィールド・タイプを確認します。サポートするタイプは以下のとおりです。

  • ZONED (ゾーン10進数)

  • PACKED (パック10進数)

  • GRAPHIC (2バイト文字)

  • CHAR (1バイト文字)

(例: T"ZONED"→ フィールドがゾーン10進数であるかどうかを確認)

条件値(VALUE)タイプについては、REDEFINES文が使用されたデータセットを参照してください。