auf einem Formular befindet sich ein DBGrid und einige DBEdit-Komponenten. Ersteres ist an eine komplexere TZQuery gebunden, welche für einen Rechner (die Abfrage wird zur Laufzeit erstellt) eine Liste von Softwareprodukten anzeigt, dazu ein Zeitpunkt der letzten generellen Bereitstellung von Updates für diese Software, die lokal zuletzt installierte Version samt Installationsdatum, die auf dem Fileserver verfügbare jüngste Version sowie der daraus berechnete Status für die lokale Installation(fehlt, veraltet oder aktuell) - liest sich viel komplizierter als es ist, denn das Ganze ist letztlich nichts weiter als ein recht praktisches "Installationsprotokoll" mit zentraler Updatefunktion für den Fileserver.
Die Daten dafür stecken in einer sqlite3-Datenbank auf dem Fileserver in einigen recht simpel gehaltenen Tabellen (tblHost, tblInstallation, tblSoftware, tblVersion).
Einige Buttons unter dem Formular sollen die Suche nach Updates (auf einem in tblSoftware installierten URL), deren Ablage auf dem Fileserver oder die schnelle Installation der im Grid ausgewählten Software vom Fileserver ermöglichen.
Soweit alles prima - das ganze war früher ein in LibreOffice Base realisiertes Werkzeug, das sich monatelang bewährt hat, jedoch seit einem Versionswechsel von LO nicht mehr funktioniert und das ich daher gern in Lazarus nachbauen würde.
Der Showstopper ist allerdings seit zwei Tagen, daß es partout nicht gelingt, ein Datumsfeld in der Datenbank aus Programmcode dauerhaft zu aktualisieren.
Wie zum Hohn funktioniert es in einer stark vereinfachten Version, die ich zu Testzwecken nochmals zusammengestellt habe, um es hier zu posten. Hier ist die Select-Anweisung für das vereinfachte Grid:
:
Code: Alles auswählen
SELECT
30 as hid,
s.sid as sid,
s.name as name,
v.vid as akt_vid,
DATETIME(s.bereitgestellt) as bereitgestellt
FROM
(SELECT vid, software, MAX(erschienen) As Datum FROM tblVersion GROUP BY software) As v
LEFT JOIN tblSoftware as s
ON v.software=s.sid
WHERE sid > 0
Code: Alles auswählen
SELECT sid, name, bereitgestellt FROM tblSoftware;
"bereitgestellt" ist ein Feld, welches in sqlite als "DATETIME" eingestellt ist. Sein Name ist leider unglücklich gewählt, gemeint ist das Datum, an welchem zuletzt manuell nach Updates gesucht wurde. Es soll aus Code heraus auf das aktuelle Datum gesetzt werden, im Demo-Projekt gelingt das testweise durch einen Button:
Code: Alles auswählen
procedure TForm1.btnAktualisierenClick(Sender: TObject);
begin
DBEditBereitstellung.DataSource.DataSet.Edit;
DBEditBereitstellung.DataSource.DataSet.FieldByName('bereitgestellt').AsDateTime:=Now();
DBEditBereitstellung.DataSource.DataSet.UpdateRecord; // offenbar entbehrlich
DBEditBereitstellung.DataSource.DataSet.Post;
DBGrid1.DataSource.DataSet.Close;
DBGrid1.Refresh; // offenbar ebenfalls entbehrlich
DBGrid1.DataSource.DataSet.Open;
end;
Alternativ hatte ich das Ziel mit einer SQL-UPDATE-Anweisung zu erreichen versucht. Auch hier: Das DBEdit-Feld sieht aktualisiert aus, das Grid nicht, und nach dem Programmende sind die Daten nicht gespeichert worden.
Wie könnte man hier weiter systematisch vorgehen? Das Ausprobieren aller Lösungsvorschläge in den zahlreichen Postings zum sinngemäßen Thema "dbgrid aktualisiert sich nicht" hat mich nicht weitergebracht, ebensowenig das Herumspielen an diversen Properties wie AutoCommit oder CachedUpdates, die nach meinem Dafürhalten im beschriebenenen Problemkontext relevant sein könnten. Ganz augenscheinlich habe ich doch noch etwas Nichttriviales übersehen - oder sitze tatsächlich einem Bug auf? Laufzeitfehler treten jedenfalls keine auf, nur die geänderten Daten verschwinden still im Nirwana.
Die komplexe SQL-Abfrage in der ZQuery des Grids ist geschachtelt, aber das sollte für ein "Requery" (auch wenn es hier nicht so heißt) ja ohne Belang sein.
Versions-Kontext: Lazarus 1.0.14, 64-Bit-Version, auf Windows 8.1 mit Zeos 7.1