ファイル入出力の get に関する考慮事項

データベースと関係のないファイル入出力の場合、EGL の get ステートメントは、ファイルからレコード・データを取り出します。

取り出したデータは、ステートメント内で指定したレコード変数に送られます。このステートメントの正確な動作は、レコード変数をステレオタイプ化した際の方法によって異なります。

構文

ファイル入出力を使用した get の構文図
positionOption
相対レコードとシリアル・レコードの場合、使用可能な定位置キーワードは next のみです。このトピックの特定レコードのステレオタイプについては、『get next』セクションを参照してください。 索引付きレコードの場合は、previous キーワードも使用できます。 このトピックの『索引付きレコードによる get previous』を参照してください。
recordVariable
データのコピー先のレコード変数の名前。
forUpdate
以降の削除または置換のために、レコードを保持するオプションです。

CSV レコード

CSVRecord ステレオタイプによるレコードを指定する場合に使用できる get ステートメントの形式は、get next (単一変数の場合) と get (配列の場合) のみです。

現行レコードを最初にファイルから読み取る場合は、EGL によりレコードの labels プロパティーがチェックされます。 プロパティーが NULL 値を持たない場合、EGL は次のアクションを実行します。
  1. データの最初の行をファイルから読み取ります。
  2. レコードの delimiter プロパティーの値に基づいて、行を文字列に分割します。レコードのフィールドよりも多くの文字列がある場合、EGL では余分な文字列は無視されます。欠落するフィールドは NULL のままとなります。
  3. ラベル配列を消去して、ステップ 2 からの文字列を埋め込みます。

EGL は続いてファイルの次の行を読み取り、delimiter プロパティーの値を基に別個の文字列に分割します。レコードのフィールドよりも多くの文字列がある場合、EGL では余分な文字列は無視されます。

最後に、EGL は文字列を使用して、レコードのフィールドを更新します。EGL は、既存の変換規則を使用して、文字列を適切な値に変換します。EGL では BOOLEAN フィールドの値として「true」および「false」が想定されます。大文字小文字の区別は無視されます。特定のフィールドに対応する文字列がない場合、そのフィールドは NULL 値を受け取ります。

get ステートメントにより、レコードの配列を指定することができます。 配列が NULL 値を持つ場合、EGL により新しい配列が作成されます。配列が非 NULL である場合は、 EGL により空の配列に再初期化されます。その maxSize プロパティーの元の値が保持されます。 さらにファイルにデータが含まれ、配列がいっぱいでなければ、EGL は次のアクションを実行します。
  1. 新しい配列エレメント (CSVRecord) を作成します。
  2. get next ステートメントを使用して、次のレコードを読み取ります。
  3. 行内の文字列を変換し、これを上記のようにレコード・フィールドに格納します。
  4. レコードを配列の末尾に追加します。

ファイルが空の場合、配列の I/O エラー状況が noRecordFound に設定されます (行の読み取りは行われない。配列のサイズがゼロ)。ファイル全体が配列に読み込まれると、 I/O エラー状況は endOfFile に設定されます。

EGL は、読み取り後、ファイルを閉じます。

索引付きレコード

IndexedRecord ステレオタイプのレコードを参照する get 文を発行するときは、 レコードのキー値によって、ファイルから検索されるレコードが決定されます。

索引付きレコードを置換または削除するには、まず、forUpdate オプションを指定した get 文でレコードを読み取る必要があります。 次に、同じファイルに対する入出力操作を間に挟まずに、replace 文または delete 文を使用します。 get 文を発行した後、同じファイルに対して次に入出力操作を行うと、以下のようになります。
  • 同じ EGL レコードに対する次の入出力操作が replace 文である場合は、 レコードはファイル内で変更されます。
  • 同じ EGL レコードに対する次の入出力操作が delete 文である場合は、 ファイル内のレコードは削除のマークが付けられます。
  • 同じ EGL レコードに対する次の入出力操作が、get 文で、 その文に forUpdate オプションが含まれている場合は、以降の replace または delete 文は新しく読み取られるファイル・レコードに対して 有効となります。
  • 同じ EGL レコードに対する次の入出力操作が、forUpdate オプションを含まない get 文、または同じファイルに対する close 文である場合は、ファイル・レコードは変更なしにリリースされます。

(forUpdate オプションを指定した) get 文を実行すると、他のプログラムはレコードを変更できなくなります。詳しくは、このトピックの『互換性』を参照してください。

索引付きレコードによる get next

索引付きレコードを指定する get next 文は、 以下の操作のいずれかにより設定された現在のファイル位置に基づいて、ファイルから次のレコードを読み取ります。
  • get 文、別の get next 文、または get previous 文などの正常な入出力 (I/O) 操作。
  • set 文 (position 修飾子付き)。
以下の規則が適用されます。
  • ファイルが開かれていない場合は、get next 文はファイル内のキー値が最も低いレコードを読み取る。
  • 以降の各 get next 文は、現在のファイル位置との関係でキー値が次に高いレコードを読み取る。 複写キーのこの状態もこのトピックで説明します。
  • get next 文がファイル内のキー値が最も高いレコードを読み取った後、次の get next 文の結果は EGL エラー値 endOfFile になる。
  • 現在のファイル位置は、以下の操作の影響を受ける。
    • set 文 (position 修飾子付き) は、 set value に基づいてファイル位置を設定する。 この値は、set 文によって参照される索引付きレコード内のキー値です。 同じ索引付きレコード変数を参照する以降の get next 文は、キー値が set value と等しいかより大きいファイル・レコードを読み取ります。そのようなレコードが存在しない場合は、get next の結果は endOfFile になります。
    • get next 文以外の正常な I/O 文は、 新しいファイル位置を設定し、同じ EGL レコードに対して発行される後続の get next 文は、次の ファイル・レコードを読み取る。例えば、get previous 文がファイル・レコードを読み取った後、get next 文は、次に高いキーを持つファイル・レコードを読み取るか、endOfFile を戻します。
    • get previous 文が endOfFile を戻した場合、 後続の get next 文は、ファイルの最初のレコードを検索する。
    • 異常終了した getget next、または get previous 文の後、ファイル位置は未定義となり、 set 文 (position 修飾子付き) によって再設定するか、get next または get previous 文以外の入出力操作によって再設定する必要がある。
  • 代替索引を使用する場合で、ファイル内に複写キーがある場合は、以下の規則が適用される。
    • キーの値がより高いレコードの検索は、get next 文が、検索された最新のレコードと同じキーを持つすべてのレコードを読み取った後でのみ行われる。複写キー付きレコードが検索される順序は、EGL がレコードを戻す順序です。
    • プログラムが同じキーを含むレコード・グループ内の最終レコードを検索した場合、EGL エラー値 duplicate は設定されない。
    • get nextget next 以外の正常な入出力操作に続く場合、その get next 文は複写キー付きレコードをスキップオーバーし、キー値が次に高いレコードを検索する。
キーが以下のようになっているファイルを考えてみましょう。
  1, 2, 2, 2, 3, 4

以下の各表は、同じ索引付きレコードに対して一連の EGL 文を実行する場合の効果を示しています。

表 1. 索引付きレコードに対する get 文および get next 文の効果
EGL 文 (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー EGL のエラー値
get 2 2 (3 つある内の最初のもの) 重複
get next any 3 --

表 2. 索引付きレコードに対する set position 文および get next 文の効果
EGL 文 (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー EGL のエラー値
set position 2 検索されない --
get next any 2 (3 つある内の最初のもの) 重複
get next any 2 (2 番目のもの) 重複
get next any 2 (3 番目のもの) --
get next any 3 --

索引付きレコードによる get previous

get previous 文が索引付きレコードに対して操作を行う場合、 get next 文を使用した場合のように、効果は現在のファイル位置に基づいたものとなります。 索引付きレコードには、以下の規則が適用されます。
  • ファイルが開かれていない場合は、get previous 文はファイル内のキー値が最も高いレコードを読み取る。
  • 以降の各 get previous は、現在のファイル位置との関係でキー値が次に低いレコードを読み取る。複写キーのこの状態は、後述します。
  • get previous 文がファイル内のキー値が最も低いレコードを読み取った後、次の get previous 文の結果は EGL エラー値 endOfFile になる。
  • 現在のファイル位置は、以下の操作の影響を受ける。
    • set 文 (position 修飾子付き) は、 set value に基づいてファイル位置を設定する。 この値は、set 文によって参照される索引付きレコード内のキー値です。 同じ索引付きレコードを参照する以降の get previous 文は、キー値が set value と等しいかより小さいファイル・レコードを読み取ります。そのようなレコードが存在しない場合は、get previous 文の結果は endOfFile になります。
      set value が 16 進数 FF で埋められている場合、 set position 文の結果は以下のようになります。
      • set 文は、ファイル内の最後のレコードの後ろにファイル位置を設定する
      • get previous 文が、次の入出力操作の場合、生成されたコードではファイル内の最後のレコードが検索される
    • get previous 文以外の正常な I/O 文は、新しいファイル位置を設定し、同じ EGL レコード変数を参照する後続の get previous 文は新しい位置との相対でレコードの位置指定を試行する。
    • get next 文が endOfFile を戻した場合、 後続の get previous 文は、ファイルの最後のレコードを検索する。
    • 異常終了した getget next、または get previous 文の後、ファイル位置は未定義となり、set position 文によって再設定するか、get next または get previous 文以外の入出力操作によって再設定する必要がある。
  • 代替索引を使用する場合で、ファイル内に複写キーがある場合は、以下の規則が適用される。
    • キーの値がより低いレコードの検索は、get previous 文が、検索された最新のレコードと同じキーを持つすべてのレコードを読み取った後でのみ行われる。複写キー付きレコードが検索される順序は、EGL がレコードを戻す順序です。
    • プログラムが同じキーを含むレコード・グループ内の最終レコードを検索した場合、EGL エラー値 duplicate は設定されない。
    • get previousget previous 以外の正常な入出力操作に続く場合、その get previous 文は複写キー付きレコードをスキップオーバーし、キー値が次に低いレコードを検索する。
代替索引内のキーが以下のようになっているファイルについて考えます。
  1, 2, 2, 2, 3, 4

以下の各表は、同じ索引付きレコードに対して一連の EGL 文を実行する場合の効果を示しています。

表 3. 索引付きレコードに対する get 文および get previous 文の効果
EGL 文 (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー EGL のエラー値
get 3 3 --
get previous any 2 (3 つある内の最初のもの) 重複
get previous any 2 (2 番目のもの) 重複
get previous any 2 (3 番目のもの) --
get previous any 1 --
get previous any -- endOfFile

表 4. 索引付きレコードに対する set position 文および get previous 文の効果
EGL 文 (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー EGL のエラー値
set position 2 -- --
get next any 2 (最初のもの) 重複
get next any 2 (2 番目のもの) 重複
get previous any 1 --
get previous any -- endOfFile

表 5. 索引付きレコードに対する set position 文および get previous 文の効果
EGL 文 (実行順) 索引付きレコード内のキー 文によって検索されるファイル・レコード内のキー EGL のエラー値
set position 1 -- --
get previous any 1 --
get previous any -- endOfFile

相対レコードに対する get

相対レコード変数に対して get 文を使用する場合、レコードに関連付けられたレコード番号フィールドによって、ファイルから取り出されるレコードが決まります。 レコード番号フィールドは、そのレコードを使用するすべての関数で使用できなければなりません。以下の任意のフィールドをレコード番号フィールドにすることができます。
  • 同一レコード内のフィールド。
  • プログラムに対してグローバルであるか、get 文を実行する関数に対してローカルであるレコード内のフィールド。
  • プログラムに対してグローバルであるか、get 文を実行する関数に対してローカルである変数。
相対レコードを置換または削除するには、レコードに対して forUpdate オプションを指定した get 文を発行し、次に、同じファイルに対する入出力操作を間に挟まずに replace 文または delete 文を発行する必要があります。 get 文を発行した後、同じファイルに対して次に入出力操作を行うと、以下のようになります。
  • 同じ EGL レコードに対する次の入出力操作が replace 文である場合は、 レコードはファイル内で変更されます。
  • 同じ EGL レコードに対する次の入出力操作が delete 文である場合は、 ファイル内のレコードは削除のマークが付けられます。
  • 同じ EGL レコードに対する次の入出力操作が get 文で、その文に forUpdate オプションが指定されている場合、後続の置換または削除が、新しく読み取られたファイル・レコードに対して有効になります。
  • 同じ EGL レコードに対する次の入出力操作が (forUpdate オプションの指定されていない) get 文であるか、同じファイルに対する close 文である場合は、変更を行わずにファイルまたはレコードがリリースされます。

相対レコードによる get next

相対レコードに対して get next 文を使用する場合、効果は現在のファイル位置に基づいたものとなります。 この位置は、get 文や別の get next 文などの正常な入出力操作によって設定されます。 以下の規則が適用されます。
  • ファイルが開かれていない場合は、get next 文はファイル内の最初のレコードを読み取る。
  • 以降の各 get next は、現在のファイル位置との関係で次に高いレコード番号値を持つレコードを読み取る。
  • 次のレコードが削除されている場合、get nextnoRecordFound を戻さない。代わりに、get next は削除されたレコードをスキップしてファイル内の次のレコードを検索します。
  • 現在のファイル位置は、以下の操作の影響を受ける。
    • get next 以外の正常な I/O 文は、新しいファイル位置を設定し、同じ EGL レコード変数を参照する後続の get next は新しいファイル位置に基づいてレコードの位置指定を試行する。
    • get 文または get next 文が正常に実行された後のファイル位置は未定義であるため、 get next 文以外の入出力操作によって再設定しなければならない。
  • get next 文がファイル内の最終レコードを読み取った後、次の get next 文の結果は EGL エラー値 endOfFile および noRecordFound になる。

シリアル・レコードによる get next

get 文は、シリアル・レコードには使用できません。

get next 文がシリアル・レコードに対して操作を行う場合、効果は現在のファイル位置に基づいたものとなります。 この位置は、別の get next によって設定されます。以下の規則が適用されます。
  • ファイルが開かれていない場合は、get next 文はファイル内の最初のレコードを読み取る。
  • 以降の各 get next は次のレコードを読み取る。
  • get next 文がファイル内の最終レコードを読み取った後、後続の get next 文の結果は EGL エラー値 endOfFile になる。
  • プログラムがファイルの書き込みから読み取りへ、またはファイルの読み取りから書き込みへ変更されるたびに、EGL はファイルをいったん閉じて、再オープンします。 例えば、add 文を使用してシリアル・レコードに書き込みを行い、次に get next 文を使用して同じファイルからデータを読み取った場合、EGL はファイルを閉じます。 get next 文に続く add 文は、ファイルの先頭にレコードを追加します。 add 文に続く get next 文は、ファイル内の最初のレコードを読み取ります。 この振る舞いは、get next 文と add 文が別々のプログラムにあり、一方のプログラムで他方のプログラムが呼び出される場合にも起こります。
複数のプログラムで同時に同じファイルが開かないようにしておくことをお勧めします。

以下に、索引付きファイルからレコードを読み取る方法の例を示します。
  myCustomer CustomerRecord;          // レコード変数を作成する
  myCustomer.customerNumber = 1001;   // レコード変数にキーを設定する

  try
    get myCustomer;
  onException(fileErr FileIOException)
    myErrorHandler(fileErr);  // プログラムを終了する
  end

フィードバック