Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Firebird und AutoInc (https://www.delphipraxis.net/154928-firebird-und-autoinc.html)

Grolle 30. Sep 2010 21:52

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 ...

scrat1979 30. Sep 2010 21:56

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]

Grolle 30. Sep 2010 21:58

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

Chemiker 30. Sep 2010 22:14

AW: Firebird und AutoInc
 
Hallo Grolle,

wenn Du einen Trigger einsetzt, kannst Du doch die ID mit einem Generator erstellen.

Bis bald Chemiker

Grolle 30. Sep 2010 22:16

AW: Firebird und AutoInc
 
Hallo,

ich brauch die generierte ID aber dann auch im Programm. Der Trigger/Generator funktioniert ja.

Viele Grüße ...

TBx 30. Sep 2010 22:31

AW: Firebird und AutoInc
 
Zitat:

Zitat von Grolle (Beitrag 1053083)
Hallo,

ich brauch die generierte ID aber dann auch im Programm. Der Trigger/Generator funktioniert ja.

Viele Grüße ...

Ab FB 2.0 gibt es ganau dafür das RETURNING im INSERT-Statement.

Grolle 30. Sep 2010 22:41

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 ...

TBx 30. Sep 2010 22:44

AW: Firebird und AutoInc
 
Welche Dataset-Komponenten setzt Du ein?

Grolle 30. Sep 2010 22:48

AW: Firebird und AutoInc
 
Hi,

Unidac - UniQuery.

Viele Grüße ....

DelphiBandit 1. Okt 2010 06:57

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).

Grolle 1. Okt 2010 13:50

AW: Firebird und AutoInc
 
Hallo,

bisher verwende ich keine statische Feldliste.

Zitat:

Zitat von Grolle (Beitrag 1053089)
ich brauche die ID, wenn der Datensatzzeiger sich im Dataset(Query/Datasource) bewegt.

gibt's denn da kein Event, an welchem ich die ID abgreifen kann?

Viele Grüße ...

haentschman 1. Okt 2010 15:30

AW: Firebird und AutoInc
 
AfterScroll :gruebel:

Chemiker 1. Okt 2010 18:35

AW: Firebird und AutoInc
 
Hallo Grolle,

Vielleicht hilft Dir dieser Link weiter: http://www.firebirdsql.org/pdfmanual...eneratoren.pdf

Bis bald Chemiker

Grolle 2. Okt 2010 14:24

AW: Firebird und AutoInc
 
Hi,

also, dass Problem liegt nicht an dem DBEdit sondern taucht beim speichern eines neuen Datensatzes auf.
Delphi-Quellcode:
    Query.Post;  
    Query.Refresh;
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
getesteten Datenbanken (MySQL, SQLite) nicht so.

Weiß jemand rat?

Viele Grüße ...

DeddyH 2. Okt 2010 14:44

AW: Firebird und AutoInc
 
Wie sieht denn der Trigger aus?

Grolle 2. Okt 2010 14:49

AW: Firebird und AutoInc
 
Hi,
SQL-Code:
/* 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
^
wurde von IBExpert generiert. Kann man nicht probieren das ganze als "After insert" zu nutzen?

Viele Grüße ...

DeddyH 2. Okt 2010 14:54

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.

Grolle 2. Okt 2010 15:00

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 ...

DeddyH 2. Okt 2010 15:20

AW: Firebird und AutoInc
 
Nein nein, der PK macht ja Sinn. Normalerweise sollte doch bei einem INSERT PK dieser dann automatisch befüllt werden.

Grolle 2. Okt 2010 15:33

AW: Firebird und AutoInc
 
Aber woher kommt dann der Fehler?

sx2008 2. Okt 2010 16:24

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.

Grolle 2. Okt 2010 16:49

AW: Firebird und AutoInc
 
Hi,

danke für deinen Post. Habe jetzt mal das beforeInsert genutzt:
Delphi-Quellcode:
procedure Tdata.QueryBeforeInsert(DataSet: TDataSet);
begin
  Query.FieldByName('id').Required := false;
end;
Das scheint vorerst zu klappen. Nicht schön, aber zweckmäßig :stupid:

Viele Grüße ...

tsteinmaurer 2. Okt 2010 19:08

AW: Firebird und AutoInc
 
http://www.devart.com/forums/viewtop...63775a1f0427d5

lg,
Thomas

scrat1979 2. Okt 2010 21:36

AW: Firebird und AutoInc
 
Zitat:

Zitat von DeddyH (Beitrag 1053354)
Nein nein, der PK macht ja Sinn. Normalerweise sollte doch bei einem INSERT PK dieser dann automatisch befüllt werden.

Der Meinung bin ich auch und bei mir funktioniert es. Ich habe übrigens das "AutoInc" Feld mit SQL-Manger (EMS Software glaube ich...) angelegt. Bei meinem INSERT-Statement ist das PK-Feld auch nicht vorhanden, da es ja - wie DeddyH schon sagt - VOR dem Insert automatisch befüllt wird. Es funktioniert OHNE Fehler. Komisch, sehr komisch... Lege doch mal einen Datensatz mit einer GUI an und lassen das PK-Feld leer. Bei einem POST - bzw. nach dem COMMIT - sollte dort eine Zahl stehen und kein Fehler auftauchen. BTW, commitest Du auch nach Deinem Post???????????????

mkinzler 2. Okt 2010 21:47

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

DeddyH 3. Okt 2010 13:37

AW: Firebird und AutoInc
 
Ja eben, deshalb hatte ich ja vorgeschlagen, die If-Abfrage ganz aus dem Trigger zu löschen.

mkinzler 3. Okt 2010 13:47

AW: Firebird und AutoInc
 
Oder zu erweitern ( möglicherweise werden ja sinnvolle Werte übergeben)

DeddyH 3. Okt 2010 13:53

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.

mkinzler 3. Okt 2010 14:01

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