Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определить, соответствует ли индекс таблице / 9 сообщений из 9, страница 1 из 1
05.03.2010, 12:41
    #36504754
Koryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, соответствует ли индекс таблице
VFP 8.0
Видела когда-то похожий вопрос на этом форуме, но не помню, было ли решение, а поиском не нашла.
Итак
Делаю вьювер для просмотра данных по трем большим таблицам формата DBF. Таблицы подготавливаются заранее другими организациями и вносить в них изменения не то чтобы нельзя, но даже смысла не имеет. Первая таблица содержит паспортные данные льготников, вторая - инфу по льготам, а третья - реестр всех жителей города. Таблицы со льготами имеют примерно по 100тыс записей, третья - 3,5 млн записей. Льготы и льготники связываются по уникальному ключу. Льготники и жители связываются по сочетанию полей ФИО+Д/р. (смысл, короче, в том, что данных аахринеть много ^^). Обновление данных на машине пользователя производится простой заменой ДБФок - льготников ежедекадно, жители раз в квартал. Для связки используются неструктурные индексы.
Собственно, наконец добралась до вопроса.
При замене DBF хотелось бы, чтобы прога замечала эту замену и сама делала переиндексацию.
Вариант с переиндексацией при запуске не покатит, т.к. даже на не самых слабых компах таблица с жителями индексируется 7-10 минут, а это чересчур долго, особенно если этот самый льготник стоит и ноет над душой оператора.
Пока что нашла только такой кусочек кода
Код: plaintext
1.
2.
3.
4.
5.
6.
lcKey=key()
nrrec=Recno()
Set Key To &lcKey
Go nrrec
If nrrec#Recno()
&& знать чтото не так
endif
но условие nrrec#Recno() ни разу не выполнилось, хотя автор утверждал, что у него работает.
Воть...
Буду благодарна за все ссылки и советы, которые накидаете =^_^=
...
Рейтинг: 0 / 0
05.03.2010, 13:14
    #36504863
Определить, соответствует ли индекс таблице
Koryuu,

при замене *.dbf надо убивать индексные файлы. При запуске программа должна проверять, существуют ли индексные файлы. Если да — открыть и работать дальше. Если нет — открыть, переиндексировать и работать дальше.
...
Рейтинг: 0 / 0
05.03.2010, 13:22
    #36504891
Местами администратор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, соответствует ли индекс таблице
Koryuu,
сделайте запросы через select и можно обойтись без индексов.
...
Рейтинг: 0 / 0
05.03.2010, 13:26
    #36504902
Определить, соответствует ли индекс таблице
Местами администратор,

Запрос к таблице в три с половиной миллиона записей без индексов? Неудачный совет.
...
Рейтинг: 0 / 0
05.03.2010, 13:49
    #36504988
quxix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, соответствует ли индекс таблице
Koryuu
Обновление данных на машине пользователя производится простой заменой ДБФок - льготников ежедекадно, жители раз в квартал. Для связки используются неструктурные индексы.
Собственно, наконец добралась до вопроса.
При замене DBF хотелось бы, чтобы прога замечала эту замену и сама делала переиндексацию.


С табличками работают, если я правильно понял, только на чтение.
Тогда проверим, что дата индексного файла соответствует дате файла БД,
если индекс старый перестроим его, иначе работаем в штатном режиме. :)
...
Рейтинг: 0 / 0
05.03.2010, 14:29
    #36505100
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, соответствует ли индекс таблице
авторПри замене DBF хотелось бы, чтобы прога замечала эту замену и сама делала переиндексацию.

ну так в чем проблема?

когда подменяете dbf затрите ф-лы cdx

а в коде отклрытия таблиц у себя алгоритм: если нет индексных ф-лов
то:

index on ... tag ...
index on ...
...
Рейтинг: 0 / 0
12.03.2010, 13:12
    #36516515
Koryuu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, соответствует ли индекс таблице
Нашла неплохое решение на http://fox.wikis.com/wc.dll?Wiki~PersistentIndexCorruption, немного доработала напильником для себя и вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
*Tname - таблица, которую проверяем
coldindexexp=NULL
SCAN
	IF EVALUATE(KEY()) < coldindexexp 
		WAIT WINDOW "Ошибка при проверке таблицы "+Tname nowait
		*запускаем процедуру переиндексации/построения индексов
		EXIT
	ENDIF
	coldindexexp=EVALUATE(KEY())
ENDSCAN
Правда, при проверке индекса по ФИО возникла проблема - наша любимая буква Ё ))
При сравнении двух строк Ё>Я, а при сортировке Ё стоит раньше Я, а учитывая, что кодовая страница означенной таблицы 866, индексное выражение вообще пришлось зверски извратить. Вместо выражения fam-imya-otch сделала chrtran(fam-imya-otch,CHR(240)+CHR(168),CHR(133)+CHR(197)). Костыль, конечно, но работает )
Еще один минус такой проверки - на той самой трехмиллионной базе длится уж очень долго. Скорее всего, из-за составного индекса. Поэтому добавила в скан проверку
Код: plaintext
1.
2.
3.
IF SECONDS()-loSecSt>loWaitTime
	WAIT WINDOW "Выход по таймеру"
	exit
endif
В loSecSt перед началом сканирования задается seconds(), а в loWaitTime произвольное время проверки. У меня оно равно 45 секунд. Если за это время ошибок в индексе не найдено, проверять всю базу не будем.
Надеюсь, кому-нибудь пригодится =^_^=
...
Рейтинг: 0 / 0
12.03.2010, 14:05
    #36516738
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, соответствует ли индекс таблице
KoryuuНашла неплохое решение на http://fox.wikis.com/wc.dll?Wiki~PersistentIndexCorruption, немного доработала напильником для себя и вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
*Tname - таблица, которую проверяем
coldindexexp=NULL
SCAN
	IF EVALUATE(KEY()) < coldindexexp 
		WAIT WINDOW "Ошибка при проверке таблицы "+Tname nowait
		*запускаем процедуру переиндексации/построения индексов
		EXIT
	ENDIF
	coldindexexp=EVALUATE(KEY())
ENDSCAN
Правда, при проверке индекса по ФИО возникла проблема - наша любимая буква Ё ))
При сравнении двух строк Ё>Я, а при сортировке Ё стоит раньше Я, а учитывая, что кодовая страница означенной таблицы 866, индексное выражение вообще пришлось зверски извратить. Вместо выражения fam-imya-otch сделала chrtran(fam-imya-otch,CHR(240)+CHR(168),CHR(133)+CHR(197)). Костыль, конечно, но работает )
Еще один минус такой проверки - на той самой трехмиллионной базе длится уж очень долго. Скорее всего, из-за составного индекса. Поэтому добавила в скан проверку
Код: plaintext
1.
2.
3.
IF SECONDS()-loSecSt>loWaitTime
	WAIT WINDOW "Выход по таймеру"
	exit
endif
В loSecSt перед началом сканирования задается seconds(), а в loWaitTime произвольное время проверки. У меня оно равно 45 секунд. Если за это время ошибок в индексе не найдено, проверять всю базу не будем.
Надеюсь, кому-нибудь пригодится =^_^=
А время полной переиндексации без проверок какое?
...
Рейтинг: 0 / 0
13.03.2010, 20:37
    #36518570
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определить, соответствует ли индекс таблице
Не, ну давайте уж без извращений :)
Исходные данные - это одно, рабочая база - это другое. В любом случае вы должны работать на копии исходных данных, а не прямо на них, даже на чтение.
У вас используются сторонние таблицы со своими индексами? - так импортируйте данные, когда их "приносят" (они "приходят"), и тогда же перестраивайте _свои_ индексы.
Раз в декаду даже 10 минут никого не убьют.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определить, соответствует ли индекс таблице / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]