Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Local View и удаленные записи, фильтровать записи, помеч-е для удаления 
V
    Опции темы
AlexPro
Дата 16.3.2008, 06:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 4



Есть некий вид, делающий выборку из нескольких связанных таблиц. Мне необходимо, чтобы в результаты не включались записи, помеченные для удаления.
На SET DELETED вид не реагирует, про функцию DELETED() в хелпе по SQL-SELECT написано нечто невразумительное, заключающееся в том, что ее нужно использовать крайне осторожно и только если выборка делается из единственной таблицы. Что делать, если таблиц несколько, разумеется, ничего не сказано.
Подскажите, плиз, что делать (кроме как упаковывать таблицы после удаления каждой записи - вариант неприемлемый)?
PM MAIL   Вверх
SaschaL
Дата 16.3.2008, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 880
Регистрация: 13.12.2006
Где: Челябинская обл г .Нязепетровcк

Репутация: нет
Всего: 9



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

* В следующем примере открывается таблица 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()



PM MAIL ICQ   Вверх
SaschaL
Дата 17.3.2008, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 880
Регистрация: 13.12.2006
Где: Челябинская обл г .Нязепетровcк

Репутация: нет
Всего: 9



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

select * from sotr where deleted()


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

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

PM MAIL ICQ   Вверх
AlexPro
Дата 17.3.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 9.11.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 4



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

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

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

Запрещается!

1. Публиковать ссылки для чисто рекламных целей.

2. Оффтопить, флеймить, говорить не культурно.

Пожалуйста, адекватно задавайте свой вопрос. Тема должна создаваться с названием характеризующем Вашу проблему.

Задавайте вопросы правильно - как спросите, так вам и ответят.

Разрешено!

Давать ссылки на статьи, обзоры, если это не нарушает первый пункт правил.

Задавая вопрос, давайте нужную информацию касающуюся Вашей проблемы. Этим вы ускорите полезные ответы.

P.S. Размещение рекламы будет строго наказываться!



Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MoLeX

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Foxpro/Clipper/Dbase | Следующая тема »


 




[ Время генерации скрипта: 0.0410 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.