AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Autoincrement

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

Registriert seit: 16. Jul 2012
Ort: Darmstadt
26 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 09:19
edit: Upz, habe UniDAC überlesen. Ich lasse das folgende für FireDAC trotzdem stehen

Interessant für dich sind "UpdateOptions.AutoIncFields" und optional "UpdateOptions.GeneratorName" (wenn der Before-Insert-Trigger sich nicht darum kümmert).
Wenn du mit persistenten Feldern arbeitest, dann sieh dir am Schlüsselfeld die Eigenschaft "AutoGenerateValue" an. Sollte auf "arAutoInc" stehen (mindestens "arDefault"), damit das Dataset sich nach der Aktion den Wert holt (intern mit RETURNING INTO, damit es sich nicht über den Schlüssel ("UpdateOptions.KeyFields" bzw. "ProviderFlags" [...,pfInWhere,pfInKey]), mit einer weiteren Abfrage, die aktuelle Zeile holen muss). Dazu muss am Feld "Required" natürlich auf "False" stehen.
Nico Bendlin

Geändert von NicoDE ( 1. Dez 2016 um 09:26 Uhr)
  Mit Zitat antworten Zitat
kretabiker

Registriert seit: 10. Mär 2005
Ort: Bargteheide
183 Beiträge
 
Delphi 12 Athens
 
#2

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 11:41
Ich habe zwar nicht UNIDAC, aber IBDAC vom gleichen Hersteller, vielleicht gibt es da Ähnlichkeiten.

Es müssen in den Komponenten folgende Felder gesetzt sein (Beispiel für IBCQuery):
- Key Generator (auf den Namen des Generators in FB)
- Key Field (auf das Feld in der Tabelle, welches als "Autoinc" dient)
- evtl. noch den GeneratorMode wechseln von gmPost auf gmInsert

So klappt es bei mir mit Pseudo-Autoinc-Feldern

*** Ups, übersehen, dass du einen Trigger einsetzt. Meine Lösung funktioniert ohne Trigger. Vielleicht hat noch jemand eine Idee bezüglich des Triggers
Udo Treichel

Geändert von kretabiker ( 1. Dez 2016 um 11:43 Uhr) Grund: Triggerverwendung übersehen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 11:46
Man muss bei den Komponenten nix einstellen.
Wenn Trigger und Generator korrekt sind reicht es einfach die ID nicht zu setzen und dann wird sie automatisch beim Insert generiert!

Zeig am besten mal den Trigger Code und stell sicher, dass der Trigger als BEFORE INSERT eingestellt und nicht deaktiviert ist.
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
mrtwo12

Registriert seit: 18. Feb 2008
34 Beiträge
 
#4

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 12:23
Moin,

ich meine, wenn mich meine grauen Zellen nicht trügen, es gibt ein Parameter unter Options->RequiredFields in der Table Komponente, die false sein soll.

War, bzw. ist es nicht so, dass der Fehler bei Feld notNull richtig ist wenn man nichts übergiebt, was ja hier richtig ist.

mfg
S.Simon
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 12:37
Also ich habe bisher bei den Komponenten noch NIEMALS einen Generator oder Trigger angegeben, sondern lediglich den Trigger in der Datenbank (OnBeforeInsert oder OnBeforePost - weiß ich nicht genau) mit Hilfe eines DB-Managers eingerichtet und gesetzt. Bisher hat alles prima beim Insert über die Komponenten funktioniert... Liegt der Fehler vielleicht doch an einem nicht ausgelösten Trigger?! (Verwende IBDAC und UniDAC von DevArt).
Michael Kübler
  Mit Zitat antworten Zitat
brunoM

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

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 12:42
Man muss bei den Komponenten nix einstellen.
Wenn Trigger und Generator korrekt sind reicht es einfach die ID nicht zu setzen und dann wird sie automatisch beim Insert generiert!

Zeig am besten mal den Trigger Code und stell sicher, dass der Trigger als BEFORE INSERT eingestellt und nicht deaktiviert ist.
Nachfolgend der Code der durch SQl-Manager generiert worden ist - und der auch intern im SQL-Manager funktioniert:

SET TERM ^ ;

CREATE TRIGGER BI_MDATEN_ID FOR MDATEN
ACTIVE BEFORE
INSERT
POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(MDATEN_ID_GEN, 1);
END^

SET TERM ; ^
  Mit Zitat antworten Zitat
brunoM

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

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 12:44
Ich bin noch nicht weiter aber bereits herzlichen Dank für die zahlreichen Antworten!
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#8

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 13:11
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.

Ggfls. dashier ändern: IF (NEW.ID IS NULL) THEN in IF (NEW.ID IS NULL) or (NEW.ID = -1) THEN und dann als ID -1 übergeben.

Bei mir funktionieren Tabellen-, Generator- und Triggerdefinitionen:
SQL-Code:
CREATE TABLE TEXTVERWALTUNG
(
  TEXTVERWALTUNGID Integer,
  ...
);

CREATE GENERATOR GEN_TEXTVERWALTUNGID;

SET TERM ^ ;
CREATE TRIGGER TR_TEXTVERWALTUNGID_BI FOR TEXTVERWALTUNG ACTIVE
BEFORE INSERT POSITION 0
AS BEGIN
  if (NEW.TextverwaltungID is NULL) then NEW.TextverwaltungID = GEN_ID(gen_TextverwaltungID, 1);
END^
SET TERM ; ^
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

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

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 13: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
909 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Firebird Autoincrement

  Alt 1. Dez 2016, 13: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
Antwort Antwort
Seite 1 von 2  1 2      


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 06:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz