FDT のレコード構造

このドキュメントでは、データベース内のファイルのレイアウトを定義するための構文とデータ定義の使用について説明します。この入力内容は、ADAFDU ユーティリティの入力であるシーケンシャルファイル FDUFDT で使用されます。

データ定義は、そのファイルのフィールド定義テーブル(FDT)を作成するのに使用されます。このテーブルは、Adabas コマンド実行中にファイル内のすべてのフィールド(またはグループ)の論理構造と特徴を判断するために Adabas が使用します。

このドキュメントでは、次のトピックについて説明します。


データ定義構文

定義対象となるフィールド(またはグループ)ごとに別々のデータ定義ステートメントが要求されます。

データ定義エントリを構成するのに使用される構文は次のとおりです。

level-number, name [,standard_length, standard_format] [(,definition_option)...]

レベル番号および名前は必須です。1 行内にある各定義エントリの間には空白をいくつでも挿入できます。セミコロンの後のテキストは、すべてコメントとして扱われ、セミコロンで開始された行は、コメント行として扱われます。空白行は何行あってもかまいません。

レベル番号

フィールドのグループに関しては、01 から 07 までの範囲内の 1 桁ないし 2 桁の番号が、レベル番号として使用されます。先頭にゼロは付けても付けなくてもかまいません。01 から 07 までの範囲でフィールドのレベルを定義できますが、02 以降のレベル番号を持つフィールドは、そのレベルよりも 1 つ若いレベルのグループのメンバとみなされます。

グループのレベルは、01 から 06 までの範囲で定義でき、グループの中にグループを入れることができます。グループに対してレベル番号を割り当てる場合、レベル番号を飛ばして指定することはできません。

グループ定義を行うことによって、ユーザーはそのグループ名を使用することで一連のフィールド(1 フィールドのみでも可能)を参照することができます。これは一連の連続フィールドを参照するのに便利で効果的な方法です。

01,GA     ; Group
02,A1,...    ; Elementary or Multiple Value field
02,A2,...    ; Elementary or Multiple Value field
01,GB     ; Group
02,B1,...    ; Elementary or Multiple Value field
02,GC     ; Group
03,C1,...    ; Elementary or Multiple Value field
03,C2,...    ; Elementary or Multiple Value field

フィールド A1 および A2 は、グループ GA に属します。フィールド B1 およびグループ GC(フィールド C1 および C2 からなる)は、グループ GB に属します。ピリオド(...)は、その先にも定義が続くことを表しています。

名前

フィールドまたはグループに割り当てられる名前です。

名前の長さは 2 文字でなければなりません。最初の文字はアルファベット、2 番目の文字はアルファベットまたは数字にする必要があります。大文字と小文字を使用できます。特殊文字は使用できません。単一の Adabas レコードでは、最大 3214 個のフィールドを定義できます。

E0 から E9 までの値は、編集マスクとして予約されているので使用できません(編集マスクの詳細については、『Adabas コマンドリファレンスマニュアル』の「Adabas の呼び出し」を参照)。

名前はファイル内でユニークでなければなりません。英語の前置詞および冠詞等に該当する AN、AT、BY、IF、IN、OF、ON 等の文字列は、NATURAL が使用する構文用語との混同をまねく恐れがあるので使用しないでください。

Valid Names       Invalid Names
-----------       -------------
    
    AA                A  (not 2 characters)
    e3                E3 (edit mask)
    S3                F* (special character)
    wm                3M (first character not alphabetic)

標準長

フィールドの標準長(バイト単位)です。標準長は、コマンド処理中に Adabas によって使用される(デフォルトの)標準長を定義するのに使用されます。標準長を指定すると、フィールド定義テーブル(FDT)に格納され、フィールドの読み込み/更新時に、ユーザーから特に長さの指定がない場合に使用されます。

指定できる最大フィールド長は次のとおりです。

フォーマット 最大長
ALPHANUMERIC LA、L4/LB オプション:LOB ファイルが定義されていない場合、またはフィールドがディスクリプタまたは派生ディスクリプタの親である場合は、16381 バイトです。その他の場合は、LA フィールドが 65533 バイト、L4/LB オプションが 2147483543 バイトです。その他のフィールドは253 バイト
BINARY 126 バイト
FIXED POINT 8 バイト(1、2、4、8 バイトのみ可能)
浮動小数点 8 バイト(4、8 バイトのみ可能)
PACKED DECIMAL 15 バイト
UNPACKED DECIMAL 29 バイト
Unicode LA、L4 オプション:UTF-8 エンコードで 16381 バイト
その他:UTF-8 エンコードで 253 バイト(下記の注意参照)

注意:
Unicode フィールドの長さは使用されるエンコードに依存します。内部的に、Adabas は、Unicode フィールドを格納するために、UTF-8 エンコードを使用しますが、Adabas ユーザーは、Unicode フィールドにアクセスするために他のエンコードを使用することが可能であり、このエンコードを使用するフィールドに対して決まった最大サイズはありません。

標準長をグループ名に指定することはできません。

FI オプションを使用しない限り、標準長によってフィールド値のサイズが制限されることはありません。ユーザーは、標準長以上の長さを指定した READ または UPDATE コマンドを発行することができます。

標準長が省略された場合には、そのフィールドは可変長フィールドとみなされます。可変長フィールドには標準(デフォルト)長はありません。Adabas コマンドで可変長フィールドを長さ指定なしで参照すると、フィールド値の先頭に値の長さ(長さバイトを含む)を示す 1 バイトのフィールドが付けられて返されます。ユーザーは、フィールドの更新時にこの長さバイトを指定する必要があります。

標準形式

フィールドの標準フォーマットを指定します(1 文字のコードで表す)。

コード フォーマット
A 英数字(左詰め)
B バイナリ(右詰め、符号なし)
F 固定小数点(右詰め、符号付き)
G 浮動小数点(浮動小数点、倍精度)
P パック 10 進数(右詰め、符号あり)
U アンパック 10 進数(右詰め、符号あり)
W Unicode(下記の注意参照)

注意:
フィールドは UTF-8 エンコードで内部的に格納されますが、フィールドにアクセスするとき、異なるエンコード(値が変換される)を指定することができます。

標準形式は、コマンド処理中に Adabas によって使用される(デフォルトの)標準のフォーマットを定義するのに使用されます。標準フォーマットはを指定すると、フィールド定義テーブル内に格納され、ユーザーから特にフォーマットがない場合に、フィールドの読み込み時または更新時に使用されます。

標準フォーマットはフィールドに必ず指定しなければなりません。グループ名に指定することはできません。グループにデフォルトのフォーマットは不要です。グループを参照するときに、グループ内のフィールドは必ず個々の各フィールドの標準フォーマットに従って返されます。

定義オプション

定義オプションは、2 文字のコードによって指定されます。これらのコードは、データ定義ステートメントの最後のエントリとして指定します。コードの順番はどのような順番でもかまいませんが、コードの間はコンマで区切ります。

ディスクリプタ(DE)

DE は、そのフィールドがディスクリプタであることを意味します。エントリがフィールドのアソシエータインバーテッドリストに作成されることにより、このフィールドは FIND コマンドのソートキーとして検索式で使用したり、論理的な順次読み込み処理を制御する方法として使用したりできるようになります。

1 つのファイルに対しては、最大 256 個のディスクリプタ(フォネティックディスクリプタ、サブディスクリプタ、スーパーディスクリプタおよびハイパーディスクリプタを含む)を指定することができます。

ディスクリプタオプションは慎重に使用する必要があります。特に、ファイルが大きく、ディスクリプタとみなされるフィールドが頻繁に更新される場合は、注意が必要です。

日付/時刻(DT)

次のようなさまざまな方法で、日付/時刻の値をデータベースに保存できます。

  • YYYYMMDDhhmmss フォーマットのタイムスタンプ

  • Natural の日付/時刻フィールド

  • UNIX time_t

DT オプションで指定した日付/時刻編集マスクは、日付/時刻値を内部的に保存する際にの日付/時刻フォーマットを定義します。

フィールド定義のフィールドオプション DT の構文は次のとおりです。

DT=date_time_edit_mask

ここで、date_time_edit_mask は次のようになります。

E(date_time_edit_mask_name)

次の日付/時刻編集マスクがサポートされています。

Date_time_edit_mask 説明 値 = 0 の場合
E(DATE) 日付:YYYYMMDD 無効な日付 – 不明
E(TIME) 時刻:HHIISS 00:00:00
E(DATETIME) 日付と時刻:YYYYMMDDHHIISS 無効な日付 – 不明
E(TIMESTAMP) マイクロ秒精度の数値タイムスタンプ:YYYYMMDDHHIISS6 無効な日付 – 不明
E(NATTIME) Natural の T フォーマット(0000-01-02 以降の 10 分の 1 秒) 0000-01-02:00:00:00.0
1 年目以前 – 不明
E(NATDATE) Natural の D フォーマット(0000 年以降の日数) 0000-01-02
1 年目以前 - 不明
E(UNIXTIME) UNIX time_t type(1970 年からの秒数)、常に UTC(協定世界時)ベース 1970-01-01:00:00:00
E(XTIMESTAMP) 1970 年以降のミリ秒の UNIX タイムスタンプ
(UNIXTIME * 1000000 ) + マイクロ秒、常に UTC ベース
1970-01-01:00:00:00.000000

DT オプションは、フォーマット B、F、P、U でのみ使用できます。DT オプションを使用するフィールドには、日付/時刻値の格納に十分な長さを指定する必要があります。次の表は、最低限必要な長さ、およびフィールドオプション TZ(ローカルタイムゾーン)が許可されているかどうかを示しています(詳細については TZ の説明を参照してください)。

Date_time_edit_mask フォーマットに必要な最短フィールド長 TZ オプションを許可
B F P U
E(DATE) 4 4 5 8 ×
E(TIME) 3 4 4 6 ×
E(DATETIME) 6 8 8 14
E(TIMESTAMP) - - 11 20
E(NATTIME) 5 8 7 12
E(NATDATE) 3 4 4 6 ×
E(UNIXTIME) 4 4 6 10
E(XTIMESTAMP) 7 8 9 16

注:

  • フォーマット B と F は、E(タイムスタンプ)と一緒に使用することはできません。

  • 日付/時刻編集マスクを使用する場合は、0001-01-01:00:00:00.000000 から 9999:12-31:23:59:59.999999 までの日付/時刻値を使用できます。値 0 は、0 が有効な日付/時刻値でない日付/時刻編集マスクにも使用できます。このような場合、値 0 の意味は「不明」です。値 0 が NC フィールドに指定されている場合は、有意性インジケータは -1 に設定されます。フォーマット/レコードバッファで提供されている有意性インジケータの影響は受けません。値 0 を使用して日付/時刻編集マスクを変換し、かつ変換先の日付/時刻編集マスクのフィールドで値 0 が不明な日付を表す場合、結果は常に 0 になります。ターゲットフィールドが NC フィールドの場合、有意性インジケータは -1 に設定されます。

  • グレゴリオ暦が導入された 1592 年より前の日付も、グレゴリオ暦として処理されます。

    • 歴史的に存在しなかった日付を入力できます。

    • 歴史的に存在していても、先発グレゴリオ暦で定義されていない日付は、NATDATE、NATTIME、UNIXTIME、XTIMESTAMP で拒否されます。

    • 時間間隔を計算する場合、歴史的な時間間隔と等しくない結果になる場合があります。

  • DATE、DATETIME、および TIMESTAMP では、ユリウス暦で歴史的に存在していて、先発グレゴリオ歴には存在しない日付も指定できます。そのような日付/時刻フィールドにどのセマンティクスを割り当てるかは、ユーザーの責任です。ただし、このような日付を別の日付/時刻編集マスクに変換しようとすると、エラーが表示されます(Adabas レスポンスコード 55)。

  • UNIXTIME または XTIMESTAMP フィールドに使用されるフォーマット/長さによっては、0 から 9999 年までの範囲内のサブセットのみがサポートされる可能性があります。

    • UNIXTIME または XTIMESTAMP フィールドでフォーマット B を使用すると、1970 年より前の日付/時刻値を保存できなくなります。このような場合は、負の値が必要になりますが、フォーマット B ではサポートされていません。

    • UNIXTIME で長さが 4 のフォーマット F を使用すると、2038 年 1 月 19 日より後の日付/時刻値を保存できなくなります。

    • UNIXTIME で長さ 4 のフォーマット B を使用する場合は、2106 年までの日付/時刻値を指定できます。

    • 長さ 10 のフォーマット U を使用する場合、UNIXTIME の最大日付は 23 世紀です。

  • 日付/時刻編集マスクのあるフィールドは、時間間隔の保存に使用しないでください。

既存ファイル内にあるフィールドへの DT オプションの追加

既存ファイルのフィールドに DT オプションを追加できます。既存のアプリケーションとの互換性を保証するために、DT オプション(ただし TZ オプションは指定していない)で定義されているフィールドは次のように処理されます。

  • Adabas では、DT オプションを追加する前に、保存されたすべての値が正しい日付/時刻値になっているかどうかをチェックしません。これをチェックするのはユーザーの責任です。このようなファイルの整合性への対処は、ユーザーの責任です。

  • 日付/時刻編集マスクを使用してフィールドを読み込もうとしたときに、フィールド値が有効な日付/時刻値でない場合は、Adabas レスポンスコード 55 が表示されます。日付/時刻編集マスクなしでフィールドを読み込んだ場合、Adabas は値が正しい日付/時刻値かどうかをチェックしません。

  • 追加/更新コマンドのフォーマットバッファでフィールドの日付/時刻編集マスクを指定しない場合、DT オプションなしでフィールドが定義されているとみなされてフィールドが処理されます。正しい日付/時刻値のチェックは行われません。フィールドに正しい日付/時刻値が含まれていることを確認するため、日付/時刻フィールドに実行するすべての更新に対して、フォーマットバッファで日付/時刻編集マスクを使用することをお勧めします。この場合、無効な日付/時刻値は Adabas レスポンスコード 55 で拒否されます。

固定ストレージ(FI)

FI は、そのフィールドが固定量のストレージを保有し、また圧縮できないことを意味します。

データストレージ内にこのフィールド値は内部的な長さバイトなしで格納されます。

空値を含む可能性の低い 1 バイトまたは 2 バイトの長さのフィールド、および圧縮できない値を含むフィールドに対しては、FI オプションを使用することをお勧めします。

レコードの末尾に、マルチプルバリューフィールドまたはピリオディックグループ内のフィールドとして定義したフィールドには、このオプションを使用しないことをお勧めします。このようなフィールドに空値があると、ディスクストレージが無駄になり、処理時間が長くなるかの可能性があるため、フィールドの省略(または圧縮)が行われないからです。

                    Without             With
                    FI option           FI option
                    ---------           ---------
    
Definition          01,AA,3,P           01,AA,3,P,FI
    
User Data           33104C              33104C
    
Internal            0433104C            33104C
Representation      (4 bytes)           (3 bytes)
   
User Data           00003C              00003C
   
Internal            023C                00003C
Representation      (2 bytes)           (3 bytes)

FI オプションの使用制限

  • FI、NC、NU オプションは併用できません。

  • FI オプションを可変長フィールド(標準長省略)に指定してはいけません。

  • FI オプションで定義されたフィールドは、フィールドの標準長を超える値によって更新することはできません。

上位優先(HF)

アプリケーションが Adabas バイナリフィールドのフォーマット B を使用するときの方法は 2 つあります。符号なし整数値として使用する方法と、任意のビットの組み合わせと長さを持つビット文字列として使用する方法です。前者の場合は、値はハードウェアアーキテクチャに従って順序付けされ、異なる整数アーキテクチャ間で交換される場合にスワップされることが想定されています。後者の場合は、値は常に上位優先(ビッグエンディアン)値として解釈されます。つまり、異なる整数アーキテクチャ間で値が交換されても、値はスワップされません。

これら両方とも使用できるようにするために、バイナリフィールドに次のような上位優先オプション(HF)が導入されました。

  • HF オプションを指定せずにバイナリフィールドが定義されている場合は、現在のハードウェアで定義されているバイト順序に従って、符号なし整数として値が解釈されます。

  • HF オプションを指定してバイナリフィールドが定義されている場合、これらの値は常に上位優先値として解釈され、下位優先のプラットフォームでも同様に解釈されます。

注意:
Natural は、Natural フォーマット B のフィールドが常に、HF オプションで定義されたバイナリフィールドになっていることを想定しています。Natural でオプション HF を指定せずにバイナリフィールドを使用すると、処理エラーが発生します。
- 整数アーキテクチャが異なるマシン上のデータベースから、これらのフィールドにアクセスすると、値がスワップされます。
- フィールドがディスクリプタで、かつ下位優先アーキテクチャのマシンに保存されている場合、ソート順は期待どおりにはなりません。

HF オプション付きで定義された B フィールドがスーパーディスクリプタの一部であり、結果のスーパーディスクリプタのフォーマットが英数字でない場合は、スーパーディスクリプタにも HF オプションが適用されます。つまり、スーパーディスクリプタ値は上位から保存されます。

例:

FDT に次のフィールド定義をします。

1,B1,4,B
1,B2,4,B,HF

フォーマットバッファに次の指定をします。

FB="B1,B2"

次の配列がレコードバッファとして用いられます。

unsigned char RB[8];

上位から保存するマシンでは、レコードバッファは次のコマンドで値が設定されます。

RB[0] = 1;  /* B1 = 0x01020304 high-order first*/
RB[1] = 2;
RB[2] = 3;
RB[3] = 4;

RB[4] = 1;  /* B2 = { 1, 2, 3, 4 } */
RB[5] = 2;
RB[6] = 3;
RB[7] = 4;

下位から保存するマシンで読み込むと内容は次のようになります。

RB[0] = 4;  /* B1 = 0x01020304 low-order first*/
RB[1] = 3;
RB[2] = 2;
RB[3] = 1;

RB[4] = 1;  /* B2 = { 1, 2, 3, 4 } */
RB[5] = 2;
RB[6] = 3;
RB[7] = 4;

ロング英数字(LB/L4、LA)フィールド

LB/L4(ロング英数字 - 4 バイト長)または LA(ロング英数字 2 バイト長)オプションは、英数字および Unicode のフィールドに指定することができます。LB と L4 はどちらも同じ意味です。LB/L4 または LA オプションのうちの 1 つだけを特定のフィールドに指定することができます。LB/L4 または LA オプションを指定して定義されたフィールドには、下記の条件において、最大 16,381 バイトの長さの値を含めることができます

  • フィールドがディスクリプタとして定義されている場合、

  • または、派生ディスクリプタの親フィールドの場合、

  • または、ファイルに LOB ファイルが関連付けられていない場合、

  • または、フィールドが Unicode フィールドの場合。

注意:
上記の場合、フィールド値は常にプライマリレコードに保存されます。このようなフィールドを定義する場合には、プライマリレコードがデータブロック(最大サイズ 32 KB)に収まる必要があることを考慮する必要があります。このようなフィールドは、それがレコードオーバーフローの原因とならない場合にのみ定義する必要があります。

それ以外の場合は、LA フィールドには最大 65533 バイト長の値を、LB/L4 フィールドには最大 2147483543 バイト長の値を含めることができます。

ファイルに LOB ファイルが関連付けられている場合、またはフィールドがディスクリプタでも、派生ディスクリプタの親でもなく、値の長さが 253 バイトより長い場合は、フィールド値は LOB ファイルに格納され、LOB 参照が基本レコードに格納されます。フィールド値が 253 バイト以下の場合は、LB/L4 または LA オプションが指定されていないフィールドと同じ方法でフィールド値が圧縮されます。LA オプション指定フィールドが実際に持つことができる最大長は、圧縮レコードが格納されるブロックのブロックサイズによって制限されます。圧縮レコードは、1 つのブロックに納まらなければなりません。

LA オプションを持つフィールドが可変長で更新または読み込まれるとき、その値は、レコードバッファに指定または返されます。値の前に、包括的な 2 バイトの長さ値(フィールド長に 2 を加えた値)が付きます。

L4 オプションを持つフィールドが可変長で更新または読み込まれるとき、その値は、レコードバッファに指定または返されます。値の前に、包括的な 4 バイトの長さ値(フィールド長に 4 を加えた値)が付きます。

L4 または LA オプションを持つフィールドについては次の点に注意してください。

  • NU、NC/NN、または MU オプションを持つこともできます。

  • PE グループのメンバにすることができます。

  • FI オプションは一緒に指定できません。

  • ディスクリプタフィールドにすることはできますが、この場合、フィールドが TR オプションが指定されていないと、1144 の最大長(排他的フィールド長)を持つ値だけを格納することができます。ディスクリプタフィールドに TR オプションが指定されている場合、1144 バイトより大きい値を格納可能ですが、インデックスのディスクリプタ値は 1144 バイトに切り捨てられます。

L4/LA の使用例

オプション 定義 ユーザーデータ(可変長)
(上位優先)
ユーザーデータ(可変長)
(下位優先)
L4 または LA なし 01,BA,0,A "\x06HELLO" "\x06HELLO"
L4 指定 01,BA,0,A,L4 "\x00\x00\x00\x09HELLO"
"\x00\x00\x07\xD4"(2000 データバイト)
"\x09\x00\x00\x00HELLO"
"\xD4\x07\x00\x00"(2000 データバイト)
LA 指定 01,BA,0,A,LA "\x00\x09HELLO"
"\x07\xD2"(2000 データバイト)
"\x09\x00HELLO"
"\xD2\x07"(2000 データバイト)

マルチプルバリューフィールド(MU)

MU は、そのフィールドが 0 個、1 個、または複数の値から構成されていることを意味します。

その値は、内部的には該当フィールドに対する他のオプション指定に応じて格納されます。NU オプション定義フィールドの場合、後続の空白値は省略されます。MU オプションと NC オプションは併用できません。

ADACMP ユーティリティで使用される構文 MU(n) は指定できますが、オカレンスカウントは無視されます。

例:NU 定義のマルチプルバリューフィールド

Definition:  01,AA,5,A,MU,NU
    
Original content after file loading:
    
       3   L  value A   L  value B   L  value C
    
     count    field AA1    field AA2    field AA3

L は L バイトを含む後続値の長さを意味します。

値 B を空値に更新した後で、

       2   L  value A  L   value C
     count    field AA1    field AA2

AA カウントは 2 になります。

例:NU 指定のないマルチプルバリューフィールド

Definition:  01,AA,5,A,MU
Original content after file loading:
       3   L  value A  L   value B   L   value C
    
     count    field AA1    field AA2     field AA3

値 B を空値に更新した後で、

       3   L  value A  L   null value  L  value C
     count    field AA1    field AA2    field AA3

AA カウントは 3 になります。

非空白圧縮(NB)

NB オプションは、値が格納されるとき、末尾の空白が抑制されないことを示します。値は、常にレコードバッファに指定された値と同じ長さでデータベースに格納されます。別の文字列の始めと一致する値を持っている文字列は、常に、他の文字列より値が小さいものとして扱われます。このため、値の順序は次のようになります。

NB オプションなし

”xxx\x00\x00” < ”xxx\x00” < “xxx” = “xxx “ = “xxx  “ < “xxx0”

NB オプションあり

”xxx” < “xxx\x00” < ”xxx\x00\x00” < “xxx “ < “xxx  “ < “xxx0”

NB オプションを FI オプションとともに指定することはできません。NB オプションは、フォーマット A または W のフィールドにだけ指定できます。

NB オプション付きで定義された値が、値の長さよりも大きい固定長で読み込まれる場合、その値は、NB オプションのないフィールドの値と同様に、末尾が空白で埋められます。ただし、同じフォーマットとレコードバッファを使って更新した場合は、データベースの値が修正されます(値の末尾に空白が付加されます)。

SQL 空値表現(NC)

NC オプションは、そのフィールドが SQL で使用される NULL 値を表現できることを意味します。このオプションが使用されると、該当フィールドに次の 2 つの状態のうち 1 つで空値を持つことができます。

  • 存在しない(NULL)

  • 空(空白)

そのフィールドが空か存在しないかは、特別なフォーマットバッファ(S エレメント)によって示されます。詳細については、『Adabas コマンドリファレンスマニュアル』の「フォーマットバッファ構文」を参照してください。

FI、NU および NC オプションは、いずれも共用することはできません。NC オプションは、マルチプルバリューフィールドには指定できません。また、NC オプションをピリオディックグループのメンバに指定することもできません。

Definition: 01,AA,2,B,NC
    Value  Blank  NULL

User S element 0   0   -1

User data  0005   0000   0000

Internal   0205   01   C1
representation

非空値オプション(NN)

NN オプションで定義されたフィールドを更新または追加する場合には、必ず値を割り当てる必要があります。何らかの値または空白を各データレコードに設定する必要があり、そうしないと、Adabas にからレスポンスコードが返されます。このオプションは、NC オプションとの共用でのみ指定することができます。

Definition:  01,AA,2,B,NC    01,AA,2,B,NC,NN
User S element -1      -1

User data  0000      0000

Internal   C1      not permitted
representation

空値省略(NU)

NU は、そのフィールドに対する空値が省略されることを意味します。

空値省略が行われると、空値は内部的に 1 バイトの空フィールドインジケータで表されます。空値は格納されません。

空値のフィールドが連続していて、さらにどのフィールドにも NU オプションを指定している場合、そのフィールド群は、空値を含む連続フィールドの数を含む 1 バイトの空フィールドインジケータによって内部的に表現されます。したがって、NU オプションを定義したフィールドは、できる限り連続させて定義した方が効率的です。

ディスクリプタに対して NU オプションを指定した場合、そのディスクリプタの空値はインバーテッドリストには格納されません。したがって、このディスクリプタの空値に対して FIND コマンドを使用すると、その結果は常に該当レコードなしになり、たとえデータストレージ内に空値を持つレコードが存在していたとしても結果は同じです。

NU オプションで定義されたディスクリプタが READ LOGICAL SEQUENCE コマンド内で論理順序の制御のために使用された場合、ディスクリプタに対して空値を持つレコードは読まれません。ディスクリプタに NU オプションと UQ オプションの両方がある場合は、一意性に違反することなく、空値を複数回保存できます。

FI、NC、NU オプションは併用できません。

通常の圧縮(NU も FI も指定しない)を行うと、空値は 1 バイトで表現されます。

例(圧縮)

                 Normal         With FI       With NU
                 Compression    Option        Option
                 -----------    -------       -------
    
Definition       01,AA,2,B      01,AA,2,B,FI  01,AA,2,B,NU
    
User data        0000           0000          0000
    
Internal         01             0000          C1
Representation   (1 byte)      (2 bytes)     (1 byte)
                                              C1 indicates
                                              1 empty field
                                              follows

非値変換(NV)

NV オプションで定義されたフィールドは、アーキテクチャの異なるマシンから UPDATE または READ コマンドが発行された場合に、データ変換が行われないことを意味します。

Unicode フィールドに NV オプションを指定することはできません。

Definition:        01,AA,2,A           01,AA,2,A,NV
 
EBCDIC data has    convert value
to be stored in    of AA from EBCDIC   no conversion
a database on an   to ASCII
ASCII machine

ピリオディックグループ(PE)

PE は、ピリオディックグループが定義されていることを意味します。

1 つのピリオディックグループは、1 つまたは複数のフィールドから構成され、1 レコード内で可能なオカレンスの数は、0、1、または複数です。

ピリオディックグループは、01 レベルで定義されます。ピリオディックグループ内に含まれるすべてのフィールドは、その直後に 02 以上のレベルで定義されなければなりません(レベルの増分は 1、最大レベルは 7 です)。次の 01 レベル定義がピリオディックグループの終了を表します。

PE はグループ名とともにのみ指定できます。長さパラメータとフォーマットパラメータをグループ名とともに指定することはできません。1 つのピリオディックグループには、ディスクリプタやマルチプルバリューフィールド、またはその両者を含むことができますが他のピリオディックグループを含むことはできません。

01,GA,PE              ; PERIODIC GROUP GA
  02,A1,6,A,NU
  02,A2,2,B,NU
  02,A3,4,P,NU
01,GB,PE              ; PERIODIC GROUP GB
  02,B1,4,A,DE,NU
  02,B2,5,A,MU,NU     ; MU fields in PE groups
                      ; are permitted.
  02,B3               ; Grouping of fields within
    03,B4,20,A,NU     ; PE groups is permitted.
    03,B5,7,U,NU
01,XA,PE              
  02,X1,3,A,NU        
  02,X2,4,U,NU
  02,YA,PE            ; Invalid. Nested periodic group not permitted.
         ^
%ADAFDU-E-PGL1  periodic group may only be defined at level 1

ピリオディックグループ内のフィールドに対しては NU オプションを指定することをお勧めします。これによって、圧縮が最大限活用され、そのフィールドの読み込み時、または更新時の処理時間が短縮します。

システム生成(SY)

システム生成フィールドの値は、Adabas によって自動的に生成されます。更新コマンドまたは保存コマンドのレコードバッファで指定されている値は無視されます。システム生成フィールドは、ピリオディックグループのフィールドであってはなりません。CR オプションを持つシステム生成フィールドは、マルチプルバリューフィールドであってはなりません。

システム生成フィールドは、次の構文で定義されます。

SY = keyword [,CR]

ここで、keyword は次の値をとることができます。

TIME

作成または最後の更新のタイムスタンプ。このフィールドは DT オプションを指定して定義する必要があります。値は UTC 値として保存されます。ローカルタイム値としてこの値にアクセスする場合は、TZ オプションを指定してフィールドを定義する必要があります。

例:

1,CR,14,U,DE,DT=E(DATETIME),TZ,SY=TIME,CR  ;	Creation timestamp
SESSIONID

レコードが作成された Adabas ユーザーセッションの Adabas セッション ID。このフィールドはオプション A、NV を指定して定義する必要があります。推奨されるフィールド長は 28 です。フィールド定義で長さが短く指定されていると、値は切り捨てられます。レイアウトは次のとおりです。

バイト数 説明
符号なし文字 s_node[8]: Adabas クライアントノード名
符号なし文字 s_user[8]: Adabas クライアントユーザー ID
符号なし整数値 s_pid[4]: プロセス ID
符号なし文字 s_timestamp[8]: セッションタイムスタンプ:1970 年以降のマイクロ秒数(バイナリ値)

注意:

  1. Adabas セッション ID は、Adabas セッションを識別するバイナリ文字列です。プラットフォーム間で変換されることはありません。特定の時点で、Adabas セッション ID は一意ですが、Adabas セッション ID は後で再利用できます。メインフレームのレイアウトは、オープンシステムとは異なります。
  2. Adabas セッション ID は、lnk_set_adabas_id 関数を使用して変更できます。つまり、この Adabas セッション ID のコンポーネントに、ユーザーに関する情報が実際に含まれているという保証はありません。
  3. アプリケーションが SESSIONID のコンポーネントにアクセスする必要がある場合は、上記の問題を考慮する必要があります。
  4. セッションタイムスタンプは、位置合わせの理由で符号なし文字 [8] として定義されていますが、バイナリ値が含まれています。
  5. Adabas バージョンが 6.2 SP2 未満または Net-Work バージョン 7.3 が使用されている場合、オープンシステムプラットフォームのセッションタイムスタンプは 0 です。これは、以前のバージョンで、タイムスタンプなしの 20 バイトのセッション ID が使用されていたためです。
  6. Adabas セッション ID のレイアウトに関するこれらのルールは、オープンシステムプラットフォームにのみ適用されます。メインフレームでは、28 バイトの Adabas セッション ID もありますが、コンポーネントは異なります。詳細については、メインフレームのマニュアルを参照してください。

例(オープンシステム):

1,CA,16,A,NV,SY=SESSIONID  	; Node ID and client user ID of last update	
UN=CA(9,16)						; Subdescriptor for user ID of last update 
SESSIONUSER

レコードが作成または更新された Adabas ユーザーセッションのログイン ID 。フィールドはフォーマット A で定義する必要があります。推奨されるフィールド長は 8 です。SESSIONUSER フィールドの値は SESSIONID フィールドのバイト 9~16 です。

注意:
SESSIONID フィールドも定義した場合は、SESSIONUSER フィールドの代わりにこのフィールドのサブディスクリプタを定義できます。SESSIONID の例を参照してください。

例:

1,CU,8,A,DE,SY=SESSIONUSER,CR  ;	Login ID of creator
OPUSER

レコードが作成された Adabas セッションの OP コマンドで、アディション 1 に指定されているユーザー ID。このフィールドは、フォーマット A と長さ 8 を持つ必要があります。

例:

1,CO,8,A,DE,SY=OPUSER			; User ID specified in OP command for last update

オプション CR(作成)が指定されたシステム生成フィールド

オプション CR が指定されたシステム生成フィールドの値は、レコードの作成時に Adabas によって自動的に生成されます。これらの値は、以後の更新処理で変更されることはありません。

オプション CR もオプション MU も指定されていないシステム生成フィールド

オプション CR もオプション MU も指定されていないシステム生成フィールドの値は、レコードの作成時に Adabas によって自動的に生成されます。値は、その後の更新処理のたびに更新されます。

オプション CR は指定されず、オプション MU が指定されているシステム生成フィールド

MU オプションが指定されたシステム生成フィールドには、最大 SYFMAX(ファイルパラメータ、詳細については、ユーティリティ ADAFDU のマニュアルを参照してください)の値を指定できます。

レコードが作成されるときに、MU フィールドの最初の値が生成されます。

レコードが更新されるときに、新しい値が生成され、MU フィールドの既存値の先頭に追加されます。

以後、MU インデックス > SYFMAX の値は削除されます。例えば、SY フィールドのフィールド名が SY であると仮定すると、インデックス 1 < i <= SYFMAX の場合、SY(i) の新しい値は、SY(i-1) の古い値になります。

システム生成フィールドとユーティリティ ADACMP

ADAMUP で外部データを一括ロードするために ADACMP を使用した場合、システム生成フィールドの値が、これらの外部データにすでに含まれている可能性があります。そのため、ADACMP パラメータ SYFINPUT を使用して、ADACMP でのシステム生成フィールドの処理方法を指定できます。

  • SYFINPUT=SYSTEM を指定した場合は、ADACMP プロセスでデータベースに挿入された場合と同様に、ADACMP によってシステム生成フィールドの値が生成されます。

  • SYFINPUT=USER を指定した場合、システム生成フィールドは、SY オプションが指定されていないフィールドとして、ADACMP によって処理されます。

詳細については、ユーティリティ ADACMP のマニュアルを参照してください。

インデックスの切り捨て(TR)

TR オプションは、L4/LA オプションおよび DE オプションで指定する必要があります。

ディスクリプタ値の最大長は 1144 バイトです。ディスクリプタが TR オプション付きで定義されない場合、1144 バイトより大きいディスクリプタ値を挿入するすべての更新処理は拒否されます。TR オプションが指定された場合、これらの値をデータベースに挿入することは可能ですが、ディスクリプタ値はインデックスでは切り捨てられます。その結果、インデックスに 1144 バイトに切り捨てられた値と同じディスクリプタ値を持つレコードが複数あると、検索処理で正確な結果が返されません。これが発生すると、警告が発行されます。TR オプション付きで定義されたディスクリプタの詳細な動作は次のとおりです。

  • 1144 バイトより大きいディスクリプタ値がデータベースに挿入される場合、値はインデックスで切り捨てられ、レスポンスコード 2 が返されます。

  • 切り捨てにより結果が正確でない可能性のある検索処理を実行する場合、レスポンスコード 2 が返されます。

  • TR オプション付きで定義されるディスクリプタによってソートする場合に、インデックスの中に、切り捨てられた結果、値が同じになっている可能性があるディスクリプタ値を持つレコードが複数あると、レスポンスコード 2 が返されます。

  • インデックスの中に、切り捨てられた結果、値が同じになっている可能性があるディスクリプタ値を持つレコードが複数あると、論理順読み込み処理(L3/6/9)でレスポンスコード 2 が返されます。

  • 切り捨てチェックオプションは S1 コマンドで利用可能です。このオプションを指定する場合、サーチバッファには TR オプション付きで定義されたディスクリプタの名前を指定し、バリューバッファには、チェックする値を指定します。値が切り捨てられない場合はレスポンスコード 0 が返され、値が切り捨てられる場合はレスポンスコード 2 が返されます。データベースでの検索処理は実行されません。

UQ オプションとともに TR オプションを指定した場合、1144 バイトに切り捨てた直後に同じ値になる、2 つの異なるディスクリプタ値を格納すると、一意性エラーが発生します。

ローカルタイムゾーン(TZ)

このオプションを指定した場合、出力フィールド値はローカル時間(またはユーザー定義のタイムゾーン)で使用されることが予期されます。内部的には、UTC で値が保存されます。このオプションは、オプション DT、および日付/時刻編集マスク名 DATETIME、TIMESTAMP、NATTIME、UNIXTIME、XTIMESTAMP とのみ一緒に使用できます。

注:

  • タイムゾーンは、日付と時刻の両方の情報が使用可能な場合にのみ関係するため、TZ は、DATE、TIME、および NATDATE では使用できません。

  • 定義上、UNIXTIME と XTIMESTAMP は UTC に基づいています。これらの値に使用可能な標準変換ルーチンには、タイムゾーン処理が含まれます。ただし、UNIXTIME および XTIMESTAMP フィールドを、他のいずれかの日付/時刻編集マスクを使用してローカル時間との間で変換する場合は、これらのフィールドを TZ オプションを使用して定義する必要があります。フィールドがオプション TZ なしで定義されている場合、外部値のタイムゾーンは UTC と見なされます。

  • 日付/時刻編集マスク DATETIME、TIMESTAMP、または NATTIME で定義され、TZ オプションが指定されていないフィールドを使用して、UTC 時間値またはローカル時間値を保存する必要がある場合は、ユーザーが指定します。ただし、次の点を考慮してください。

    • このようなフィールドを日付/時刻編集マスク UNIXTIME または XTIMESTAMP との間で変換する場合、Adabas は内部値に UTC 時間値が含まれていると仮定します。

    • このようなフィールドを使用してローカル時間値を保存する場合、夏時間が標準時間に戻されたときに 2 回発生する時間を、一意に区別することはできません。

    これらの点のいずれかが問題になる場合は、TZ オプションを指定してフィールドを定義する必要があります。

  • 既存ファイルのフィールドに UTC 値が含まれていて、日付/時刻編集マスク DATETIME、TIMESTAMP、NATTIME のいずれかを使用して DT および TZ オプションを追加する必要がある場合は、ADADBM で新しいオプションを追加してオプションを追加できます。ファイルにローカル時間値が含まれている場合は、元のファイルをアンロードして圧縮解除する必要があります。その後、新しいオプションを使用してファイルを圧縮し、再ロードできます。

  • TZ オプションを使用してフィールドにアクセスし、かつフォーマットバッファで日付/時刻編集マスクを指定していない場合は、フィールド定義内の日付/時刻編集マスクがフォーマットバッファに指定されているものとして、フィールドが処理されます。

ユニークディスクリプタ(UQ)

UQ では、フィールドがユニークディスクリプタであることを示します。ユニークディスクリプタには、ファイル内の各レコードで異なる値が含まれている必要があります。ただし、1 つのレコードの中では、マルチプルバリューフィールドに同じ値がいくつあってもかまいません。

UQ オプションは、DE オプションと一緒に指定する必要があります。1 ファイル内に 1 つ以上の UQ オプションにフィールドを指定できます。

サブディスクリプタ

サブディスクリプタは、エレメンタリフィールドの一部から派生したディスクリプタです。そのエレメンタリフィールドは、ディスクリプタ自体であってもなくてもかまいません。また、サブディスクリプタは、マルチプルバリューフィールドやピリオディックグループ内のフィールドに対しても定義できますが、マルチプルバリューフィールドのある特定の値やピリオディックグループのある特定のオカレンスに対しては定義することができません。

サブディスクリプタは、最終フィールド定義の後に定義しなければなりません。

サブディスクリプタは、派生元のフィールドと同じフォーマットでなければなりませんが、例外的に、固定小数点および浮動小数点はバイナリになり、Unicode は英数字になります。

パック値から派生したサブディスクリプタには、派生元の符号も付加されます。

サブディスクリプタ定義構文

name [,UQ]= field-name (from, to)
名前

サブディスクリプタの名前です。サブディスクリプタの名前の付け方は、Adabas の命名規則と同じです。

フィールド名

サブディスクリプタエレメントを派生させるソースフィールドの名前です。

ソースフィールドにできるものは次のとおりです。

  • エレメンタリフィールド

  • マルチプルバリューフィールド

  • ピリオディックグループ内のフィールド

  • ディスクリプタまたは非ディスクリプタ

ソースフィールドにできないものは次のとおりです。

  • マルチプルバリューフィールドの特定の値

  • ピリオディックグループの特定のオカレンス

  • 他のスーパーディスクリプタ、サブディスクリプタおよびフォネティックディスクリプタ

ソースフィールドの定義に NU/NC オプションの指定がある場合には、サブディスクリプタにも NU/NC オプションが指定されます。したがって、ソースフィールドが空の場合には、そのサブディスクリプタも空であり、インバーテッドリスト内には含まれません。

from

サブディスクリプタ定義の開始位置となる、ソースフィールド内の相対的なバイト位置を意味します。

to

サブディスクリプタ定義の終了位置となる、ソースフィールド内の相対的なバイト位置を意味します。

英数字フィールドや Unicode フィールドに from と to を指定する場合は、左から右に向かって 1 から順番にカウントされます。

アンパック形式のフィールドやパック形式のフィールドに from と to を指定する場合は、左から右に向かって 1 から順番にカウントされます。ソースフィールドが P フォーマットで定義されている場合には、派生サブディスクリプタ値の符号は、下位バイト(バイト 1)の下位 4 ビットから取得されます。

バイナリ形式、固定小数点形式、および浮動小数点の各フィールドに from と to を指定する場合は、下位から上位に向かって 1 から順番にカウントされます。

to は 253 以下にする必要があります。

UQ

サブディスクリプタは、ユニークディスクリプタとして定義できます。

サブディスクリプタの標準長および標準形式

サブディスクリプタの標準長は、サブエレメントの長さによって定義され、また検索コマンド処理時に Adabas によって使用されます。例えば、サーチバッファがサブディスクリプタのみを含み、長さの変更が行われない場合には、この標準長が使用されます。

Unicode の親フィールドを持つサブディスクリプタ

サブディスクリプタの構成要素を W フィールドから派生させる場合、その構成要素は、W フィールド(UTF-8)の内部エンコードに基づいて作成されます。ユーザーセッションにユーザーエンコードを定義しても、そのエンコードとの間の変換は行われません。

サブディスクリプタ定義の例

Source Field Definition:      01,AR,10,A,NU

Subdescriptor Definition:     SB = AR(1,5)

サブディスクリプタ SB の値は、ソースフィールド AR のすべての値の最初の 5 バイト(左から右にカウント)から派生します。

AR values                     SB values
---------                     ---------

DAVENPORT                     DAVEN
FORD                          FORD
WILSON                        WILSO

Source Field Definition:      02,PF,6,P

Subdescriptor Definition:     PS = PF(4,6)

サブディスクリプタ PS の値は、ソースフィールド PF のすべての値の 4~6 バイト(右から左にカウント)から派生します。

PF values                     PS values
---------                     ---------
(shown in hex)                (shown in hex)

00243182655C                    02431C
00000000186C                        0C*
78426281448D                  0784262D

* PF に対して NU オプションが指定されている場合、この値に対する PS 値は作成されません。

Source Field Definition:      02,PF,6,P
Subdescriptor Definition:     PT = PF(1,3)

PT の値は、PF のすべての値の 1~3 バイト(右から左にカウント)から派生します。

PF values                     PT values
---------                     ---------
(shown in hex)                (shown in hex)

00243182655C                  82655C
00000000186C                    186C
78426281448D                  81448D

スーパーディスクリプタ

スーパーディスクリプタは、複数のフィールド、フィールドの一部、またはこれらの組み合わせから派生するディスクリプタです。スーパーディスクリプタの定義に使用される各ソースフィールド(またはフィールドの一部)は、エレメントと呼ばれます。1 つのスーパーディスクリプタは、2 から 20 までのエレメントから定義されます。

スーパーディスクリプタは、最終フィールド定義の後(サブディスクリプタ定義の前か後、またはその両方)に定義しなければなりません。

どのフィールドフォーマットも、スーパーディスクリプタの一部として扱われます。

注意:

  1. 親フィールドの先頭から 253 バイトのみを指定できます。
  2. メインフレームの Adabas データベースでは、浮動小数点フォーマット(フォーマット G)のフィールドを、スーパーディスクリプタの親フィールドとして使用することはできません。オープンシステムの Adabas データベースでは、浮動小数点フォーマットのフィールドを、スーパーディスクリプタの親フィールドとして使用できます。

スーパーディスクリプタ定義構文

name [,format] [,PF] [,UQ] = field-name (from, to[, encoding]),
                                                   field-name (from, to[, encoding])
                                                   [[,field-name (from, to[, encoding])]...]
名前

スーパーディスクリプタの名前です。スーパーディスクリプタの命名規則は、Adabas の名前の命名規則と同一です。

format

フォーマットは、次の場合にのみ指定できます

  • すべての親フィールドにアンパックフォーマットがある場合。この場合に、A(英数字)、B(バイナリ)、または U(アンパック)を指定できます。以前のバージョンの Adabas との互換性を考慮して、デフォルトは B ですが、A または U のいずれかを指定することを強くお勧めします。これは、下位優先のプラットフォームでのスーパーディスクリプタの動作によって、予期しない結果が生じる可能性があるためです。

  • • 少なくとも 1 つの親フィールドがフォーマット W の場合。この場合に、A または W を指定できます。デフォルトは A です。

PF

このオプションを指定することにより、スーパーディスクリプタにパック形式のフィールドが含まれている場合、メインフレームシステムの Adabas データベースとの互換性が保証されます。メインフレームデータベース上では、パック形式の値の符号用ハーフバイトは 0x0F であるのに対して、UNIX/Windows では 0x0C です。PF オプションを使うことで、パック形式の値がスーパーディスクリプタの中で 0x0F として格納されます。

注意:
インデックス内では、符号ハーフバイトは 0x0F ですが、読み取りコマンドのフォーマットバッファにスーパーディスクリプタを指定した場合、0x0F は得られません。この場合、符号ハーフバイトは 0x0C に変換されます。これはまた、インデックス内の値のソート順が、読み取ったスーパーディスクリプタ値の英数字比較を実行して得られるソート順とは異なる可能性があることも意味します。ディスクリプタ値の範囲を読み取る場合は、L3 または L9 コマンドのサーチバッファに終了条件を指定すること、および終了条件を満たしているかどうかを確認するために読み取りディスクリプタ値をチェックしないことをお勧めします。

UQ

スーパーディスクリプタは、ユニークディスクリプタとして定義できます。

フィールド名

スーパーディスクリプタエレメントの派生元にあたるソースフィールドの名前です。

ソースフィールドにできるものは次のとおりです。

  • エレメンタリフィールド

  • マルチプルバリューフィールド(ただし、スーパーディスクリプタごとに 1 つのみ)

  • ピリオディックグループ内の任意のエレメンタリフィールド

  • ディスクリプタまたは非ディスクリプタ

ソースフィールドにできないものは次のとおりです。

  • マルチプルバリューフィールドの特定の値

  • ピリオディックグループの特定のオカレンス

  • 他のスーパーディスクリプタ、サブディスクリプタ、ハイパーディスクリプタまたはフォネティックディスクリプタ

1 つ以上のソースフィールドの定義に NU/NC オプションの指定がある場合には、スーパーディスクリプタにも NU/NC オプションが指定されます。したがって、1 つ以上のエレメントが空の場合には、スーパーディスクリプタも空でありインバーテッドリストにも入りません。

from

スーパーディスクリプタ要素の開始位置となる、ソースフィールド内の相対的なバイト位置を意味します。

to

スーパーディスクリプタ要素の終了位置となる、ソースフィールド内の相対的なバイト位置を意味します。

英数字フィールドや Unicode フィールドに from と to を指定する場合は、左から右に向かって 1 から順番にカウントされます。

アンパック形式のフィールドやパック形式のフィールドに from と to を指定する場合は、左から右に向かって 1 から順番にカウントされます。

バイナリ形式、固定小数点形式、および浮動小数点の各フィールドに from と to を指定する場合は、下位から上位に向かって 1 から順番にカウントされます。

to は 253 以下にする必要があります。

from は to 以下でなければなりません。スーパーディスクリプタ値全体の長さには制限があり、英数字の場合には 1144 バイト、バイナリの場合には 126 バイト、アンパック形式の場合には 29 バイトです。

エンコード

encoding は W フィールドにのみ使用できます。encoding は、Unicode エンコードである必要があります。encoding が指定されている場合は、指定されたバイトがフィールド値から選択される前に、フィールド値は指定されたエンコードに変換されます。

スーパーディスクリプタの標準長および標準形式

format の説明では、すべてのコンポーネントがアンパックされている、または少なくとも 1 つのコンポーネントが Unicode の、スーパーディスクリプタの標準フォーマットに関する情報を提供します。

このフォーマットは、少なくとも 1 つの親フィールドが英数字の場合は英数字になり、それ以外ではバイナリになります。

スーパーディスクリプタのフォーマットは、すべての親フィールドがアンパックされている場合にのみ指定できます。この場合、アンパックとバイナリのみ指定できます。デフォルトはバイナリです。一部の親フィールドがアンパック形式ではなく、少なくとも 1 つの親フィールドが英数字または Unicode である場合、フォーマットは英数字であり、それ以外の場合はバイナリです。一部の親フィールドがアンパック形式ではなく、少なくとも 1 つの親フィールドが英数字または Unicode である場合、フォーマットは英数字であり、それ以外の場合はバイナリです。

スーパーディスクリプタの標準長は、そのエレメントの合計で決まり、検索コマンド処理時に Adabas によって使用されます。例えば、サーチバッファに 1 つのスーパーディスクリプタ名しかなく、長さの変更が行われない場合にはこの標準長が使用されます。

Unicode の親フィールドを持つスーパーディスクリプタ

スーパーディスクリプタの親フィールドにエンコードが指定されている場合、スーパーディスクリプタエレメントは、指定されたエンコードに変換された W フィールド値から派生します。W フィールドから派生したスーパーディスクリプタエレメントにエンコードが指定されていない場合、スーパーディスクリプタエレメントの値は、W フィールドの内部エンコード(UTF-8)から作成されます。ユーザーセッションに定義されたユーザーエンコード間の変換は、スーパーディスクリプタエレメントによって行われます。変換は、エンコードが指定されたスーパーディスクリプタエレメントに対してのみ行われます。同じスーパーディスクリプタに異なるエンコードを指定することはできません。

注意:

  1. フォーマット W のスーパーディスクリプタを使用する場合、そのスーパーディスクリプタ値は、通常、有効な Unicode フィールドではありません。これは、Unicode フィールドではないエレメントをスーパーディスクリプタに含めることができること、および Unicode フィールドから派生したスーパーディスクリプタエレメントが文字の途中で開始または終了することが理由です。

  2. UTF-16 または UTF-32 エンコードを使用する場合は、UTF-16LE または UTF-32LE は指定せずに、常に UTF-16BE または UTF-32BE を指定することを強くお勧めします。Unicode エレメントのソート順は英数字に基づくので、期待通りの検索順は、ビッグエンディアンコーディングを使用した場合にのみ実現されます。

  3. Unicode のスーパーディスクリプタエレメントに指定されているエンコードとは異なるユーザーエンコードが指定されている W フィールドの親を持つスーパーディスクリプタを使用すると、正しくない結果や未定義の結果になる場合があります。例えば、スーパーディスクリプタエレメント FN(1,2,UTF-16BE) を、フィールドの最初の文字がスーパーディスクリプタに含まれるように定義し、かつユーザーエンコードが UTF-8 だとします。FN の最初の文字が 3 バイトの UTF-8 文字になっている値を検索しようとすると、サーチバッファの値には文字の一部のみが含まれます。=> スーパーディスクリプタエレメントを UTF-8 から UTF-16 に変換することはできません。

  4. スーパーディスクリプタの長さを超える W フィールドの親を持つスーパーディスクリプタを読み取る際には、パディングに以下のルールが使用されます。

    • 最後の親フィールドが W フィールドの場合、指定された長さに従って、W フィールドが最後のバイトまで拡張されます。

    • 最後の親フィールドが W フィールドでない場合、スーパーディスクリプタには A フィールドの空白がパディングされます。

  5. UTF-8 エンコーディングでスーパーディスクリプタの親を指定するか、エンコーディングなしで指定するかによって違いが生じます。エンコーディング UTF-8 を明示的に指定した場合にのみ、Adabas コールでスーパーディスクリプタを使用したときに、ユーザーエンコーディングへの変換またはユーザーエンコーディングからの変換が実行されます。

  6. スーパーディスクリプタにアクセスするときに府明示的に指定するフォーマットは、スーパーディスクリプタのフォーマットである必要があります。ただし、スーパーディスクリプタに使用されているフォーマットに関係なく、スーパーディスクリプタの処理は同じです。

バイナリの親フィールドを含むスーパーディスクリプタ

スーパーディスクリプタにバイナリの親フィールドが含まれる場合(HF オプションなし)、スーパーディスクリプタの値は、それが使用されるプラットフォームに依存します。

  • 上位優先プラットフォームでは、バイナリの構成は上位優先に従います。

  • 下位優先プラットフォームでは、バイナリの構成は下位優先に従います。

ただし、下位優先プラットフォームでのスーパーディスクリプタの照合は、上位優先プラットフォームと同じです。この点で正常値への相違がありますが、値は、同じフォーマットの他の値と同様に扱われます。例えば、A フォーマットのスーパーディスクリプタをスーパーディスクリプタ長より短い長さでサーチバッファに指定した場合、スーパーディスクリプタ値の足りない部分を補うために、値に空白が埋め込まれます。

スーパーディスクリプタ定義の例

次の定義は、下記の次の 2 つの例で使用されます。

01,LN,40,W,DE,NU    ;Last-Name
01,FN,40,W,MU,NU    ;First-Name
01,ID,4,B,NU        ;Identification
01,AG,3,U           ;Age
01,AD,PE            ;Address
  02,CI,20,A,NU     ;City
  02,ST,20,A,NU     ;Street
01,FA,PE            ;Relatives
  02,NR,20,A,NU     ;R-Last-Name
  02,FR,20,A,MU,NU  ;R-First-Name

Superdescriptor definition:   SD = LN(1,4),ID(1,2),AG(2,3)

スーパーディスクリプタ SD を作成します。スーパーディスクリプタの値は、フィールド LN のバイト 1~4(左から右にカウント)、フィールド ID のバイト 1~2(下位バイトから上位バイトにカウント)、およびフィールド AG のバイト 2~3(右から左にカウント)から派生します。フィールド LN にはエンコードが指定されていないので、内部で使用されるエンコード UTF-8 が維持されます。すべての値は 16 進数で示されます。次の例では、照合順を制御するために値が内部的にどのように表現されるのか(図中の internal)、また、上位優先と下位優先のプラットフォームでは、レコードバッファまたはバリューバッファの中で、値がそれぞれどのように表現されるのかを示しています(図中の high-order first と low-order first)。

LN             ID                          AG      SD

464C454D494E47 0x862143 (logical value)    303433  464C454D21433034 (internal)
               00862143 (h-o first)                464C454D21433034 (h-o first)
               43218600 (l-o first)                464C454D43213034 (l-o first)

4D4F52524953   0x2461866 (logical value)   303338  4D4F525218663033 (internal)
               02461866  (h-o first)               4D4F525218663033 (h-o first)
               66184602  (l-o first)               4D4F525266183033 (l-o first)

5041524B4552   00000000                    303336  No value is stored with index

202020202020   0x432144  (logical value)   303030  No value is stored with index
               00432144  (h-o first)        
               44214300  (l-o first)        

414141414141   0x144     (logical value)   313131  4141414101443131 (internal)
               00000144  (h-o first)               4141414101443131 (h-o first)
               44010000  (l-o first)               4141414144013131 (l-o first)

少なくとも 1 エレメント(LN)が W フォーマットで定義されていて、かつ明示的なフォーマットが指定されていないので、SD のフォーマットは英数字となります。

サーチバッファに次を指定することにより、スーパーディスクリプタ値を切り捨てを指定した場合、

SD,5

サーチバッファの値

464C45D21

は、スーパーディスクリプタ値の不足部分を補うために空白が埋め込まれます。

464C45D21202020

この値が上位優先プラットフォームで指定された場合、それは問い合わせを解決するために使用される内部値でもあります。値が下位優先プラットフォームで指定された場合、対応する内部値は、次のようになります。

464C454D20212020

Superdescriptor definition:   SY,W = LN(1,8,UTF-16BE),FN(1,2,UTF-16BE)

スーパーディスクリプタ SY をフィールド LN および FN(マルチプルバリューフィールド)から作成します。すべての値は文字フォーマットで示されます。フォーマットは W です。

          LN                                  FN                        SY
          FLEMING                             DAVID                     FLEMD	
UTF-16BE: 0046 004C 0045 004D 0049 004E 0047  0044 0041 0056 0049 0044  0046 004C 0045 004D 0044	
          WILSON                              JOHN                      WILSJ
                                              SONNY                     WILSS
UTF-16BE: 0057 0049 004C 0053 004F 004E004A   004F 0048 004E	     0057 0049 004C 0053 004A
                                              0053 004F 004E 004E 0059  0057 0049 004C 0053 004E 

すべての値が 1 バイトまたは 2 バイトの UTF-8 文字のみで構成されている場合は、ユーザーエンコード UTF-8 も使用できます。この場合、FLEMING、DAVID 用に作成されたスーパーディスクリプタ値は、46 4C 45 4D 20 20 20 20 44 に変換されます。また、アプリケーションプログラムで、フィールド値からスーパーディスクリプタ値を作成した場合に、期待どおりに動作します。作成される値は 46 4C45 4D49 4E47 20 44 41 です。スーパーディスクリプタ値の最初のエレメントは、0046 004C 0045 004D 0049 004E 0047 0020 に変換され、その後切り捨てられて 0046 004C 0045 004D になります。スーパーディスクリプタの 2 番目のエレメントは 0044 0041 に変換され、その後切り捨てられて 0044 になります。つまり、変換されたスーパーディスクリプタ値は、期待どおりの 0046 004C 0045 004D 0044 になります。

ただし、3 バイトの UTF-8 文字を含んでいる値がある場合にユーザーエンコード UTF-8 を使用すると、問題が発生します。

Field Definitions:

01,PN,6,U,NU
01,NA,20,A,DE,NU
01,DP,1,B,FI
Superdescriptor Definition:   SZ = PN(3,6),DP(1,1)
Source Field Values           SZ Values
-------------------           ---------
(shown in hex)                (shown in hex)

PN             DP             SZ

303234363732   04             3032343604
383430333938   00             3834303300
303030303131   06             3030303006
303030303031   00             3030303000

SZ のフォーマットはバイナリになります。これは、A フォーマットで定義されたソースフィールドから派生したエレメントが 1 つも存在しないことが理由です。スーパーディスクリプタフォーマットがバイナリであり、最初の値にアンパック形式のゼロ(X'30')が含まれており、バイナリのゼロ(X'00')ではないため、この最終値として空値が格納されます。

Field Definitions:

01,PF,4,P,NU
01,PN,2,P,NU
Superdescriptor Definition:   SP = PF(3,4),PN(1,2)
Source Field Values           SP values
-------------------           ---------
(shown in hex)                (shown in hex)

PF             PN             SP

0002463C       003C           0002003C
0000045C       043C           0000043C
0032464C       000C           No value is stored with index
0038000C       044C           0038044C

SP のフォーマットは、A フォーマットで定義されたソースフィールドが 1 つも存在しないのでバイナリとなります。

Field Definitions:

01,AD,PE
02,CI,4,A,NU
02,ST,5,A,NU
Superdescriptor Definition:   XY = CI(1,4),ST(1,5)
Source Field Values           XY values
-------------------           ---------

CI             ST             XY

(1st occ.)     (1st occ.)
BALT           MAIN           BALTMAIN

(2nd occ.)     (2nd occ.)
CHI            SPRUCE         CHI SPRUCE

(3rd occ.)     (3rd occ.)
WASH           11TH           WASH11TH

(4th occ.)     (4th occ.)
DENV           <null value>   No value stored with index

少なくとも 1 つのエレメントが、A フォーマットで定義されているソースフィールドから派生しているので、XY のフォーマットは英数字となります。

フォネティックディスクリプタ

フォネティックディスクリプタは、フォネティック検索を行うために定義します。FIND コマンドでフォネティックディスクリプタを使用することにより、よく似たフォネティック値を持つレコードがすべて返されます。フォネティックディスクリプタのフォネティック値は、ソースフィールド値の最初の 20 バイトが基本になっています。大文字/小文字のアルファベット値だけが認められ、数値、特殊文字および空白は無視されます。

フォネティックディスクリプタは最後のフィールド定義の後に定義されます。フォネティックディスクリプタは、サブディスクリプタまたはスーパーディスクリプタ定義の前後にあってもかまいません。

フォネティックディスクリプタの定義構文

pn = PHON(fn)
pn

フォネティックディスクリプタの名前です。前述した Adabas での命名規則に準じる必要があります。

PHON(fn)

文字 PHON はソースフィールド名の値に続き、フォネティック判定対象を意味します。

ソースフィールドは、エレメンタリフィールドかマルチプルバリューフィールドであり、英数字フォーマットで定義されていなければなりません。また、ソースフィールドは、ディスクリプタであってもなくても構いませんが、サブディスクリプタおよびスーパーディスクリプタは指定できません。

ソースフィールドはピリオディックグループ内に含まれていても構いません。

Source Field Definition:      01,AA,20,A,DE,NU

Phonetic Definition:          PA = PHON(AA)

ハイパーディスクリプタ

ハイパーディスクリプタは、その値がユーザー指定アルゴリズムを基にしているディスクリプタです。

値は、特殊なユーザー出口(ハイパー出口 1 から 255)にコーディングされたアルゴリズムを基にしています。各出口は、複数のハイパーディスクリプタを扱えます。各ハイパーディスクリプタは、1 つのハイパー出口に割り当てられなければなりません。

ハイパーディスクリプタ値が、Adabas ニュークリアスまたは ADAINV、ADACMP または ADAULD ユーティリティによって生成されるときは、必ずハイパー出口がコールされます。

ハイパーディスクリプタに割り当てられたオプション(PE、MU)によっては、1 つまたは複数の値が返されることがあります。入力値に割り当てられている元の ISN は変更可能です。

ハイパーディスクリプタのフォーマット、長さ、およびオプションについては、ユーザーが定義します。これらは、ハイパーディスクリプタ指定によって定義される親フィールドから取得されるわけではありません。

ハイパーディスクリプタ値を使用した検索は、標準ディスクリプタの場合と同様のやり方で行われます。

ハイパーディスクリプタ値が正しく作成されているかどうかは、ユーザーが確認する必要があります。データストレージに対するハイパーディスクリプタ値の完全性をチェックする標準的な方法はありません。ユーザーは、それぞれの値定義規則を設定し、値が正しいかどうかをチェックします。

ハイパーディスクリプタがパック形式またはアンパック形式で定義されている場合、Adabas で返された値の正当性がチェックされます。

ハイパーディスクリプタの詳細については、「ユーザー出口とハイパー出口」を参照してください。

ハイパーディスクリプタ定義構文

hy-name,length,format[,option... = HYPER(exit_number,parent_field
                                   [,parent  field...])
hy-name

ハイパーディスクリプタに使用する名前です。前述した Adabas での命名規則に準じる必要があります。

長さ

ハイパーディスクリプタのデフォルト長です。

format

ハイパーディスクリプタのフォーマットです。次のフォーマットがサポートされています。

フォーマット 最大長
英数字(A) 253 バイト
2 進数(B) 126 バイト
固定小数点(F) 4 バイト(常に 4 バイト)
浮動小数点(G) 8 バイト(常に 4 または 8 バイト)
パック 10 進数(P) 15 バイト
アンパック 10 進数(U) 29 バイト
オプション

ハイパーディスクリプタに割り当てられるオプションです。ハイパーディスクリプタとともに使用できるオプションを次に示します。

オプション 説明
HE サーチバリュー生成:親フィールドが 1 個の場合のみ使用できます。内部的な検索値ではなく、対応する親フィールドを指定しなければなりません。その後、Adabas は内部的な検索値に変換するためにハイパー出口を呼びます。
MU マルチプルバリューディスクリプタ
NU 空値省略
PE ピリオディックグループインデックス使用
UQ ユニークディスクリプタ
exit_number

ハイパーディスクリプタに割り当てられるハイパー出口番号です。この番号は、Adabas ニュークリアスおよびユーティリティによって使用され、コールされるハイパーディスクリプタユーザー出口を決定します。

parent field

1 から 20 個までのエレメンタリフィールドの名前です。フィールド名とアドレスはユーザー出口に渡されます。

ハイパーディスクリプタ定義の例

次の定義は、下記の例に対して使用されます。

01,LN,20,A,DE,NU    ;Last-Name
01,FN,20,A,MU,NU    ;First-Name
01,ID,4,B,NU        ;Identification
01,AG,3,U           ;Age
01,AD,PE            ;Address
  02,CI,20,A,NU     ;City
  02,ST,20,A,NU     ;Street
01,FA,PE            ;Relatives
  02,NR,20,A,NU     ;R-Last-Name
  02,FR,20,A,MU,NU  ;R-First-Name

Hyperdescriptor definition: HN,60,A,MU,NU=HYPER(2,LN,FN,FR)

ハイパー出口 2 がこのハイパーディスクリプタに割り当てられ、名前は HN です。

ハイパーディスクリプタの長さは 60、フォーマットは英数字です。このハイパーディスクリプタは、空値省略(NU)のマルチプルバリュー(MU)ディスクリプタです。

ハイパーディスクリプタ値は、フィールド LN、FN および FR から派生します。

Hyperdescriptor definition: SN,20,A,HE,NU=HYPER(3,LN)

ハイパー出口 3 がこのハイパーディスクリプタに割り当てられ、名前は SN です。

ハイパーディスクリプタ長は 20、フォーマットは空値省略(NU)の英数字です。ハイパー出口がコールされ、サーチおよびバリューバッファを使用する検索および読み込みコマンドのためにサーチバリューの生成(HE)を行います。

ハイパーディスクリプタ値は、フィールド LN から派生されます。

照合ディスクリプタ

照合ディスクリプタは、Unicode フィールドの照合に ICU 照合キーを使用するディスクリプタです。ICU 照合キーは、Unicode 照合アルゴリズムと言語特有のルールに従って、変換前の文字列から生成されたバイナリ文字列です。この方法で文字列から生成された照合キー同士をバイナリとして比較する場合、お使いの環境に応じた文字列の比較になります。

注意:

  1. 照合ディスクリプタ値は 1144 バイトに切り捨てられます。そのため、実際には異なる値が同じ値として扱われる可能性があることを意味しています。また、照合キーは、派生元の値よりも非常に長くなる可能性もあります。
  2. Adabas バージョン 6.4 までは、ICU 3.2 が使用されていました。Adabas バージョン 6.5 以降では、ICU 5.4 がデフォルトで使用されます。既存のディスクリプタのために、ICU 3.2 も並行してサポートされています。ICU およびサポートされているバージョンの詳細については、「セクションユニバーサルエンコーディングサポート(UES)」を参照してください。

照合ディスクリプタ定義構文

col-name [,max_length] [,LA|L4] [,HE] [,UQ] = COLLATING(parent_field[,collation_attribute]...)
col-name

照合ディスクリプタに使用する名前。前述した Adabas での命名規則に準じる必要があります。

max_length

ディスクリプタ値として格納される最大バイト数。親フィールドから派生した照合キーの方が大きい場合、照合キーは切り捨てられます。デフォルト値と最大値は、ともに最大ディスクリプタ値の長さ(1144)です。

LA、L4

これらのオプションのうちの 1 つを指定すると、可変長のディスクリプタにアクセスする場合に、長さインジケータは 2 バイト(LA オプションの場合)または 4 バイト(L4 オプションの場合)になります。

HE

このオプションを指定する場合、内部照合キーではなく、検索処理のバリューバッファに対応する親フィールド値を指定する必要があります。ディスクリプタ値の読み込み(L9 コマンド)はできません。

このオプションを指定しない場合には、サーチバッファに応じて、バリューバッファに内部照合キーまたは対応する親フィールド値のどちらかを指定することができます。この場合に、ディスクリプタ値の読み込み(L9 コマンド)は可能です。

注意:

  1. アプリケーションプログラムで ICU も使用する場合を除いて、特に必要がなければ、内部照合キーを処理することは避けるようにします。したがって、通常は HE オプションを指定してください。
  2. HE オプションを使用しない場合、照合キーは、それらの親フィールド(親値の長さの 4 倍が照合キーの一般的な長さ)よりかなり大きくなることに注意してください。つまり、照合キーの長さとしては、ほとんどの場合 1 バイトでは足りないわけですが、それでも親値には LA/L4 オプションを定義せずに、照合ディスクリプタに LA または L4 オプションのどちらかを指定することを推奨します。しかし、照合キーは大きくなっても、インデックスに格納されます。これには LA オプションや L4 オプションの指定の有無は関係ありません。ただし、L9 コマンドを使って、この照合キーを可変長で読み込むことはできません。読み込もうとすると、Adabas レスポンスコード 55 が返されます。
UQ

照合ディスクリプタはユニークディスクリプタとして定義することができます。

parent_field

照合ディスクリプタの派生元となるソースフィールドの名前。フォーマットは W でなければなりません。

collation_attribute

すべての照合属性はオプションであり、それらは任意の順序で指定することができます。次の照合属性を指定することができます。

ロケール文字列

ICU によってサポートされるロケールの 1 つ。これは通常、2 文字の ISO-3166 言語コードです。続けて、"@" と "collation=" <照合指定子> を指定できます。この文字列は単一引用符で囲む必要があります。例:'de@collation=phonebook'

デフォルトは、''(空の文字列)です。この場合、照合キーは、Unicode デフォルト照合テーブルと互換性があります。このテーブルは、言語に依存しませんが、よい結果が得られる言語がいくつもあります。

照合の強度

次のいずれかのキーワードを指定することができます。PRIMARY、SECONDARY、TERTIARY、QUARTERNARY、IDENTICAL。指定する値は、比較レベルを表します。詳細については、下記の参考資料 1 と 2 を参照してください。

PRIMARY を指定すると、大文字と小文字の違いや付加記号の有無は無視され、SECONDARY を指定すると、大文字と小文字の違いだけが無視されます。また、TERTIARY を指定すると、句読記号が無視され、QUARTERNARY を指定すると、単語に句読点が付いているか、付いていないかが区別されます。例えば、"ab" と "a-b" を比較するとして、TERTIARY を指定した場合には、どちらも同じとみなされますが、QUARTERNARY を指定した場合には、"ab" の方が小さいとみなされます。IDENTICAL を指定すると、同じ標準分解の単語だけが等しいとみなされます。

デフォルトは TERTIARY です。

ケース優先オプション

次のいずれかのキーワードを指定することができます。UPPERFIRST または LOWERFIRST。

UPPERFIRST を指定すると、大文字は小文字の前にソートされます(例えば、'AB' > 'ab')。

LOWERFIRST を指定すると、小文字は大文字の前にソートされます(例えば、'ab' > 'AB')。

指定されていない場合、大文字小文字の優先処理は未定義になります。

alternate_option

次のいずれかのキーワードを指定することができます。SHIFTED または NON_IGNORABLE。

これらのキーワードは、スペースやハイフンなどの句読記号文字のソート順序に影響します。例えば、単語 "bi-weekly" と "biweekly" をソートしたときの結果は、SHIFTED を指定した場合には、両者は並びますが、NON_IGNORABLE を指定した場合には、両者は並びません。詳細については、下記の参考資料 1 と 2 を参照してください。

デフォルトは NON_IGNORABLE です。

case_level_option

次のいずれかのキーワードを指定することができます。CASELEVEL または NO_CASELEVEL。

CASELEVEL を指定する場合、第 2 ケースレベルと第 3 ケースレベルとの間にもう 1 つのケースレベルが形成されます。現在、ケースレベルは日本語のために使用されますが、ピンインなどの別の用途にも使用可能であることが分かっています。詳細については、下記の参考資料 2 を参照してください。

デフォルトは NO_CASELEVEL です。

french_option

次のいずれかのキーワードを指定することができます。FRENCH または NO_FRENCH。

このオプションの設定は、フランス語のように、付加記号がソートされるかどうかを決定します。

デフォルトは NO_FRENCH です。

normalization_option

次のいずれかのキーワードを指定することができます。NORMALIZATION または NO_NORMALIZATION。

このオプションの設定は、Unicode の標準的同値が考慮されるかどうかを決定します。NO_NORMALIZATION が設定されていたとしても、ICU はほとんどの世界言語の非正規化テキストを正しく処理できます。しかし、1 文字で複数の付加記号を使用できる言語(例えば、ヘブライ語、タイ語、ベトナム語など)では、入力が Unicode 正規化フォーム D に従って正規化されていない場合に、このオプションの設定が必要になります。詳細については、下記の参考資料 2 を参照してください。

デフォルトは NO_NORMALIZATION です。

Collation descriptor definition: C1,HE,UQ=COLLATING(W1,'en',PRIMARY) 

固有の照合ディスクリプタは HE オプションで定義され、言語は英語、照合の強度は PRIMARY です。

Collation descriptor definition: C2,HE=COLLATING(W2,'de@collation=phonebook') 

照合ディスクリプタは HE オプションで定義され、言語はドイツ語、電話帳の順序が使用されます。照合の強度はデフォルト(TERTIARY)です。

ICU 照合に関する参考情報

  1. Mark Davis、Ken Whistler:『Unicode Technical Standard #10, Unicode Collation Algorithm』(http://www.unicode.org/reports/tr10/

  2. International Components for Unicode ホームページ(https://www-01.ibm.com/software/globalization/icu/

参照制約

参照制約は、2 つのキー間の参照整合性を保証します。キーは、ディスクリプタ、スーパーディスクリプタ、または ISN のいずれかです。参照整合性とは、「外部キー」と呼ばれるディスクリプタのすべての値について、プライマリファイル内で「プライマリキー」と呼ばれるディスクリプタ内に値があることを意味します。プライマリキーは一意として定義され、かつオプション NC および NN が設定されている必要があります。外部キーの場合は、オプション NC を設定する必要があります。プライマリキーと外部キーのペアは、同じフォーマットになっている必要があります。ISN をプライマリキーとして使用できます。また、対応する外部キーがバイナリになっている必要があります。プライマリキーと外部キーがスーパーディスクリプタの場合は、次のようになります

  • 対応するキーはスーパーディスクリプタである必要があります。

  • スーパーディスクリプタは、同じ数の親フィールドを持つ必要があります。

  • 対応する親フィールドは、同じフォーマットになっている必要があります。

  • 1 つのスーパーディスクリプタで親フィールドが 2 回出現することはありません。

  • 複数の外部キーで親フィールドが出現することはありません。

  • すべての親フィールドに、オプション NC が必要です。

  • プライマリキーのすべての親フィールドに、オプション NN が必要です。

  • プライマリキーのスーパーディスクリプタは、一意になっている必要があります。

プライマリキー値が変更された場合に外部キーレコードで実行される参照アクションを指定できます。

参照制約は、外部キーが属するファイルに追加されます。

参照制約の構文

Constraint-name = REFINT(foreign-key, primary-file,
			  primary-key[/referential-action[,referential-action]])
foreign-key

外部キーフィールドの名前です。

primary-file

プライマリキーが属するファイルの番号です。

primary-key

プライマリキーの名前です。

referential-action

次のいずれかのキーワードです。

キーワード 説明
DC 削除時にカスケード:プライマリファイル内のレコードが削除されると、外部キーとしてプライマリキーを含んでいるレコードも削除されます。これらのレコードに、参照制約のプライマリキーも含まれている場合は、これらのキーに対して、対応する参照アクションも実行されます。
DX 削除時にアクションなし(デフォルト):プライマリファイル内のレコードを削除する際に、そのプライマリキーを外部キーにしているレコードが存在していない必要があります。存在していると、Adabas レスポンスコード 196 で削除処理が失敗します。
DN 削除時に空値を設定:プライマリファイル内のレコードが削除されると、そのプライマリキーを外部キーにしているレコードで、外部キーフィールドが空値に設定されます。オプション NN を使用して外部キーフィールドが定義されている場合は、このオプションは指定できません。
UC 更新時にカスケード:プライマリファイルのレコードでプライマリキーが更新されると、そのプライマリキーを外部キーにしているレコードで、当該外部キーが新しいプライマリキー値に設定されます。外部キーが参照制約のプライマリキーにもなっている場合は、対応する参照アクションもこれらのキーに対して実行されます。
UX 更新時にアクションなし(デフォルト):プライマリファイル内のレコードでプライマリキーを更新する際に、古いプライマリキー値を外部キーにしているレコードが存在していない必要があります。存在していると、Adabas レスポンスコード 196 で更新処理が失敗します。
UN 更新時に空値を設定:プライマリファイル内のレコードでプライマリキーが更新された場合、そのプライマリキーを外部キーにしているレコードで、外部キーフィールドが空値に設定されます。オプション NN を使用して外部キーフィールドが定義されている場合は、このオプションは指定できません。

参照制約に対しては、最大 1 つの削除処理と最大 1 つの更新オプションを指定できます。ISN をプライマリキーとして参照する制約の場合は、「削除時にカスケード」および「更新時にアクションなし(DC、UX)」アクションのみが可能です。

例:

Primary key definition in file 9:      1, AA,8,A,DE,UQ,NC,NN
Foreign key definition in file 12:     1, AC,8,A,DE,NC

HT=REFINT(AC,9,AA) 
HT=REFINT(AC,9,AA/UC)
HT=REFINT(AC,9,AA/UC,DN)