|
Option Strict Off
Option Explicit On
Imports DatabaseObjects
Imports System.Collections
Public Class Orders
Implements IDatabaseObjects
Implements IEnumerable
Default Public ReadOnly Property Item(ByVal intIndex As Integer) As Order
Get
Return NorthwindDB.Database.ObjectByOrdinal(Me, intIndex)
End Get
End Property
Public ReadOnly Property Count() As Integer
Get
Return NorthwindDB.Database.ObjectsCount(Me)
End Get
End Property
Public Sub Delete(ByRef objOrder As Order)
'The objOrder is passed ByRef because the ObjectDelete function
'sets the objOrder = Nothing thereby ensuring it can no longer be accidentally used.
NorthwindDB.Database.ObjectsDeleteAll(objOrder.Details)
NorthwindDB.Database.ObjectDelete(Me, objOrder)
End Sub
Private Function DistinctFieldAutoIncrements() As Boolean Implements IDatabaseObjects.DistinctFieldAutoIncrements
Return True
End Function
Private Function DistinctFieldName() As String Implements IDatabaseObjects.DistinctFieldName
Return "OrderID"
End Function
Private Function ItemInstance() As IDatabaseObject Implements IDatabaseObjects.ItemInstance
Return New Order
End Function
Private Function KeyFieldName() As String Implements IDatabaseObjects.KeyFieldName
End Function
Private Function OrderBy() As SQL.SQLSelectOrderByFields Implements IDatabaseObjects.OrderBy
End Function
Private Function Subset() As SQL.SQLConditions Implements IDatabaseObjects.Subset
End Function
Private Function TableName() As String Implements IDatabaseObjects.TableName
Return "Orders"
End Function
Private Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return NorthwindDB.Database.ObjectsList(Me).GetEnumerator
End Function
Private Function TableJoins(ByVal objPrimaryTable As SQL.SQLSelectTable, ByVal objTables As SQL.SQLSelectTables) As SQL.SQLSelectTableJoins Implements IDatabaseObjects.TableJoins
End Function
End Class
Public Class Order
Implements IDatabaseObject
Private pintID As Integer
Private pobjDetails As OrderDetails
Public ShipName As String
Public ShipAddress As String
Public ShipCity As String
Public ShipRegion As String
Public ShipPostalCode As String
Public ShipCountry As String
Public TheDate As Date
Public RequiredDate As Date
Friend ReadOnly Property ID() As Integer
Get
'Friend will allow public access within the NorthwindDatabase assembly but will be
'private outside of the NorthwindDatabase assembly
Return pintID
End Get
End Property
Public ReadOnly Property Number() As Integer
Get
Return pintID
End Get
End Property
Public ReadOnly Property Cost() As Decimal
Get
Dim curCost As Decimal
Dim objDetail As OrderDetail
For Each objDetail In Me.Details
curCost = curCost + objDetail.Cost
Next
Cost = curCost
End Get
End Property
Public ReadOnly Property Details() As OrderDetails
Get
If pobjDetails Is Nothing Then
pobjDetails = New OrderDetails(Me)
End If
Details = pobjDetails
End Get
End Property
Private Property DistinctValue() As Object Implements IDatabaseObject.DistinctValue
Get
Return pintID
End Get
Set(ByVal Value As Object)
pintID = Value
End Set
End Property
Private Property IsSaved() As Boolean Implements IDatabaseObject.IsSaved
Get
'This function can be implemented using a boolean variable to hold
'whether this object has been saved or not. However, if the object is
'using an Identity field the following shortcut can be used as it is
'logically equivalent. The Property Let IsSaved does
'not need to be implemented
Return pintID <> 0
End Get
Set(ByVal Value As Boolean)
End Set
End Property
Public Sub Save()
Try
NorthwindDB.Database.Transactions.Begin()
'Save the main header object before saving the details, because if this is a new
'Order object then the OrderID won't have been set yet and the OrderDetail objects
'won't save with the correctly associated OrderID.
NorthwindDB.Database.ObjectSave(NorthwindDB.Orders, Me)
If Not pobjDetails Is Nothing Then
'save all of the detail lines
pobjDetails.Save()
End If
NorthwindDB.Database.Transactions.Commit()
Catch ex As Exception
NorthwindDB.Database.Transactions.Rollback()
Throw ex
End Try
End Sub
Private Sub LoadFields(ByVal objFields As SQL.SQLFieldValues) Implements IDatabaseObject.LoadFields
Me.TheDate = objFields("OrderDate").Value
Me.RequiredDate = objFields("RequiredDate").Value
Me.ShipName = objFields("ShipName").Value
Me.ShipAddress = objFields("ShipAddress").Value
Me.ShipCity = objFields("ShipCity").Value
Me.ShipRegion = IIf(objFields("ShipRegion").Value Is DBNull.Value, "", objFields("ShipRegion").Value)
Me.ShipPostalCode = IIf(objFields("ShipPostalCode").Value Is DBNull.Value, "", objFields("ShipPostalCode").Value)
Me.ShipCountry = objFields("ShipCountry").Value
End Sub
Private Function SaveFields() As SQL.SQLFieldValues Implements IDatabaseObject.SaveFields
Dim objFields As SQL.SQLFieldValues
objFields = New SQL.SQLFieldValues
objFields.Add("OrderDate", Me.TheDate)
objFields.Add("RequiredDate", Me.RequiredDate)
objFields.Add("ShipName", Me.ShipName)
objFields.Add("ShipAddress", Me.ShipAddress)
objFields.Add("ShipCity", Me.ShipCity)
objFields.Add("ShipRegion", IIf(Me.ShipRegion = Nothing, DBNull.Value, Me.ShipRegion))
objFields.Add("ShipPostalCode", IIf(Me.ShipPostalCode = Nothing, DBNull.Value, Me.ShipPostalCode))
objFields.Add("ShipCountry", Me.ShipCountry)
Return objFields
End Function
End Class
Public Class OrderDetails
Implements IDatabaseObjects
Implements IEnumerable
Private pobjParent As Order
'store each detail in a temporary collection
Private pobjDetails As ArrayList
Friend Sub New(ByVal objParent As Order)
pobjParent = objParent
LoadDetails()
End Sub
Friend ReadOnly Property Parent() As Order
Get
Parent = pobjParent
End Get
End Property
Default Public ReadOnly Property Item(ByVal intIndex As Integer) As OrderDetail
Get
Return pobjDetails(intIndex)
End Get
End Property
Public ReadOnly Property Count() As Integer
Get
Return pobjDetails.Count
End Get
End Property
Friend Sub Save()
Dim objDetail As OrderDetail
'Delete all of the Detail lines associated with this Order
NorthwindDB.Database.ObjectsDeleteAll(Me)
'Save all of the detail lines. Note that in the IsSaved function
'in the OrderDetail object is set to false. This ensures that records are always
'inserted into the database not updated because all of the existing detail records
'have just been deleted.
For Each objDetail In Me
NorthwindDB.Database.ObjectSave(Me, objDetail)
Next
End Sub
Private Sub LoadDetails()
'Loading all of the OrderDetail objects into a collection is necessary so that
'any adding, editing or deleting of the detail lines does not affect the database
'until the Order.Save sub is called.
pobjDetails = NorthwindDB.Database.ObjectsList(Me)
End Sub
Private Function DistinctFieldAutoIncrements() As Boolean Implements IDatabaseObjects.DistinctFieldAutoIncrements
End Function
Private Function DistinctFieldName() As String Implements IDatabaseObjects.DistinctFieldName
'The ProductID uniquely identifies each OrderDetail object within the
'Order - see the Subset function below. The 'ProductID' field
'together with the 'OrderID' field will determine which record each OrderDetail
'object is associated with.
Return "ProductID"
End Function
Private Function ItemInstance() As IDatabaseObject Implements IDatabaseObjects.ItemInstance
Return New OrderDetail(Me)
End Function
Private Function KeyFieldName() As String Implements IDatabaseObjects.KeyFieldName
End Function
Private Function OrderBy() As SQL.SQLSelectOrderByFields Implements IDatabaseObjects.OrderBy
End Function
Private Function Subset() As SQL.SQLConditions Implements IDatabaseObjects.Subset
Dim objConditions As SQL.SQLConditions = New SQL.SQLConditions
objConditions.Add("OrderID", SQL.ComparisonOperator.EqualTo, pobjParent.ID)
Return objConditions
End Function
Private Function TableName() As String Implements IDatabaseObjects.TableName
Return "Order Details"
End Function
Private Function GetEnumerator() As System.Collections.IEnumerator Implements System.Collections.IEnumerable.GetEnumerator
Return pobjDetails.GetEnumerator
End Function
Private Function TableJoins(ByVal objPrimaryTable As DatabaseObjects.SQL.SQLSelectTable, ByVal objTables As DatabaseObjects.SQL.SQLSelectTables) As DatabaseObjects.SQL.SQLSelectTableJoins Implements DatabaseObjects.IDatabaseObjects.TableJoins
End Function
End Class
Public Class OrderDetail
Implements IDatabaseObject
Private pobjParent As OrderDetails
Private pobjProduct As Product
Private pcurUnitPrice As Decimal
Private pintQuantity As Integer
Private psngDiscount As Single
Friend Sub New(ByVal objParent As OrderDetails)
pobjParent = objParent
End Sub
Public Property UnitPrice() As Decimal
Get
UnitPrice = pcurUnitPrice
End Get
Set(ByVal Value As Decimal)
'check that valid prices are set
If Value >= 0 Then
pcurUnitPrice = Value
Else
Throw New ArgumentException(Value.ToString)
End If
End Set
End Property
Public Property Quantity() As Integer
Get
Quantity = pintQuantity
End Get
Set(ByVal Value As Integer)
'check that valid quantities are set
If Value >= 0 Then
pintQuantity = Value
Else
Throw New ArgumentException(Value.ToString)
End If
End Set
End Property
Public Property Discount() As Single
Get
Discount = psngDiscount
End Get
Set(ByVal Value As Single)
If Value >= 0 Then
psngDiscount = Value
Else
Throw New ArgumentException(Value.ToString)
End If
End Set
End Property
Public Property Product() As Product
Get
Product = pobjProduct
End Get
Set(ByVal Value As Product)
If Value Is Nothing Then
Throw New ArgumentNullException
End If
pobjProduct = Value
End Set
End Property
Public ReadOnly Property Cost() As Decimal
Get
Return Me.UnitPrice * Me.Quantity
End Get
End Property
Private Property DistinctValue() As Object Implements IDatabaseObject.DistinctValue
Get
Return pobjProduct.ID
End Get
Set(ByVal Value As Object)
'This function is called when the object is loaded
'but can be ignored and done in the LoadFields
End Set
End Property
Private Property IsSaved() As Boolean Implements IDatabaseObject.IsSaved
Get
'This is always false because a new record is always written to the database for this
'object. This is because all of the OrderDetail objects are deleted before saving to the
'database. See the Order.Save function.
'
Return False
End Get
Set(ByVal Value As Boolean)
End Set
End Property
Private Sub LoadFields(ByVal objFields As SQL.SQLFieldValues) Implements IDatabaseObject.LoadFields
pobjProduct = NorthwindDB.Database.Object(NorthwindDB.Products, objFields("ProductID").Value)
Me.UnitPrice = objFields("UnitPrice").Value
Me.Quantity = objFields("Quantity").Value
Me.Discount = objFields("Discount").Value
End Sub
Private Function SaveFields() As SQL.SQLFieldValues Implements IDatabaseObject.SaveFields
Dim objFields As SQL.SQLFieldValues
objFields = New SQL.SQLFieldValues
objFields.Add("OrderID", pobjParent.Parent.ID)
objFields.Add("UnitPrice", Me.UnitPrice)
objFields.Add("Quantity", Me.Quantity)
objFields.Add("Discount", Me.Discount)
Return objFields
End Function
End Class
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.
A list of licenses authors might use can be found here
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.