Autor Beitrag
cyberax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Sa 30.09.06 21:38 
Hallo,

also wie aus Titel ersichtlich verwernde ich Firebird und die Zeos Komponenten.

Habe gerade angefangen meine erste DB mit Firebird aufzubauen. Die erste Tabelle funktioniert einwandfrei (auch mit den Autoinc Feldern). Aber die zweite will einfach nicht laufen.

Also habe ein Feld "ID". Dafür habe ich einen Generator und einen Trigger erzeugt. Ind Firebird funktioniert das auch einwandfrei, wenn ich einen neuen Datensatz einfüge. Aber in meinem in Delphi geschriebenen Programm einfach nicht. Wenn ich zum Beispiel einen neuen Datensatz anlege, Werte eingebe und dann mit Zquery.post speichere kommt die Fehlermeldung "...Feld ID muss einen Wert haben. ...".
Aber der soll doch autom. erzeugt werden, oder???!!?
Habe es auch mit zquery.connection.commit probiert -> genau so.

Würde mich sehr über Hilfe von euch freuen.

Mfg Cyberax
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 30.09.06 21:45 
Zeig mal deine Abfrage.

_________________
Markus Kinzler.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Sa 30.09.06 23:02 
Und den Trigger-Quellcode. Arbeitest Du mit persistenten Feldern?

Wenn ja, wird wahrscheinlich NULL oder '' als Übergabewert für Deine ID gepostet, dann funktioniert das natürlich je nach Trigger-Code nicht.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 11:25 
Zitat:
persistenten Feldern?
:?:
Was ist das? Also hier mein quellcode zur Abfrage / Anzeige:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
 with zquery_kunden do begin
  sql.text:='Select * From kunden '+
            ' where ((firma like :firma) or (firma IS NULL))'+
            ' and ((name like :name) or (name IS NULL))'+
            ' and ((vorname like :vorname) or (vorname IS NULL))'+
            ' and ((kurztext like :kurztext) or (kurztext IS NULL))'+
            ' and ((ort like :ort) or (ort is NULL))';
    With Params.ParamByName('firma') do begin
       DataType := ftstring;
       Value :=  edit2.text+'%';
    End;
    With Params.ParamByName('name') do begin
       DataType := ftstring;
       Value :=  edit5.text+'%';
    End;
    With Params.ParamByName('vorname') do begin
       DataType := ftstring;
       Value :=  edit1.text+'%';
    End;
    With Params.ParamByName('ort') do begin
       DataType := ftstring;
       Value :=  edit3.text+'%';
    End;
    With Params.ParamByName('kurztext') do begin
       DataType := ftstring;
       Value :=  edit4.text+'%';
    End;
   open;
  end;

... wird bei fenster.onshow aufgerufen

Dann  ZQuery_kunden.Insert;
... zum neuen Kunde anlegen und ...
ausblenden Delphi-Quelltext
1:
2:
3:
// ZQuery_kunden.post;
 ZQuery_kunden.Connection.Commit;
 ZQuery_kunden.Refresh;

zum Speichern. Habe beides (post und commit) probiert gleicher Fehler.

Hier der Trigger Quellcode:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
CREATE TRIGGER KUNDEN_BI FOR KUNDEN
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_KUNDEN_ID,1);
END
^


SET TERM ; ^


Hmmm?!?
Ideen?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 11:49 
Da du in der ursprünglichen Abfrage per select das Feld ID eingeschlossen hast, wird es auch beim Insert gesetzt.
Du kannst das Problem begegnen, wenn du für den Insert einen eigenen query nimmst oder den Trigger umgehst, indem du das Feld ID im Client setzt. Das kannst du Verwendung vonb TZSequence machen.

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 12:13 
Zitat:
Da du in der ursprünglichen Abfrage per select das Feld ID eingeschlossen hast, wird es auch beim Insert gesetzt.

.. und warum wird es dann nicht in die Tabelle geschrieben??

Bei meiner anderen Tabelle funktionierts doch auch!!!??!
Zitat:
Du kannst das Problem begegnen, wenn du für den Insert einen eigenen query nimmst

Meinst du damit, dass ich jeden Eintrag (jedes Value) über einen Insert Befehl eintragen soll?
Hmm finde ich umständlich, vor allem wenn evtl. später mal Änderungen oder Erweiterungen an der DB vorgenommen werden muss man immer die Query's suchen um den Insert Befehl anzupassen.

Könnte ja auch nur den aktuellen Generator Wert abfragen (mit einem zweiten Query) und den in ein DBedit schreiben und dann speichern, oder?
Zitat:
oder den Trigger umgehst, indem du das Feld ID im Client setzt. Das kannst du Verwendung vonb TZSequence machen.

Wie funktioniert das mit TZSequence? Habe noch nie damit gearbeitet...

Evtl. ein kleines Beispiel??
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 12:22 
Zitat:
Könnte ja auch nur den aktuellen Generator Wert abfragen (mit einem zweiten Query) und den in ein DBedit schreiben und dann speichern, oder?
Genau das macht die ZSequence-Komponente. Sie wird mit der Connection und dem Generator (Sequencename) verbunden. Dann wird diese im Query ausgewählt und in der Eigenschaft .SequenceField das Feld gewählt.

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 13:01 
Ach super. Funktioniert einwandfrei!

AAAber - habe in der gleichen Tabelle zwei Felder mit Autoinc - einmal die ID (da arbeite ich nun mit der ZSequence-Komponente und dann noch ein Feld Kundennummer. Das wollte ich auch über einen Generator regeln. Wie mache ich das dann? Kann ja im Query nur 1X Sequence einstellen ....?!?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 13:07 
Diesequenzen sind primär zum Setzen des Primärschlüssels gedacht. Versuch doch mal das Feld Kundennummer explizit auf NULL zu setzen.

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 14:01 
Okay und wie mach ich das?
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 14:09 
ausblenden Delphi-Quelltext
1:
.value = 'NULL';					

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 14:14 
Ja okay. Aber soll ich das manuell angeben, wenn ich .post ausführe, oder wie meinst du das?? Genau das wollte ich ja nicht...

Bitte ein Beispiel!!!
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 14:19 
Nach Insert, wenn dann ein Wert gesetzt wird, wird er berücksichtigt, sonst müßte der Trigger anspringen.

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 14:29 
dbedit3 ist das Feld kundennr zugewiesen.
Habe nach .insert mit
ausblenden Delphi-Quelltext
1:
 dbedit3.Field.Value:=null;					
und  dbedit3.TEXT:='null';
probiert. Funktioniert nicht.
Müssen autoinc Felder immer Index sein? Zur Zeit habe ich's so.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 14:38 
Zitat:
ausblenden Delphi-Quelltext
1:
 dbedit3.TEXT:='null';					
kann nicht funktioniere, weil es dasn Feld auf den String 'Null' setzt und nicht auf NULL. In diesem fall könntest du den Trigger so erweitern, daß er auch bei Leerstring einen Wert per Generator setzt.
Zitat:
Müssen autoinc Felder immer Index sein? Zur Zeit habe ich's so.
Nein, bei einer Jundennummer aber sinnvoll.

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 15:09 
Naja - aber habe ja einen Trigger dafür geschrieben. Genau wie für die ID Nummer. Aber der arbeitet ja nicht richtig - genau wie bei der ID.

Für die Kundennummer sieht er so aus:
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
CREATE TRIGGER KUNDEN_KDNR FOR KUNDEN
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.KUNDENNR IS NULL) THEN
    NEW.KUNDENNR = GEN_ID(GEN_KUNDEN_NUMMER,1);
END
^


SET TERM ; ^
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 15:11 
ausblenden SQL-Anweisung
1:
IF (NEW.KUNDENNR IS NULL) or (NEW.KUNDENNR = '') THEN					

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: So 01.10.06 16:33 
Is NULL und '' nicht das selbe ?? :?

Anscheinend nicht - denn es funktioniert so.

Vielen Dank!!!
Mfg cyberax
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 01.10.06 16:36 
Zitat:
Is NULL und '' nicht das selbe ?? :?
Nein ein Leerstring ins ein leerer String( ein Wert) und NULL bedeutet keinen Wert.

_________________
Markus Kinzler.
cyberax Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 247

Win XP Pro
Delphi 5 Enterprise
BeitragVerfasst: Mo 02.10.06 14:15 
Okay. Also danke nochmals