Распечатать страницу

Удаление и восстановление записей в VFP

« Назад

Команда

DELETE [Scope] [FOR lExpression1] [WHILE lExpression2]
 [IN nWorkArea | cTableAlias] [NOOPTIMIZE]

проставляет, если команда употреблена без опций, пометку удаления текущей записи или записей таблицы, отвечающих указанным в опциях значениям.

Опции и параметры команды описаны в табл. 1.7.

Записи, имеющие пометку удаления, физически не удаляются. Эту операцию выполняет команда PACK. Записи, удаленные командой PACK или ZAP, восстановлены быть не могут.

Пометку удаления можно снять. Это действие производится командой RECALL.

Пример. Из таблицы Authors удаляются все авторы, для которых в таблице BooksAuthors не указаны произведения.

&& Учитываем при поиске в Books также и записи с пометкой удаления

set deleted off

select Authors

&& Перебираем записи таблицы Authors

scan

if Empty(Lookup(BooksAuthors.AuthorId, ;

AuthorId, ;

BooksAuthors.AuthorId, ;

"AuthorId")) then

&& Проставляем пометку удаления текущей записи таблицы Authors

delete

endif

endScan

&& Просматриваем записи с пометкой удаления

browse last for Deleted( ) save

Возможный результат приведен на рис. 15.7.

212.1.-Записи-с-пометкой-удаления

Рис. 15.7. Записи с пометкой удаления

Тот же результат можно получить, заменив цикл одной командой:

delete for Empty(Lookup(BooksAuthors.AuthorId, ;
AuthorId, ;
BooksAuthors.AuthorId, ;
"AuthorId")) in Authors

Команда DELETE – SQL

DELETE [Target]
FROM [FORCE] Table_List [[, Table_List ...] | [JOIN [ Table_List]]]
[WHERE FilterCondition1 [AND | OR FilterCondition2 ...]]

проставляет пометку удаления записей указанной таблицы, отвечающим заданным условиям.

Смысл опций и параметров см. в описании команды UPDATE – SQL.

Число записей, получивших пометку удаления, заносится в системную переменную _TALLY.

В отличие от DELETE команда DELETE – SQL в процессе своего выполнения осуществляет блокировку записей таблицы. Это уменьшает уровень конфликтов в многопользовательском режиме, но может привести к снижению производительности. Наибольшая скорость достигается, когда таблица открыта монопольно или когда она заблокирована функцией FLOCK( ).

Пример 1.

delete from Authors where Authors.AuthorId > 50

Пример 2 (приводится в справке VFP). Пометку удаления получают все записи курсора MyProducts, отвечающие условию PriceList.ProdId = MyProducts.ProdId and PriceList.Discontinued.

close databases all

create cursor MyProducts (ProdId I , OurPrice Y NULL)

insert into MyProducts values (1, 1.10)

insert into MyProducts values (2, 2.20)    && Получит пометку удаления

insert into MyProducts values (3, 3.30)    && Получит пометку удаления

&&

create cursor PriceList (ProdId I, ProdCategory I NULL, Price Y, Discontinued L)

insert into PriceList values (1, 9, 1.00, .F.)

insert into PriceList values (2, 8, 2.00, .T.)

insert into PriceList values (3, 7, 3.00, .T.)

&&

delete MyProducts ;

from PriceList ;

where PriceList.ProdId = MyProducts.ProdId ;

and PriceList.Discontinued

&&

select MyProducts

browse last

Команда

RECALL [Scope] [FOR lExpression1] [WHILE lExpression2]
                   [NOOPTIMIZE] [IN nWorkArea | cTableAlias]

снимает пометки удаления записей выбранной таблицы.

Опции и параметры команды описаны в табл. 1.7.

Пример. Снимается пометка удаления с записей таблицы Authors, для которых InputDate < {^2004-01-01}.

set deleted off

select authors

recall for InputDate < {^2004-01-01}

Команда

PACK [MEMO] [DBF] [Tablename ] [IN nWorkarea | cTableAlias]

удаляет все записи, имеющие пометку удаления, текущей или указанной таблицы и соответствующие данные memo-файла (FPT-файла), ассоциированного с таблицей. После упаковки размеры таблицы и memo-файла уменьшаются (если они содержали записи с пометкой удаления).

Опции и параметр:

MEMO – удаляет данные memo-файла, относящиеся к записям, имеющим пометку удаления; сами же помеченные записи в таблице сохраняются.

DBF – удаляет записи с пометкой удаления, сохраняя данные memo-файла.

Если опции MEMO и DBF опущены, то выполняется упаковка и FPT- и DBF-файлов.

Tablename – задет имя сжимаемой таблицы. VFP открывает указанную таблицу, упаковывает и затем закрывает. Если таблица уже открыта, то будет сгенерирована ошибка.

При упаковке VFP копирует записи, не имеющие пометку удаления, во временную таблицу. После завершения процесса копирования VFP удаляет исходную таблицу с диска и переименовывает временную таблицу, давая ей имя исходной. Если процесс упаковки прервать клавишей ESC, то удаляется временная таблица, а исходная сохраняется. Также она сохраняется, если в процессе работы PACK обнаружена недостача свободной памяти на диске.

Команда PACK может быть выполнена, если таблица открыта для монопольного доступа. Такой режим открытия таблицы задается либо в команде USE, либо в результате установки команды SET EXCLUSIVE в ON.

Все открытые индексы таблицы, подвергаемой упаковке, перестраиваются во время выполнения команды PACK.

Записи, удаленные командой PACK, пропадают навечно.

Команда

ZAP [IN nWorkArea | cTableAlias]

удаляет все записи таблицы, оставляя лишь ее структуру.

Действие команды эквивалентно выполнению команд

delete all

pack

но ZAP работает гораздо быстрее.

Если SET SAFETY установлен в ON, то пользователю придется подтвердить свои намерения.

При выполнении ZAP триггер удаления игнорируется.

Записи удаляются командой ZAP безвозвратно.