Hallo zusammen
Ich habe einen Code übernommen, der in einem Unterformular (Endlos) nach Aktualisierung die Position beibehalten soll. Gleicher Datensatz markiert, und der Datensatz sollte an gleicher Position im Fenster sein.
Teilweise funktioniert es, aber nicht immer. Wenn ich die Anweisungen Schritt für Schritt durchgehe, dann funktioniert es immer. Wo könnte da der Fehler liegen?
Der Code:
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
Hallo,
ein zuverlässiges Ergebnis zur RecordCount-Eigenschaft gibt es in der Regel erst nach einem MoveLast.
Vielleicht hat das etwas damit zu tun...
Außerdem fehlt der Sprung auf den aktuellen Datensatz und der Fokus sollte wohl auch erst nach dem Requery gesetzt werden.
Super, ich glaube jetzt funktioniert es. Mal schauen wie es sich bewährt. Wie schön, dass die Tutorials und Hilfeseiten nie komplett sind ;)
Hallo Sam
könntest du deinen geänderten Code mal ins Forum stellen.
Ich versuche auch gerade die DS Position beizubehalten.
Wo und wie sollte MoveLast eingebaut werden
Jens
Ich würde dazu mal FAQ 4.5 Gleicher Datensatz nach Requery (http://www.donkarl.com?FAQ4.5) anschauen.
Der Code von Sam hat einen etwas anderen Ansatz. Er positioniert primär die Srollposition so wie vorher. Nach Eingabe eines neuen Datensatzes kann dieser aber evtl. auch an anderer Stelle sein. - Abhängig von der Sortierung.
Hi, hat jemand den o.g. Code zum Laufen bringen können?
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
Hallo,
in einem gefilterten Formular benutze ich diesen Code, um nach Anzeigen aller Datensätze auf dem angezeigten Datensatz zu bleiben:
Dim lngStore As Long
If Not IsNull(Me!ID) Then
lngStore = Me!ID
End If
Me.Painting = False
DoCmd.RunCommand acCmdRemoveFilterSort
Me.Recordset.FindFirst "[ID] = " & lngStore
usw.
Hier müsste man doch, statt den Filter abzuschalten, ein Requery einbauen können.
Ist allerdings ein Einzelformular.
Gruß Thomas
danke für den tipp, allerdings springt das formular durch findfirst. genau dieser "sprungeffekt" soll ja gerade verhindert werden.
grüße
Hallo,
Warum diskutiert ihr das hier in zwei parallelen Threads? Zumal das
von Felicé verlinkte Klassenmodul doch alle Wünsche erfüllen sollte
(hab's nicht runtergeladen und getestet, weiss aber von Christians
Professionalität).
gruss ekkehard
Hallo,
@ Ekkehard: für den Parallel-Thread kann ich nichts.
@ PhilS: Sorry, habe erst jetzt gesehen, dass mein Vorschlag genau dem Donkarl-Beispiel entsprang.
@ Felicé: Ich habe den Donkarl'schen Ansatz mal in einem Endlosformular getestet, funktioniert tadellos, auch mit gleichzeitiger Filterabschaltung. Scheint mir etwas ökonomischer zu sein als das Klassenmodul aus Deinem Link.
Gruß, Thomas
PS: Das Springen im Formular kann mit Me.Painting = False/True vermieden werden, steht auch in Donkarl.
mit springen ist gemeint, dass der datensatz den du anwählst und dann in die variable lngstore schreibst nach dem requery durch die findfirst-methode an die erste stelle im formular springt.
bsp. --> auswahl ds3 --> requery --> neue ansicht
ds1 ds3
ds2 ds4
ds3 ds5
ds4 ds6
ds5 ds7
me.painting = false/true hat leider nicht das gewünschte ergebnis gebracht...
Hallo,
das in #11 geschilderte Verhalten ist doch völlig vernünftig! Der Datensatz, von dem Du ausgehst, wird nach dem Requery im Formular an erster Stelle angezeigt, die Datensätze ds1 und ds2 sind nach oben gescrollt. Was wäre, wenn Du so viele Datensätze hast, dass sie nicht alle angezeigt werden? Dann wäre, wenn es nach Deinen Vorstellungen läuft, der Datensatz, in dem der Cursor steht, ausserhalb des angezeigten Bereiches. Was hätte man davon? Mein Testbeispiel hatte im Endlosformular 100.000 Datensätze! Wie soll ich da den aktiven Datensatz finden? Oder habe ich etwas falsch verstanden?
Gruß Thomas
ich glaube da verstehen wir uns falsch :)
es soll die selbe ansicht nach dem requery wie davor sein. schau dir einfach die beispieldatenbank an. da klappt das ganz genauso. ziel erreicht. problem gelöst, würde ich sagen.