Hallo,
Um Felder in einer gridähnlichen-Sichttabelle beim Klick auf einen Spaltenkopf zu sortieren, verwenden wir die Eigenschaft "IndexFieldNames" von "TFDQuery".
Um das Grid als Fehlerquelle auszuschließen, haben wir das Grid vom Formular entfernt und das Setzen von "IndexFieldNames" mit üblichen Buttons ersetzt (Siehe Anhang).
Wenn man den Index nun oft genug per Buttonklick wechselt, etwa 4-5 mal, anschließend die FDQuery einmal aktualisiert (via "Refresh") und dann die FDQuery schließt,
tritt eine Zugriffsschutzverletzung mit Fehlercode "00000004" auf, um genau zu sein, bei der FireDAC-internen Prozedur "RemRef".
Call stack:
[00728C83] FireDAC.DatS.Dats.TFDDatSView.RemRef$qqrv
[0075893F] FireDAC.Comp.DataSet.Comp.Dataset.TFDDataSet.Inter nalClose$qqrv
[00794D98] FireDAC.Comp.Client.TFDAdaptedDataSet.InternalClos e$qqrv
[006C468E] Data.DB.Db.TDataSet.CloseCursor$qqrv
[006C4572] Data.DB.Db.TDataSet.SetActive$qqro
Hierbei werden anscheinend temporäre "Views" (nicht zu verwechseln mit Views in der Datenbank),
gelöscht, die beim Setzen von "IndexFieldnames" erstellt wurden.
Gemäß Hilfe: "(...) Durch die Anwendung von Filtern, Indizes und Bereichen erstellt FireDAC Sichten zusätzlich zu diesem Sichtobjekt. (...)".
Mit "RemRef" (RemoveReference) werden die Referenzen auf diese Views FireDAC-intern gelöscht, bzw mit "AddRef" hinzugefügt.
Eine oder mehrere dieser Referenzen auf diese Sichten ist nil, und endet deshalb in einer ZSV. Und das nil ist das Problem.
Wir haben die Felder die manuell indiziert werden, überprüft und nochmal neu erstellt. Das Problem tritt in mehreren Tabellen auf. (es wurden nicht alle getestet)
Bei manchen Tabellen reicht es 2 Felder hintereinander zu indizieren.
Um den Fehler zu reproduzieren muss man mehrmals verschiedene Felder mit "IndexFieldNames" indizieren (mind. 4 mal),
die Datenmenge aktualisieren und anschließend die Datenmenge schließen.
Die FDQuery beinhaltet folgendes
SQL-Statement "SELECT * FROM kunden" und alle Felder sind persistent vorhanden.
Hat jemand hiermit schonmal Erfahrung gesammelt? Ist es ein Bug? Wenn ja, wie können wir diesen Bug umgehen?
Das Problem tritt wie bereits erwähnt in mehreren Tabellen auf.
Mit freundlichen Grüßen.