Delphi Tips & Tricks softsale > Delphi Tips & Tricks      

< poprzednia rada następna rada >

Reindeksacja tablic w danym aliasie

Aby dokonać reideksacji zbiorów indeksowych dla danej tablicy trzeba skorzystać z wywołań BDE. W tym wypadku korzysta się z funkcji DBiRegenIndexes(Handle:HDBICur);

Aby otrzymać nazwy wszystkich tablic w danym aliasie korzystamy z metody GetTableNames komponentu TSession:

procedure GetTableNames(const DatabaseName,Pattern:string;
              Extensions,SystemTables:Boolean;List:TSrings);
Dodatkowo możemy wyświetlać wskaźnik postępu używając w tym celu metody ProcessMessage klasy Application oraz np. nazwy zbiorów (parametr ll). Poniżej podajemy kod procedury Reindex
procedure Reindex(DataBase: TDataBase; Table: TTable;
          ll: TLabel; ProgressBar: TProgressBar);
Var
   List: TStrings;
   i : Integer;
begin
   try
      Database.Connected := True;
   except
      raise;
      exit;
   end;
   List := TStringList.Create;
// Utwórz listę nazw tablic w danym aliasie
   Session.GetTableNames( Database.AliasName, '', True, False,
                                                        List);
   for i := 0 to List.Count - 1 do begin
// Wyświetl informację o postępie indeksowania
      if(Flaga_Przerwij) then
         Break;
         ll.caption:=' Indeksuję zbiór: '+List[i];
      ProgressBar.Position := Trunc(100 * i / List.Count);
      Application.ProcessMessages;
      Table.Close;
// Podstaw nazwę tablicy
      Table.TableName := List[i];
      try
         Table.Open;
// Otwórz tablicę i reindeksuj
         Check(DbiRegenIndexes(Table.Handle));
      except
         raise;
      end;
   end;
   List.Free;
// zniszcz obiekt
   Database.Connected := False;
// Odłącz się od bazy danych
   ProgressBar.Position := 0;
   ll.caption:='';
end;
Wywołanie procedury można umieścić pod przyciskiem:
procedure TForm1.Button1Click(Sender: TObject);
begin
   if(Flaga_Indeksuj) then
      Flaga_Przerwij := True
   else
   if(ListBox1.ItemIndex <> -1) then begin
      label1.visible:=true;
      Flaga_Indeksuj := True;
      Database1.AliasName:=ListBox1.Items[ListBox1.ItemIndex];
      ListBox1.Enabled := False;
      BitBtn1.Enabled := False;
      Flaga_Przerwij := False;
      Button1.Caption := 'Anuluj';
      reindex(DataBase1, Table1, label1, ProgressBar1);
      Button1.Caption := 'Start';
      ListBox1.Enabled := True;
      BitBtn1.Enabled := True;
      Flaga_Indeksuj := False;
   end;
Na zdarzeniu OnCreate formy należałoby jeszcze ustawić pasek wyboru:
procedure TForm1.FormCreate(Sender: TObject);
begin
   label1.visible:=false;
   Session.GetAliasNames(ListBox1.Items);
   if(ListBox1.Items.Count > 0) then
      ListBox1.ItemIndex := 0;
end;
Dodatkowo użyte zostały dwie flagi:
Var
   Flaga_Przerwij, Flaga_Indeksuj : Boolean;
Aby przetestować powyższy kod należy umieścić na formie: komponent DataBase, Table, ListBox , ProgressBar oraz dwa przyciski Start i Koniec. Ważne aby dla komponentów: DataBase oraz TTable podać taką samą nazwę dla ich własności DataBaseName np: Reindextablic.

SOFTSALE - Oprogramowanie i Szkolenia
softsale@softsale.com.pl

03-565 Warszawa , ul. Borzymowska 43 lok. 301C
tel/fax:4084840,GSM:0607612428