Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по FoxPro DOS / 22 сообщений из 22, страница 1 из 1
12.07.2005, 12:35:29
    #33161080
barboza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Ситуация такая, слетела база данных которая работает на фокспро 2.5, а именно полетели индексы - у каких файлов неизвестно, поэтому приходится открывать все файлы поочереди и искать неисправные, файлов огромное количество и на выявление неисправных уходит много времени, а больше всего добивает процесс постоянного открытия закрытия файлов. Подскажите возможно ли автоматизировать этот процесс - может быть есть готовая программа или писать самому, если писать самостоятельно то на какие функции и операторы обратить внимание??? Сложно ли будет писать прогу, если с досовской версией не работал??
...
Рейтинг: 0 / 0
12.07.2005, 12:42:04
    #33161105
vitali_z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
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
...
Рейтинг: 0 / 0
12.07.2005, 13:01:12
    #33161177
Владимир СА
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
В отдельном каталоге держи правильные пустые таблицы и индексы к ним. В случае такого сбоя индексы перекопируешь в каталог где сейчас находятся *.dbf файлы со сломанными индексами. И запускаешь Reindex для всех областей. Но пока придется поработать ручками.
...
Рейтинг: 0 / 0
12.07.2005, 13:40:27
    #33161312
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
как вариант можно хранить описание индексов в prg
и запускать либо с АРМ админа если такой есть - либо просто
с подменю сервис (индексирование/реиндексирование)
...
Рейтинг: 0 / 0
12.07.2005, 14:03:02
    #33161404
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Досовская версия - во многом проще, просто многих команд "еще нет" :) и вместо объектов ввода-вывода - команды типа @x,y GET qqq с обязательным READ и @x,y SAY qqq... Строки-столбцы - фиксированы на экране, вместо grid - BROWSE и т.д.
Напишешь прогу - если компиллятор ругается - смотришь в хэлп, чего написал лишнего. А так - суть такая же.
...
Рейтинг: 0 / 0
13.07.2005, 21:30:20
    #33164658
glamiss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
я храню индексы в файле index и при проблемах запускаю процедуру reindex при файлах роазмером в 500000-600000 записей даже по сети время восстановления 2-3 мин.
Подходи к решению проблемы системно!
...
Рейтинг: 0 / 0
14.07.2005, 06:33:25
    #33164827
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
glamissя храню индексы в файле index
это как?
...
Рейтинг: 0 / 0
14.07.2005, 07:19:02
    #33164844
golsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Да скорее всего как команды создания индекса:

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

и т.д. по всем индексам
...
Рейтинг: 0 / 0
14.07.2005, 07:49:38
    #33164857
WORKSNS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Я для данной ситуации использую справочник индексов, получаемый программынм способом:

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, т.к. она ведет к "опуханию" индексного файла. Естественно у этого метода есть недостаток, так как справочник индексов должен соответствовать текущей версии БД.
...
Рейтинг: 0 / 0
14.07.2005, 09:27:32
    #33165001
w3d
w3d
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
WORKSNSЯ не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла.
Не понял. Переведите и расшифруйте, плиз.
...
Рейтинг: 0 / 0
14.07.2005, 09:57:14
    #33165077
WORKSNS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
А что непонятного, индексный файл после каждого reindex увеличивается в размере.
то есть берем таблицу со структурным индексом, смотрим размер CDX. Открываем, даем команду REINDEX, закрываем, смотрим размер CDX - он увеличился.
...
Рейтинг: 0 / 0
14.07.2005, 10:03:02
    #33165085
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
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.
=rand(- 1 )
create table test (nn n( 7 ))
ltabfile = dbf('test')
for i =  1  to  10000 
  insert into (ltabfile) values int(rand() *  10000000 )
endfor
index on nn tag nn
use
=adir(ladir,forceext(ltabfile, 'CDX'))
lsize1=ladir( 1 , 2 )
use (ltabfile) exclusive
scan
  replace nn with int(rand() *  10000000 )
endscan
use
=adir(ladir,forceext(ltabfile, 'CDX'))
lsize2=ladir( 1 , 2 )
use (ltabfile) exclusive
reindex
use
=adir(ladir,forceext(ltabfile, 'CDX'))
lsize3=ladir( 1 , 2 )
erase (forceext(ltabfile, 'CDX'))
use (ltabfile) exclusive
index on nn tag nn
use
=adir(ladir,forceext(ltabfile, 'CDX'))
lsize4=ladir( 1 , 2 )
erase (forceext(ltabfile, 'CDX'))
erase (ltabfile)
? "Размер первоначально построенного индекса :"+str(lsize1)
? "Размер индекса после изменения данных     :"+str(lsize2)
? "Размер индекса после реиндекса            :"+str(lsize3)
? "Размер полностью перестроенного индекса   :"+str(lsize4)
...
Рейтинг: 0 / 0
14.07.2005, 10:06:47
    #33165096
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
w3d WORKSNSЯ не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла.
Не понял. Переведите и расшифруйте, плиз.
Самый сложный и правильный совет на мой взгляд дал golsa ...

Microsoft рекомендует именно пересоздавать индексы, удаляя предыдущие, причем вместо команды DELETE TAG ALL рекомендуется удалять их физически, то есть DELETE FILE AAA.CDX ...

"опухание" назван процесс (ошибка в раннем FoxPro), когда новый индекс строится, но при этом физичкски старые значения остаются в индексном файле, тем самым увеличивая его размер...
...
Рейтинг: 0 / 0
14.07.2005, 11:06:56
    #33165310
WORKSNS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
На всякий случай проэкспериментировал (а то червяк сомнения глодать начал :-)), и убедился, что так и есть - увеличиться индекс не увеличился после REINDEX, но и не уменьшился (хотя точно помню, что при реиндексации размер увеличивался, могу ошибаться, но может это связано с наличием FOR-условия в индексе, в данной ситуации таких тэгов не было). Взял табличку родную для FPD 2.5, кол-во записей 2298114, исходный размер CDX = 76 519 936, после REINDEX размер не изменился, поле удаления структурного индекса по DELETE TAG ALL создал индексы снова. CDX получился размером 62 252 032. Т.е. разница составила 14 267 904.
...
Рейтинг: 0 / 0
14.07.2005, 12:34:32
    #33165597
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
В FPD индекс CDX увеливается после вторичного применения к нему команды
IDEX ON ... TAG ...
Единственное лечение, как и писал Sergey Ch - удалять. Только, по-моему, лучше писать ERASE, чем DELETE FILE - то же самое, зато короче :)
...
Рейтинг: 0 / 0
14.07.2005, 12:43:49
    #33165633
WORKSNS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
да вроде DELETE TAG ALL тоже уничтожает CDX, а после удаления структурного индекса по DLETE FILE или ERASE при следующем открытии DBF-файла будет выдано сообщение об отсутствии структурного индекса. Мелочь :-), но если таких файлов пригорошня, то тогда прийдется писать обработку такой ситуации...
...
Рейтинг: 0 / 0
14.07.2005, 12:50:33
    #33165659
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Невнимательно прочитал предыдущие сообщения... :)
Sergey Chименно пересоздавать индексы
Т.е. удаялешь - потом создаешь заново.
Я же тоже написал, что:
Код: plaintext
1.
В FPD индекс CDX увеличивается после ВТОРИЧНОГО применения к нему команды
IDEX ON ... TAG ...
Как-то недавно я видел индексный файл размером около 30(!) мег, а сам файл dbf при этом был... - всего около 700(!) байт!!!
Вот результат многократной команды IDEX ON ... TAG ...
...
Рейтинг: 0 / 0
14.07.2005, 14:03:03
    #33165961
glamis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
w3d glamissя храню индексы в файле index
это как?

См приложение
...
Рейтинг: 0 / 0
14.07.2005, 14:34:06
    #33166082
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
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.
set safety off
set talk on
on error do prpr3 with error()
use \buh\ch\dat\ch01.dbf exclusive alias ch01
if used('ch01')
  on error
  use
  delete file \buh\ch\dat\ch01.cdx
  use \buh\ch\dat\ch01.dbf exclusive alias ch01
  pack
  index on KOD tag KOD additive
else
  do s_sob1 with '\buh\ch\dat\ch01.dbf'
endif
on error do prpr3 with error()
use \buh\ch\dat\ch02.dbf exclusive alias ch02
if used('ch02')
  on error
  use
  delete file \buh\ch\dat\ch02.cdx
  use \buh\ch\dat\ch02.dbf exclusive alias ch02
  pack
  index on K1 tag K1 additive
  index on K2 tag K2 additive
  index on str(K1, 2 )+str(K2, 2 ) tag KKK additive
else
  do s_sob1 with '\buh\ch\dat\ch02.dbf'
endif

...

...
Рейтинг: 0 / 0
15.07.2005, 01:29:04
    #33167275
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Hi WORKSNS & All!

Твой код совсем не поможет, если таблица из-за повреждения индекса не может быть открыта! Причём этому мешает обычно не несчастный флаг наличия CDX в заголовке (он и снимается программно в пару строк, да и автоматом он снимается если проигнорировать первую неудачную попытку открытия таблицы) - а записи об индексах в dbc контейнере. "Прямого" способа убрать эту информацию нету, а писать код по ручной "зачистке" dbc - упаришься однозначно :( Даже использовать DELETE TAG ALL (который кстати тоже невозможен если таблица не открылась) весьма сложно - после этого не достаточно одних INDEX ON - нужно восстанавливать первичный ключ, связи (REFERENCES). Кроме того если по каким-то внутренним причинам часть тегов была создана в "неродной" COLLATE, то и это нужно особо отслеживать...

А вот REINDEX совсем необязательно делать над уже "распухшим" cdx файлом - достаточно взять cdx из "эталонной" пустой копии базы (в нём тогда не будет данных - только информация о самих тегах), подставить вместо "плохого" и использовать REINDEX.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
15.07.2005, 05:28:49
    #33167322
WORKSNS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Hi Igor Korolyov.
Насчет битого индекса не спорю, прийдется удалять. Но и в этом случае справочник индексов вполне нормальный выход - всегда можно добавить необхадимые поля в него и для Collate и для чего угодно. Никто не мешает опять же вместо DELETE TAG ALL использовать удаление индексного файла (что я уже и проделал в своей процедуре :-)). На сообщение об ошибке об отсутствии структурного индекса можно просто выдать RETRY (по коду ошибки). В общем поле деятельности большое :-). Я не большой любитель эталонных таблиц, поэтому сделал это на уровне справочника, на уровне справочника же я отслеживаю соответствие структур таблиц, эти справочники генерю после компиляции новой версии EXE.
А вообще большое спасибо за то, что подтолкнули к доработке процедуры восстановления индексов. До этого момента вроде как не подводила меня, но теперь думаю будет надежнее (хочется надеяться :-)).
...
Рейтинг: 0 / 0
15.07.2005, 09:47:41
    #33167496
Crispy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по FoxPro DOS
Просто маленький нюанс :)
barboza Ситуация такая, слетела база данных которая работает на фокспро 2.5
В FPD - удаление (и пересоздание) CDX было вещью совсем не страшной :)
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по FoxPro DOS / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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