September 24, 2020, 02:55:10

Neuigkeiten:

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


Endlosformular nach Requery gleiche Position

Begonnen von Sam, Januar 29, 2016, 10:50:59

⏪ vorheriges - nächstes ⏩

Sam

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

MaggieMay

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.
Freundliche Grüße
MaggieMay

Sam

Super, ich glaube jetzt funktioniert es. Mal schauen wie es sich bewährt. Wie schön, dass die Tutorials und Hilfeseiten nie komplett sind ;)


Jens

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

PhilS

Mai 25, 2016, 07:55:05 #4 Letzte Bearbeitung: Mai 31, 2016, 23:22:37 von PhilS
Ich würde dazu mal FAQ 4.5 Gleicher Datensatz nach Requery 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.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

Felicé

Hi, hat jemand den o.g. Code zum Laufen bringen können?

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

ShenTo19

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

Felicé

danke für den tipp, allerdings springt das formular durch findfirst. genau dieser "sprungeffekt" soll ja gerade verhindert werden.

grüße

Beaker s.a.

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
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

ShenTo19

August 12, 2020, 12:35:28 #10 Letzte Bearbeitung: August 12, 2020, 12:40:05 von ShenTo19
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.

Felicé

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

Felicé

me.painting = false/true hat leider nicht das gewünschte ergebnis gebracht...

ShenTo19

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

Felicé

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.