Suppose that I've created a factory object, but I haven't populated it. In this case, I don't have a recordset at all, so before I can create the new worker object I have to create the recordset. Now, when I get a recordset from the DAL, it comes back already containing the required fields. But if I don't have a recordset, I'm going to have to build one manually. This is a slightly laborious task because it means performing AddField operations for each property on the worker object. Another way to do this would be to retrieve an empty recordset from the DAL, either by requesting the required recordset with parameters that will definitely return an empty recordset, or by having an optional parameter on the OpenRecordset call. In our current implementation, however, we build empty recordsets inside the factory object itself.
But before we look at the process of creating a recordset manually, let's see the AddNew procedure in action:
Dim ocDAL As New cDAL Dim ocfEmployees As New cfEmployees Dim ocwEmployee As New cwEmployee ocfEmployees.Create ocDAL Set ocfEmployee = ocfEmployees.AddNew ocfEmployee.Name = "Adam Magee"
This is how it is implemented:
Public Function AddNew() As cwEmployee Dim ocwEmployee As cwEmployee If oPicRecordset Is Nothing Then Set oPicRecordset = New cRecordset With oPicRecordset .AddField "ID" .AddField "Department" .AddField "FirstName" .AddField "LastName" End With End If oPicRecordset.AddNew ' Add an empty row for the ' worker object to reference. oPicRecordset.Update Set ocwEmployee = New cwEmployee ocwEmployee.Create oPicRecordset, oPicDAL colPicwWorkers.Add ocwEmployee Set New = ocwEmployee End Property
This introduces an unavoidable maintenance problem, though. Changes to the worker object must now involve updating this code as well-not the most elegant solution, but it's worth keeping this in mind whenever changes to the worker objects are implemented.
So now we can retrieve worker objects from the database, we can add them to other factories, and we can create new ones-all well and good-but what about saving them back to the data source? This is the role of persistence. Basically, persistence involves sending the recordset back to the database to be updated. The DAL has a method that does exactly that-UpdateRecordset-and we can also supply and retrieve any parameters that might be appropriate for the update operation (although most of the time UpdateRecordset tends to happen without any reliance on parameters at all).
Dim ocDAL As New cDAL Dim ocfEmployees As New cfEmployees Dim ocwEmployee As New cwEmployee Dim ocParams As New cParams ocfEmployees.Create ocDAL ocParams.Add "Department", "Engineering" ocfEmployees.Populate ocParams For Each ocwEmployee In ocfEmployees .Salary = "Peanuts" Next 'ocwEmployee ocfEmployees.Persist ' Reduce costs
What is this Persist method doing, then?
Public Sub Persist(Optional i_ocParams As cParams) oPicDAL.UpdateRecordset oPicRecordset, i_ocParams End Sub
Consider it persisted.