| Delphi Tips & Tricks | softsale > Delphi Tips & Tricks |
| < poprzednia rada | następna rada > |
Reindeksacja tablic w danym aliasieAby 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 |