powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определить, соответствует ли индекс таблице
9 сообщений из 9, страница 1 из 1
Определить, соответствует ли индекс таблице
    #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
Определить, соответствует ли индекс таблице
    #36504863
Koryuu,

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

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


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

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

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

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

index on ... tag ...
index on ...
...
Рейтинг: 0 / 0
Определить, соответствует ли индекс таблице
    #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
Определить, соответствует ли индекс таблице
    #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
Определить, соответствует ли индекс таблице
    #36518570
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, ну давайте уж без извращений :)
Исходные данные - это одно, рабочая база - это другое. В любом случае вы должны работать на копии исходных данных, а не прямо на них, даже на чтение.
У вас используются сторонние таблицы со своими индексами? - так импортируйте данные, когда их "приносят" (они "приходят"), и тогда же перестраивайте _свои_ индексы.
Раз в декаду даже 10 минут никого не убьют.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Определить, соответствует ли индекс таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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