Einzelnen Beitrag anzeigen

Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#12

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 12:23
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.
  Mit Zitat antworten Zitat