| Autor |
Beitrag |
cyberax
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: Sa 30.09.06 21:45
Zeig mal deine Abfrage.
_________________ Markus Kinzler.
|
|
UGrohne
      

Beiträge: 5502
Erhaltene Danke: 220
Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
|
Verfasst: 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 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: So 01.10.06 11:25
| Zitat: | | persistenten Feldern? |
Was ist das? Also hier mein quellcode zur Abfrage / Anzeige: 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 ... Delphi-Quelltext 1: 2: 3:
| ZQuery_kunden.Connection.Commit; ZQuery_kunden.Refresh; |
zum Speichern. Habe beides (post und commit) probiert gleicher Fehler.
Hier der Trigger Quellcode: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: So 01.10.06 14:01
Okay und wie mach ich das?
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 01.10.06 14:09
Delphi-Quelltext
_________________ Markus Kinzler.
|
|
cyberax 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: So 01.10.06 14:29
dbedit3 ist das Feld kundennr zugewiesen.
Habe nach .insert mit 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 01.10.06 14:38
| Zitat: | Delphi-Quelltext |
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 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: 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: 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
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: So 01.10.06 15:11
SQL-Anweisung 1:
| IF (NEW.KUNDENNR IS NULL) or (NEW.KUNDENNR = '') THEN |
_________________ Markus Kinzler.
|
|
cyberax 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: So 01.10.06 16:33
Is NULL und '' nicht das selbe ??
Anscheinend nicht - denn es funktioniert so.
Vielen Dank!!!
Mfg cyberax
|
|
mkinzler
      
Beiträge: 4106
Erhaltene Danke: 13
Delphi 2010 Pro; Delphi.Prism 2011 pro
|
Verfasst: 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 
      
Beiträge: 247
Win XP Pro
Delphi 5 Enterprise
|
Verfasst: Mo 02.10.06 14:15
Okay. Also danke nochmals
|
|