Access UFO mit Bookmark scrollt DS nach unten

Guten Tag,

ich habe ein Formular welches mir Kopfdaten zu einem Kunden anzeigt und in einem UFO sämtliche Aufträge zu diesem Kunden in den verschiedenen Stati (Anfrage, Auftrag, Lieferschein, Rechnung,…).
Klicke ich in dem UFO auf einen Auftrag öffnet sich ein neues Formular zum Auftrag wo ich dann etwas machen kann (Lieferschein schreiben, Rechnung schreiben, etc).
Schließe ich das Auftragsformular wieder, so muss ich auf dem UFO ein Requery machen um die Statusänderung mitzubekommen.
Um nachher wieder auf dem gleichen Auftrag zu stehen, setze ich ein Bookmark.
Bis hier funktioniert auch alles einwandfrei.

Seit ich als Backend MySQL habe, merkt er sich zwar das Bookmark, aber er scrollt im Rahmen des Fensters nach unten. D.h., klicke ich auf einen Auftrag, der vor dem Klick an Position 2 (d.h. 1 Auftrag davor, 15 dahinter) im Fenster dargestellt wird, so ist zwar nachher der richtige Auftrag selektiert, allerdings steht er jetzt an vorletzter Stelle im Formular (15 DS davor, dann mein ausgewählter, 1 DS dahinter)…

Dies ist sehr lästig wenn man zwischen ein paar Aufträgen hin und her springen muss…

Als das Backend Access war, war das Verhalten nicht zu beobachten…

Access-Version ist 2003.

Jemand 'ne Idee?

Vielen Dank und viele Grüße,
Volker

Hi,
hat denn der dem UFO basierende Recordset keine festgelegte Sortierung?

Gruss
Joey

Hallo Joey,

doch, klar, die AuftragsNr wird zu Sortierung benutzt. Der Index ist zusätzlich mit im Recordset, wird aber nicht angezeigt…
Ich stehe ja prinzipiell auch auf dem richtigen Datensatz. Das Lesezeichen ist also korrekt. Nur der angezeigte Ausschnitt rund um mein Lesezeichen wird verändert…

Noch 'ne Idee?

Vielen Dank,
Volker

Guten Tag,

Hi,
also ist die Sortierung der Records im UFO richtig.
Nur die Position deines Records in Bezug auf den UFO Bereich ist anders. Ich gehe davon aus, dass im UFO-Bereich nicht alle Aufträge auf einmal sichtbar sind?

Wie greifst du auf MySql zu - ODBC?

Gruss
Joey

>>Ich gehe davon aus, dass im UFO-Bereich nicht alle Aufträge auf >>einmal sichtbar sind?
Korrekt. Das UFO nimmt nur einen kleinen Teil ein und zeigt so ca. 5,5 Datensätze gleichzeitig (Endlosformular) an. Zum Kunden sind aber durchaus auch 20-25 Aufträge „aktiv“…

>>Wie greifst du auf MySql zu - ODBC?
Yep. MySQL-ODBC-Treiber 5.1

Hi,

Public Sub RequeryForm(f As Form)
Dim OrigSelTop As Long
Dim OrigCurrentSectionTop As Long
Dim RowsFromTop As Long

OrigSelTop = f.SelTop
OrigCurrentSectionTop = f.CurrentSectionTop

f.Painting = False

f.Requery

If f.Section(acHeader).Visible = True Then
 RowsFromTop = (OrigCurrentSectionTop - f.Section(acHeader).Height) / f.Section(acDetail).Height
Else
 RowsFromTop = OrigCurrentSectionTop / f.Section(acDetail).Height
End If

f.SelTop = f.RecordsetClone.RecordCount
f.SelTop = OrigSelTop - RowsFromTop
DoEvents
f.Painting = True
f.Recordset.Move RowsFromTop
End Sub

Gruss
Joey

Hallo Joey,

Danke für Deinen Beitrag. An eine solche Lösung hatte ich auch schon gedacht, sie allerdings bisher „als zu aufwändig“ verworfen. Ich war der Ansicht, dass es eigentlich auch mit „normalen“ Mitteln möglich sein sollte. Schließlich hat es ja mit Access als Backend einwandfrei funktioniert…
Warum es zu diesem Unterschied (Access - MySQL) kommt weißt Du aber auch nicht, oder? Oder funktioniert es evtl. grundsätzlich nicht bei eingebundenen Tabellen? Müsste ich eigentlich mal ausprobieren…

Du müsstest in Deiner Lösung zu RowsFromTop noch +1 addieren, da bei der Division die Nachkommastellen wegfallen. Ansonsten rutschen die Zeilen immer eins nach oben…

Vielen Dank für Deine Hilfe,
Volker

Hallo Joey,

habe mich vertan. +1 ist auch nicht richtig…
Was mich etwas stutzig macht…CurrentSectionTop sind vielfache von 270… (Klar, die Zeilenhöhe des Detailbereiches). Dividiert wird durch den Wert von Form.Section(acDetail).Height - dieser ist aber 410???
Außerdem habe ich festgestellt, dass bei CurrentSectionTop keine Überschrift berücksichtigt wird, obwohl Form.Section(acHeader).Visible WAHR ist…??? D.h. CurrentSectionTop ist für die erste Zeile auch 270…

Nachdem ich jetzt die Berechnung in

RowsFromTop = OrigCurrentSectionTop / 270 - 1 

geändert habe, funktioniert es für alle DS richtig. Ist jetzt zwar nicht mehr universell was die Zeilenhöhe betrifft, aber die ändert in meinem Fall keiner.
Lediglich wenn ich mich quasi am Ende des Recordsets befinde, d.h. ich sehe die letzten 2 Datensätze, dann füllt er nachher das Formular soweit auf, dass der letzte DS des RS unten zu sehen ist. Laut meiner berechneten Werte sollte das nicht sein…???

Vielen Dank für Deinen Beitrag,
Volker

Hi,
ich hatte auch mal ein MySql/Access Projekt mit dem gleichen Problem.
Ich habe vier verschiendene Lösungsansätze gehabt und am Ende habe ich mir die Funktion in Kleinarbeit und Internet zusammengestoppelt und funktionierte für mein Endlosformular (kein UFO).

Die Recordsets die vom ODBC Treiber erstellt werden unterstützen nicht alle Eigenschaften die Access kann.

Ich habe mit ADO gearbeitet und mußte teilweise sehr komische Dinge machen - zumal auch in MySql einige Dinge recht seltsam implementiert sind.

Gruss
Joey

PS: wenn du die Funktion so hinbekommst, dass die überall einsetzbar ist, dann schick sie mit doch noch mal zu :smile:

Hallo Joey,

ich habe einiges entfernt und es läuft trotzdem. Interessanterweise unabhängig von der eingestellten Zeilenhöhe…???

Public Sub RequeryForm(f As Form)
 Dim OrigSelTop As Long
 Dim OrigCurrentSectionTop As Long
 Dim RowsFromTop As Long

 OrigSelTop = f.SelTop
 OrigCurrentSectionTop = f.CurrentSectionTop

 f.Painting = False
 f.Requery

' If f.Section(acHeader).Visible = True Then
' RowsFromTop = (OrigCurrentSectionTop - f.Section(acHeader).Height) / f.Section(acDetail).Height
 RowsFromTop = OrigCurrentSectionTop / 270 - 1 ' 270 ist die Zeilenhöhe im Detailbereich. Warum anders als f.section(acdetail).height???
' Else
' RowsFromTop = OrigCurrentSectionTop / f.Section(acDetail).Height
' End If

' Debug.Print OrigSelTop, " ", OrigCurrentSectionTop, " ", f.Section(acHeader).Height, " ", f.Section(acDetail).Height, " ", OrigSelTop - RowsFromTop

 f.SelTop = f.RecordsetClone.RecordCount
 f.SelTop = OrigSelTop - RowsFromTop
 DoEvents
 f.Painting = True
 f.Recordset.Move RowsFromTop
End Sub