Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird Autoincrement (https://www.delphipraxis.net/191030-firebird-autoincrement.html)

Neutral General 1. Dez 2016 12:13

AW: Firebird Autoincrement
 
Zitat:

Zitat von nahpets (Beitrag 1355125)
Wie ist denn ID in der Datenbank definiert? Als Not Null?
Wenn das von der Datenbank vor dem Ausführen des Triggers geprüft wird, hast Du ohne Angabe einer ID keine Chance.

Wird es aber nicht.

DataCool 1. Dez 2016 12:23

AW: Firebird Autoincrement
 
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

user0815 1. Dez 2016 12:37

AW: Firebird Autoincrement
 
per Quellcode anlegen

Delphi-Quellcode:
// table
      q.SQL.Add('CREATE TABLE MyTableName (');
      q.SQL.Add(' ID INTEGER NOT NULL,');
      q.SQL.Add(' MyText VARCHAR(75) COLLATE UNICODE,');
      q.SQL.Add(' MyValue FLOAT DEFAULT 0,');
      q.SQL.Add('CONSTRAINT PK_MyTableName PRIMARY KEY (ID))');
      q.ExecSQL;
// Generator
      q.SQL.Clear;
      q.SQL.Add('CREATE GENERATOR MyTableName_GEN');
      q.ExecSQL;

      q.SQL.Clear;
      q.SQL.Add('SET GENERATOR MyTableName_GEN TO 0');
      q.ExecSQL;
// Trigger
      q.SQL.Clear;
      q.SQL.Add('CREATE TRIGGER ID FOR MyTableName ACTIVE BEFORE INSERT POSITION 0 AS');
      q.SQL.Add('begin');
      q.SQL.Add(' if ( (new.ID is null) or (new.ID = 0) )');
      q.SQL.Add(' then new.ID = gen_id(MyTableName_GEN, 1);');
      q.SQL.Add('end');
      q.ExecSQL;

MyRealName 1. Dez 2016 13:41

AW: Firebird Autoincrement
 
Bei unidac reicht es nicht, das als autoinc field anzugeben und den trigger zu haben, man muss aus DMLRefresh auf True setzen, damit er die Werte entsprechend im Dataset updated (von der DB)

mikhal 1. Dez 2016 14:08

AW: Firebird Autoincrement
 
Ich nutze die persistenten Felder, hier wird beim PK-Feld die Property Required auf False gesetzt, in den Optionen der TUniQuery wird auf dem Reiter Optionen einfach der Name des Generators in der Eigenschaft KeyGenerator eingetragen - das wars.

Grüße
Mikhal

brunoM 1. Dez 2016 14:54

AW: Firebird Autoincrement
 
Herzlichen Dank an alle - das Problem hat sich gelöst!!

Es liegt tatsächlich an "Requirdedfields" in den Optionen der UniTable-Komponente.
Ich habe dieses auf False gesetzt.
Weiter habe ich in der Rubrik "Specificoptions" folgende Werte geändert:

GeneratorMode := gmInsert
KeyGenerartor := Name des Generators

Ob das einen Eifluss hat oder ob es nur an "Requiredfields" liegt habe ich noch nicht ausporbiert. Jedenfalls funktioniert es super.

Nochmals herzlichen Dank für die Tipps.

Gruss
Bruno


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz