Hi Bruno,
ich verwende genau die gleiche Konstellation in einem Projekt (Firebird + UniDac).
Ich habe in der Firebird
DB auch einen Generator und einen Trigger(Before Insert):
Code:
if ( (new.id is null) OR (NEW.ID = 0) ) then
new.ID = GEN_ID(GEN_IDPOOL,1);
Jetzt gibt es 2 Varianten die funktionieren sollten:
1. Im Objekt-Inspektor, beim dem PK Field die Property "Required" auf false setzen
2. Im Delphi-Code im Event im Event "OnBeforePost" das Feld selber befüllen über den Generator:
Delphi-Quellcode:
procedure TfrmKonzepte.tbl_DataBeforePost(DataSet: TDataSet);
var iID : Int64;
begin
inherited;
// Neuer Datensatz ?
if DataSet.State = dsInsert then begin
// neue ID selber ermitteln und setzen dazu Stored procedure verwenden,
// die den internen Generator benutzt
iID := dmGlobalDB.GetGeneratorValueFromSP(dmGlobalDB.DBCon, cSPGetPrimaryKey, 0);
if iID > 0 then // erfolgreich die neue PK-ID ermittelt diese dann setzen
tbl_DataID.AsLargeInt := iID;
end;
end;
function TdmGlobalDB.GetGeneratorValueFromSP(AConnection: TUniConnection;
const AStoredProcedureName: string;
iDefault: Int64): Int64;
var Qry : TUniQuery;
begin
Result := iDefault;
Qry := TUniQuery.Create(nil);
try
Qry.Connection := AConnection;
Qry.SQL.Text := 'SELECT * FROM '+AStoredProcedureName;
Qry.Active := True;
if not Qry.Eof then begin
if not Qry.Fields[0].IsNull then
Result := Qry.Fields[0].AsLargeInt;
end;
Qry.Active := False;
finally
FreeAndNil(Qry);
end;
end;
Ich selber verwende Variante 2.
Gretes Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.