Delphi - Paradox táblák újraindexelése

forráskód letöltése
Nagyobb Paradox táblák esetén előfordulhat az indexek sérülése. Ilyenkor egy újraindexelés megoldhatja a problémát, de ezt programból nem egyszerű feladat megoldani. Éppen ezért ebben a példában egy olyan eljárást készítünk, amely megoldja ezt a problémát, sőt nem csak Paradox, hanem más típusú BDE tábla újraindexelésére is alkalmas (pl. dBase).
Az új eljárást egy külön unit-ban hozzuk létre a könnyebb felhasználhatóság érdekében. Az eljárás neve ReindexParadox lesz, de mint ahogyan a bevezetőben is említettük, ez nem csak Paradox, hanem például dBase táblák újraindexelésére is alkalmas.
Az eljárásnak mindössze egy paramétert kell átadni, az indexelendő adatbázis tábla TTable objektumát. Ahhoz, hogy az indexelést el tudjuk végezni az szükséges, hogy a táblát kizárólagos módban tudjuk megnyitni, valamint nem lehet megadva a táblában egy index sem, sem az IndexFieldNames sem pedig az IndexName property-ben. Ezeket tehát törölnünk kell, valamint ha a tábla meg van nyitva, akkor le kell zárni, és kizárólagos módban megnyitni. Miután az indexelés megtörtént az eredeti állapotot kell visszaállítani, ezért az Active, Exclusive, IndexFieldNames és IndexName property-k értékeit eltároljuk egy-egy átmeneti változóban. Ezután lezárjuk a táblát (ha meg volt nyitva), majd az Exclusive property értékét igazra állítjuk, az IndexFieldNames és IndexName property-k értékeit pedig töröljük.
Ezután megnyitjuk a táblát, majd a DbiRegenIndexes függvénnyel újraindexeljük a táblát. Ennek a függvénynek paraméterként a tábla objektumának azonosítóját kell megadni (TTable.Handle). A függvényhívás visszatérési értékét a Check eljárással ellenőriztetjük, ami generál egy kivételt, ha az indexelés közben hiba történt.
with Table do begin
  ...
  Check(DbiRegenIndexes(Handle));
  ...
end;
Az indexelés után még el is kell menteni a változtatásokat, erre szolgál a DbiSaveChanges függvény. Ennek paraméterként szintén a tábla objektumának azonosítóját kell megadni. A visszatérési értékét ennek is a Check eljárással ellenőriztetjük.
with Table do begin
  ...
  Check(DbiSaveChanges(Handle));
  ...
end;
Ezután lezárjuk a táblát, majd visszaállítjuk a property-k eredeti értékeit. Ha a tábla aktív volt az eljárás meghívásakor, akkor most is az lesz, hiszen az Active property értékét is elmentettük.