BOF, EOF Properties
Applies To
Dynamic-Type Recordset object, Dynaset-Type Recordset object, Forward-Only–Type Recordset object, Recordset object, Snapshot-Type Recordset object, Table-Type Recordset object.
Description
- BOF — returns a value that indicates whether the current record position is before the first record in a Recordset object.
- EOF — returns a value that indicates whether the current record position is after the last record in a Recordset object.
Return Values
The return values for the BOF and EOF properties are Boolean values.
The BOF property returns True if the current record position is before the first record, and False if the current record position is on or after the first record.
The EOF property returns True if the current record position is after the last record, and False if the current record position is on or before the last record.
Remarks
You can use the BOF and EOF properties to determine whether a Recordset object contains records or whether you've gone beyond the limits of a Recordset object when you move from record to record.
The location of the current record pointer determines the BOF and EOF return values.
If either the BOF or EOF property is True, there is no current record.
If you open a Recordset object containing no records, the BOF and EOF properties are set to True, and the Recordset object's RecordCount property setting is 0. When you open a Recordset object that contains at least one record, the first record is the current record and the BOF and EOF properties are False; they remain False until you move beyond the beginning or end of the Recordset object by using the MovePrevious or MoveNext method, respectively. When you move beyond the beginning or end of the Recordset, there is no current record or no record exists.
If you delete the last remaining record in the Recordset object, the BOF and EOF properties may remain False until you attempt to reposition the current record.
If you use the MoveLast method on a Recordset object containing records, the last record becomes the current record; if you then use the MoveNext method, the current record becomes invalid and the EOF property is set to True. Conversely, if you use the MoveFirst method on a Recordset object containing records, the first record becomes the current record; if you then use the MovePrevious method, there is no current record and the BOF property is set to True.
Typically, when you work with all the records in a Recordset object, your code will loop through the records by using the MoveNext method until the EOF property is set to True.
If you use the MoveNext method while the EOF property is set to True or the MovePrevious method while the BOF property is set to True, an error occurs.
This table shows which Move methods are allowed with different combinations of the BOF and EOF properties.
| MoveFirst, MoveLast | MovePrevious, Move < 0 | Move 0 | MoveNext, Move > 0 |
|
BOF=True, EOF=False | Allowed | Error | Error | Allowed |
BOF=False, EOF=True | Allowed | Allowed | Error | Error |
Both True | Error | Error | Error | Error |
Both False | Allowed | Allowed | Allowed | Allowed |
Allowing a Move method doesn't mean that the method will successfully locate a record. It merely indicates that an attempt to perform the specified Move method is allowed and won't generate an error. The state of the BOF and EOF properties may change as a result of the attempted Move.
An OpenRecordset method internally invokes a MoveFirst method. Therefore, using an OpenRecordset method on an empty set of records sets the BOF and EOF properties to True. (See the following table for the behavior of a failed MoveFirst method.)
All Move methods that successfully locate a record will set both BOF and EOF to False.
In a Microsoft Jet workspace, if you add a record to an empty Recordset, BOF will become False, but EOF will remain True, indicating that the current position is at the end of Recordset. In an ODBCDirect workspace, both BOF and EOF will become False, indicating that the current position is on the new record.
Any Delete method, even if it removes the only remaining record from a Recordset, won't change the setting of the BOF or EOF property.
The following table shows how Move methods that don't locate a record affect the BOF and EOF property settings.
| BOF | EOF |
|
MoveFirst, MoveLast | True | True |
Move 0 | No change | No change |
MovePrevious, Move < 0 | True | No change |
MoveNext, Move > 0 | No change | True |
See Also
MoveFirst, MoveLast, MoveNext, MovePrevious methods.
Example
This example demonstrates how the BOF and EOF properties let the user move forward and backward through a Recordset.
Sub BOFX()
Dim dbsNorthwind As Database
Dim rstCategories As Recordset
Dim strMessage As String
Set dbsNorthwind = OpenDatabase("Northwind.mdb")
Set rstCategories = _
dbsNorthwind.OpenRecordset("Categories", dbOpenSnapshot)
With rstCategories
' Populate Recordset.
.MoveLast
.MoveFirst
Do While True
' Display current record information and get user
' input.
strMessage = "Category: " & !CategoryName & _
vbCr & "(record " & (.AbsolutePosition + 1) & _
" of " & .RecordCount & ")" & vbCr & vbCr & _
"Enter 1 to go forward, 2 to go backward:"
' Move forward or backward and trap for BOF or EOF.
Select Case InputBox(strMessage)
Case 1
.MoveNext
If .EOF Then
MsgBox _
"End of the file!" & vbCr & _
"Pointer being moved to last record."
.MoveLast
End If
Case 2
.MovePrevious
If .BOF Then
MsgBox _
"Beginning of the file!" & vbCr & _
"Pointer being moved to first record."
.MoveFirst
End If
Case Else
Exit Do
End Select
Loop
.Close
End With
dbsNorthwind.Close
End Sub
Example (Microsoft Access)
The following example uses the EOF property of a Recordset object to move the current record pointer past the last record in the Recordset object, then uses the BOF property to move the current record pointer to before the first record in the Recordset object.
Sub EndsOfFile()
Dim dbs As Database, rst As Recordset
' Return reference to current database.
Set dbs = CurrentDb
' Open recordset on Orders table.
Set rst = dbs.OpenRecordset("Orders")
' Do until end of file.
Do Until rst.EOF
' Move to next record.
rst.MoveNext
.
.
.
Loop
' Move to last record to set a current record.
rst.MoveLast
' Do until beginning of file.
Do Until rst.BOF
rst.MovePrevious
.
.
.
Loop
rst.Close
Set dbs = Nothing
End Sub