Delphi - Azonosítók közötti lyukak megszűntetése

forráskód letöltése
Amikor egy táblába új rekordot viszünk fel, és a kulcsmező értékét is mi állítjuk be, akkor a kulcsmező általában a soron következő legnagyobb értéket kapja. Ha a táblákból rekordokat törlünk, akkor lyukak maradnak a kulcsok között. Amennyiben a tábla nem áll kapcsolatban más táblákkal (pl. naplózást végző táblák), ezeket a lyukakat eltávolíthatjuk. Készítünk egy komponenst, amely elvégzi az azonosítók újraszámozását.
A mellékelt példaprogram megnyitása előtt a DBRemoveKeyHoles.pas-ban lévő komponenst telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot. A komponens csak abban az esetben használható, ha a kulcsmező egyetlen numerikus mezőből áll, és ez az első oszlop a táblában.
A komponenst DataSet property-jén keresztül kapcsolhatjuk hozzá bármilyen adatforráshoz.
Ha az adatforrás több indexszel is rendelkezik, akkor az Execute metódus meghívása előtt ki kell választani azt az indexet, amely a rekordokat a rekordazonosító szerinti rendezésben mutatja.
Az Execute metódus meghívására a komponens újraszámozza a rekordazonosítók értékeit. Folyamatos értékeket állít be 1-től kezdődően. Amennyiben az első rekord értéke kisebb 1-nél, úgy a számozás attól az értéktől kezdődik.
A rekordazonosítók átszámozásának állapotáról folyamatosan tájékozódhatunk az OnProgress eseményen keresztül.
TProgressEvent = procedure(Sender: TObject; ActualRecord, RecordCount: Integer) of object;
A RecordCount változóban megkapjuk az adatforrás rekordjainak számát, az ActualRecord változóban pedig az éppen feldolgozott rekord sorszámát.
A komponenst a TComponent osztályból származtatjuk.
Ahhoz, hogy a komponenshez hozzákapcsolhassunk egy TDataSet-et, az alábbi property deklaráció szükséges:
property DataSet: TDataSet read FDataSet write SetDataSet;
Ha a komponenshez hozzákapcsolunk egy TDataSet-et, majd azt eltávolítjuk, akkor a Delphi hibaüzenetet ad.
Ennek elkerülése érekében felül kell írnunk a Notification metódust.
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
A metódus kódjában az alábbi kódot helyezzük el.
if (AComponent=FDataSet) and (Operation=opRemove) then
  FDataSet:=Nil;
Az Execute metódus kódjában nincs más dolgunk, mint megállapítani az első rekordazonosító kezdőértékét, majd minden egyes rekord esetén módosítani az első mező értékét a soron következő, új azonosítóra.
Minden egyes módosítás után meghívjuk az OnProgress eseményt.
if Assigned(FOnProgress) then
  FOnProgress(Self,c,r);