![]() |
Datenbank: Firenird • Version: 2.1 • Zugriff über: UniDac
Firebird und AutoInc
Hallo,
ich verwende in meiner Anwendung ein AutoInc Feld, welches über einen Firebird Trigger gefüllt wird. Jetzt habe ich das Problem, dass beim Dataset.Insert das AutoInc ID DBEdit Feld nicht leer sein darf (klar, wg. PK). Ich brauche dieses ID Feld zum referenzieren weiterer Datensätze. Soll ich da einen weiteren Trigger und ein weiteres DB Feld anlegen und das als PK nutzen? Viele Grüße ... |
AW: Firebird und AutoInc
Warum hast Du denn bei einem AutoInc-Feld ein DBEdit?? Das wird doch automatisch durch den Trigger "BeforeInsert" befüllt und ist somit "automatisch" nicht leer?!?!?! Bei mir funktioniert das nämlich ohne Probleme....
[Edit] Ich befülle meine Tabelle allerdings durch ein SQL-Statement. Vielleicht zeigt FireBird hier auch ein anderes Verhalten... [/edit] |
AW: Firebird und AutoInc
Hi,
weil ich das erst (hidden) nutzen wollte, um darauf Zugriff zu haben. War nicht schlau, deshalb suche ich jetzt einen anderen Weg an die ID des Datensatzes zu kommen :roll: Viele Grüße .... // Edit: Eigentlich brauche ich das Ereignis, an dem ich den jeweils aktiven Datensatz (bzw. seine ID) im Dataset lesen kann |
AW: Firebird und AutoInc
Hallo Grolle,
wenn Du einen Trigger einsetzt, kannst Du doch die ID mit einem Generator erstellen. Bis bald Chemiker |
AW: Firebird und AutoInc
Hallo,
ich brauch die generierte ID aber dann auch im Programm. Der Trigger/Generator funktioniert ja. Viele Grüße ... |
AW: Firebird und AutoInc
Zitat:
|
AW: Firebird und AutoInc
Hi,
ich brauche die ID, wenn der Datensatzzeiger sich im Dataset(Query/Datasource) bewegt. In dem Moment, wenn die Edits auch die Daten bekommen. Die ReturningId ist ja der zuletzt eingefügte Datensatz. Viele Grüße ... |
AW: Firebird und AutoInc
Welche Dataset-Komponenten setzt Du ein?
|
AW: Firebird und AutoInc
Hi,
Unidac - UniQuery. Viele Grüße .... |
AW: Firebird und AutoInc
Hast Du eine statische Feldliste in der Query verwendet?
Wenn ja, setzt mal für das ID-Feld die Option Required auf false. Wenn Du sie nicht verwendet hast, erstelle diese mal und setze dann diese Option für das ID-Feld. Andere Möglichkeit, die wir ab und zu verwenden ist es den Generator in einer zweiten Query laufen zu lassen (SELECT GEN_ID( GEN_NAME,1 ) FROM RDB$DATABASE). |
AW: Firebird und AutoInc
Hallo,
bisher verwende ich keine statische Feldliste. Zitat:
Viele Grüße ... |
AW: Firebird und AutoInc
AfterScroll :gruebel:
|
AW: Firebird und AutoInc
Hallo Grolle,
Vielleicht hilft Dir dieser Link weiter: ![]() Bis bald Chemiker |
AW: Firebird und AutoInc
Hi,
also, dass Problem liegt nicht an dem DBEdit sondern taucht beim speichern eines neuen Datensatzes auf.
Delphi-Quellcode:
Beim Post kommt der Fehler, dass das Feld ID einen Wert haben muss (dieses ist aber gar nicht in der Insert Query). Leider ist das bei den anderen
Query.Post;
Query.Refresh; getesteten Datenbanken (MySQL, SQLite) nicht so. Weiß jemand rat? Viele Grüße ... |
AW: Firebird und AutoInc
Wie sieht denn der Trigger aus?
|
AW: Firebird und AutoInc
Hi,
SQL-Code:
wurde von IBExpert generiert. Kann man nicht probieren das ganze als "After insert" zu nutzen?
/* Trigger: CONTACTS_BI */
CREATE TRIGGER CONTACTS_BI FOR CONTACTS ACTIVE BEFORE INSERT POSITION 0 as begin if (new.id is null) then new.id = gen_id(gen_contacts_id,1); end ^ Viele Grüße ... |
AW: Firebird und AutoInc
Da ich annehme, dass es sich um den PK handelt, wird das im AfterInsert wohl nicht gehen, da der Datensatz mit einem NULL-Wert in einem NOT NULL-Feld nicht angelegt wird. Übrigens würde ich die if-Abfrage innerhalb des Triggers löschen, da IMO ein Setzen des Wertes niemals von außen zu geschehen hat.
|
AW: Firebird und AutoInc
Hi,
habe es geändert. Sollte ich das Feld besser nicht als PK markieren und Null? (Hatte ich so auch schon getestet und läuft, aber ist nicht gerade optimal?!) Viele Grüße ... |
AW: Firebird und AutoInc
Nein nein, der PK macht ja Sinn. Normalerweise sollte doch bei einem INSERT PK dieser dann automatisch befüllt werden.
|
AW: Firebird und AutoInc
Aber woher kommt dann der Fehler?
|
AW: Firebird und AutoInc
Back to the basics...
Ein Feld kann das Attribut NULL oder NOT NULL haben. Ein Primärschlüsselfeld hat in aller Regel das Attribut NOT NULL. Bei einem AutoInc-Feld wird die Sache etwas komplizierter. Es hat das Attribut NOT NULL, darf aber nicht von der Anwendung befüllt werden (Attribut "DON'T FILL") Es wird ja von der Datenbank gefüllt und darf deshalb nicht in der INSERT oder UPDATE-Anweisung angesprochen werden. Man muss also daür sorgen (eigentlich sollte das die VCL tun), dass das Property "Required" der Felds = False ist. AutoInc-Felder sind bequem und smart, aber nur solange man den Wert beim Einfügen eines Datensatzes nicht benötigt. Hat man abhängige Tabellen, dann ist es besser auf AutoInc-Felder zu verzichten und einen Generator oder künstlich erzeugte Schlüssel zu benützen. |
AW: Firebird und AutoInc
Hi,
danke für deinen Post. Habe jetzt mal das beforeInsert genutzt:
Delphi-Quellcode:
Das scheint vorerst zu klappen. Nicht schön, aber zweckmäßig :stupid:
procedure Tdata.QueryBeforeInsert(DataSet: TDataSet);
begin Query.FieldByName('id').Required := false; end; Viele Grüße ... |
AW: Firebird und AutoInc
|
AW: Firebird und AutoInc
Zitat:
|
AW: Firebird und AutoInc
Am Besten den Trigger so anlegen, dass immer ein Wert gesetzt wird, auch wenn ein Wert ( wie Z.B. '') übergeben wird
|
AW: Firebird und AutoInc
Ja eben, deshalb hatte ich ja vorgeschlagen, die If-Abfrage ganz aus dem Trigger zu löschen.
|
AW: Firebird und AutoInc
Oder zu erweitern ( möglicherweise werden ja sinnvolle Werte übergeben)
|
AW: Firebird und AutoInc
Mach ich nie, da ich der Meinung bin, dass die DB und nur die DB künstliche Schlüssel zu vergeben hat. Aber das ist vermutlich Ansichtssache.
|
AW: Firebird und AutoInc
Ich auch. Da gibt es aber unterschiedliche Ansichten
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 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-2025 by Thomas Breitkreuz