[解説10]
ロールアップ、ロールダウンとも、この@CLCTLサブファイルの消去をします。つまり、毎回、まっさらの、サブファイルに書き込みます。
[解説15]
再表示の場合、現在表示中のレコードを再び、サブファイルにロードしなくてはいけません。サブルーチン@BWD(backward)を利用して、1ページ分戻ります。注意すべきは、もし、画面の途中まで表示して、EOFとなっている画面で、F5を押したときです。固定的に1ページのサイズにせず、表示行分のレコード数(W1CNT)だけ戻る事で、解決しています。
※他のユーザーが、レコードを追加したために、表示開始行が変わることがあります。この点は、余り気にしていません。もし、これが問題となる場合は、キーによるアクセス+読み込みにしなくてはなりません。
[解説20]
@READCへのタイミングは、ロールアップダウンの前にしています。この後だと、ロールアップダウンを押されると、いくら入力しても、@CLCTLで、入力値ごと消えてなくなります。
[解説30]
ロールアップ(次ページ)、つまりデータを前方に進める場合は、このまま前回の続きとしてファイルを読めばいい。
[解説40]
ロールダウン(前ページ)、つまり逆方向へファイルを読む場合は、ファイルカーソルの位置を、いったん前に戻してから、ロールアップと同じ処理になる。
[解説45]※見やすくフレームを調整して下さい。
ここは、重要です。サファイルにレコードを書き込む場合、READをいきなりしますので、ファイルカーソルは、画面の先頭行のレコードの一つ前に無いといけないのです。 W1CNTはページの途中で終わった場合のつじつま合わせ用です。
例えば、1ページ3行という前提で考えますと、
|
ファイルレコード |
ページ |
W1CNT |
Backward |
*LOVAL SETLL |
BOF |
* |
* |
|
|
|
1 |
1 |
1 |
3 |
6 |
|
|
|
2 |
2 |
2 |
5 |
|
|
|
3 |
3 |
1 |
4 |
7 |
|
|
4 |
2 |
1 |
|
3 |
6 |
|
|
5 |
2 |
|
2 |
5 |
|
|
6 |
3 |
|
1 |
4 |
5 |
|
7 |
3 |
1 |
|
|
3 |
4 |
|
8 |
2 |
|
|
2 |
3 |
|
9 |
3 |
|
|
1 |
2 |
|
10 |
4 |
1 |
|
|
|
1 |
*HIVAL SETGT |
EOF |
|
|
|
* |
- 最初のページから前のページに戻るならば、ファイルレコード番号1の前にする(BOF;*LOVALでSETLLします)。
- 2ページ表示後、前のページに戻るならば、ファイルレコード番号6から、ファイルレコード番号1にする(-7;BOF;*LOVALでSETLLします)
- 3ページ表示後、前のページに戻るならば、ファイルレコード番号9から、ファイルレコード番号3にする(-7)
- 4ページ表示後、前のページに戻るならば、ファイルレコード番号EOFから、ファイルレコード番号6にする(-5)
まとめると、
前ページレコード数(=3)+表示中のレコード数、
EOFのページは、ここに+1をすることになります。
[解説50]
一ページ分を取り込む方法はやはり、書き込んだレコードのカウント(W1CNT)をして判断します。W1CNTの代わりにRRN01では、@BWDでおかしくなります。
READCでRRN01が変わるからです。
[解説60]
ここで、EOFになったら、SETGTするのは、この後、オペレータがロールダウン(前ページ)をするかもしれないから。つまり、パターン2では、ロールダウンは、メモリに入った内容を巻き戻すので、明示的にSETGTをする必要がありませんでした。しかし、パターン3では、すべて読み直しをするので、この処理をする必要があります。
ちなみに、READ系の命令では、EOF,BOF後に再び読み込むときは、位置決め命令(SETLL,SETGT)は必須です。
[解説70]
ここでも、EOF検査のあと、SETGTをしないと、この後の、ロールダウン処理がおかしくなります。
[解説80]
書き込み行数のカウント用のフィールドのカウントアップです。
[解説100]
EOFの場合のみ、SETGTをした分、戻りレコード数は、+1します。SETGT後にREADPで読み込むレコードが、最終レコードとなるからです。
[解説110]
ここで、ファイルカーソルを一気にもどします。スクロールバックをしているわけです。
[解説120]
*IN95はBOF(ファイル先頭)に達したので、*LOVAL SETLLをしています。
このあとは、パターン1と同じです。
|