:: Архив конференции по VFP до 2005 года
Re: Представления + индексы + транзакции
Владимир Максимов

Сообщений: 14098
Откуда: Москва
Дата регистрации: 02.09.2000
Я тут поэкспериментировал немного. Получилось следующее:

-) Если View вообще не имела индекса, то одна (или несколько) команда вроде INDEX ON ... TAG .. создаст нужное количество тэгов структурного индексного файла (определяется командой CDX(1)). При этом имя структурного индексного файла совпадает с именем временной таблицы (DBF())

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

-) Если View уже имеет структурынй индексный файл, то после Requery() команда INDEX ON ... TAG ... создаст тэг мультииндексного, но НЕ структурного индексного файла (определяется по команде CDX(2)). Вот этот-то второй индекс и мешает транзакции. Выполнение команды CLOSE INDEX закроет все НЕ структурные индексы. Структурные индексы остануться открытыми. Их в принципе невозможно закрыть пока открыта таблица.

Т.е. перед собственно сохранением делаешь примерно следующее:

LOCAL lcExprIndex
select MyView
IF EMPTY(CDX(2,"MyView"))=.F.
* Проверяем тот факт, что активный в данный момент индекс - это НЕ структурный индекс
IF CDX(2,"MyView") $ SET('ORDER')
* запоминаем выражение активного индекса
lcExprIndex = SYS(14,Tagno())
ENDIF
* закрываем все НЕ структурные индексы
CLOSE INDEX
ENDIF
* Выполняем сохранение
...
* Обновление содержимого View
Requery("MyView")
IF EMPTY(m.lcExprIndex)=.F.
* Если на момент сохранения активным был TAG из НЕ структурного индексного файла
* то строим индекс по сохраненному выражению
= CURSORSETPROP("Buffering", 3, "MyView")
* Здесь ADDITIVE уместно, поскольку строится НЕ структурный индекс
INDEX ON &lcExprIndex TAG &lcExprIndex ADDITIVE
= CURSORSETPROP("Buffering", 5, "MyView")
ENDIF

Ну, и все. Далее действуешь как и раньше. Индексируешь поля, если они не были проиндексированы.




------------------
Ratings: 0 negative/0 positive
Re: Представления + индексы + транзакции
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Hi, Владимир!

Цитата:
-) После выполнения команды REQUERY() имя индексного файла перестает
совпадать с именем временной таблицы, но он по прежнему остается
структурным индексным файлом.
Да, это любопытно.
Цитата:
Т.е. перед собственно сохранением делаешь примерно следующее:
Тока ещё бы добавить ERASE для этого "левого" cdx-а, а то мусор накапливать
нехорошо




------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Представления + индексы + транзакции
bell
Автор

Сообщений: 167
Откуда: Харьков
Дата регистрации: 04.04.2002
Огромное спасибо Владимиру и Игорю! Помогли разобраться с проблемой. Думаю, тему можно закрыть.
P.S. Наверное, проще всего все-таки построить сразу ВСЕ индексы во ВСЕХ представлениях.
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 10 (Гостей: 10)

© 2000-2024 Fox Club 
Яндекс.Метрика