September 24, 2020, 04:55:43

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Endlosformular Repostionieren nach Requery

Begonnen von Felicé, August 03, 2020, 10:00:58

⏪ vorheriges - nächstes ⏩

Felicé

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é

DF6GL

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.

Felicé

Leider springt der zuletzt ausgewählte Datensatz dadurch immer an die erste Stelle im Endlosformular. Sehr unschön. Gibt's da nicht was besseres?


Felicé

Besser wäre, wenn der Datensatz nach dem requery an der selben Postion ist wie vorher.

DF6GL

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.

Felicé

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.

DF6GL

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.



Felicé

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.

Felicé

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

Felicé

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