Autor |
Beitrag |
Bronstein
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: Di 23.03.10 12:58
Hallo,
ich habe eine ganz einfache SQL anweisung mit JOIN, mit Hilfe einer AdoQuery ausgeführt:
AdoQuery1.SQL.Clear;
SQL-Anweisung 1:
| SELECT ID, TEXT, DAUER, BEMERKUNG, STATUS.TYP_ID, TYP.TYP_ID FROM STATUS INNER JOIN TYP ON STATUS.TYP_ID = TYP.TYP_ID WHERE ID = 1; |
Die AdoQuery habe ich mit einer DATASOURCE und diese weiderum mit einem DBGRID verknüpft.
Wenn ich jetzt aber z.B. die Dauer in einer Zeile ändere und in die nächste Zeile springen möchte bekomme ich folgende Fehlermeldung:
Quelltext 1:
| Im Projekt XXX.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'Nicht genügend Schlüsselfeldinformationen zum Aktualisieren' aufgetreten. |
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
jaevencooler
      
Beiträge: 166
Erhaltene Danke: 6
MS-DOS,Win32, Win95, Win 98, Me,XP, Linux, NT4.0, NT 2000-2008, Vista, Windows 7
Turbo Pascal,D1 Enter,D2 Enter,D3 Enter,D5 Enter, Kylix, D2007, PL/SQL, MS/SQL, Delphi 2010, Delphi XE
|
Verfasst: Di 23.03.10 13:34
Moin, Moin,
sagt man so bei uns hier im Norden.....
Bronstein hat folgendes geschrieben : | Hallo,
ich habe eine ganz einfache SQL anweisung mit JOIN, mit Hilfe einer AdoQuery ausgeführt:
AdoQuery1.SQL.Clear;
SQL-Anweisung 1:
| SELECT ID, TEXT, DAUER, BEMERKUNG, STATUS.TYP_ID, TYP.TYP_ID FROM STATUS INNER JOIN TYP ON STATUS.TYP_ID = TYP.TYP_ID WHERE ID = 1; |
Die AdoQuery habe ich mit einer DATASOURCE und diese weiderum mit einem DBGRID verknüpft.
Wenn ich jetzt aber z.B. die Dauer in einer Zeile ändere und in die nächste Zeile springen möchte bekomme ich folgende Fehlermeldung:
Quelltext 1:
| Im Projekt XXX.exe ist eine Exception der Klasse EDatabaseError mit der Meldung 'Nicht genügend Schlüsselfeldinformationen zum Aktualisieren' aufgetreten. | |
Um Dir detailliert weiter helfen zu können, müsste man erst einmal wissen was für eine Datenbank da hinter steht ?
Grundsätzlich ist aber so, das Du 2 Tabellen die über einen inner oder outer Join verbunden sind, nicht updaten kannst !
Die meisten Datenbanken können das einfach nicht.....
Die Lösung wäre also ein seperates Update auf die entsprechende Tabelle.
Gruß
Michael
Was für eine Datenbank steht denn da hinter ?
_________________ Wissen ist Macht, nichts wissen macht auch nichts...
|
|
Bronstein 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: Mi 24.03.10 05:57
Hallo, es handelt sich dabei um eine DB2 Datenbank.
Und wie würde so ein Update aussehen, auf das DBGrid und die SQL kann ich ja nicht verzichten, denn ich muss dem Benutzer ja die Daten anzeigen, damit dieser diese bearbeiten kann
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Mi 24.03.10 09:07
Also, ich würde zuerst mal aliase beim Sql benutzen:
Delphi-Quelltext 1: 2: 3:
| SELECT s.ID, s.TEXT, s.DAUER, s.BEMERKUNG, s.TYP_ID, t.TYP_ID FROM STATUS s INNER JOIN TYP t ON t.TYP_ID = s.TYP_ID WHERE s.ID = 1 |
Wieso eigentlich beide TYP_ID? haben dann doch beide den selben Wert?
wenn beide, dann besser eindeutig benennen, z.b. so
Delphi-Quelltext 1:
| Select ... , s.TYP_ID as STATUSTYPID, t.TYP_ID as TYPTYP_ID from ... |
Updaten geht einfach mit einem Updatebefehl, z.b. wenn du in Tabelle Status den Text und die Bemerkung aktualisieren möchtest:
Delphi-Quelltext 1: 2: 3:
| Update STATUS set TEXT = 'einText', Bemerkung = 'eineBemerkung' where ID = 1; |
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
Bronstein 
      
Beiträge: 578
Erhaltene Danke: 1
WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
|
Verfasst: Do 25.03.10 15:01
Das hatte ich nicht gemeint.
Die Fehlermeldung wird ja vom DBGrid erzeugt, wenn ich da was ändere oder wie kann ich die Fehlermeldung abschalten und dafür den Update Befehl verwenden?
So wie ich das jetzt sehe mit dem Update Befehl, darf ich die DBGrid Komponente nicht verwenden und nehme stattdessen ein StringGrid?
_________________ Es gibt keine dummen Fragen nur dumme Antworten!!!
|
|
zuma
      
Beiträge: 660
Erhaltene Danke: 21
Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
|
Verfasst: Do 25.03.10 16:23
Doch, das hast du gemeint
Du hast den Zusammenhang Dataset/DbGrid noch nicht richtig erfasst.
Das Grid wirft NICHT den Fehler! Mal grob gesagt:
Du zeigst dein Dataset (in diesem Fall dein Query) zwar in einem Grid an, aber das reicht die Änderung nur an das daran gehängte Dataset weiter, das dann versucht, die Änderung in die DB zu schreiben, was aufgrund der join-geschichte eben nicht geht.
Evtl. befasst Du dich noch mal mit den Grundlagen zur DB-Verwendung?
_________________ Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
|
|
|