Сохраняет в памяти информацию о текущей
позиции файла file, которую потом можно будет
восстановить процедурой RESTORE.
- Для каждого файла базы данных с помощью
SAVE можно сохранить несколько позиций, но
восстанавливать эти позиции с помощью
RESTORE можно только в обратном порядке, по
отношению к порядку их сохранения.
Например:
...
SAVE(File1); (* Сохранили позицию 1 в файле File1 *)
...
SAVE(File2); (* Сохранили позицию 1 в файле File2 *)
...
SAVE(File1); (* Сохранили позицию 2 в файле File1 *)
...
RESTORE(File2) (* В файле File2 восстановили позицию 1 *)
...
RESTORE(File1) (* В файле File1 восстановили позицию 2 *)
...
RESTORE(File1) (* В файле File1 восстановили позицию 1 *)
...
Т.о. вложенные пары SAVE - RESTORE работают по
принципу стека: восстанавливается
последняя сохраненная позиция данного
файла.
- Число RESTORE-ов внутри всей программы, а
также внутри каждого TRY-блока, должны
соответствовать числу SAVE-ов.
- Если при нормальном выходе из TRY-блока
(в том числе с помощью EXIT, RETURN, HALT(0))
число выполненных RESTORE-ов оказалось
меньше числа выполненных в нем SAVE-ов, то
выбрасывается исключение 167.
Причем, это исключение можно
перехватить обработчиком этого же TRY-блока.
Например:
TRY
SELECT(File, Key);
SAVE(File);
EXCEPT
ON Exc: Exc_RunTime DO
IF Exc.ErrorCode = 167 THEN
STDMSG("В TRY-блоке маловато RESTORE-ов", INFORM);
END;
ELSE
...
END;
- Если при нормальном завершении
программы (в том числе с помощью
HALT(0)) число выполненных RESTORE-ов
оказалось меньше числа выполненных SAVE-ов,
то выбрасывается исключение 168.
- Если в TRY-блоке выбросится какое-либо
исключение, то сохраненные внутри
этого TRY-блока позиции файлов
восстановятся автоматически.
- Если на момент выполнения SAVE, позиция в
файле не была определена, т.е. функция OCCURE
вернула бы 0, то после выполнения RESTORE
позиция в файле станет неопределенной.
- Если после выполнения позиционирования
значения полей файла были модифицированы и
без выполнения REPLACE или INSERT
(грязный курсор)
вызван SAVE, то будет выброшено исключение 181.
- Если после выполнения SAVE программа изменила значения полей записи
сохраненной позиции, то
RESTORE восстановит запись с новыми значениями
полей. Например:
File.Field:= 105;
REPLACE(File);
SAVE(File); (* Сохранили текущую позицию файла File со значением поля Field=105 *)
File.Field:= 16;
REPLACE(File); (* В Изменили значение поля Field записи сохраненной позиции *)
LAST(File); (* Сместились с сохраненной позиции *)
RESTORE(File); (* Спозиционировались на сохраненную позицию, причем значение поля Field=16 *)
- Если после выполнения SAVE программа
удалила запись сохраненной позиции, то
после RESTORE позиция в файле будет не определена. Например:
SAVE(File); (* Сохранили текущую позицию файла File со значением поля Field=105 *)
REMOVE(File); (* Удалили сохраненную позицию, сместились на следующую (если получилось) *)
RESTORE(File); (* Пытались восстановить сохраненную позицию, но получили состояние ~OCCURE *)
- Режим текущей позиции
в момент SAVE должен соответствует режиму таблицы
в момент RESTORE, иначе RESTORE выбросит
исключение 979. Причем RESTORE восстановит тот экземпляр, который в
текущем режиме доступа дала бы
процедура
позиционирования. Данное правило не действует, если оба режима -
нестабильные. Примеры:
- SOFT - SEARCH - SAVE - RIDGE - RESTORE - исключение 979, т.к.
сохранен экземпляр мягкого режима, а к моменту выполнения RESTORE
таблица в жестком
- SOFT - SEARCH - SAVE - GETLASTVERSION - RESTORE - восстановит
экземпляр жесткого режима, т.к. сохранен экземпляр мягкого режима, к
моменту выполнения RESTORE таблица в мягком, но восстанавливаемая
позиция разделяемо заблокирована, а значит доступен только экземпляр
жесткого режима.
- FINISHED - SEARCH - SAVE - HOTTEST - RESTORE - восстановит
экземпляр HOTTEST-режима, т.к. сохранен FINISHED-экземпляр, к
моменту выполнения RESTORE таблица в HOTTEST-режиме, оба режима
нестабильные, поэтому исключение не выбрасывается. Текущий режим файла
HOTTEST, значит RESTORE даст HOTTEST- экземпляр (именно его дала бы
процедура позиционирования)