Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Reposition - Requery mit Positionierung auf alten Datensatz
zurück: Blutdruck messen weiter: Fehlerbehandlung in VBA / Access Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
04. Mai 2013, 19:54
Rufname:

Reposition - Requery mit Positionierung auf alten Datensatz - Reposition - Requery mit Positionierung auf alten Datensatz

Nach oben
       Version: (keine Angabe möglich)

Hallo zusammen,

eine der sicher häufigst genutzten Methoden in einem Formular ist die Methode "Requery". Wie allgemein bekannt, positioniert Access dabei immer auf den ersten Datensatz zurück. Eine Alternative ist bis zu einer gewissen Grenze die Methode "Refresh", die auf dem Datensatz bleibt, auf dem man war, da sie nur die vorhandenen Datensätze aktualisiert, aber dafür keine anderweitig gelöschten oder neu eingefügten Datensätze anzeigt.
"Refresh" versagt außerdem bei ADPs, wenn man ein Recordset manuell zuweist - dann funktioniert "Refresh" genau wie "Requery".

Allgemein bekannt ist ebenso, daß man natürlich den Datensatz, bei dem man war, mit einem "Find"/"FindFirst" (ADO bzw. DAO) wiederfinden kann und damit wieder zu dem gewünschten Datensatz zurückspringen kann.

Problem hierbei ist, daß der Datensatz dann aber immer der erste im Formular ist. Wenn man also zuvor den Datensatz in der Mitte des Bildschirms stehen hatte und dann nach einem "Requery" auf diese Weise zurückpositioniert, steht der Datensatz nun am Formularanfang, was ziemlich nervig ist.

Bei der Suche nach einer Lösung zu dem Problem stößt man schnell auf Versuche, die Scrollposition mit Hilfe von Windows APIs zu ermitteln und so zu erreichen, daß man irgendwie wieder auf die gleiche Scrollposition zurückkommt. Das ist sehr umständlich, weil man erst die Scrollbar ermitteln muß (die auch noch je Access-Version unterschiedlich ermittelt werden muß) und dann eine Windows Message an die Scrollbar senden muß, damit diese die gewünschte Position erreicht. Hat sich die Anzahl Datensätze nach dem Requery geändert, ist auch nicht mehr sicher, ob die Position so noch die gleiche ist.
Dann bin ich zufällig über diese Seite gestolpert, die eine einfache und geniale Lösung bietet:
Access: Form Return to scroll position after update

Die Idee: Ein Formular hat eine (weitgehend unbekannte) Eigenschaft namens "CurrentSectionTop" (und auch das Pendant "CurrentSectionLeft"). Das ist der Abstand des aktuellen Datensatzes zum oberen Rand der gleichen Sektion, in der die Datensätze gelistet werden. Für ein Einzelformular sinnlos, aber für ein Endlosformular kann man damit ermitteln, an welcher Bildschirmposition der aktuelle Datensatz steht - und damit kann man mit ein wenig Rechnerei die Position in den meisten Fällen exakt wiederherstellen.

Die dort angebotene Lösung war mir ein wenig zu speziell, auch die Lösung, mit DoCmd die Datensätze zu positionieren, war mir zu unpraktisch, da bekanntermaßen die DoCmd-Befehle nur mit dem gerade aktiven Formular funktionieren, man also erst mühsam den Fokus auf ein Control des Formulars setzen muß - was spätestens Probleme macht, wenn man ein verschachteltes UFO verwendet.

Außerdem berücksichtigt die Lösung nicht, was passiert, wenn der Datensatz gelöscht wird, auf dem man gerade steht, wenn man auf dem neuen Datensatz steht, wenn man gerade einen Datensatz bearbeitet usw.

Daher habe ich die Lösung umgeschrieben auf ein Klassenmodul, das alle Sonderfälle berücksichtigt und zuverlässig auf den Datensatz positioniert, auf dem man gerade war - und zwar an der richtigen Bildschirmposition.

Die Klasse hat oben zwei Konstanten, mit dem man die Kompilierung der Klasse je nach Wunsch umstellen kann. Zum einen kann man von DAO nach ADO wechseln (da DAO "FindFirst" und "NoMatch" verwendet, ADO aber "Find" und "EOF"), allerdings gilt die Einstellung dann für die gesamte Anwendung, man kann also dann nicht wahlweise mal mit DAO- und mal mit ADO-Formularen arbeiten. Wenn man das möchte, muß man die Klasse um eine passende Funktion erweitern, so daß man einmal "Reposition" mit DAO und eine andere mit ADO verwenden kann. Im Allgemeinen wird man aber eher weniger beide Techniken gemischt einsetzen.
Zum anderen gibt es die Möglichkeit "UseRequeryInterface" auf "True" zu setzen (ohne Anführungszeichen). Damit muß das Formular das Klassenmodul "ICCReposition" implementieren mit "Implements ICCReposition" am Anfang des Formulars. Danach wählt man im linken Dropdownfeld des VBA-Editors das Interface "ICCReposition" aus und rechts "SetRecordSource", womit die passende Sub in das Formular eingefügt wird.

In die neue Sub schreibt man nun den Code, der in irgendeiner Form die Datensätze des Formulars aktualisiert. Ohne das Interface führt die Klasse "clsCCReposition" lediglich ein Standard-"Requery" aus, mit dem Interface wird stattdessen nun diese Sub ausgeführt, so daß man einen beliebigen Code verwenden kann, um die Form zu aktualisieren. Das ist besonders bei ADPs oder generell bei direkter Zuweisung eines zuvor erstellten Recordsets zum Form-Recordset sinnvoll, bei dem ein "Requery" u.U. nicht funktioniert. Grund ist, weil Access mit Zuweisung eines Recordsets an das Form-Recordset versucht, einen RecordSource-SQL-Befehl in das Formular-Recordset zu übernehmen, dieser Befehl wird im Hintergrund ausgeführt, wenn "Requery" verwendet wird. Wenn man aber etwa eine komplexe Stored Procedure ausführt, die Parameter benötigt, kann es in ADPs dazu kommen, das die RecordSource, die Access selbst erstellt hat, schlicht falsch ist und eine Fehlermeldung produziert (übrigens auch bei F5, was man dann ebenso abschalten muß). Hier kann man also besser einfach die SP in dieser Interface-Sub neu aufrufen und erhält damit das gleiche Ergebnis: Eine Neuabfrage der Datensätze.

Die Klasse versucht danach, den richtigen Datensatz wiederzufinden unter Berücksichtigung der Datensatznummer des ersten Datensatzes auf dem Formular. Erst wird auf diesen positioniert und dann versucht, den alten Datensatz in einem der folgenden Datensätze zu finden. Im Standardfall führt das dazu, wieder genau die gleiche Position zu erreichen. Wurde in der Zwischenzeit z.B. die Sortierung geändert und befindet sich der Datensatz vor dem ersten auf dem Formular, wird nochmal von Anfang an nach dem Datensatz gesucht - in dem Fall ist der Datensatz wieder der erste im Formular, wie gehabt. Wurde der alte Datensatz durch einen anderen User gelöscht, wird auf den folgenden Datensatz positioniert, falls möglich, ansonsten auf einen neuen Datensatz (sofern das Formular das erlaubt).
Wurde ein neuer Datensatz vor dem alten Datensatz eingefügt, wird die neue Position sich um eine Zeile nach unten verschieben.
Scrollt man mit dem Mausrad oder der Scrollbar, so daß der aktuelle Datensatz außerhalb des Formulars steht, und verwendet dann den "Requery"-Button, wird der Datensatz trotzdem wieder an die gleiche Position auf dem Bildschirm gestellt wie vorher - so oder so ist der aktuelle Datensatz auf jeden Fall sichtbar.
Wird der aktuelle Datensatz gerade bearbeitet, kann Requery nicht verwendet werden. Steht man gerade auf einem neuen Datensatz, steht man nachher auch wieder auf dem neuen Datensatz (unter Berücksichtigung der Bildschirmposition des neuen Datensatzes).

Vorteil dieser Methode ist auch, daß man nun auch eine "Zeilennummer" als Feld in der Tabelle verwenden könnte, nach der im Formular sortiert wird. Dann kann man eine INSERT-Sub schreiben, die einen neuen Datensatz an der aktuellen Position einfügt und die nachfolgenden Zeilennummern um eins erhöht sowie die Reposition-Methode anwendet - schon hat man optisch den Effekt einer Tabellenkalkulation, was für manche spezielle Aufgaben schon mal sinnvoll sein kann.

Die gleiche Methode der Positionierung könnte man theoretisch auch mit "CurrentSectionLeft" für die waagerechte Position erreichen, wenn man sogar auf das gleiche Feld positionieren wollen würde. Das habe ich allerdings nicht ausprobiert.

Die angehängte Datei ist im Format A2003, wurde geschrieben und getestet unter A2007.

Viel Spaß mit dem neuen "Requery"

Christian



CCReposition.zip
 Beschreibung:
CCReposition Demodatenbank mit den Top 999 Nachnamen der USA und der Reposition Klasse mit Demos für DAO,ADO und ADO mit Interface im Format A2003

Download
 Dateiname:  CCReposition.zip
 Dateigröße:  57.12 KB
 Heruntergeladen:  103 mal

derArb
getting better


Verfasst am:
04. Mai 2013, 20:18
Rufname: derArb
Wohnort: Berlin


AW: Reposition - Requery mit Positionierung auf alten Datens - AW: Reposition - Requery mit Positionierung auf alten Datens

Nach oben
       Version: (keine Angabe möglich)

cool und danke, Bitsqueezer.
_________________
MfG
derArb

Scio me nihil scire...Εν οίδα οτι ουδέν οίδα... Ich weiss, dass ich nichts weiss (Sokrates)
Ich bevorzuge Beiträge mit korrekter deutscher Grammatik.
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Datensatz ändern / aktualisieren 1 zwerg 819 05. Jan 2006, 10:35
stpimi Datensatz ändern / aktualisieren
Keine neuen Beiträge Access Tabellen & Abfragen: Neuer Datensatz trotz aktivem Filter 2 pukamon 595 17. Nov 2005, 10:48
pukamon Neuer Datensatz trotz aktivem Filter
Keine neuen Beiträge Access Tabellen & Abfragen: Neuer Datensatz in Access 6 Heinz-Erich 1220 02. Okt 2005, 20:09
Gast Neuer Datensatz in Access
Keine neuen Beiträge Access Tabellen & Abfragen: unlöschbaren Datensatz erstellen 1 Vincent_Vega 899 15. Aug 2005, 21:45
stpimi unlöschbaren Datensatz erstellen
Keine neuen Beiträge Access Tabellen & Abfragen: Datensatz über Formular suchen 3 Sandnet 2166 10. Jun 2005, 10:52
Dalmatinchen Datensatz über Formular suchen
Keine neuen Beiträge Access Tabellen & Abfragen: Reduzierung mehrerer Datensätze auf einen Datensatz 2 Pulldown 819 03. Jun 2005, 09:32
Pulldown Reduzierung mehrerer Datensätze auf einen Datensatz
Keine neuen Beiträge Access Tabellen & Abfragen: Datensatz automatisch kopieren??? 0 Edelschnitt 701 11. Mai 2005, 19:41
Edelschnitt Datensatz automatisch kopieren???
Keine neuen Beiträge Access Tabellen & Abfragen: Hintergrundfarbe in Datensatz 1 Rheinbote 900 24. Feb 2005, 20:18
stpimi Hintergrundfarbe in Datensatz
Keine neuen Beiträge Access Tabellen & Abfragen: Aus 1 Datensatz mit 10 Infos mache 10 Datensätze à 1 Info 2 Steve 914 14. Jan 2005, 00:43
Steve Aus 1 Datensatz mit 10 Infos mache 10 Datensätze à 1 Info
Keine neuen Beiträge Access Tabellen & Abfragen: Abfrage soll nur jeweils ersten Datensatz liefern (Group By? 2 MichaelN 2552 28. Dez 2004, 15:06
MichaelN Abfrage soll nur jeweils ersten Datensatz liefern (Group By?
Keine neuen Beiträge Access Tabellen & Abfragen: Bei der Aktualisierung eines Tabellenwertes neuen Datensatz 6 zheng 810 07. Dez 2004, 22:35
zheng Bei der Aktualisierung eines Tabellenwertes neuen Datensatz
Keine neuen Beiträge Access Tabellen & Abfragen: Aktionsabfrage in Formular -immer nur einen Datensatz ändern 6 blauvogel 1092 08. Okt 2004, 11:43
Skogafoss Aktionsabfrage in Formular -immer nur einen Datensatz ändern
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Web Editor Forum