Autor Beitrag
Galaxydriver
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 20.10.09 08:53 
Hallo,

ich habe ein DBGrid und möchte einen neuen Datensatz einfügen, indem ich nach dem Verlassen eines Feldes der eingegebene Wert in die Tabelle geschrieben wird und dabei ein neuer Datensatz angelegt wird.
Wenn in einem bestehenden Datensatz nur der Inhalt eines Feldes verändert wird - also ein neuer Wert eingegeben wird, soll dieser den alten Wert im Tabellenfeld ersetzen.

Ich stelle mir das so vor wie in MS-Access. Wenn ich da in ein Feld einen Wert eintrage wird automatisch ein kompletter dazu Datensatz angelegt bzw. veränderte Wert gespeichert.
Unterstützt ein DBGrid diese Aktion oder muss die mit einem OnLeave-Ereignis auf ein Tabellen-Feld selbst implementiert werden?

Momentan ist es so, dass ich im DBGrid zwar mit dem Curser zwar in das Feld klicken kann - allerdings nichts eingeben.
Die Eigenschaft ReadOnly Objektinspektor ist nicht angehakt - also false.

cu
Chris
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: Di 20.10.09 09:59 
grundsätzlich macht das Grid da gar nichts, es dient 'nur' der Anzeige.
Dein 'Edit/Insert' wird in dem mit dem Grid verbundenen Dataset gemacht.
wenn du kein Readonly auf dem Grid hast, vermute ich, das du es im Dataset hast.
Das kann mehrere Ursachen haben, ich denke mal, das du
a) einen 'nur-Lesen'-zugriff auf die DB gemacht hast
oder
b) die gelesene Datenmenge mit einem Join ermittelt hast (weiss ich bei ADO nicht sicher, aber meist wird bei 'gejointen Sqls' die Datenmenge als 'read only' geöffnet).
Woran's noch liegen kann, kann evtl. meine zur Zeit kaputte Glaskugel zeigen oder ein wenig Source-code ;)

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!
Galaxydriver Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mi 21.10.09 08:19 
Danke für den Tipp - es lag an der Eigenschaft "Active" im DataSet!
Die muss man anklicken, dann kann man auch Daten anlegen bzw. zurückschreiben.

Ich habe vergeblich nach dem Quellcodegesucht in der Unit gesucht, der für die Datenbankanbindung benötigt wird.

In der Unit konnte ich z. B. weder den Connection-String, noch ein SQL-Statement finden.
Wo schreibt das Delphi hin - in eine Projektdatei oder ein Include?
Wenn ich z. B. Steuerelemente oder eigene Klassen schreibe, dann finde ich die in der Unit?

cu
Chris
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 21.10.09 13:13 
Also sorgt das 'Active' dafür, das die Datenmenge auch schreibend und nicht nur lesend geöffnet wird.

Kenne mich mit ADO nicht so aus, denke aber mal, das es da ein Objekt gibt, das die Datenbankanbindung managed und mit dem deine Table/dein Query verbunden ist?
Und dort wird wahrscheinlich auch sowas wie der connection-string usw. zu finden sein. Aber wie gesagt, bei ADO kenn ich mich nicht aus, kann also nur vermuten.

Bei eigenen Klassen steht natürlich alles da, wo man es selber hinlegt. Den Soucre einer Fremdkomponente zu ändern halte ich generell nicht für sinnvoll, wenn man Änderungen braucht, würde ich es eher vererben.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!