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

メインフレームのデータセットをOpenFrameにマイグレーションするときに最も重要なことは、ソース・データセットのレイアウトを分析することです。そのためには、COBOLコピーブックまたはAIMのDBスキーマなどの情報を参考にして、データセット変換スキーマ・ファイルを作成する必要があります。

本付録では、作成されたスキーマ・ファイル(v5.1)の構造と形式、必要項目について説明します。

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

以下は、OpenFrameで提供するcobgensch、ndbgenschツールを使用して作成されたスキーマ・ファイル(v5.1)の構造です。

* Schema Version 5.1
 Label, Level, Field Name, Type, Length, Occurs, ODO Field

 * Condition
 Label, "Value", ( Label List )

以下は、各項目に関する説明です。

項目 説明

Label

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

Level

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

Field Name

フィールド名です。

Type

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

スキーマ・ファイルのType項目に対応するデータ型は以下のとおりです。

  • EBC_ASC: Single-byte Character

  • COPY: Binary

  • PACKED: Packed Decimal

  • U_PACKED: Unsigned Packed Decimal

  • ZONED: Zoned Decimal

  • U_ZONED: Unsigned Zoned Decimal

  • GRAPHIC: Double-byte Character

Length

フィールドの長さです。

Occurs

繰り返し回数です。

ODO Field

Occurs Depending Onが指し示すフィールド名です。

cobgensch、ndbgenschツールの詳細については、OpenFrame Base『ツールリファレンスガイド』とOpenFrame NDB『ツールリファレンスガイド』を参照してください。

  • COND文

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

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

    「FIELD_# : VALUE_#」条件が複数使用される場合は、各条件をコロン(:)で区切ることができ、各フィールドでは条件値(VALUE)を複数比較することができます。この条件値と一致する場合に、再定義文(REDEFINES)が使用されます。再定義文の詳細については、再定義文(REDEFINES)が使用されるデータセットを参照してください。

  • 条件句

    以下は、$$COND文に対応するスキーマ・ファイルの条件句の構造と説明です。

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

    Label(L#)

    再定義文に定義されているフィールドのラベル番号です。

    条件値(VALUE_#)

    再定義文で定義されたラベルのフィールド値と比較する値(VALUE)です。一致する場合、ラベル一覧の順序どおりレイアウトが構成されます。1つのラベルのフィールド値を複数の条件値と比較することができ、このときの条件値はORで結合されていると考えられます。

    複数ラベルの条件文をコンマ(,)で区切って条件値と比較することができます。

    Label List

    ラベルのフィールド値と条件値が一致する場合に構成されるラベルの順序を一覧で示します。

1.1. ODO(Occurs Depending On)項目

ODO文は、別のフィールドに保存されている値を参照して、OCCURS回数を決めるときに使用できるオプションです。下のコピーブックのサンプルではODOオプションを使用しています。ODO文に指定するOCCURS回数は、Min/Max(1つの繰り返し回数のみ指定された場合はMax値を意味する)値を意味しており、実際の繰り返し回数ではありません。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 5.1
 L1, 01, ROOT, NULL, 0, 1,
 L2, 03, AAA, EBC_ASC, 1, 1,
 L3, 03, ODO, NULL, 0, 10, AAA
 L4, 05, BBB, ZONED, 2, 1,
 L5, 03, CCC, EBC_ASC, 1, 5,

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

上記例で最終行のL0が存在するCondition文は、デフォルト条件の場合に構成されるレイアウト順を表示しています。詳細については、再定義文(REDEFINES)を参照してください。

1.2. 再定義文(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(5).

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

<スキーマ・ファイル>

0* Schema Version 5.1
 L1, 01, ROOT, NULL, 0, 1,
 L2, 03, AAA, EBC_ASC, 2, 1,
 L3, 03, BBB, EBC_ASC, 3, 1,
 L4, 03, BBB-1, ZONED, 3, 1,   # REDEFINES BBB
 L5, 03, CCC, EBC_ASC, 5, 1,

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

上記例でコピーブックとスキーマ・ファイルの条件文を比較すると、AAAというフィールド名に対応するのがL2(Label2)と同じで、このフィールドに該当する条件値が"AB"である場合に再定義文が実行されるので、L1、L2、L4、L5の順に作成されます。最後のL0は、デフォルトで構成されるレイアウト順をリストで表示したものです。

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

Copybook $$COND文に対応するスキーマ・ファイルのCondition句の条件値は、該当するフィールドのタイプを使用せずに、様々なタイプで指定して希望するタイプに変換することができます。条件値を記述するための二重引用符(" ")の前に、ユーザー指定のタイプを入力できます。条件値(VALUE)タイプの詳細については、再定義文(REDEFINES)が使用されるデータセットを参照してください。

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

タイプ 説明

!

NOT EQUALITYをチェックします。

'(empty)'

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

'A'

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

'E'

EBCDIC文字に変換します。

'P' or 'UP'

Packed Decimal、またはUnsigned Packed Decimal形式に変換します。

'Z' or 'UZ'

Zoned Decimal、またはUnsigned Zoned Decimal形式に変換します。

'G'

GRAPHIC(2Byte)文字に変換します。

'H'

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

'X'

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