HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Kulcsmező manuális inkrementálása


Példaprogram letöltése

5001 bájt

Amikor létrehozunk egy újabb adatbázis táblát, célszerű létrehoznunk benne egy olyan mezőt, amelyet kulcsként használunk. Ez azt jelenti, hogy a mező értéke egyértelműen azonosítja a tábla sorait. Számos adatbázis típus lehetőséget biztosít a kulcsmező értékének automatikusan történő növelésére (autoincrement mezők), ez azonban nem mindig adja az optimális megoldást. Ebben a példában mi határozzuk meg a kulcsmező következő lehetséges értékét, függetlenül az indextől és az alkalmazott szűrőktől.

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;

Cikksorozat

#IDKategóriaCikk címeSorozat
3643DelphiFormEditor1. rész
3689DelphiProject és modul információk2. rész
3719DelphiMegnyitás, mentés3. rész
3749DelphiKódszerkesztő4. rész
3778DelphiForráskód írása, olvasása5. rész
3809DelphiInterfész a kódszerkesztő ablakhoz6. rész
3839DelphiKijelölt blokkok7. rész
3869DelphiA buffer beállításai8. rész
3899DelphiKörnyezeti és Project opciók9. rész
3929DelphiKurzor a kódszerkesztőben10. rész
3959DelphiKeresés és csere beállításai11. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 333. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |