Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с индексами в dbf, Индексация dbf таблиц 
:(
    Опции темы
Kusik
Дата 14.11.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.12.2005
Где: Харьков

Репутация: нет
Всего: нет



при работе с дбф возникли проблемы, касающие индексов. хочу найти способ переиндексирования dbf таблиц непосредственно из Deplhi. (Надоело каждый раз при подобных проблемах открывать Foxpro и делать REINDEX на каждой таблице). нашел в документашке функцию DbiRegenIndexes(Table1.Handle), но чтото она не индексирует, бывало даже она удаляла индексный файл (cdx) и восстановить его можно было тока в Фоксе. сейчас же, при попытке сджелать переиндексацию с помощью этой функции вылазит ошибка: "Index does not exists (...MDX)" хотя никакого MDX файла там нет. помогите, подскажите советом
PM MAIL ICQ   Вверх
Akella
Дата 14.11.2006, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Код

procedure TfmMain.actReindexExecute(Sender: TObject);
begin
 cur(cS);
 Try
    tApt.Close;
    tApt.Exclusive:=True;
    tPrep.Close;
    tPrep.Exclusive:=True;
    tFilterPrep.Close;
    tFilterPrep.Exclusive:=True;
    tZay.Close;
    tZay.Exclusive:=True;
    tTemp.Close;
    tTemp.Exclusive:=True;
    tFilials.Close;
    tFilials.Exclusive:=True;
    tNakls.Close;
    tNakls.Exclusive:=True;
    tNaklsDet.Close;
    tNaklsDet.Exclusive:=True;
    tEdIzm.Close;
    tEdIzm.Exclusive:=True;
    //справочник поставщиков
    sb2.Panels[0].Text:='Реиндексация таблиц начата...';
    application.ProcessMessages;
    Try
     tApt.DeleteIndex('idxAName');
     tApt.AddIndex('idxAName','AName',[ixCaseInsensitive]);
    Except
     tApt.AddIndex('idxAName','AName',[ixCaseInsensitive]);
    end;
    Try
     tApt.DeleteIndex('idxAAddres');
     tApt.AddIndex('idxAAddres','AAddres',[ixCaseInsensitive]);
    Except
     tApt.AddIndex('idxAAddres','AAddres',[ixCaseInsensitive]);
    end;
    Try
     tApt.DeleteIndex('idxATel');
     tApt.AddIndex('idxATel','ATel',[ixCaseInsensitive]);
    Except
     tApt.AddIndex('idxATel','ATel',[ixCaseInsensitive]);
    end;

    Try
     tPrep.DeleteIndex('idxPNamePPrice');
     tPrep.AddIndex('idxPNamePPrice','PName;PPrice',[ixCaseInsensitive]);
    Except
     tPrep.AddIndex('idxPNamePPrice','PName;PPrice',[ixCaseInsensitive]);
    end;

...


Это сообщение отредактировал(а) Akella - 14.11.2006, 15:00
PM MAIL   Вверх
ТоляМБА
Дата 14.11.2006, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Котэ
***


Профиль
Группа: Завсегдатай
Сообщений: 1607
Регистрация: 15.12.2004

Репутация: 3
Всего: 252



BDE: Query,
SQL: Create Index 
и будет тебе MDX
PM   Вверх
Vas
Дата 14.11.2006, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Цитата(Kusik @  14.11.2006,  14:47 Найти цитируемый пост)
при попытке сджелать переиндексацию с помощью этой функции вылазит ошибка: "Index does not exists (...MDX)" хотя никакого MDX файла там нет

Подсказывают мне темные силы, что база dBase. Тады значит если таблица была индексирована, то в ней 28 байт <>0, если 0 то таблица не имела индексного файла. Вот функция переиндексации с учетом этого:
Код

Function CreateIndex(aPath: String; aTable: TTable; aIndexName, aIndexfieldName: String): Boolean ;
var
  DBFile: file of byte;
  b:byte;
begin
  Result:=False;
  with aTable do
  begin
   try
      IndexDefs.Update;
    except
      if not FileExists(aPath+'\'+TableName) then
        begin
             Raise Exception.Create('Файл "'+aPath+'\'+TableName+ '" не существует');
             Application.Terminate;
        end;
      if aPath='' then
        AssignFile(DBFile,TableName)
      else
        AssignFile(DBFile,aPath+'\'+TableName) ;
      try
        Reset(DBFile);
        Seek(DBFile,28);
        b:=0;
        Write(DBFile,b);
      finally
        CloseFile(DBFile);
        DeleteFile(ChangeFileExt(aPath+'\'+TableName,'.MDX'));
      end;
      AddIndex(aIndexName,aIndexFieldName,[]);
      Result:=True ;
    end;
  end;
End;



--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Kusik
Дата 16.11.2006, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 9.12.2005
Где: Харьков

Репутация: нет
Всего: нет



Akella, спасибо за ответ, то что ты предлагаешь имеет отношение к dDase| FoxPro таблицам?
Код

  tApt.DeleteIndex('idxAName');
  tApt.AddIndex('idxAName','AName',[ixCaseInsensitive]);
  
 и что это единственный корректный способ переиндексировать таблицу?
и почему эта функция неработает? DbiRegenIndexes(Table1.Handle)
Допустим что индексный файл запорчен, и я не знаю какие у таблицы индексы. как мне его восстановить?

Добавлено @ 13:20 
допустим есть таблица DBase III+
с индексным файлом *.cdx
при первой попытке переиндексировать вылазит ошибка: "Invalid Language Driver" и файл *.cdx пропадает. а при повторном вывозе  "Index does not exists (...MDX)".
PM MAIL ICQ   Вверх
Akella
Дата 16.11.2006, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



Цитата(Kusik @  16.11.2006,  13:12 Найти цитируемый пост)
 и что это единственный корректный способ переиндексировать таблицу?

нет не единственный
см. вложения

Добавлено @ 14:40 
Цитата(Kusik @  16.11.2006,  13:12 Найти цитируемый пост)
Invalid Language Driver

в настройках BDE, возможно, нужно покавыряться и установить корректные LangDrivers

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  Data.rar 675,67 Kb
PM MAIL   Вверх
SergeBS
Дата 17.11.2006, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Kusik
Akella
Не парьтесь с BDE. Уже давно существует куча более легких (100-600 кБ к ЕХЕ-шнику и все) и удобных (все настройки - в программе) движков. И проблем нет. Я например в Halcyon при старте программы базы открываю и индексирую. Чтобы иметь правильные индексы. Впрочем, в Fox(DOS) делал так же. А CDX - индексы избегаю как раз из-за их "обязаловки".
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0796 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.