Hallo liebe Community,
nach langem Suchen und nicht fündig werden, möchte ich euch um Hilfe bitten:
Ich habe eine Datenbank für Strom-, Gas- und Wasserzähler gebaut. Zur Navigation in der Datenbank benutze ich ein Endlosformular mit Such- und Filterfunktionen und Absprüngen in andere Formulare. Hierbai habe ich festgestellt, dass sobald ich die Daten per Me.Requery aktualisiere die Position im Endlosformular verloren geht.
Gibt es eine Möglichkeit, die Scrollposition zu merken und den letzten angewählten Datensatz nach einem Requery an selber Stelle im Endlosformular zu positionieren? Versuche auf Me.Refresh oder .Recalc umzusteigen liefern nicht die gewünschten Ergebnisse. Auch den letzten Datensatz als Variable zu merken und per Findfirst wieder aufzurufen führt zu unschönen Sprüngen in der Anssicht. Vorab vielen Dank für eure Ideen.
Grüße
Felicé
Hallo,
hier findest Du eine Lösung: http://www.donkarl.com/?FAQ4.5
Um Flackern zu vermeiden, kann
Echo True/False
und /oder
Me.Painting =True/False
helfen.
Leider springt der zuletzt ausgewählte Datensatz dadurch immer an die erste Stelle im Endlosformular. Sehr unschön. Gibt's da nicht was besseres?
Hallo,
was ist "was Besseres"?
Besser wäre, wenn der Datensatz nach dem requery an der selben Postion ist wie vorher.
Hallo,
ist trotzdem unklar. Meinst Du die logische Position im Form-Recordset oder eine sich nicht ändernde Darstellung der DS im Endlosform auf dem Monitor?
Durch die Änderungen können sich ja Verschiebungen in der Reihenfolge der DS (z. B. durch Sortierung) ergeben.
Eine sich nicht ändernde Darstellung auf dem Bildschirm kann allenfalls durch Refresh, evtl. durch Recalc erreicht werden.
Ich meine es so:
Formularkopf
5.DS
6.DS
7.DS
8.DS
9.DS
me.requery
Formularkopf
5.DS
6.DS
7.DS
8.DS
9.DS
Hoffe, das ist irgendwie verständlich. Zweite Ansicht auch wenn der Fokus auf Datensatz 7 lag. Im Grunde die Positionierung der Scrollbars wiederherstellen.
Hallo,
benötigst Du unbedingt Requery? Was ist mit Refresh, bzw. Recalc?
Es gibt Ansätze, die Scollbar-Position zu beeinflussen. Das liegt aber außerhalb Access-Standard und benötigt API-Funktionen .. Ich kann da aber keinen konkreten Vorschlag machen, außer dazu eine Suchmaschine zu bemühen.
Leider benötige ich Requery :'(
Hab auch entsprechenden Code gefunden, hackt aber an einer Stelle. Ich stell den gleich mal rein, vielleicht hilfts ja was. Vielen Dank schon einmal.
Public Sub SilentRequery(frm As Form, strPKField As String, strFocusField As String)
Dim lngCurrentSectionTopStart As Long
Dim lngDatensatz As Long
Dim lngCurrentSectionTop As Long
Dim lngSelTop As Long
Dim lngHeightDetailsection As Long
'Datensatz merken
lngDatensatz = frm(strPKField)
'Position bezogen auf die angezeigten Datensätze merken
lngSelTop = frm.SelTop
'Formularaktualisierung unterbinden
frm.Painting = False
'Fokus zurück auf den Datensatz
frm(strFocusField).SetFocus
'X-Position des markierten Datensatzes ermitteln
lngCurrentSectionTop = frm.CurrentSectionTop
'Requery durchführen
frm.Requery
'Höhe des Detailbereichs ermitteln
If frm.DefaultView = 1 Then
lngHeightDetailsection = frm.Section(0).Height
Else
lngHeightDetailsection = frm.CurrentSectionTop
End If
'X-Position für den obersten Datensatz ermitteln, der nach Requery standardmäßig angezeigt wird
lngCurrentSectionTopStart = frm.CurrentSectionTop
'Erstmal ganz nach unten, damit der vor dem Requery ganz oben angezeigte Datensatz mit der
'nächsten Anweisung wieder ganz oben landet.
frm.SelTop = frm.Recordset.RecordCount
'Alten ganz oben stehenden Datensatz wieder dorthin positionieren
frm.SelTop = lngSelTop - (lngCurrentSectionTop - lngCurrentSectionTopStart) _
/ lngHeightDetailsection
'Zuvor ausgewählten Datensatz wieder auswählen
frm.SelTop = lngSelTop
'Formularaktualisierung wieder einschalten
frm.Painting = True
End Sub
Liebe Community,
ich habe hier eine gut funtionierende Beispieldatenbank gefunden:
https://www.experts-exchange.com/articles/11515/Reposition-requery-with-positioning-to-the-recent-record.html
Löst genau das thematisierte Problem. Ist allerdings auch eine ganz schöne Menge an Code :)
Grüße