AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Firebird Autoincrement

Ein Thema von brunoM · begonnen am 1. Dez 2016 · letzter Beitrag vom 1. Dez 2016
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.144 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 12:13
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
886 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
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#13

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 12:37
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;
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
430 Beiträge
 
Delphi 10.3 Rio
 
#14

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 13:41
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)
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
769 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#15

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 14:08
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
brunoM

Registriert seit: 19. Jul 2006
Ort: CH-3123 Belp
61 Beiträge
 
Delphi XE5 Professional
 
#16

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 14:54
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
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf