Entwickler-Ecke
Datenbanken - DBGRID "Nicht genügend Schlüsselfeldinformationen" SQL JOIN
Bronstein - Di 23.03.10 12:58
Titel: DBGRID "Nicht genügend Schlüsselfeldinformationen" SQL JOIN
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. |
jaevencooler - 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 ?
Bronstein - 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
zuma - 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; |
Bronstein - 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?
zuma - 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?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!