Data Controlls "aktualisieren"

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Data Controlls "aktualisieren"

Beitrag von Aliobaba »

Hallo,

Für die Bearbeitung meiner SQLite-Datenbank benutze ich Lazarus mit Zeos. In diesem Programm gibt es z.B. ein "TDBEdit"-Textfeld, das auf eine Spalte/ein Feld der hinterlegten Datenbank zugreift. Der Zugriff auf die Datenbank funktioniert auch problemlos: Ich kann in das Edit-Feld schreiben und das Geschriebene erscheint ordnungsgemäß in der Datenbankdatei:
z.B.:
Qtext.Edit -> DB_DS_Text.Text:= Inttostr( 44444 ) -> QText.Post; (QText.Edit ist ein "TDBEdit")

Wenn ich nun aber mittels eines Update-Befehls (innerhalb meines Lazarus-Programms) – oder sogar "direkt" schreibend in einen beliebigen Editor einer SQLite - Datenbank ("am Lazarus-Programm vorbei") das entsprechende Feld direkt in der Datenbank ändere in einen beliebigen anderen Text, dann kriege ich es nicht hin, dass ich diesen geänderten(!) Text im "TDBEdit"-Textfeld erscheinen lassen kann. Den Update-Befehl "außerhalb" der von Zeos/Lazarus gebotenen "Data Controlls" brauche ich aber, da ich die gesamte "Table" bearbeiten muss.

Probiert habe ich alles mögliche:
Qtext.ApplyUpdates; Qtext.CommitUpdates; xy.Refresh; SQLTransaction1.Commit;
QText.Close; gefolgt von QText.Open;

Viele dieser Befehle aktualisieren aber nur die Datenbankeinträge selbst, ausgehend vom gerade aktuellen Inhalt des (z.B.) "TDBEdit"-Textfeldes.
(also Richtung Data-Controll --> Datenbank)

Ich würde aber gerne das "TDBEdit"-Textfeld füllen mit den aktuellen Inhalten des entsprechenden Datenbank-Feld, das ich vorher(!) mit einem "SQL-Update-Befehl" (oder probehalber mit dem "direkten" Eingriff via DB-Editor) geändert habe..
(also Richtung Datenbank -> Data-Controll )

Seltsamerweise gelingt dies nur, wenn ich das Lazarus-Programm erst völlig beende und neu starte. Dann wird das "TDBEdit"-Textfeld (logischerweise) eingelesen; nicht aber, wenn ich die obigen "Verrenkungen" mache, einschließlich des Schließen der Query und dem Wiederöffnen während des Programmlaufes. (QText.Close; gefolgt von QText.Open; )

Wahrscheinlich sitze ich schon tagelang auf der Leitung und ich komm und komm einfach nicht drauf, wie ich dieses Problem lösen kann. Sorry jetzt schon dafür, dass ich die wahrscheinlich triviale Lösung nicht gefunden habe. Bemüht habe ich mich wirklich!

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Aliobaba
Lazarusforum e. V.
Beiträge: 496
Registriert: Di 1. Mai 2012, 09:11

Re: Data Controlls "aktualisieren"

Beitrag von Aliobaba »

Hallo,

jetzt denke ich habe ich die Lösung selber gefunden:

".refresh" ist nun doch mein Freund! Verwirrt wurde ich, weil nach einem Refresh (natürlich) die Abfrage wiederholt wird und so der Cursor auf die erste Stelle der (bei mir nicht angezeigten) Ergebnisliste der erneuten Select-Abfrage-Liste springt. Wenn nun das "TDBEdit"-Feld eine andere Datenbankzeile ursprünglich angezeigt hat, dann zeigt nach der ".refresh"-Abfrage auch das "TDBEdit"-Feld den (bei mir leeren) Inhalt dieser ersten Datenbankzeile an.

Also so geht's:
ID-Nummer der Datenbankzeile merken, die das "TDBEdit-Feld" ursprünglich anzeigt.
dann ".refresh" und dann nochmal auf die gemerkte Datenbankzeile springen.

Ein wenig ungünstig ist, dass dann allerdings die bestehende und möglicherweise etwas kompliziertere "Select"-Abfrage zerstört wird. Allerdings sehe ich gerade, dass es auch den Befehl ".refreshCurrentRow()" gibt. Mal sehen ob das weiter hilft: Da habe ich allerdings aktuell noch ein weiteres Problem, welche Variable einzugeben ist. (Jemand einen kurzen Tip?)

Es hilft halt immer mal wieder, wenn man durch so einen Forum-Post gezwungen wird, sein Problem nochmal zu überdenken und die wesentlichen Dinge komprimiert niederzuschreiben.

(Sorry für den Traffic hier; aber vielleicht hilft dies ja noch irgendwann zukünftig jemand.)

Aliobaba
"MyMemoryDB" ( https://www.heise.de/download/product/mymemorydb-89626 )

Antworten