Dva načina rada sa "autoincrement" primary poljima u Delphi-u koja su se pokazala kao dobra i dosta pouzdana (oba primera su za BeforeInsert):
1. način:
Trigger izgleda ovako:
Code:
IF (NEW.SIFRA IS NULL) THEN
NEW.SIFRA = GEN_ID(GEN_SIFRA_ID, 1);
U ovom slučaju najbolje rešenje je iz Delphija pri svakom novom unosu u bazu koristiti sledeći upit:
Code:
SELECT GEN_ID(GEN_SIFRA_ID, 1) FROM RDB$DATABASE
Ovaj kod vraća vrednost generatora ("autoincrement" polja SIFRA) uvećanu za 1 i ta vrednost se koristi za INSERT novog sloga u bazu.
2. način:
Trigger okidati ovako:
Code:
NEW.SIFRA = GEN_ID(GEN_SIFRA, 1);
U ovom primeru vrednost polja SIFRA se automatski generise pri svakom unosu podataka u bazu, bez obzira da li se vrednost za to polje eksplicitno unese ili ne.
Tada je iz Delphi aplikacije moguće uvek proslediti istu vrednost SIFRE (npr. -1), jer će ta vrednost svakako biti zanemarena i dodeljena vrednost generatora, a delphi se neće buniti. Kod ovog primera jedino je neophodan refresh podataka, da bi se videla prava vrednost SIFRE.
Ja više koristim prvi metod i to u okviru OnNewRecord ili BeforePost ClientDataSet-a.