Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Autowerte bei Firebird setzen (https://www.delphipraxis.net/47383-autowerte-bei-firebird-setzen.html)

FBrust 10. Jun 2005 11:39

Datenbank: Firebird • Version: 1.5 • Zugriff über: Zeos 6.5.1

Autowerte bei Firebird setzen
 
Hallo,

ich bastel gerade an einem Programm, dass über die Zeos-Komponenten auf einen Firebird-Server zugreift.

Nun habe eine Tabelle in meiner FB-Datenbank, die über ein Feld "ID" verfügt. Dieses Feld ist primärer Index und als "autoinc" definiert.

Wenn ich nun einen Datensatz speichern will (über den Navigator), erhalte ich die Fehlermeldung, dass der Insert-Befehl gescheitert wäre.

Wenn ich dann über ein DBEdit-Feld einen Wert für ID eintrage, klappt der Insert. Dabei sollte doch ein Autowert automatisch gesetzt werden, oder?

Für das Feld ID hat IBExpert noch einen Generator angelegt, der wohl für diese AutoInc-Sachen zuständig ist. Muss ich den irgendwie anstoßen/ausführen? Wenn ja, wie?


Gruß
Frank

MagicAndre1981 10. Jun 2005 11:54

Re: Autowerte bei Firebird setzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von FBrust
Hallo,

ich bastel gerade an einem Programm, dass über die Zeos-Komponenten auf einen Firebird-Server zugreift.

Nun habe eine Tabelle in meiner FB-Datenbank, die über ein Feld "ID" verfügt. Dieses Feld ist primärer Index und als "autoinc" definiert.

Wenn ich nun einen Datensatz speichern will (über den Navigator), erhalte ich die Fehlermeldung, dass der Insert-Befehl gescheitert wäre.

Wenn ich dann über ein DBEdit-Feld einen Wert für ID eintrage, klappt der Insert. Dabei sollte doch ein Autowert automatisch gesetzt werden, oder?

Für das Feld ID hat IBExpert noch einen Generator angelegt, der wohl für diese AutoInc-Sachen zuständig ist. Muss ich den irgendwie anstoßen/ausführen? Wenn ja, wie?


Gruß
Frank

Hi, die Zeos-Kompos sind mir leider nicht vertraut, aber bei den IBX-Kompos musst du über das Property "GeneratorField" angeben welches Feld das autoinc-Feld ist und wo der Wert erhöht wird (siehe Anhang).

Schau mal nach, ob es bei den Zeos auch so was gibt.

André

FBrust 10. Jun 2005 12:12

Re: Autowerte bei Firebird setzen
 
Hallo André,

hab nachgesehen, es gibt für das einzelne Feld über den Feldeditor der ZTable-Komponente die Eigenschaft "AutoGenerateValue", aber wenn ich die auf "arAutoInc" setze, erhalte ich trotzdem die gleiche Fehlermeldung.


Gruß
Frank

Grendel 10. Jun 2005 12:20

Re: Autowerte bei Firebird setzen
 
Als ich das letzte mal mit Firebird gearbeitet habe (war gerade die 1.0 frisch raus) gabe es sowas wie ein "autoinc" Flag garnicht. Stattdessen musste man sich ein Konstrukt aus einem Trigger und einer Sequenz basteln wobei die Sequenz die ID hochzählt und der Trigger diese einfügt.

Daher meine Frage: Wie hast Du das Feld als autoincrement definiert?

Falls die 1.5 Firebird o.g. Konstrukt nicht mehr benötigt vergiss alles was ich gesagt habe :)

Bis neulich ...

FBrust 10. Jun 2005 15:56

Re: Autowerte bei Firebird setzen
 
Hallo Grendel,

ich hab die Datenbank und die Tabellen mit IBExpert erzeugt. Dort kann man in dem Dialog zur Tabellengenerierung "autoinc" ankreuzen. Aufgrund dieser Angabe erzeugt IBExpert dann einen sog. Generator mit einem definierten Startwert.

Allerdings weiss ich nicht, ob ich den Generator extra ansprechen muss, da ja z. B. beim ADS oder bei der BDE Autoinc-Felder automatisch hochgezählt werden, hier passiert allerdings nix.

Natürlich kann ich mir mit "SELECT MAX..." den höchsten Wert aus der Tabelle holen und um 1 erhöhen, aber dann bräuchte ich kein Autoinc....


Gruß
Frank

Albi 10. Jun 2005 16:11

Re: Autowerte bei Firebird setzen
 
Hallo,

dann erzeuge doch einfach noch den passenden Trigger dazu und du brauchst dich um die Erstellung nicht mehr zu kümmern, da die DB das für dich erledigt.

SQL-Code:
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
      NEW.ID = GEN_ID(DB_Name_ID_GEN, 1);
END

FBrust 10. Jun 2005 16:16

Re: Autowerte bei Firebird setzen
 
Hallo Albi,

ist ja schön und gut, aber wozu brauche ich dann die "AutoInc"-Definition? Und wie nutze ich die?


Gruß
Frank

marabu 10. Jun 2005 16:23

Re: Autowerte bei Firebird setzen
 
Hallo Frank,

eine Möglichkeit zur "automatischen" Vergabe von ID für deine Tabelle TBL unter Verwendung eines Generators ist ein Trigger, wie er im Handbuch steht. Ich gehe davon aus, dass der Generator so heißt wie die Tabelle.

SQL-Code:
CREATE TRIGGER "TBL_BI0" FOR "TBL"
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id = 0) then
    new.id = gen_id(TBL, 1);
end
Ich habe immer einen solchen Trigger - und benutze ihn dann nicht. Der Trigger dient bei mir nur der Unterstützung von bulk-load Operationen. Den ID für single record inserts hole ich mir vom Generator und setze ihn in der Anwendung. Auf diese Weise habe ich die ID für meinen Programm-Kontext. Echte AutoInc-Felder machen bei primary key Feldern mehr Probleme als Freude.

Grüße vom marabu

Albi 10. Jun 2005 16:32

Re: Autowerte bei Firebird setzen
 
Hallo,

Du sagst damit nichts weiter wie das ein Generator erzeugt wird. Diesen kannst Du entweder selber in der StoredProcedure machen über


SQL-Code:
...
...
Insert Into DB (ID,...,...)
Values (gen_ID(DB,1),...,...)
Oder Du erzeugst noch den passenden Trigger, dann kannst Du dir in der SP eben das Feld ID sparen. Und die DB kümmert sich um die Vergabe der DB.

Welche Vorteile oder Nachteil das hat, kann ich dir auch nicht sagen. Aber ich bevorzuge immer die Variante mit den Trigger (wahrscheinlich aus Bequemlichkeit :-D )

FBrust 10. Jun 2005 17:05

Re: Autowerte bei Firebird setzen
 
Hallo,

ich habe mittlerweile einen möglichen Grund gefunden.

Wenn man im IBExpert eine Tabelle anlegt, kann man auch ein Feld als AutoInc definieren. IBExpert erzeugt dann einen Generator und verknüpft ihn dann mit dem Feld. Allerdings scheint IBExpert die Verbindung nicht in der Datenbank zu speichern, da beim Bearbeiten der Tabelle die entsprechende Checkbox leer ist.

Weist man nun erneut den bereits definierten Generator zu und speichert ab, so ist bei erneutem Öffnen der Feldeigenschaften die Checkbox wieder leer (nicht gesetzt).

Also werd ich wohl einen Trigger einbauen, der beim Insert das Feld ID um eins erhöht.


Danke für Eure Antworten.


Gruß

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
Seite 1 von 4  1 23     Letzte »    

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