ファイル入出力の get に関する考慮事項
データベースと関係のないファイル入出力の場合、EGL の get ステートメントは、ファイルからレコード・データを取り出します。
取り出したデータは、ステートメント内で指定したレコード変数に送られます。このステートメントの正確な動作は、レコード変数をステレオタイプ化した際の方法によって異なります。
構文

- positionOption
- 相対レコードとシリアル・レコードの場合、使用可能な定位置キーワードは next のみです。このトピックの特定レコードのステレオタイプについては、『get next』セクションを参照してください。 索引付きレコードの場合は、previous キーワードも使用できます。 このトピックの『索引付きレコードによる get previous』を参照してください。
- recordVariable
- データのコピー先のレコード変数の名前。
- forUpdate
- 以降の削除または置換のために、レコードを保持するオプションです。
CSV レコード
CSVRecord ステレオタイプによるレコードを指定する場合に使用できる get ステートメントの形式は、get next (単一変数の場合) と get (配列の場合) のみです。
- データの最初の行をファイルから読み取ります。
- レコードの delimiter プロパティーの値に基づいて、行を文字列に分割します。レコードのフィールドよりも多くの文字列がある場合、EGL では余分な文字列は無視されます。欠落するフィールドは NULL のままとなります。
- ラベル配列を消去して、ステップ 2 からの文字列を埋め込みます。
EGL は続いてファイルの次の行を読み取り、delimiter プロパティーの値を基に別個の文字列に分割します。レコードのフィールドよりも多くの文字列がある場合、EGL では余分な文字列は無視されます。
最後に、EGL は文字列を使用して、レコードのフィールドを更新します。EGL は、既存の変換規則を使用して、文字列を適切な値に変換します。EGL では BOOLEAN フィールドの値として「true」および「false」が想定されます。大文字小文字の区別は無視されます。特定のフィールドに対応する文字列がない場合、そのフィールドは NULL 値を受け取ります。
- 新しい配列エレメント (CSVRecord) を作成します。
- get next ステートメントを使用して、次のレコードを読み取ります。
- 行内の文字列を変換し、これを上記のようにレコード・フィールドに格納します。
- レコードを配列の末尾に追加します。
ファイルが空の場合、配列の I/O エラー状況が noRecordFound に設定されます (行の読み取りは行われない。配列のサイズがゼロ)。ファイル全体が配列に読み込まれると、 I/O エラー状況は endOfFile に設定されます。
EGL は、読み取り後、ファイルを閉じます。
索引付きレコード
IndexedRecord ステレオタイプのレコードを参照する get 文を発行するときは、 レコードのキー値によって、ファイルから検索されるレコードが決定されます。
- 同じ EGL レコードに対する次の入出力操作が replace 文である場合は、 レコードはファイル内で変更されます。
- 同じ EGL レコードに対する次の入出力操作が delete 文である場合は、 ファイル内のレコードは削除のマークが付けられます。
- 同じ EGL レコードに対する次の入出力操作が、get 文で、 その文に forUpdate オプションが含まれている場合は、以降の replace または delete 文は新しく読み取られるファイル・レコードに対して 有効となります。
- 同じ EGL レコードに対する次の入出力操作が、forUpdate オプションを含まない get 文、または同じファイルに対する close 文である場合は、ファイル・レコードは変更なしにリリースされます。
(forUpdate オプションを指定した) get 文を実行すると、他のプログラムはレコードを変更できなくなります。詳しくは、このトピックの『互換性』を参照してください。
索引付きレコードによる 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 文は、ファイルの最初のレコードを検索する。
- 異常終了した get、get next、または get previous 文の後、ファイル位置は未定義となり、 set 文 (position 修飾子付き) によって再設定するか、get next または get previous 文以外の入出力操作によって再設定する必要がある。
- 代替索引を使用する場合で、ファイル内に複写キーがある場合は、以下の規則が適用される。
- キーの値がより高いレコードの検索は、get next 文が、検索された最新のレコードと同じキーを持つすべてのレコードを読み取った後でのみ行われる。複写キー付きレコードが検索される順序は、EGL がレコードを戻す順序です。
- プログラムが同じキーを含むレコード・グループ内の最終レコードを検索した場合、EGL エラー値 duplicate は設定されない。
- get next が get next 以外の正常な入出力操作に続く場合、その get next 文は複写キー付きレコードをスキップオーバーし、キー値が次に高いレコードを検索する。
1, 2, 2, 2, 3, 4
以下の各表は、同じ索引付きレコードに対して一連の EGL 文を実行する場合の効果を示しています。
| EGL 文 (実行順) | 索引付きレコード内のキー | 文によって検索されるファイル・レコード内のキー | EGL のエラー値 |
|---|---|---|---|
| get | 2 | 2 (3 つある内の最初のもの) | 重複 |
| get next | any | 3 | -- |
| 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 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 文は、ファイルの最後のレコードを検索する。
- 異常終了した get、get next、または get previous 文の後、ファイル位置は未定義となり、set position 文によって再設定するか、get next または get previous 文以外の入出力操作によって再設定する必要がある。
- set 文 (position 修飾子付き) は、
set value に基づいてファイル位置を設定する。
この値は、set 文によって参照される索引付きレコード内のキー値です。
同じ索引付きレコードを参照する以降の get previous 文は、キー値が set value と等しいかより小さいファイル・レコードを読み取ります。そのようなレコードが存在しない場合は、get
previous 文の結果は endOfFile になります。
- 代替索引を使用する場合で、ファイル内に複写キーがある場合は、以下の規則が適用される。
- キーの値がより低いレコードの検索は、get previous 文が、検索された最新のレコードと同じキーを持つすべてのレコードを読み取った後でのみ行われる。複写キー付きレコードが検索される順序は、EGL がレコードを戻す順序です。
- プログラムが同じキーを含むレコード・グループ内の最終レコードを検索した場合、EGL エラー値 duplicate は設定されない。
- get previous が get previous 以外の正常な入出力操作に続く場合、その get previous 文は複写キー付きレコードをスキップオーバーし、キー値が次に低いレコードを検索する。
1, 2, 2, 2, 3, 4
以下の各表は、同じ索引付きレコードに対して一連の EGL 文を実行する場合の効果を示しています。
| 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 |
| EGL 文 (実行順) | 索引付きレコード内のキー | 文によって検索されるファイル・レコード内のキー | EGL のエラー値 |
|---|---|---|---|
| set position | 2 | -- | -- |
| get next | any | 2 (最初のもの) | 重複 |
| get next | any | 2 (2 番目のもの) | 重複 |
| get previous | any | 1 | -- |
| get previous | any | -- | endOfFile |
| EGL 文 (実行順) | 索引付きレコード内のキー | 文によって検索されるファイル・レコード内のキー | EGL のエラー値 |
|---|---|---|---|
| set position | 1 | -- | -- |
| get previous | any | 1 | -- |
| get previous | any | -- | endOfFile |
相対レコードに対する get
- 同一レコード内のフィールド。
- プログラムに対してグローバルであるか、get 文を実行する関数に対してローカルであるレコード内のフィールド。
- プログラムに対してグローバルであるか、get 文を実行する関数に対してローカルである変数。
- 同じ EGL レコードに対する次の入出力操作が replace 文である場合は、 レコードはファイル内で変更されます。
- 同じ EGL レコードに対する次の入出力操作が delete 文である場合は、 ファイル内のレコードは削除のマークが付けられます。
- 同じ EGL レコードに対する次の入出力操作が get 文で、その文に forUpdate オプションが指定されている場合、後続の置換または削除が、新しく読み取られたファイル・レコードに対して有効になります。
- 同じ EGL レコードに対する次の入出力操作が (forUpdate オプションの指定されていない) get 文であるか、同じファイルに対する close 文である場合は、変更を行わずにファイルまたはレコードがリリースされます。
相対レコードによる get next
- ファイルが開かれていない場合は、get next 文はファイル内の最初のレコードを読み取る。
- 以降の各 get next は、現在のファイル位置との関係で次に高いレコード番号値を持つレコードを読み取る。
- 次のレコードが削除されている場合、get next は noRecordFound を戻さない。代わりに、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 文の結果は 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