powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по FoxPro DOS
22 сообщений из 22, страница 1 из 1
Вопрос по FoxPro DOS
    #33161080
Фотография barboza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация такая, слетела база данных которая работает на фокспро 2.5, а именно полетели индексы - у каких файлов неизвестно, поэтому приходится открывать все файлы поочереди и искать неисправные, файлов огромное количество и на выявление неисправных уходит много времени, а больше всего добивает процесс постоянного открытия закрытия файлов. Подскажите возможно ли автоматизировать этот процесс - может быть есть готовая программа или писать самому, если писать самостоятельно то на какие функции и операторы обратить внимание??? Сложно ли будет писать прогу, если с досовской версией не работал??
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33161105
vitali_z
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вопрос по FoxPro DOS
    #33161177
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В отдельном каталоге держи правильные пустые таблицы и индексы к ним. В случае такого сбоя индексы перекопируешь в каталог где сейчас находятся *.dbf файлы со сломанными индексами. И запускаешь Reindex для всех областей. Но пока придется поработать ручками.
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33161312
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как вариант можно хранить описание индексов в prg
и запускать либо с АРМ админа если такой есть - либо просто
с подменю сервис (индексирование/реиндексирование)
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33161404
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Досовская версия - во многом проще, просто многих команд "еще нет" :) и вместо объектов ввода-вывода - команды типа @x,y GET qqq с обязательным READ и @x,y SAY qqq... Строки-столбцы - фиксированы на экране, вместо grid - BROWSE и т.д.
Напишешь прогу - если компиллятор ругается - смотришь в хэлп, чего написал лишнего. А так - суть такая же.
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33164658
glamiss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я храню индексы в файле index и при проблемах запускаю процедуру reindex при файлах роазмером в 500000-600000 записей даже по сети время восстановления 2-3 мин.
Подходи к решению проблемы системно!
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33164827
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
glamissя храню индексы в файле index
это как?
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33164844
golsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да скорее всего как команды создания индекса:

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
Вопрос по FoxPro DOS
    #33164857
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я для данной ситуации использую справочник индексов, получаемый программынм способом:

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
Вопрос по FoxPro DOS
    #33165001
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WORKSNSЯ не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла.
Не понял. Переведите и расшифруйте, плиз.
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33165077
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что непонятного, индексный файл после каждого reindex увеличивается в размере.
то есть берем таблицу со структурным индексом, смотрим размер CDX. Открываем, даем команду REINDEX, закрываем, смотрим размер CDX - он увеличился.
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33165085
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопрос по FoxPro DOS
    #33165096
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
w3d WORKSNSЯ не использую команду REINDEX, т.к. она ведет к "опуханию" индексного файла.
Не понял. Переведите и расшифруйте, плиз.
Самый сложный и правильный совет на мой взгляд дал golsa ...

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

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

См приложение
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33166082
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопрос по FoxPro DOS
    #33167275
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопрос по FoxPro DOS
    #33167322
WORKSNS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Igor Korolyov.
Насчет битого индекса не спорю, прийдется удалять. Но и в этом случае справочник индексов вполне нормальный выход - всегда можно добавить необхадимые поля в него и для Collate и для чего угодно. Никто не мешает опять же вместо DELETE TAG ALL использовать удаление индексного файла (что я уже и проделал в своей процедуре :-)). На сообщение об ошибке об отсутствии структурного индекса можно просто выдать RETRY (по коду ошибки). В общем поле деятельности большое :-). Я не большой любитель эталонных таблиц, поэтому сделал это на уровне справочника, на уровне справочника же я отслеживаю соответствие структур таблиц, эти справочники генерю после компиляции новой версии EXE.
А вообще большое спасибо за то, что подтолкнули к доработке процедуры восстановления индексов. До этого момента вроде как не подводила меня, но теперь думаю будет надежнее (хочется надеяться :-)).
...
Рейтинг: 0 / 0
Вопрос по FoxPro DOS
    #33167496
Crispy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто маленький нюанс :)
barboza Ситуация такая, слетела база данных которая работает на фокспро 2.5
В FPD - удаление (и пересоздание) CDX было вещью совсем не страшной :)
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Вопрос по FoxPro DOS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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