Autor Beitrag
Bronstein
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: 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;
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
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
BeitragVerfasst: Di 23.03.10 13:34 
Moin, Moin,

sagt man so bei uns hier im Norden.....

user profile iconBronstein hat folgendes geschrieben Zum zitierten Posting springen:
Hallo,
ich habe eine ganz einfache SQL anweisung mit JOIN, mit Hilfe einer AdoQuery ausgeführt:
AdoQuery1.SQL.Clear;
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mi 24.03.10 09:07 
Also, ich würde zuerst mal aliase beim Sql benutzen:
ausblenden 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
ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 578
Erhaltene Danke: 1

WIN XP
Delphi 6 / Delphi 2006 / Delphi XE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: 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!