Google
オフコン練習帳内を検索
インターネット全体を検索

NECオフコン関連
オフコン一般
情報
トップ  >  A−VX - 順編成ファイル その1

順編成ファイル その1

1 順編成ファイルとはどんなファイルか

順編成ファイルは、先頭あるいは前回最後に書き込んだ続きから順番に書き込み、先頭から順番に読み込みできるファイルです。

<読み込み>
必ず先頭から順番にデータを読み込むことになり、途中からデータを読み込むことができません。もし途中のレコード(データ)が必要ならば、先頭から目的のデータまでの途中のデータを読み捨てていきます。
もちろんファイルの最後から先頭に向かって逆順に読むということもできません。

<書き込み>
書き込みは先頭から順番に行うほかに、前回書き込んだ次から順番に書き込むことができます。磁気ディスク(ハードディスク)とフロッピーディスク上の順編成ファイルの場合には、読み込んだデータを変更して、そのデータを元の場所に書き戻すことと、読み込んだデータを削除することができます。あるデータをファイルの途中に挿入することはできません。
ファイルの最後から先頭に向かって逆順に書き込むということもできません。

2 4つの処理モード

A−VXの順編成ファイルには4種類の処理モードがあり、ファイルのオープン時にそのうちのどの処理モードでファイルにアクセスするかを決めます。一度モードを決めるとファイルをクローズするまで変わりません。もしモードを変えたいならば、一旦クローズして目的のモードで再度オープンしなければなりません。

<入力処理モード>
ひたすらファイル先頭から順番にレコードを読み込むモード。ファイルに対する書き込みは一切できない。

<出力処理モード>
入力処理モードとは逆に、ファイル先頭からレコードを順番に書き込むモード。前に書いたレコード(データ)は上書きされて残らない。ファイルからの読み込みは一切できない。

<更新処理モード>
先頭から順番に読み込み、そのレコードのデータを変更して同じ場所に書き込むことや削除することができる。
磁気ディスク(ハードディスク)とフロッピーディスク上の順編成ファイルの場合だけ選べるモード。

<追加処理モード>
現在のファイルの最後のレコードの次のレコードから書き込んでいくモード。出力処理モードとは異なり、前回書き込んだデータは残したい場合に使います。読み込みはできません。

3 出力処理モードと追加処理モードの違い

ファイルには、EOD(レコード終了アドレス)というものがあり、これで最後にどこまで書き込んだかを覚えています。ファイルの先頭からEODの指しているレコードの1つ前のレコードまでが、使用している(データの入っている)レコードとなります。

A−VXではSYS@FDFというファイルでそのボリュームに存在する全てのファイルの情報を管理しており、EODもSYS@FDF中に格納されています。



追加処理モードの場合は、EODの指しているレコードから書き込みを行います。一方、出力処理モードの時は、EODを一旦ファイルの先頭のレコードに戻してから書き込みを行います。



出力処理モードでは、EODをファイル先頭に戻すだけで、ファイル中のレコード内のデータは何も書き換えないというところに注目してください。

なぜ、EODの説明をしているかですが、EODの仕組みがわかるとファイルの復旧ができるかもしれないからです。

例えば、あるファイルに100件のレコード(データ)があるとします。そしてそのファイルをうっかり出力処理モードでオープンしてしまい、2レコード分上書きをしてしまったとします。そうするとファイル上は2レコード書き込み、EODが3レコード目を指している状態になります。出力処理モードではEODの移動しかしないので、98件分のデータは上書きされていません。つまりEODを98件分後ろにずらせば、98件分のデータが復旧できるかもしれないということになります。

EODをおかしくしてしまうと、逆にデータ消失してしまうこともあるので、気をつけてください。

4 更新処理モード

更新処理モードでは、先頭から順番に読み込み、そのレコードの内容を変更して書き戻したり、削除することができます。「先頭か順番に」なのでいきなり途中のレコードを読むということはできません。またレコードの内容を書き換える前にそのレコードを読み込まなければなりません。読み込んでいないレコードをいきなり書き換えることはできません。削除も同様に読み込んだレコードに対して行います。いきなりレコードを削除ということはできません。ファイルの途中にレコードを挿入するといったこともできません。

レコードの内容を変更するときは次のような手順で行います。

(1)変更するレコードを読み込む(READ)。
(2)読み込んだレコードの必要な項目を他の値で置き換える。
(3)変更されたレコードを元の場所へ書き戻す(REWRITE)。

(1)から(3)の間はレコードの排他制御のロックが行われます。つまり(1)で(3)で書き戻すまでの間は、他のジョブはこのレコードに対するアクセスが待ち合わせられるということです。(共用モードの場合)これにより(1)から(3)の間の不可分性(Atomicity)、独立性(Isolation)が保たれます。

削除も同様に読み込みから削除の間はレコードの排他制御のロックが行われます。

今までロックされると書きましたが、実はCOBOLの命令にレコードをロック状態にしないオプションがあります。(READ UNLOCK)

5 アクセスモード

順編成ファイルでは一般に順アクセスモードを使用します。

6 削除レコード

更新処理モードで順編成ファイルをオープンすると、任意のレコードを削除することができます。

システム内部では、レコードの先頭1バイトに16進コードで”FF”という削除コード(DDM:Delete Data Mark)を書き込むことによって、削除されたレコードにしています。



先頭1バイトが”FF”という特殊なコードになっているとシステムが削除レコードと判断されるため、仮にレコードを削除したとしても、システムは1バイト目だけしか書き換えず、2バイト目以降のデータはハードディスク上に残っています。ということは、1バイト目を”FF”以外に書き換えれば、削除レコードではなくなるということです。A−VX付属のユーティリティを使えば、1バイト目を書き換えることができます。もしうっかり削除してしまったとしても、元のデータの1バイト目がわかっていれば、ユーティリティを使って1バイト目を元に戻すことにより、データを復帰させることができます。

また、そもそも1バイト目を使用しないようにすれば、(例えば先頭を1バイトのキャラクタフィールドとしておいて、そこは何も使わない)うっかり削除してしまっても、削除コード”FF”を”40”なり適当な値に書き換えれば元に戻り、元データが何であったかを思い出す必要はなくなります。

7 ファイルのオーバーフロー

削除レコードはそのままでは再利用されません。
このためどんどんレコードを削除していくと、削除レコードが増えていきます。そして削除レコードが増えると、ほんの少ししかレコード(データ)が入っていないのにオーバーフローになってしまうことがあります。

ファイルがオーバーフローになる原因は次の2つです。
・本当にファイルが満杯になっている。(例えば100レコードの大きさのファイルがあったとして、100レコード分のデータが入ってしまっている。)
・削除レコードがたくさんある。(例えば100レコードの大きさのファイルがあったとして、80レコードが削除レコードで、20レコードが使用されている。)

前者の場合、エクステントの拡張や追加、それができなければもっと大きなファイルを作り直すなどで解決させます。
後者の場合は、削除レコードを整理して再利用可能な状態にします。

削除レコードを再利用可能にするには、ファイルの再編成を行います。
ファイルの再編成の方法は、一般的にユーティリティなどを使って、削除コードを持たないレコードのみを抽出して別ファイルに出力するなどの方法が取られます。 削除レコードをなくすことによるもうひとつの効果として、無駄なファイル読み込みがなくなるため、順編成ファイルの読み込みが速くなったりすることもあります。

8 レコード/ブロック形式

レコードの桁数:1〜4096(フロッピーディスクの場合1〜1024)

ブロック化係数:1〜256

ブロックの桁数:1〜4096(フロッピーディスクの場合1〜1024)

先に説明したようにレコードの先頭が16進数FFのレコードは、削除レコードとみなされるので注意。削除レコードは読み出すことができません。一般的にA−VXのデータで16進数のFFを使うことはあまりないと思いますが、COBOLでレコードの先頭にX項目があって、通信で入ってきたデータをそのまま転記したときのような場合に思わぬところでFFが入ったりするので注意が必要です。送られたデータの数とファイルに入っているレコードの数が合わず「何で?」となりやすいです。