Neuigkeiten:

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

Mobiles Hauptmenü

Laufzeitfehler 2001 bei Form_Load

Begonnen von sts2009, Januar 27, 2012, 14:48:37

⏪ vorheriges - nächstes ⏩

sts2009

Hallo,

ich habe ein Formular, das an eine Tabelle gebunden ist, mit einem Listenfeld "lstJobs" zur Datensatzauswahl.
"lstJobs_AfterUpdate()" sorgt mittels recordsetclone, find und Me.bookmark für die Synchronisation zwischen Formular und Listenfeld. Funktioniert einwandfrei, z. B.

Private Sub cmdAufAnfang_Click()
    If Me!lstJobs.ListCount > 0 Then
        Me!lstJobs.SetFocus
        Me!lstJobs.ListIndex = 0
    End If
End Sub

setzt Liste und Formular auf den 1. Eintrag.

Mein Problem: Am Ende von Form_Load() sage ich

Private Sub Form_Load()
[...]
    If Me!lstJobs.ListCount > 0 Then ' selber Code wie oben
        Me!lstJobs.SetFocus
        Me!lstJobs.ListIndex = 0 ' (*)
    End If
End Sub

Hier wird zwar der 1. Eintrag der Liste selektiert, die Anweisung Me.bookmark = rs.bookmark in lstJobsAfterUpdate() löst nun aber Laufzeitfehler 2001 "Sie haben den vorherigen Vorgang abgebrochen" aus.

M. a. W.: Der Code funktioniert hinter einem CommandButton, nicht aber in Form_Load(). Noch komischer: Wenn ich auf die mit (*) markierte Zeile einen breakpoint setze und mit F8 die Anweisungen nacheinander ausführe, gibt es keinen Laufzeitfehler!

Ratlose Grüße
Stefan

PS: Habe beim Googeln den Tip gefunden, mit rs.MoveLast und rs.MoveFirst sicherzustellen, daß das Formular komplett geladen wurde. Hilft aber nüscht.


DF6GL

Hallo,

das ist nicht komisch,  es sind lediglich beim (während des) Load-Ereignis noch nicht alle Steuerelemente geladen, was  gerade passiert ...

Nimm statt des Load-Ereignisses das Form_Current-Ereignis um das Listenfeld zu synchronisieren.




sts2009

Hallo,

Zitat von: DF6GL am Januar 27, 2012, 15:04:47
das ist nicht komisch,  es sind lediglich beim (während des) Load-Ereignis noch nicht alle Steuerelemente geladen, was  gerade passiert ...

grad rausgefunden: wenn man Form_Load etwas Zeit gibt, dann klappt's:
Wait(1000) ' wait() von http://dbwiki.net/wiki/; Angabe in Millisekunden
eingefügt vor der Zeile
Me!lstJobs.ListIndex = 0

-> kein Laufzeitfehler mehr.

Wait(500) reicht nicht, das finde ich schon etwas komisch. ;) Vor allem ist diese Lösung natürlich auch unbefriedigend, da ich ja nicht weiß, ob 1000 ms Wartezeit unter allen Umständen (Größe der Tabelle, Netzwerkauslastung, ...) ausreicht.

Zitat
Nimm statt des Load-Ereignisses das Form_Current-Ereignis um das Listenfeld zu synchronisieren.
Ich möchte das Formular über das Listenfeld steuern, deshalb scheidet das aus.

Viele Grüße

DF6GL

Hallo,

mit der Warterei handelst Du Dir nur Ärger ein...


Warum scheidet Form_Current aus??


sts2009

Hallo,

optimal finde ich das mit wait() auch nicht.

Form_Current() scheidet meiner Meinung nach aus, weil ich das Formular durch das Listenfeld steuern will, nicht umgekehrt. Dazu muß ich "Me.bookmark = rs.bookmark" sagen. Das löst das Ereignis Form_Current aus, somit kann ich das nicht in Form_Current() machen. (?)

Viele Grüße

DF6GL

Hallo,

"Dazu muß ich "Me.bookmark = rs.bookmark" sagen."


Warum?

"Das löst das Ereignis Form_Current aus, somit kann ich das nicht in Form_Current() machen"

As kannst Du dort nicht machen?  Dort mußt Du nur das Listenfeld synchronisiren, d. h. den Listenfeldentrag markieren, der als DS im Form angezeigt wird.

Um einen anderen DS anzuzeigen, den Du mit Hilfe des Listenfeldes auswählst, bzw. darin markierst,kannst Du das Klick-Ereignis des Listenfeldes benutzen, um den DS zu suchen und im Form anzuzeigen. 

Beaker s.a.

Hallo Franz,
ZitatWas kannst Du dort nicht machen?
Den Bookmark setzen (Me.Bookmark = rs.Bookmark). Das würde IMO dann aber auch wirklich keinen Sinn machen, da dadurch ja sowas wie eine Endlosschleife gestartet wird; - Current -> Bookmark -> Current usw.
Obwohl nicht ersichtlich ist wo er das jetzt macht, - im geposteten Code ist davon jedenfalls nichts zu sehen.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

sts2009

Hallo,

Zitat von: Beaker s.a. am Januar 27, 2012, 22:39:15
ZitatWas kannst Du dort nicht machen?
Den Bookmark setzen (Me.Bookmark = rs.Bookmark). Das würde IMO dann aber auch wirklich keinen Sinn machen, da dadurch ja sowas wie eine Endlosschleife gestartet wird; - Current -> Bookmark -> Current usw.

Genau.

Zitat
Obwohl nicht ersichtlich ist wo er das jetzt macht, - im geposteten Code ist davon jedenfalls nichts zu sehen.

Er hatte es im Ausgangsbeitrag kurz erwähnt (2. Zeile). Es ist praktisch unverändert der Code, den Access erzeugt, wenn man mit dem Assistenten ein Listenfeld ins Formular einfügt und die Option "Datensatzauswahl" wählt.  Hab den Code deshalb nicht explizit gepostet. Was zugegebenerweise  ungeschickt war, da genau die Zeile "Me.Bookmark = rs.Bookmark" den Laufzeitfehler verursacht.

Viele Grüße
Stefan


sts2009

Hallo,

Zitat von: DF6GL am Januar 30, 2012, 15:42:17

und was ist jetzt Stand Deiner  Dinge??


Bis vor ein paar Minuten: ratlos und verzweifelt. ;)

Inzwischen meine ich eine Lösung zu haben. Und zwar in sub Form_Load():

        Me.Recordset.MoveLast
        Me.Recordset.MoveFirst

Das soll dafür sorgen, daß das Formular komplett geladen wird, bevor man Me.Bookmark setzt. Funktioniert anscheinend und ist auch schneller als wait(1000). :)



Ich hatte im Ausgangsbeitrag geschrieben, daß genau dieses MoveLast/First nix nützt; das stimmt aber nur, wenn man das falsche recordset nimmt (das geklonte); wenn man das Formular-recordset nimmt, dann klappt's.

Viele Grüße

DF6GL

Hallo,

naja, wenn's geht...


trotzdem als Tipp nochmal mein Vorschlag:

Zitat
Dort (im Form_Current-Ereignis) mußt Du nur das Listenfeld synchronisieren, d. h. den Listenfeldentrag markieren, der als DS im Form angezeigt wird.

Um einen anderen DS anzuzeigen, den Du mit Hilfe des Listenfeldes auswählst, bzw. darin markierst, kannst Du das Klick-Ereignis des Listenfeldes benutzen, um den DS zu suchen und im Form anzuzeigen.