A mellékelt példában egy Paradox 7 típusú adattáblát hoztunk létre. A tábla két mezővel rendelkezik, KValue és Number néven. Mindkettő típusa Long Integer. A KValue mezőt kulcsként jelöltük meg a táblában, ez azt jelenti, hogy soha sem tartalmazhat két azonos értéket.
Ha kulcsmezőt használunk, akkor ahhoz automatikusan készül egy index. Létrehoztunk egy újabb indexet is, a Number mező szerint.
A tábla megjelenítéséhez készítettünk egy egyszerű alkalmazást. Az alkalmazásban lehetőségünk van Filter-t beállítani a táblához, valamint egy új véletlen értéket elhelyezni abban. A dolgot nehezíti, hogy a táblához a Number mező szerinti indexet állítottuk be, nem pedig a kulcsmezőjét.
A probléma nagy kérdése, hogy miként tudjuk meghatározni a kulcsmező következő lehetséges értékét, ha a táblán szűrés van és teljesen más indexet használ, mint a kulcsmező. Persze ezt úgy kell végrehajtanunk, hogy a felhasználó az egészből semmit ne vegyen észre.
A kulcs mező következő értékének meghatározásához készítünk egy függvényt, amelynek nincs bemenő paramétere, visszatérési értékként pedig csak egy LongInt típusú értékre van szükségünk.
function GetNextKeyValue: LongInt;
Ha a kulcsmező következő értékét akarjuk meghatározni a következő lépéseket kell megtennünk:
- Létre kell hoznunk egy könyvjelzőt az aktuális rekordon.
- Meg kell szüntetnünk a Filter-t.
- Aktuális indexként a kulcsmezőt kell beállítanunk.
- Ha a tábla nem tartalmaz rekordot, akkor a függvény visszatérési értékeként 1-et adunk. Ha a táblában van rekord, akkor a legutolsó rekordból kiolvassuk a kulcsmező értékét, és ahhoz hozzáadunk 1-et.
- A végén mindent vissza kell állítanunk az eredeti állapotba.
A fenti műveletek végrehajtásához elegendő 3 változó.
var
b: TBookMarkStr;
Index: String;
f: Boolean;
A b-ben tároljuk a könyvjelzőt, az Index változóba a jelenlegi index neve kerül, f-ben pedig a Filtered property értékét jegyezzük fel.
Az adatokat az alábbi módon jegyezhetjük fel:
with Table1 do begin
f:=Filtered;
b:=Bookmark;
Index:=IndexFieldNames;
A DisableControls metódus meghívásával a táblához kapcsolt vizuális komponensek frissítése megszűnik, így a felhasználó nem lát semmilyen változást a táblában. Ezután kikapcsoljuk a szűrőt, majd a kulcsmezőt beállítjuk aktuális index-nek.
DisableControls;
Filtered:=False;
IndexFieldNames:='KValue';
A Last metódus meghívásával a tábla végére lépünk. Mivel a kulcsmező szerint van rendezve a tábla, a kulcsmező értékét ki kell olvasnunk az utolsó rekordból, majd hozzá kell adnunk egyet, feltéve, hogy van utolsó rekord.
try
Result:=FieldByName('KValue').Value+1;
except
Result:=1;
end;
Végül mindet visszaállítunk az eredeti állapotába, és visszakapcsoljuk a táblához kapcsolt komponensek frissítését.
IndexFieldNames:=Index;
Filtered:=f;
Bookmark:=b;
EnableControls;
A művelet kellően gyors és a felhasználó az egészből semmit nem vesz észre.
A függvény felhasználásánál figyelnünk kell arra, hogy még a szerkesztő parancs előtt meghatározzuk a következő kulcs értékét. Ugyanis ha kiadjuk az Edit vagy Append parancsot és pozícionálunk a táblában, akkor az a Cancel utasítással egyenértékű.
NextKey:=GetNextKeyValue;
with Table1 do begin
Append;
FieldByName('KValue').Value:=NextKey;
FieldByName('Number').Value:=Random(10000);
Post;
end;