Als antwoord op jouw vraag...
Je zult waarschijnlijk de volgende regels even ervoor moeten zetten:
Delphi Code:
DataSet.FieldByName('ID').Required := false;
Ik denk dat jij het ID veld als volgt hebt aangemaakt: "ID INTEGER not NULL".
Die "not NULL" zorgt ervoor dat Delphi een melding geeft als je het veld wilt gebruiken en het gevuld is met NULL.
Door die Required handmatig op false te zetten los je dat op.
(Voor het opslaan van de opgehaalde ID kun je hieronder zien hoe ik dat normaal doe.)
Originally Posted by
Antoine
Zit te stoeien met AutoIncrement voor mijn ID veld in een FireBird database.
Maar nog even uit nieuwsgierigheid... waarom werk je niet met een trigger om dit te doen?
Voordeel is dat als je buiten je programma records toe voegt het ook goed gaat en dan ben je van het handmatig uitvoeren af en weet je zeker dat de ID altijd goed gevuld wordt.
Code:
SET TERM ^ ;
CREATE GENERATOR GEN_CONTACT^
SET GENERATOR GEN_CONTACT TO 0^
CREATE TRIGGER TR_CONTACT FOR CONTACT ACTIVE BEFORE INSERT POSITION 0 AS
BEGIN
IF ((NEW.ID is NULL) or (NEW.ID = 0)) THEN
NEW.ID = GEN_ID(GEN_CONTACT, 1);
END^
Als je in je code eventueel voor de post toch de ID handmatig wilt vullen (wat niet altijd nodig is) gebruik ik:
Delphi Code:
function CreateDefaultTransaction(Sender: TComponent; Db: tibdatabase): TIBTransaction;
var
Trans: TIBTransaction;
begin
Trans := TIBTransaction.Create(Sender);
Trans.DefaultDatabase := Db;
Trans.DefaultAction := taRollback;
Trans.Params.Add('read_committed');
Trans.Params.Add('rec_version');
Trans.Params.Add('nowait');
Trans.Active := false;
Result := Trans;
end;
function GetnewID(table: string; Db: tibdatabase): integer;
var
ib: tIbSQL;
sd: string;
begin
Result := -1;
ib := tIbSQL.Create(nil);
try
try
ib.Database := Db;
ib.Transaction := CreateDefaultTransaction(ib, Db);
ib.Transaction.Active := true;
sd := 'SELECT GEN_ID(GEN_' + table + ',1) AS link FROM RDB$DATABASE';
ib.SQL.Clear;
ib.SQL.Add(sd);
ib.ExecQuery;
Result := ib.FieldByName('link').asInteger;
ib.Close;
except
on E: Exception do
ShowMessage('Getnewlinknummer : Error - ' + E.Message);
end;
finally
ib.free;
end;
end;
en:
Delphi Code:
Q := GetnewID('CONTACT', DataSet.database);
DataSet.FieldByName('ID').AsInteger := Q;
Initieel lijkt het wat meer code maar je kunt de functie dus wel hergebruiken voor meerdere tabellen.
Bookmarks