Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Опять о переиндексации. (Ранние топы на эту тему просмотрены) / 8 сообщений из 8, страница 1 из 1
18.03.2005, 06:50
    #32967219
Max4
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
1.У меня в базе более 30 таблиц.
В каждой таблице по 5-7 индексов.
Если у пользователя внезапно виснет компьютер или вырубают энергию,
файлы CDX могут запортиться. Часто бывает, глядишь, а размер CDX равен 0.
Хочу написать переиндексацию.
Но очень уж муторно смотреть каждый индекс, тем более там много составных, чтобы написать:
Hапример:
INDEX ON STR(KOD)+ DTOC(DAT) TAD INDEX OF SPR_STROK
Это надо около 200 строк так написать.
Но легко можно ошибиться в написании. Ищи потом, Выверяй.
Может, есть что попроще.
Не найду такую функцию, которая вывела бы мне по указанной таблице
все имена тэгов и какие они, по каким полям и т. д.
Вдруг такая есть?

2.И еще. Если ключ primary, то в команде INDEX его же не задашь:
INDEX ON eExpression TO IDXFileName | TAG TagName [OF CDXFileName]
[FOR lExpression]
[COMPACT]
[ASCENDING | DESCENDING]
[UNIQUE | CANDIDATE]
[ADDITIVE]
Хотел использовать
ALTER TABLE SPR_STROK ADD PRIMARY KEY kod_o TAG kod_o1
Но из помощи:
"С помощью команды ALTER TABLE можно модифицировать структуру таблицы,
не включенной в базу данных. "
А у меня же база?
Или это не так?
Тогда как пересоздавать программно индексы primary?
Неужели
"Восстановление индексов в случае наличия резервной копии - элементарная операция. Просто заменяешь поврежденный файл CDX на файл из резервной копии, а после открытия таблицы даешь REINDEX для приведения его содержимого в соответствии с новыми значениями таблицы."
Единственный вариант?
...
Рейтинг: 0 / 0
18.03.2005, 08:04
    #32967274
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
1. См. TAGCOUNT(), SYS(14)
2. Через ALTER TABLE как раз и можно вносить модификации в таблицы
...
Рейтинг: 0 / 0
18.03.2005, 08:58
    #32967325
cbani1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
я лично решил проблему таким образом

CLEAR
CLOSE DATABASES ALL
CLOSE ALL
DIMENSION lai(1)
lcCale=pcCaleMain
lcCale1='c:\tudor\vfp8\decl\data\'
SET SAFETY OFF
CREATE TABLE (lcCale1+'allindex') (tabel c(128),indxtag c(128),indxtype c(128),indxkey c(254),indxfor c(128),;
indxord c(254),indxcoll c(128))
SET SAFETY ON
lnF=ADIR(laf,lcCale+'*.dbf')
*? lnF
FOR lni=1 TO lnF
USE (lcCale+laf(lni,1)) IN 0 ALIAS tabel
SELECT tabel
lnin= ATAGINFO(lai)
LCaL=JUSTSTEM(laf(lni,1))
FOR LNJ=1 TO lnin
SELECT allindex
APPEND BLANK
REPLACE tabel WITH LCaL
REPLACE indxtag WITH lai(LNJ,1)
REPLACE indxtype WITH lai(LNJ,2)
REPLACE indxkey WITH lai(LNJ,3)
REPLACE indxfor WITH lai(LNJ,4)
REPLACE indxord WITH lai(LNJ,5)
REPLACE indxcoll WITH lai(LNJ,6)
ENDFOR
* ? laf(lni,1),lnin
USE IN tabel
ENDFOR
SELECT allindex
SET SAFETY OFF
COPY TO (pcCalep+'allindexb') WITH CDX
USE IN allindex

DELETE FILE (lcCale1+'allindex.dbf')
SET SAFETY ON

а после делаешь маленькую прогу по востановлению.
...
Рейтинг: 0 / 0
18.03.2005, 09:41
    #32967409
Grumax_user
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
Берешь прогу GENDBC.prg пишешь в командной строке
Код: plaintext
1.
OPEN DATABASE C:\My_proj\Otz_shtat\Data_s\Oklad.dbc
DO C:\My_proj\Otz_shtat\prog_s\gendbc.prg WITH "My_database"
и выцепляешь от туда все, что тебе надо

------------------------------------------------------------------------------------
Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
18.03.2005, 09:50
    #32967435
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
А чем тебе собственно восстановление из резервной копии не нравиться? Непривычно? Ну, так "флаг тебе в руки" и пиши кучу программного кода.

Причем, в результате это все сведется к той же резервной копии, только другими средствами. Либо немерянный PRG, либо дополнительные DBF плюс немерянный PRG.

Ты не забывай, что с наличием контейнера базы данных (DBC) индекс прописывается не только в файле CDX, но и в собственно контейнере. Следовательно, прежде чем вообще взяться за воcстановление индекса придется удалить все ссылки на этот индекс из контейнера базы данных (DBC), потом их все обратно восстановить! В общем случае - это очень не тривиальная задача.

Заметь, что в резервной копии не обязательно лежат заполненные индексы. В данном случае достаточно индексов к пустым таблицам. Т.е. от самих индексов нужна только "шапка". Их структура. Места это занимает немного.

И еще. Резервная копия базы данных у тебя должна быть в любом случае . Особенно, если так часто падает питание. Ну, и какие проблемы воспользоваться этой копией, когда она действительно понадобилась?
...
Рейтинг: 0 / 0
18.03.2005, 10:21
    #32967508
Grumax_user
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
Из собственного опыта...писал самый первый проект с *.dbc и тоже заморочился на программном востановлении индексов (даже прогу написал рабочую, по восстановлению *.cdx, Relations и триггеров и удалении ссылок из *.dbc).
To Владимир Влидимир Ну, так "флаг тебе в руки" и пиши кучу программного кода. Просто ему, как и мне надо переболеть. Каждый имеет право на ошибку. Вот когда надоест для каждой *.dbc писать прогу по восстановлению...вот тогда и придет к выводу Владимир восстановление из резервной копии
Тёска, слушай что старшие говорят! Лучше напиши прогу по копированию в *.zip своей базы

------------------------------------------------------------------------------------
Я во все дела суюсь -> всесторонне разовьюсь
...
Рейтинг: 0 / 0
18.03.2005, 10:59
    #32967614
leaf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
зачем же для каждой базы писать
моно универсальную прогу написать
...
Рейтинг: 0 / 0
19.03.2005, 23:36
    #32969901
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять о переиндексации. (Ранние топы на эту тему просмотрены)
Hi leaf!

> зачем же для каждой базы писать
> моно универсальную прогу написать

Напиши, потом мы с удовольствием укажем тебе на твои ошибки, ты их исправишь - процесс повториться ...надцать раз - в конце концов ты напишешь таки хорошую программу уровня той-же StoneField DataBase Toolkit - только у меня возникает серьёзнейшее опасение, что ты не отдашь её нам задарма, а будешь продавать... Но тогда зачем было её писать - уже всё написано!

Мы же предлагаем вполне простой, рабочий и главное совершенно бесплатный вариант :)

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Опять о переиндексации. (Ранние топы на эту тему просмотрены) / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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