(Access 2002)
bekanntlich muss man das Recordset mit .MoveLast erst einmal vollständig
auffüllen, um die korrekte Anzahl von Datensätzen zu ermitteln.
Wenn ich nun wissen will, ob der Datensatz in meinem Formular der letzte
ist (Weil ich z.B. die Next- und Last-Buttons deaktivieren will), ist da
stets ein .MoveLast erforderlich? MoveLast gilt ja bei größeren
Datensatzmengen als Bremse.
Also so (Im Form_Current-Ereignis):
if me.currentRecord = me.recordsetClone.RecordCount then ...
oder so:
Me.Recordsetclone.Movelast
if me.currentRecord = me.recordsetClone.RecordCount then ...
Ist das ständige Neuzählen zwingend geboten? Muss der Recordsetclone immer
wieder vollständig durchlaufen werden, wenn Daten hinzukommen können?
Danke und Gruß
Josef Morlo
Joo, ist IMO anzuraten.
Ich habe vor Jahren mal anlässlich einer Diskussion etwas getestet
und festgestellt, dass es ohne Movelast zumindest ab ein paar hundert
Datensätzen oft falsche Ergebnisse geben kann.
Ein RecordCount liefert dann zwischendurch mal die aktuelle
Datensatznummer im Formular + 1 oder dergl. Blödsinn.
Schwer nachzuvollziehen, was da wann geladen und gezählt wird,
aber wenn's zuverlässig sein soll...
--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai
ok, dann muss es halt sein. Ich danke Dir recht herzlich!
Lieber Gruß
Josef Morlo
> Wenn ich nun wissen will, ob der Datensatz in meinem Formular der letzte
> ist (Weil ich z.B. die Next- und Last-Buttons deaktivieren will), ist da
> stets ein .MoveLast erforderlich? MoveLast gilt ja bei größeren
> Datensatzmengen als Bremse.
Du könntest auch RecordsetClone auf das aktuelle Lesezeichen setzen und
dann mittels MoveNext ermitteln, ob das Recordset EOF ist:
Private Sub Form_Current()
Dim rst As DAO.Recordset
Set rst = Me.RecordsetClone
rst.Bookmark = Me.Bookmark
rst.MoveNext
If rst.EOF Then
MsgBox "Ende"
End If
End Sub
Ob das jetzt am Ende performanter als dein Ansatz ist, müsstest du mit
einer größeren Datenmenge mal selber testen. Alternativ fällt mir noch
der Weg ein, per SQL ein Count(*) über die Datenmenge auszuführen.
Viele Grüße aus Bremen,
Stefan
Stefan Dase:
>> Wenn ich nun wissen will, ob der Datensatz in meinem Formular der letzte
>> ist (Weil ich z.B. die Next- und Last-Buttons deaktivieren will), ist da
>> stets ein .MoveLast erforderlich? MoveLast gilt ja bei größeren
>> Datensatzmengen als Bremse.
>
> Du könntest auch RecordsetClone auf das aktuelle Lesezeichen setzen und
> dann mittels MoveNext ermitteln, ob das Recordset EOF ist:
>
> Private Sub Form_Current()
>
> Dim rst As DAO.Recordset
>
> Set rst = Me.RecordsetClone
> rst.Bookmark = Me.Bookmark
> rst.MoveNext
>
> If rst.EOF Then
> MsgBox "Ende"
> End If
>
> End Sub
>
> Ob das jetzt am Ende performanter als dein Ansatz ist, müsstest du mit
> einer größeren Datenmenge mal selber testen.
Die BOF-Variante wäre in der Tat eine praktikable Alternative und vor allen
Dingen einen Test wert.
> Alternativ fällt mir noch
> der Weg ein, per SQL ein Count(*) über die Datenmenge auszuführen.
Da es um Code für Navigationsschaltflächen geht, ist der Weg über SQL für
mich ungeeignet, da ich nicht den Tabellennamen habe. Ich habe den
Navigationscode in eine separates Modul ausgelagert, und da müsste ich mir
den Namen eigens rüberholen für ein "SELECT COUNT(*) FROM MyTable"
Nebenbei bemerkt: Wenn ich einen Beitrag von Michael Zimmermann recht
erinnere, sei Recordcount einer der wenigen Fälle, wo das Arbeiten mit
Recordsets schneller als SQL sei. Wie gesagt mit dem dem Vorbehalt einer
möglicherweise getrübten Erinnerung.
Lieben Gruß
Josef Morlo