PDA

Vollständige Version anzeigen : Refresh bei Kreuztabellenformular funktioniert nicht


siboern
01.11.2001, 09:43
Hallo Leute,
ich habe ( in ACCESS2000 unter W98)ein Formular, das an eine Abfrage gebunden ist, die aus zwei miteinander verknüpften Kreuztabellenabfragen besteht. (um Spalten aus zwei Feldern zu bekommen). Die interessierenden Felder in den Spalten sind Kontrollkästchen, die der Anwender nach Bedarf umschalten soll. Da das bei Kreuztabellen nicht geht, habe ich neben jedes Kontrollkästchen eine Befehlsschalftfläche gesetzt, mit der ich direkt in der zugrunde liegenden Tabelle das Ja/Nein-Feld umschalte.
Das Öffnen des Formulars funktioniert sehr gut, wie ich aus der Tabelle bzw. der dem Formular zugrundeliegenden Abfrage ersehen kann, wird auch das betreffende Feld richtig umgeschaltet.
Was nicht funktioniert ist das Aktualisieren des Formulars nach dem Ändern des Feldes. Normalerweise würde ein Me!Refresh genügen, oder auch ein Me!Requery, eingesetzt in die Prozedur zum Umschalten des Feldes nach erfolgtem Update der Tabelle. Aber genau das funktioniert nicht!. Man muss mehrmals auf die Befehlsschaltfläche klicken, und irgendwann einmal wird das veränderte Ergebnis angezeigt, aber die Zahl der Klicks bis dahin ist nicht eindeutig reproduzierbar.
Auch der Menübefehl "Datensätze/Anzeige aktualisieren" bringt nichts. Durch Zufall bin ich darauf gekommen, dass aber der Menübefehl "Datensätze/Filter/Sortierung entfernen" genau das gewünschte Ergebnis liefert, d.h. wenn ich mit der Prozedur nur das Feld in der Tabelle ändere und dann auf "Datensätze/Filter/Sortierung entfernen" klicke, wird sofort das richtige Ergebnis angezeigt. Nun sollte man meinen, man könne diesen Befehl auch mit der Codezeile Docmd.ShowAllRecords nachbilden. Ist aber nicht so!
Schließen und NeuÖffnen des Formulars geht natürlich, auch Wechsel in den Entwurfsmodus und Rückkehr in den Formularmodus bringt das richtige Ergebnis.
Übrigens: Wenn ich ein abgemagertes Formular mit nur einer Spalte an die zugehörige Kreuztabellenabfrage binde, funktionert das Refresh einwandfrei. Das Problem scheint also daran zu liegen, dass dem Formular die beiden miteinander verknüpften Kreuztabellenabfrage zugrunde liegen. Darin kann ich aber eigentlich keinen Fehler finden., zumal die Abfrage für sich ja einwandfrei läuft.
Hat jemand eine Idee, wie ich das Formular dazu bringen kann, nach Verändern des Tabellenfeldes den neuen Zustand richtig anzuzeigen?
Gruß Siegfried

WalterS
01.11.2001, 09:49
Hi!

Ich fürchte dass ACC hier zu langsam die Kreuztabellen aktualisiert und deshalb den refresh auf das Formular fertig ausführt bevor noch die Kreuztabellen neu erstellt sind.


Lösung ????

Sascha Trowitzsch
01.11.2001, 10:41
Setze mal vor den Me.Requery-Code die Zeile:

DBEngine.Idle dbRefreshCache

Ich kenne das Problem von langsamen Rechnern/Netzwerken. Oft zeigt Access die Formulare schon an, bevor es anscheinend gültige Daten in seinem Puffer hat. Manchmal kommt es dann beim Öffnen des Formulars zu einer Fehlermeldung 'Globaler Fehler'.
Die Zeile oben zwingt Access, seinen Cache mit den aktuellen Daten zu füllen, was normalerweise erst nach einem komplexeren Schedule passiert.
Alternativ kannst du checken, ob sich was ändert, wenn du in den Optionen die Datenaktualisierungsintervalle verkürzst.

Ciao, Sascha

siboern
01.11.2001, 15:17
Hallo Walter und Sascha,
vielen Dank für Euter Beiträge. Leider ohne Erfolg: der Befehl DBEngine.Idle dbRefreshCache bringt genau so wenig wie das Verkürzen des Intervalls für Anzeigeaktualisierung von 60 auf 1 sec.
Ich habe aber jetzt eine "Krampflösung": Wenn ich das Formular im Eigenschaftenfenster an die eine der beiden Kreuztabellenabfragen binde, und dann beim Laden per Code als Recordsource die ganze Abfrage mit beiden Kreuztabellenanfragen eintrage, dann funktioniert die Sache mit einem einfachen Me.requery. In dem Moment, wo ich im Eigenschaftenfenster des Formulars nichts als Datenquelle eintrage, funktioniert es wieder nicht mehr. Verstehen kann ich das aber nicht, daher ist mir diese "Lösung" auch etwas unheimlich. Aber vielleicht könnte man daraus den Schlüssel zum Problem bzw. zu einer richtigen Lösung finden. Was bleibt denn im Formular "hängen", wenn ich beim Laden einen anderen sqlstring als Recordssource eintrage als den, an den das Formular "gebunden" ist?
Gruß Siegfried