Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Foxpro/Clipper/Dbase > Local View и удаленные записи


Автор: AlexPro 16.3.2008, 06:01
Есть некий вид, делающий выборку из нескольких связанных таблиц. Мне необходимо, чтобы в результаты не включались записи, помеченные для удаления.
На SET DELETED вид не реагирует, про функцию DELETED() в хелпе по SQL-SELECT написано нечто невразумительное, заключающееся в том, что ее нужно использовать крайне осторожно и только если выборка делается из единственной таблицы. Что делать, если таблиц несколько, разумеется, ничего не сказано.
Подскажите, плиз, что делать (кроме как упаковывать таблицы после удаления каждой записи - вариант неприемлемый)?

Автор: SaschaL 16.3.2008, 18:37
Доброго времени суток! Увидел вас вопрос, решил вспомнить прошлое, раньше занимался Фоксом очень плотно , в настоящее время по мере необходимости.
Привожу пример кода который нашел в своем архиве (это хелп на русском языке):
Цитата

* В следующем примере открывается таблица customer в базе данных
* testdata. Команда DELETE - SQL помечает на удаление все записи, в
* которых поле country содержит значение USA. Функция DELETED( )
* используется для отображения всех записей, помеченных для удаления.
* Команда RECALL ALL используется для снятия маркировки со всех
* записей, помеченных на удаление.

CLOSE DATABASES
OPEN DATABASE (HOME( ) + 'samples\data\testdata')
USE customer  && Opens Customer table

DELETE FROM customer WHERE country = 'USA'  && Mark for deletion
CLEAR
LIST FIELDS company, country FOR DELETED( ) && List marked records
RECALL ALL  && Unmark all records marked for deletion


Если нужно выбрать только помеченные
то вид кода будет выглядеть примерно так, прошу простить если ошибусь в синтаксисе, пишу по памяти

Цитата

select  *  from <TableName> where deleted()



Автор: SaschaL 17.3.2008, 06:45
Пришел на работу проверил работоспособность кода.
Искусственно создал ситуацию при которой в базе (*.dbf) имелись записи помеченные на удаление. Открыл таблицу в Фоксе
и произвел отбор записей следующей командой.
Цитата

select * from sotr where deleted()


в результате чего в запрос попали записи из таблицы sotr  помеченые в таблице как удаленные.
Подобная же конструкция запроса может быть и применима для более сложных запросов например выбору по нескольким связанным таблицам.

В принципе в справочнике по языку написано подробно, главное понять философию самого FoxPro. Сразу оговорюсь пробовал это сделать как на версии 6-ой так и на 9-ке.

Автор: AlexPro 17.3.2008, 12:10
SaschaL, спасибо за ответ, но к сожалению, приведенный пример подходит для выборки только из единственной таблицы. Вот что пишет по этому поводу сама Microsoft:
Цитата

С осторожностью пользуйтесь в условиях объединения такими функциями, как DELETED( ), EOF( ), FOUND( ), RECCOUNT( ) и RECNO( ), поддерживающими необязательный аргумент в виде псевдонима или номера рабочей области. Если в подобной функции задать псевдоним или рабочую область, могут получиться непредсказуемые результаты. Предложение SELECT не будет использовать ваши рабочие области; оно выполнит операцию, эквивалентную команде USE ... AGAIN. Запросы с одной таблицей, в которых эти функции используются без псевдонима и номера рабочей области, возвращают правильные результаты. Однако если эти функции используются в запросах с несколькими таблицами (даже если в них не задавать псевдоним или рабочую область), результаты могут оказаться самыми неожиданными.

Вот, собственно, и вся философия... smile 
Тем не менее, этот ответ заставил меня гораздо основательней поковыряться с этим вопросом и найти приемлемое решение. Проблема заключалась в том, что форма, отображающая вид, использует приватную сессию данных и все установки (в т.ч. и SET DELETED) у меня вызывались из метода формы LOAD (т.е. после открытия таблиц). Для таблиц это было совершенно неважно, в отличие от вида. После перемещения вызова SET DELETED ON в метод BeforeOpenTables все заработало как надо: записи, помеченные на удаление, перестали попадать в выборку, что меня чрезвычайно порадовало. smile
Еще раз спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)