![]() |
Datenbank: Access • Version: 2003 • Zugriff über: FireDac
FDQuery CachedUpdates Datensatz speichern?
Hallo, ich habe eine Access Datenbank mit 120 Spalten. Die Datensätze werden in einem dbGrid angezeigt. Soweit so gut.
1.) Ändere ich jetzt eine Spalte und will den Datensatz verlassen, kommt die Fehlermeldung '[FireDac][Phys][ODBC][Microsoft][ODBC-Treiber für Microsoft Access]Abfrage ist zu komplex. Der Datensatz bleibt im Edit-Modus und kann nicht gespeichert werden. Reduzier ich die Spalten um ca. 20 spalten so dass ich nur noch 100 habe, läufts. Gibts da eine Beschränkung??? 2.) Stelle ich die Eigenschaft des FDQuery.CachedUpdates auf true, dann kommt keine Fehlermeldung und der Datensatz wird geändert und im dbGrid dementsprechend angezeigt. Soweit so gut. 3.) Bei einem Neustart des Programms werden jedoch wieder die alten Werte angezeigt, die zuvor geänderten Datensätze wurde offenbar nur temporär geändert und nicht in der Datenbank gespeichert. Speichern habe ich mit FDQuery.Post, FDQuery.CommitUpdates, oder mit FDQuery.UpdateRecord probiert. Es werden die Änderungen aber nicht in der Datenbak gespeichert. Frage: Kann mir jemand helfen das Problem zu lösen? Hat jemand eine Idee woran das liegen könnte? LG Harry |
AW: FDQuery CachedUpdates Datensatz speichern?
iErrors := FDQuery1.ApplyUpdates;
|
AW: FDQuery CachedUpdates Datensatz speichern?
Hallo Olli73,
vielen Dank. Leider wird nur temporär gespeichert. Hier mein code: procedure TForm1.Button1Click(Sender: TObject); var iErrors: integer; begin if DataSource1.State = dsEdit then begin FDConnection1.StartTransaction; iErrors := FDQuery1.ApplyUpdates; if iErrors = 0 then begin FDQuery1.CommitUpdates; FDConnection1.Commit; end; end; end; Beim nächsten Programmstart werden wieder die vorherigen und nicht die aktualisierten Werte gezeigt. Bei einer anderen Tabelle mit ca. 85 Spalten läufts ohne Probleme. Vielleicht gibt es doch eine Einschränkung mit access oder dem Treiber, Firedac etc. Vielleicht hat jemand noch eine Idee? LG Harry |
AW: FDQuery CachedUpdates Datensatz speichern?
Einfach mal die Suchmaschine Deiner Wahl mit
![]() Der Fehler kommt in vielfältiger Form vor. Eine dieser Formen entspricht Deiner Beobachtung: Zuviel Spalten. Lösungen dazu: Keine sinnvollen, sondern immer nur: Nimm doch weniger Spalten. Also eigentlich keine Lösung in Sicht, auch wenn sich der Fragezeitraum für dieses Problem schon über gefühlt zwei Jahrzehnte erstreckt. |
AW: FDQuery CachedUpdates Datensatz speichern?
Kannst du mal die Einstellungen für die Query und Felder zeigen? Am besten wäre ein abgespecktes Beispiel.
|
AW: FDQuery CachedUpdates Datensatz speichern?
Liste der Anhänge anzeigen (Anzahl: 1)
So wie es jetzt aussieht, muss ich wohl einige Felder löschen. Da das aber eine aktive Datenbank ist, muss ich sehen, ob wirklich alle Felder vom Hauptprogramm (nicht von mir) genutzt werden, so dass ich die überflüssigen Felder löschen kann.
Anbei mal die Test.mdb mit der Tabelle sPersKto wo ein paar Beispieldaten hinterlegt sind, zum Testen. LG Harry |
AW: FDQuery CachedUpdates Datensatz speichern?
Interessant wären hier wirklich die Einstellungen der FDQuery.
|
AW: FDQuery CachedUpdates Datensatz speichern?
Achte darauf, dass in der FDQuery unter UpdateOptions.UpdateMode das upWhereKeyOnly eingetragen ist, und das für das Feld Nummer unter ProviderFlags das pfInKey angehakt ist. Das geht entweder über ein statisches Feld oder dynamisch im AfterOpen.
Es reicht übrigens, wenn Nummer das einzige statische Feld ist. Dazu muss in der Query unter FieldOptions der Wert für AutoCreateMode auf acCombineAlways stehen. Dann werden alle übrigen Felder dynamisch angelegt. |
AW: FDQuery CachedUpdates Datensatz speichern?
An den Eigenschaften der FDQuery wurde nichts geändert (also nur die Komponente platziert) und als SQL select * from sPersKto hinterlegt. Das ist alles.
|
AW: FDQuery CachedUpdates Datensatz speichern?
upWhereKeyOnly ist eingetragen, AutoCreateMode steht auf acCombineAlways, aber ProviderFlags finde ich nicht.
Geht aber mit den ersten zwei Einstellungen auch nicht. |
AW: FDQuery CachedUpdates Datensatz speichern?
ProviderFlags gibt es nicht in der Query sondern beim Feld. Du musst erst im Feld-Editor der Query (Kontext-Menü) über Felder hinzufügen das Nummer-Feld statisch anlegen. Dort kannst du die Provider-Flags setzen.
|
AW: FDQuery CachedUpdates Datensatz speichern?
Uwe you made my day!
Ich danke Dir!!!! AutoCreateMode auf acCombineAlways stellen und im Query FeldEditor ein Feld anlegen und dem Feld ProviderFlags/pfInKey auf true setzen. Jetzt läuft das ganze problemlos. Nochmals DANKE für die schnelle Hilfe. LG Harry |
AW: FDQuery CachedUpdates Datensatz speichern?
Um das mal ein wenig zu erklären: FireDAC versucht bei einem Update möglichst eindeutige Key-Felder zu nehmen (upWhereKeyOnly). Ein Key-Feld zeichnet sich dadurch aus, dass es das ProviderFlag pfInKey hat. Die WHERE-Clause beim Update enthält also nur die Key-Felder.
Gibt es kein solches Feld, kommt als Fallback das upWhereAll zum Einsatz. Dabei listet die WHERE-Clause alle Felder auf und da streikt Access ab einer gewissen Anzahl. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz