|
|
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
Ситуация такая, слетела база данных которая работает на фокспро 2.5, а именно полетели индексы - у каких файлов неизвестно, поэтому приходится открывать все файлы поочереди и искать неисправные, файлов огромное количество и на выявление неисправных уходит много времени, а больше всего добивает процесс постоянного открытия закрытия файлов. Подскажите возможно ли автоматизировать этот процесс - может быть есть готовая программа или писать самому, если писать самостоятельно то на какие функции и операторы обратить внимание??? Сложно ли будет писать прогу, если с досовской версией не работал?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 12:35:29 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
nCount = ADIR(aDBFArray,m.__path + '*.dbf') FOR i=1 TO m.nCount ?m.__path+aDBFArray[m.i,1] USE (m.__path+aDBFArray[m.i,1]) ENDFOR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 12:42:04 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
В отдельном каталоге держи правильные пустые таблицы и индексы к ним. В случае такого сбоя индексы перекопируешь в каталог где сейчас находятся *.dbf файлы со сломанными индексами. И запускаешь Reindex для всех областей. Но пока придется поработать ручками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 13:01:12 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
как вариант можно хранить описание индексов в prg и запускать либо с АРМ админа если такой есть - либо просто с подменю сервис (индексирование/реиндексирование) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 13:40:27 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
Досовская версия - во многом проще, просто многих команд "еще нет" :) и вместо объектов ввода-вывода - команды типа @x,y GET qqq с обязательным READ и @x,y SAY qqq... Строки-столбцы - фиксированы на экране, вместо grid - BROWSE и т.д. Напишешь прогу - если компиллятор ругается - смотришь в хэлп, чего написал лишнего. А так - суть такая же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.07.2005, 14:03:02 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
я храню индексы в файле index и при проблемах запускаю процедуру reindex при файлах роазмером в 500000-600000 записей даже по сети время восстановления 2-3 мин. Подходи к решению проблемы системно! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2005, 21:30:20 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
glamissя храню индексы в файле index это как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 06:33:25 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
Да скорее всего как команды создания индекса: use tablename1 index on fieldname1 tag tagname1 index on fieldname2 tag tagname2 additive use tablename2 index on fieldname1 tag tagname1 index on fieldname2 tag tagname2 additive и т.д. по всем индексам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 07:19:02 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
Я для данной ситуации использую справочник индексов, получаемый программынм способом: CREATE TABLE stru\IndStru.SQL (tb c(8), nm c(10), vi c(254), vf c(254)) DIMENSION NmTbl(кол-во таблиц) NmTbl(1)=[таблица1] ...... FOR RollTbl=1 TO ALEN(NmTbl,1) USE &NmTbl(RollTbl) IN 0 CntIndexes=ATAGINFO(IND) IF CntIndexes>0 =ASORT(IND,1) FOR RollInd=1 TO CntIndexes INSERT INTO stru\IndStru.sql (tb, nm, vi, vf) VALUES ; (NmTbl(RollTbl), IND(RollInd,1), IND(RollInd,3), IND(RollInd,4)) ENDFOR ENDIF USE ENDFOR а затем при переиндексации использую этот справочник. USE indstru.sql IN 0 ALIAS ListTag && открываем файл структурных индексов SELECT ListTag GO TOP cntdbf=RECCOUNT([ListTag]) LastAlias=[] && последний открывавшийся алиас SCAN FraseInd=[INDEX ON ]+ALLTRIM(vi)+[ TAG ]+ALLTRIM(nm)+; IIF(!EMPTY(vf),[ FOR ]+ALLTRIM(vf),[]) &&выражение индекса OpenTable=ALLTRIM(tb) && имя открываемой таблицы USE (OpenTable) IN 0 EXCLUSIVE && открываем монопольно SELECT (OpenTable) IF !LastAlias==OpenTable &&если алиас последней открывавшейся таблицы не равен текущему, то LastAlias=OpenTable DELETE TAG ALL && удаляем все тэги ENDIF &FraseInd && создаем тэг USE SELECT ListTag ENDSCAN CLOSE TABLES ALL Я не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла. Естественно у этого метода есть недостаток, так как справочник индексов должен соответствовать текущей версии БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 07:49:38 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
WORKSNSЯ не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла. Не понял. Переведите и расшифруйте, плиз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 09:27:32 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
А что непонятного, индексный файл после каждого reindex увеличивается в размере. то есть берем таблицу со структурным индексом, смотрим размер CDX. Открываем, даем команду REINDEX, закрываем, смотрим размер CDX - он увеличился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 09:57:14 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
w3d WORKSNSЯ не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла. Не понял. Переведите и расшифруйте, плиз. Попробуйте тест примерно такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 10:03:02 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
w3d WORKSNSЯ не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла. Не понял. Переведите и расшифруйте, плиз. Самый сложный и правильный совет на мой взгляд дал golsa ... Microsoft рекомендует именно пересоздавать индексы, удаляя предыдущие, причем вместо команды DELETE TAG ALL рекомендуется удалять их физически, то есть DELETE FILE AAA.CDX ... "опухание" назван процесс (ошибка в раннем FoxPro), когда новый индекс строится, но при этом физичкски старые значения остаются в индексном файле, тем самым увеличивая его размер... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 10:06:47 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
На всякий случай проэкспериментировал (а то червяк сомнения глодать начал :-)), и убедился, что так и есть - увеличиться индекс не увеличился после REINDEX, но и не уменьшился (хотя точно помню, что при реиндексации размер увеличивался, могу ошибаться, но может это связано с наличием FOR-условия в индексе, в данной ситуации таких тэгов не было). Взял табличку родную для FPD 2.5, кол-во записей 2298114, исходный размер CDX = 76 519 936, после REINDEX размер не изменился, поле удаления структурного индекса по DELETE TAG ALL создал индексы снова. CDX получился размером 62 252 032. Т.е. разница составила 14 267 904. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 11:06:56 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
В FPD индекс CDX увеливается после вторичного применения к нему команды IDEX ON ... TAG ... Единственное лечение, как и писал Sergey Ch - удалять. Только, по-моему, лучше писать ERASE, чем DELETE FILE - то же самое, зато короче :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 12:34:32 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
да вроде DELETE TAG ALL тоже уничтожает CDX, а после удаления структурного индекса по DLETE FILE или ERASE при следующем открытии DBF-файла будет выдано сообщение об отсутствии структурного индекса. Мелочь :-), но если таких файлов пригорошня, то тогда прийдется писать обработку такой ситуации... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 12:43:49 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
Невнимательно прочитал предыдущие сообщения... :) Sergey Chименно пересоздавать индексы Т.е. удаялешь - потом создаешь заново. Я же тоже написал, что: Код: plaintext 1. Вот результат многократной команды IDEX ON ... TAG ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 12:50:33 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
w3d glamissя храню индексы в файле index это как? См приложение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 14:03:03 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
WORKSNS да вроде DELETE TAG ALL тоже уничтожает CDX, а после удаления структурного индекса по DLETE FILE или ERASE при следующем открытии DBF-файла будет выдано сообщение об отсутствии структурного индекса. Мелочь :-), но если таких файлов пригорошня, то тогда прийдется писать обработку такой ситуации... Процедуры prpr3 и s_sob1 - это Ваши красивые сообщения о работе для клиента (коду более 15 лет, так что он не очень крсив): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2005, 14:34:06 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
Hi WORKSNS & All! Твой код совсем не поможет, если таблица из-за повреждения индекса не может быть открыта! Причём этому мешает обычно не несчастный флаг наличия CDX в заголовке (он и снимается программно в пару строк, да и автоматом он снимается если проигнорировать первую неудачную попытку открытия таблицы) - а записи об индексах в dbc контейнере. "Прямого" способа убрать эту информацию нету, а писать код по ручной "зачистке" dbc - упаришься однозначно :( Даже использовать DELETE TAG ALL (который кстати тоже невозможен если таблица не открылась) весьма сложно - после этого не достаточно одних INDEX ON - нужно восстанавливать первичный ключ, связи (REFERENCES). Кроме того если по каким-то внутренним причинам часть тегов была создана в "неродной" COLLATE, то и это нужно особо отслеживать... А вот REINDEX совсем необязательно делать над уже "распухшим" cdx файлом - достаточно взять cdx из "эталонной" пустой копии базы (в нём тогда не будет данных - только информация о самих тегах), подставить вместо "плохого" и использовать REINDEX. Posted via ActualForum NNTP Server 1.2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2005, 01:29:04 |
|
||
|
Вопрос по FoxPro DOS
|
|||
|---|---|---|---|
|
#18+
Hi Igor Korolyov. Насчет битого индекса не спорю, прийдется удалять. Но и в этом случае справочник индексов вполне нормальный выход - всегда можно добавить необхадимые поля в него и для Collate и для чего угодно. Никто не мешает опять же вместо DELETE TAG ALL использовать удаление индексного файла (что я уже и проделал в своей процедуре :-)). На сообщение об ошибке об отсутствии структурного индекса можно просто выдать RETRY (по коду ошибки). В общем поле деятельности большое :-). Я не большой любитель эталонных таблиц, поэтому сделал это на уровне справочника, на уровне справочника же я отслеживаю соответствие структур таблиц, эти справочники генерю после компиляции новой версии EXE. А вообще большое спасибо за то, что подтолкнули к доработке процедуры восстановления индексов. До этого момента вроде как не подводила меня, но теперь думаю будет надежнее (хочется надеяться :-)). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2005, 05:28:49 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33167496&tid=1593864]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
295ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
83ms |
get tp. blocked users: |
2ms |
| others: | 226ms |
| total: | 659ms |

| 0 / 0 |
