FindFirst sucht immer nur den ersten Datensatz

Hallo Leute,

ich habe ein Problem mit der Findfirst Methode. Bei den ersten 600 Datensätzen funktioniert es, dass mir der unten stehende Code in einem neuen Bearbeitungsformular den Datensatz mit dem identischen Schlüsselfeld heraussucht, aber bei den letzten 30 Datensätzen (erst waren es nur die letzten 2) öffnet Access dann nur den Datensatz mit dem Schlüsselfeld = 1. Es folgt auch keine Fehlermeldung.

Der Code wird aus einem separaten Formular (einem rechten Steuerungsframe) ausgeführt und bezieht sich auf die momentan geöffnete „Maske“. DIese Maske ist ein HF mit 2 UFOs (1 als Endlos und 1 als Detailformular) in dem die Schlüsselfelder alle vorhanden sind. Das Detailfenster („SubFrame“) wird immer wieder mit dem Recordset vom Endlosformular („UFO1“) abgeglichen.

Private Sub PersonalBearbeiten_Click()
Dim a As Integer
a = Forms!fml_PersonalMaske!UFO1.Form.BN

'BN ist der Primärkey

DoCmd.Close
DoCmd.Close acForm, „fml_P_MA_MainFrame“

'Personalmaske und Bearbeitungsframe werden geschlossen

DoCmd.OpenForm „fml_Personal_Bearbeitung“, acNormal, „“, „“, , acNormal
Forms!fml_P_Bearbeitung.Recordset.FindFirst „BN=“ & a

End Sub

Hallo,

es ist grundsätzlich „ungut“, Objektgrenzen (–> Formularobjekt) durch solchen Code zu durchbrechen.

Vermutlich ist der Form-Recordset des Forms noch gar nicht vollständig geladen, wenn die Findfirst-Methode angewendet wird und somit gar nichts gefunden werden kann, wenn sich die BN.Nummer noch im ungeladenen Teil befindet.

Außerdem stimmen die Formularnamen nicht überein (was, denke ich,hier sein sollte):
Dim a As LONG
a = Forms!fml_PersonalMaske!UFO1.Form ! BN
DoCmd.Close acform, Me.Name

DoCmd.OpenForm „fml_Personal_Bearbeitung“
Doevents’ bzw. eine Wartezeit her einbauen.
Forms!fml_ Personal _Bearbeitung.Recordset.FindFirst „BN=“ & a

Hallo Franz,

ich habe die Formularnamen der Lesbarkeit im Forum dienlich gemacht und darum kam es zu diesem Namen-Missverständnis. Das Aufrufen der Formulare etc. klappt ja einwandfrei und der Bearbeitungsframe wird zeitgleich mit der zugehörigen Maske geladen. Nur leider funktioniert die Findfirst nicht richtig. :confused:

MfG Philipp K.

Hallo Franz,

ich habe die Formularnamen der Lesbarkeit im Forum dienlich
gemacht und darum kam es zu diesem Namen-Missverständnis.

na, sowas ist aber ganz und gar nicht dienlich… eher falsch/verwirrend.

Das Aufrufen der Formulare etc. klappt ja einwandfrei und der
Bearbeitungsframe wird zeitgleich mit der zugehörigen Maske
geladen.

Es mag ja sein, dass die Anzeige dann schon aufgebaut ist, davon hab ich aber nicht geredet, sondern von Laden der Daten in den Form-Recordset

Nur leider funktioniert die Findfirst nicht richtig.

Ja, weiß ich… Den/die Grund/Gründe hab ich auch gesagt.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hi Franz,

wie kann ich dann Access explizit nochmal auffordern das Recordset vollständig zu laden und wie sieht das dann mit der Performance aus?

Was kann es für Gründe haben, dass Access das Recordset nicht vollständig lädt und wie kann man das sonst vermeiden?

MfG
Philipp K.

Hallo Franz,

ich hatte dich falsch verstanden und weiß nun was du meintest. Ich soll der Datenbank Zeit geben das Recordset fertig zu laden bevor ich sofort nach einen Datensatz suchen lasse, der noch nicht geladen ist und ich dadurch das Laden abbreche, richtig?

Also wäre es wohl besser erst das Bearbeitungsformular zu laden und dann Befehl 2 Sekunden (vielleicht schon zu viel?) warten und dann den Datensatz heraussuchen. Am besten wäre dann noch, wenn dann in dem Bearbeitungsfenster der 1. Datensatz nicht angezeigt wird, sondern ein leerer, da man sonst auf die Idee kommt, dass es nicht fertig geladen wurde und dann wieder das Bearbeitungsfenster schließt…

Oder ein Fortschrittsbalken einfügen - da weiß ich aber noch nicht genau wie.

MfG
Philipp K.

Hallo,

also ich habe das warten mit DoEvents getestet, aber der wartet keine 2 oder 3 Sekunden sondern geht direkt im Code weiter.

Public Function Wait (MilliSekunden As Double)
Dim I As Double, Ende As Double
Ende = Timer + (MilliSekunden / 1000)
Do While I

Hallo,

versuch das Ganze vernünftig zu machen und nicvh an Symptomen herumzudoktern…

Ruf das zweite Form auf und übergib dabei eine „Where-Condition“-Paramter zur Filtgerung des 2. Forms:

Dim a as LONG '!!!
.
.
.
DoCmd.OpenForm „fml_Personal_Bearbeitung“,„BN=“ & a

das sollte reichen.

Andere Möglickeit ist, statt dem „Where-Condition“-Patramter den Openargs-Paramter zu nehmen und im Form_Load-Ereignis des 2. Forms auf den Datensatz zu positionieren:

DoCmd.OpenForm „fml_Personal_Bearbeitung“,„BN=“ & a

Sub Form_Open()
If not Isnull(Me.Openargs) Then
Me.Recordsetclone.Findfirst Me.Openargs
If not Me.Recordsetclone.Nomatch then Me.Bookmark= Me.Recordsetclone.Bookmark
End If
End Sub

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!