This type of view displays as many records as it can afford, based on its dimensions. To navigate among records, the user can click the Navigation Buttons in the bottom section of the window. This moves the focus from one record to the next or from one record to the previous one. When the view displays the last record, it would not move further. To move a particular record based on its number, the user can type an index, such as 12, in the text box located between the navigation buttons and press Enter. Besides the data sheet, the Form View of a form or report consists of displaying one record at a time:
Once again, to move from one record to another, the user can click the buttons in the bottom section of the form or report.
Most users know how to use navigation buttons to move among records. Some others don't. This means that, sometimes, you will need a way to make it easy for the user to perform this navigation. Fortunately, Microsoft Access provides everything you need to do this. To assist you with programmatically navigating among records, the DoCmd object is equipped with a method named GoToRecord. Its syntax is: DoCmd.GoToRecord(ByVal Optional ObjectType As AcDataObjectType = _ AcDataObjectType.acActiveDataObject, _ ByVal Optional ObjectName As String = "", _ ByVal Optional Record As AcRecord = AcRecord.acNext, _ ByVal Optional Offset As Integer = 1) As you can see, this method takes four arguments and all of them are optional. The first argument is a member of the AcDataObjectType enumeration. If allows you to specify the type of object on which the action will be applied. The members of this enumeration and their integral values are:
As you can see, if you omit the first argument and you call the DoCmd.GoToRecord() method from a form or report, the navigation action will be applied on the record that is currently displaying on that form or report. The second argument is the name of the object selected in the first argument. For example, if you specify the first argument as a form (AcDataObjectType.acDataForm), you can pass the name of that form or report as the second argument. The third argument specifies the actual action to perform. This argument is a member of the AcRecord enumeration. The members of this enumeration are:
To assist you with creating your own navigation buttons, Microsoft Access provides the Button Wizard. To use it, with the Use Control Wizards button down, after adding a Command Button to the form or report, when the Command Button Wizard, in the first page, select Record Navigation (it should be selected by default):
In the Actions list, you can select the type of navigation you want the new button to perform. In the second page, you have the option of using a suggested bitmap for the button or you can enter a caption in the top text box and click Next. In the third page, you can enter a name for the button and click Finish. At the end, the wizard will have code for you that essentially calls the DoCmd.GoToRecord method. Here is an example: Private Sub cmdNextStudent_Click()
On Error GoTo Err_cmdNextStudent_Click
DoCmd.GoToRecord , , acNext
Exit_cmdNextStudent_Click:
Exit Sub
Err_cmdNextStudent_Click:
MsgBox Err.Description
Resume Exit_cmdNextStudent_Click
End Sub
This code is used to move to the next record.
Navigating through a record set consists of visiting its records. This is similar to using the navigation buttons at the bottom of a table, a query, a form or a report. We saw how to do this manually or programmatically using the DoCmd object. The Recordset class also supports record navigation through various methods. Whenever performing an operation on a record, you should know your position in the set. Whenever in doubt, you can reset your position by moving to the first record. To support this, the Recordset object is equipped with a method named MoveFirst. This method takes no argument. Here is an example of calling it: Private Sub cmdVideoAnalyze_Click()
Dim rstVideos As ADODB.Recordset
Dim fldEach As ADODB.Field
Set rstVideos = New ADODB.Recordset
rstVideos.Source = "Blah Blah Blah"
rstVideos.ActiveConnection = Application.CodeProject.Connection
rstVideos.CursorType = adOpenStatic
rstVideos.LockType = adLockOptimistic
rstVideos.Open
rstVideos.MoveFirst
For Each fldEach In rstVideos.Fields
MsgBox fldEach.Value
Next
rstVideos.Close
Set rstVideos = Nothing
End Sub
Besides the first record, another extreme position you can move to is the last record. To do this, you can call the MoveLast() method of the Recordset object. To move from one record to the next, you can call the MoveNext() method of the Recordset object. When this code executes, the record position is first moved to the first. Then it immediately moves to the second record. Then it visits each column, retrieves its value corresponding to the second record and displays it in a message box. To move to the previous record in the set, call the MovePrevious() method of the Recordset object. The MoveFirst() and MoveLast() methods allow you to navigate one record at a time until you get to a certain record. If you are positioned at a certain record and you want to jump a certain number of records ahead or you want to move back by a certain number of records, you can call the Move() method. Its syntax is: recordset.Move NumRecords, Start The first argument is required. Its specifies the number of records to jump to. If you pass a positive value, the position would be moved ahead by that number. Here is an example: Private Sub cmdEditRecord_Click()
Dim dbCustomers As Object
Dim rstCustomers As Object
Set dbCustomers = CurrentDb
Set rstCustomers = dbCustomers.OpenRecordset("Customers")
rstCustomers.Move 4
End Sub
When this code executes, it would jump 4 records ahead of the current record of a table named Customers. You can also pass a negative value. In this case the position would be moved behind the current record by the value passed. If the record set doesn't contain any record when you call the Move() method, you would get a 3021 error:
Some, if not most operations require that you remain within the range of values of the record set. If you move below the first record record, you (actually the user) may receive an error. In the same way, if you move beyond the last record, you would receive an error. To assist you with checking whether you are in the first record, the Recordset object provides the BOF() method. This method returns a Boolean value as follows:
On the other hand, if you want to check whether you are at the highest position of the records, you can call the EOF() method of the Recordset object. It also returns a Boolean value as follows:
As we will see in Lesson 23 on record maintenance, editing a record consists of changing the value of one or more columns. As done visually using a table, a query or a form, on a record set, editing a record is done in various steps. First, you must locate the record. If you know exactly the index of the record that contains the value you want to edit, you can call the Move() method to jump to it. Before editing the value, you can first jump to the record number. Here is an example that use Microsoft Access Object library: Private Sub cmdMovePosition_Click()
Dim dbVideoCollection As Object
Dim rstVideos As Object
Set dbVideoCollection = CurrentDb
Set rstVideos = dbVideoCollection.OpenRecordset("Videos")
rstVideos.Move 6
End Sub
Although this uses the Microsoft Access Object Library, you can also apply it to DAO by simply changing the names of the objects to the appropriate ones: Private Sub cmdMovePosition_Click()
Dim dbVideoCollection As DAO.Database
Dim rstVideos As DAO.Recordset
Set dbVideoCollection = CurrentDb
Set rstVideos = dbVideoCollection.OpenRecordset("Videos")
rstVideos.Move 6
End Sub
We also saw that you could call one of the other Move-oriented methods (MoveFirst(), MovePrevious(), MoveNext(), or MoveLast()). Once you get to a record, you can then perform the necessary operation. For example, you can retrieve the values held by that record.
When performing data entry, you can expect the user to skip any column whose value is not available and move to the next. In some cases, you may want to require that the value of a column be specified before the user can move on. If you are creating the table in the Design View, to require that the user enter a value for a particular column, in the lower section of the window, use the Required Boolean property. By default, the value of the Required property is set to No, which means the user doesn't have to provide a value for the column in order to create the record. If you want to require the value, set this property to Yes.
To support the nullity of a value, the Field class of the Microsoft Access Object Library is equipped with a Boolean property named Required. By default, the value of this property is False, which means the user can skip the field during data entry. If you set this property to True, the user must enter a value for the field. Here is an example: Private Sub cmdCreateTable_Click()
Dim curDatabase As Object
Dim tblStudents As Object
Dim fldFirstName As Object, fldLastName As Object
' Get a reference to the current database
Set curDatabase = CurrentDb
' Create a new table named Students
Set tblStudents = curDatabase.CreateTableDef("Students")
Set fldFirstName = tblStudents.CreateField("FirstName", dbText)
tblStudents.Fields.Append fldFirstName
Set fldLastName = tblStudents.CreateField("LastName", dbText)
fldLastName.Required = True
tblStudents.Fields.Append fldLastName
' Add the Students table to the current database
curDatabase.TableDefs.Append tblStudents
End Sub
During data entry, if a value is not provided for the field, the compiler would produce a 3314 error: Private Sub cmdCreateRecord_Click()
Dim curDatabase As Object
Dim rstStudents As Object
Set curDatabase = CurrentDb
Set rstStudents = curDatabase.OpenRecordset("Students")
rstStudents.AddNew
rstStudents("FirstName").Value = "Helene"
Rem rstStudents("LastName").Value = "Mukoko"
rstStudents.Update
Set rstStudents = Nothing
Set curDatabase = Nothing
End Sub
In the DAO library, the Field class provides the Required property. You can use this property to allow the user to skip a field during data entry. You can also use this property to make sure a value is entered for the field before the record is considered complete. The default value of this property is False. If you set it to True, a value must always be entered for the field. Here is an example: Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
Dim fldEmployeeNumber As DAO.Field
Dim fldEmployeeName As DAO.Field
Dim fldEmailAddress As DAO.Field
' Specify the database to use
Set dbExercise = CurrentDb
' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")
Set fldEmployeeNumber = tblEmployees.CreateField("EmployeeNumber", DB_TEXT)
fldEmployeeNumber.Required = True
tblEmployees.Fields.Append fldEmployeeNumber
Set fldEmployeeName = tblEmployees.CreateField("EmployeeName", DB_TEXT)
tblEmployees.Fields.Append fldEmployeeName
Set fldEmailAddress = tblEmployees.CreateField("EmailAddress", DB_TEXT)
tblEmployees.Fields.Append fldEmailAddress
' Add the new table to the database.
dbExercise.TableDefs.Append tblEmployees
dbExercise.Close
End Sub
If you try or the user tries skipping a field whose Required property is set to True, the database would produce an error.
If you are programmatically creating the column using SQL, if you want to let the user add or not add a value for the column, type the NULL keyword on the right side of the data type. If you want to require a value for the column, type NOT NULL. Here are examples: Private Sub cmdTable_Click()
DoCmd.RunSQL "CREATE TABLE Contractors(" & _
"FirstName TEXT NULL, " & _
"LastName VARCHAR NOT NULL);"
End Sub
In this case, when performing data entry, the user must always provide a value for the LastName column in order to create a record. If you omit to specify the nullity of a field, it is assumed NULL. |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
When creating a text-based field, you have the option of controlling the number of characters that a field can hold. If you are creating the table in Microsoft Access, to control the maximum number of characters it can contain, display the table in Design View. After setting the column name and the data type as Text, in the lower section of the window, click Field Size and type the desired value. You can set a value from 1 to 255.
In our introduction to table creation in the Microsoft Access Object Library, we saw that the CreateField() method of a table takes three arguments. By now, we know that the first argument is for the name of the column and the second argument can be either dbText or DB_TEXT: Private Sub cmdCreateTable_Click()
Dim curDatabase As Object
Dim tblStudents As Object
Dim fldFullName As Object
' Get a reference to the current database
Set curDatabase = CurrentDb
' Create a new table named Students
Set tblStudents = curDatabase.CreateTableDef("Students")
Set fldFullName = tblStudents.CreateField("FullName", dbText, Size)
tblStudents.Fields.Append fldFullName
' Add the Students table to the current database
curDatabase.TableDefs.Append tblStudents
End Sub
To specify the maximum number of characters a text-based column can hold, provide a third argument to the CreateField() method and enter the desired number. Here is an example: Private Sub cmdCreateTable_Click()
Dim curDatabase As Object
Dim tblStudents As Object
Dim fldFullName As Object
' Get a reference to the current database
Set curDatabase = CurrentDb
' Create a new table named Students
Set tblStudents = curDatabase.CreateTableDef("Students")
Set fldFullName = tblStudents.CreateField("FullName", dbText, 120)
tblStudents.Fields.Append fldFullName
' Add the Students table to the current database
curDatabase.TableDefs.Append tblStudents
End Sub
The DAO library uses the same approach as the Microsoft Access Object Library. Therefore, when creating a text-based column, to specify the maximum number of characters it can have, pass a third argument to the DAO.TableDef.CreateField() method as a number. Here is an example: Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
Dim fldEmploymentStatus As DAO.Field
' Specify the database to use
Set dbExercise = CurrentDb
' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")
Set fldEmploymentStatus = tblEmployees.CreateField("EmploymentStatus", DB_TEXT, 80)
tblEmployees.Fields.Append fldEmploymentStatus
' Add the new table to the database.
dbExercise.TableDefs.Append tblEmployees
dbExercise.Close
End Sub
We saw that, in SQL, a text-based field can use the TEXT, CHAR, or VARCHAR data type. By default, when a column of a table has been set to TEXT, CHAR, or VARCHAR, it is made to hold 255 characters. To specify the number of characters of the string-based column, add an opening and a closing parentheses to the TEXT, the CHAR, or the VARCHAR data types. In the parentheses, enter the desired number. Here are examples: Private Sub cmdCreateTable_Click()
DoCmd.RunSQL "CREATE TABLE Contractors (" & _
"EmplNumber TEXT(6)," & _
"FirstName Text(20)," & _
"LastName Text(20)," & _
"Address varchar(100)," & _
"City VARCHAR(40)," & _
"State char(2));"
End Sub
All of the text data types we have used so far can hold only a maximum of 255 characters. Of course, sometimes you will want to have a column that can hold longer text. If you are creating a table in Microsoft Access, you can display it in Design View. After specifying the name of the column, set its Data Type to Memo. Like the Text data type, the Memo type is used for any type of text, any combination of characters, and symbols, up to 64000 characters. If you are programmatically creating a column, using the Microsoft Access Object Library, if you want it to hold longer text than the Text data type or a regular String would handle, pass its type as DB_MEMO. Here is an example: Private Sub cmdCreateTable_Click()
Dim curDatabase As Object
Dim tblStudents As Object
Dim colFullName As Object
Dim colComments As Object
Set curDatabase = CurrentDb
Set tblStudents = curDatabase.CreateTableDef("Students")
' Create a colume named FullName in the Students table
Set colFullName = tblStudents.CreateField("FullName", DB_Text)
tblStudents.Fields.Append colFullName
' Create the Comments column
Set colComments = tblStudents.CreateField("Comments", DB_MEMO)
tblStudents.Fields.Append colComments
' Add the Students table to the current database
curDatabase.TableDefs.Append tblStudents
DoCmd.SelectObject acTable, "Students", True
End Sub
If you are creating the table using DAO and want to use long text values on a column, specify its data type as dbMemo. Here is an example: Private Sub cmdTableCreation_Click()
Dim curDatabase As DAO.Database
Dim tblStudents As DAO.TableDef
Dim colFullName As DAO.Field
Dim colAnnualReview As DAO.Field
' Get a reference to the current database
Set curDatabase = CurrentDb
' Create a new table named Students
Set tblStudents = curDatabase.CreateTableDef("Students")
Set colFullName = tblStudents.CreateField("FullName", dbText)
tblStudents.Fields.Append colFullName
Set colAnnualReview = tblStudents.CreateField("AnnualReview", dbMemo)
tblStudents.Fields.Append colAnnualReview
' Add the Students table to the current database
curDatabase.TableDefs.Append tblStudents
DoCmd.SelectObject acTable, "Students", True
End Sub
If you are using SQL to create your table, you can apply the MEMO, the NOTE, or the LONGTEXT data types to a column that would hold long text.
A default value allows a column to use a value that is supposed to be common to most cells of a particular column. The default value can be set as a constant value or it can use a function that would adapt to the time the value is needed.
To support the default value, the Field class of the Microsoft Access Object Library is equipped with a property named DefaultValue. When creating a field, get its reference from calling the TableDef.CreateField() method. With that reference, access its DefaultValue property and assign the desired value to it. The value must be a string for a text-based field. Here is an example: Private Sub cmdCreateTable_Click()
Dim curDatabase As Object
Dim tblStudents As Object
Dim fldFullName As Object
Dim fldGender As Object
' Get a reference to the current database
Set curDatabase = CurrentDb
' Create a new table named Students
Set tblStudents = curDatabase.CreateTableDef("Students")
Set fldFullName = tblStudents.CreateField("FullName", dbText, 120)
tblStudents.Fields.Append fldFullName
Set fldGender = tblStudents.CreateField("Gender", dbText, 20)
fldGender.DefaultValue = "Female"
tblStudents.Fields.Append fldGender
' Add the Students table to the current database
curDatabase.TableDefs.Append tblStudents
End Sub
After specifying a default value for a column, during data entry, you or the user can skip that field. Here is an example: Private Sub cmdCreateRecord_Click()
Dim curDatabase As Object
Dim rstStudents As Object
Set curDatabase = CurrentDb
Set rstStudents = curDatabase.OpenRecordset("Students")
rstStudents.AddNew
rstStudents("FullName").Value = "Helene Mukoko"
rstStudents.Update
Set rstStudents = Nothing
Set curDatabase = Nothing
End Sub
If you skip the field, the field would receive the default value as its value.
Once again, DAO uses the same approach as the Microsoft Access Object Library to perform this type of operation. In the DAO library, the DAO.Field class is equipped with the DefaultValue property. To specifying a default value for a new field you are creating, assign that value to it. Here is an example: Private Sub cmdCreateTable_Click()
Dim dbExercise As DAO.Database
Dim tblEmployees As DAO.TableDef
Dim fldEmployeeNumber As DAO.Field
Dim fldEmployeeName As DAO.Field
Dim fldEmploymentStatus As DAO.Field
' Specify the database to use
Set dbExercise = CurrentDb
' Create a new TableDef object.
Set tblEmployees = dbExercise.CreateTableDef("Employees")
Set fldEmployeeNumber = tblEmployees.CreateField("EmployeeNumber", DB_TEXT, 10)
fldEmployeeNumber.Required = True
tblEmployees.Fields.Append fldEmployeeNumber
Set fldEmployeeName = tblEmployees.CreateField("EmployeeName", DB_TEXT, 100)
tblEmployees.Fields.Append fldEmployeeName
Set fldEmploymentStatus = _
tblEmployees.CreateField("EmploymentStatus", DB_TEXT, 20)
fldEmploymentStatus.DefaultValue = "Full Time"
tblEmployees.Fields.Append fldEmploymentStatus
' Add the new table to the database.
dbExercise.TableDefs.Append tblEmployees
dbExercise.Close
End Sub
Once a field has a default value, it can be skipped during data entry, in which case the default value would be used for its value. |
|
|||||||||||||||||||||
|
|