Re: Kombifeld Formular: Neuer Eintrag + Abgleich mit Quelltabelle

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



Hallo Karl

quoting Karl Donaubauer:

Set rswae = db.OpenRecordset(stsql)
If rswae.RecordCount = 0 Then

Sicherer ist für sowas:

If rswae.BOF Then

s.a. www.donkarl.com/?FAQ6.17

Was ist an rswae.BOF sicherer als den RecordCount auf 0 zu prüfen? Ich behaupte BOF liefert nicht in allen Sitationen das richtige Ergebnis, die Prüfung auf Recordcount = 0 hingegen schon. Da sitzt Du IMHO einer verbreiteten Irrmeinung auf.

Hier ein bisschen Code, der zeigt, das die Prüfung auf BOF=True durchaus nicht immer das erwartete liefert, RecordCount hingegen schon:

Public Function testBOF()
Dim db As Database
Dim rs As Recordset
Set db = CurrentDb()
Dim maxID As Long
maxID = DMax("PersonID", "Personen")
Set rs = db.OpenRecordset("SELECT PersonID " & _
"FROM Personen WHERE PersonID=" & _
maxID, dbOpenDynaset)
Debug.Print "Nach OpenRecordset"
Debug.Print "BOF=" & rs.BOF & _
", EOF = " & rs.EOF & ", RecordCount = " & _
rs.RecordCount; ""
rs.MovePrevious
Debug.Print "Nach MovePrevious"
Debug.Print "BOF=" & rs.BOF & _
", EOF = " & rs.EOF & ", RecordCount = " & _
rs.RecordCount; ""
rs.MoveFirst
Debug.Print "Nach MoveFirst"
Debug.Print "BOF=" & rs.BOF & _
", EOF = " & rs.EOF & ", RecordCount = " & _
rs.RecordCount; ""
rs.Delete
Debug.Print "Nach Delete"
Debug.Print "BOF=" & rs.BOF & _
", EOF = " & rs.EOF & ", RecordCount = " & _
rs.RecordCount; ""
rs.MoveFirst
Debug.Print "Nach MoveFirst"
Debug.Print "BOF=" & rs.BOF & _
", EOF = " & rs.EOF & ", RecordCount = " & _
rs.RecordCount; ""
rs.Requery
Debug.Print "Nach Requery, wenn RS leer"
Debug.Print "BOF=" & rs.BOF & _
", EOF = " & rs.EOF & ", RecordCount = " & _
rs.RecordCount; ""
rs.Close
Set rs = Nothing
Set db = Nothing
End Function

call testBOF()
Nach OpenRecordset
BOF=False, EOF = False, RecordCount = 1
Nach MovePrevious
BOF=True, EOF = False, RecordCount = 1

==> BOF ist True, es existiert aber ein Record!

Nach MoveFirst
BOF=False, EOF = False, RecordCount = 1
Nach Delete
BOF=False, EOF = False, RecordCount = 0

==> BOF ist False, Recordset ist nun aber leer!

Nach MoveFirst
BOF=True, EOF = True, RecordCount = 0
Nach Requery, wenn RS leer
BOF=True, EOF = True, RecordCount = 0

Fazit:
Es ist *nicht* sicherer auf BOF als auf Recordcount zu prüfen. Wenn das Recordset soeben geöffnet wurde, stimmt zwar BOF auch, aber es gibt einige Fälle, wo die Recordcount = 0 das richtige Ergebnisse liefert, die Prüfung auf BOF das falsche.

Falls Du einen Fall kennst, wo rs.Recordcount = 0 das falsche Ergebnis liefert oder ein Bug bekannt wäre, bin ich froh um Hinweise.

Gruss
Henry


--
Keine E-Mails auf Postings in NGs. Danke.
KB: http://support.microsoft.com/default.aspx
FAQ: http://www.donkarl.com
OH: Online Hilfe (Taste F1)
Downloads: http://www.dbdev.org

.



Relevant Pages