Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > проблема с индексами в dbf


Автор: Kusik 14.11.2006, 14:47
при работе с дбф возникли проблемы, касающие индексов. хочу найти способ переиндексирования dbf таблиц непосредственно из Deplhi. (Надоело каждый раз при подобных проблемах открывать Foxpro и делать REINDEX на каждой таблице). нашел в документашке функцию DbiRegenIndexes(Table1.Handle), но чтото она не индексирует, бывало даже она удаляла индексный файл (cdx) и восстановить его можно было тока в Фоксе. сейчас же, при попытке сджелать переиндексацию с помощью этой функции вылазит ошибка: "Index does not exists (...MDX)" хотя никакого MDX файла там нет. помогите, подскажите советом

Автор: Akella 14.11.2006, 14:59
Код

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;

...

Автор: ТоляМБА 14.11.2006, 15:01
BDE: Query,
SQL: Create Index 
и будет тебе MDX

Автор: Vas 14.11.2006, 16:54
Цитата(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;

Автор: Kusik 16.11.2006, 13:12
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)".

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)