VbzCart/docs/archive/code/VBA/clsPackageItem
<VB> ' CLASS: clsPackageItem
Option Compare Database Option Explicit Private vID As Long Private vPkg As Long Private vItem As Long Private vOrdItem As Long Private vQtyShipped As Long ' qty shipped as ordered Private vQtyExtra As Long ' qty shipped unrequested Private vQtyNotAvail As Variant Private vQtyCancelled As Variant Public Sub Init(iFields As Fields)
With iFields vID = !ID vPkg = !ID_Package vItem = Nz(!ID_Item) vOrdItem = Nz(!ID_OrderItem) vQtyShipped = Nz(!QtyShipped) vQtyExtra = Nz(!QtyExtra) vQtyNotAvail = !QtyNotAvail vQtyCancelled = !QtyCancelled End With
End Sub Public Sub InitNew(iParent As clsPackage) ' ACTION: creates a new line item for the given package ' ASSUMES: no fields have been filled in beforehand; must be saved explicitly afterwards if those fields are to be written to the db
vPkg = iParent.ID With clsPackageItems .DataOpen With .Data .AddNew vID = !ID !ID_Package = vPkg .Update End With .DataShut End With
End Sub Public Sub CopyOrderItem(iData As clsOrderItem) ' ACTION: fills in the appropriate data in this object with information from the given order item ' USAGE: used for creating a new package from an order
With iData ' get the item to be shipped, and the order item it's shipping from Me.Item_ID = .Item_ID Me.OrderItem_ID = .ID
' (2004-01-16) we used to assume everything would ship; now we check stock first. ' ' assume we'll be shipping everything not nailed down... I mean, not already accounted for ' Me.QtyShipped = .QtyOrd - .QtyDone
' other quantities default to NULL End With Me.Save
End Sub Public Sub Ship() ' ACTION: ships this item. This used to involve adjusting a quantity in the Order Item record, but for now it does nothing. ' If there is no corresponding order item, does nothing too. ' Dim objOrdItm As clsOrderItem
' If Me.OrderItemExists Then ' Set objOrdItm = Me.OrderItem ' With objOrdItm ' .QtyDoneAdd Me.QtyHandled + Me.QtyNotAvail + Me.QtyCancelled ' .Save ' End With ' End If End Sub Public Sub UnShip() ' ACTION: UNships this item, i.e. reverses the action of Ship() ' If there is no corresponding order item, does nothing ' Dim objOrdItm As clsOrderItem ' ' If Me.OrderItemExists Then ' Set objOrdItm = Me.OrderItem ' With objOrdItm ' .QtyDoneDel Me.QtyHandled + Me.QtyNotAvail + Me.QtyCancelled ' .Save ' End With ' End If End Sub Public Function Delete() As Boolean
With clsPackageItems .DataOpen If Located Then .Data.Delete Delete = True Else Delete = False End If End With
End Function Public Sub Save()
With clsPackageItems .DataOpen If Located Then With .Data .Edit !ID_Package = vPkg !ID_Item = vItem !ID_OrderItem = IIf(vOrdItem = 0, Null, vOrdItem) !QtyShipped = vQtyShipped !QtyExtra = vQtyExtra !QtyNotAvail = vQtyNotAvail !QtyCancelled = vQtyCancelled .Update End With End If End With
End Sub Public Property Get ID() As Long
ID = vID
End Property Public Property Get Package_ID() As Long
Package_ID = vPkg
End Property Public Property Get PackageExists() As Boolean
PackageExists = (vPkg <> 0)
End Property Public Property Get Package() As clsPackage
Dim objPkg As clsPackage
Set objPkg = clsPackages.Item(Me.Package_ID) If objPkg Is Nothing Then With clsPackages .DataOpen .Data.Requery Set objPkg = .Item(Me.Package_ID) .DataShut End With End If Set Package = objPkg
End Property Public Property Get Item_ID() As Long
Item_ID = vItem
End Property Public Property Let Item_ID(iID As Long)
vItem = iID
End Property Public Property Get Item() As clsItem
Set Item = clsItems.Item(Me.Item_ID)
End Property Public Property Get OrderItem_ID() As Long
OrderItem_ID = vOrdItem
End Property Public Property Let OrderItem_ID(iID As Long)
vOrdItem = iID
End Property Public Property Get OrderItem() As clsOrderItem
Set OrderItem = clsOrderItems.Item(vOrdItem)
End Property Public Property Get OrderItemExists() As Boolean
If (Me.OrderItem_ID = 0) Then OrderItemExists = False Else OrderItemExists = Not (Me.OrderItem Is Nothing) End If
End Property Public Property Get QtyShipped() As Long
QtyShipped = vQtyShipped
End Property Public Property Let QtyShipped(iQty As Long)
vQtyShipped = iQty
End Property Public Property Get QtyMoved() As Long ' RETURNS: quantity shipped + quantity extra
QtyMoved = vQtyShipped + vQtyExtra
End Property Public Sub AddQtyShipped(iQty As Long)
vQtyShipped = vQtyShipped + iQty
End Sub Public Property Get QtyNotAvail() As Long
QtyNotAvail = Nz(vQtyNotAvail)
End Property Public Property Let QtyNotAvail(iQty As Long)
vQtyNotAvail = iQty
End Property Public Property Get QtyCancelled() As Long
QtyCancelled = Nz(vQtyCancelled)
End Property Public Property Let QtyCancelled(iQty As Long)
vQtyCancelled = iQty
End Property Public Property Get QtyCancelledEver() As Long ' ACTION: returns the total cancelled of this item for all packages started prior to this one
Dim objList As Scripting.Dictionary Dim objItem As clsPackageItem Dim dtStart As Date, dtItem As Date Dim didFinish As Boolean Dim doCount As Boolean Dim qtyTot As Long Set objList = Me.Packings With Me.Package didFinish = .HasBeenFinished If didFinish Then dtStart = .WhenFinished End If End With
If objList Is Nothing Then QtyCancelledEver = 0 Else For Each objItem In objList With objItem dtItem = .Package.WhenStarted If didFinish Then doCount = (dtItem < dtStart) Else doCount = False End If If doCount Then qtyTot = qtyTot + .QtyCancelled End If End With Next objItem QtyCancelledEver = qtyTot End If
End Property Public Property Get QtyHandled() As Long
QtyHandled = QtyShipped + QtyNotAvail + QtyCancelled
End Property Public Property Get QtyOpen() As Long
With Me.OrderItem QtyOpen = .QtyRem End With
End Property Public Property Get QtyOrdered() As Long ' ACTION: returns the quantity originally ordered for the current item
With Me.OrderItem QtyOrdered = .QtyOrd End With
End Property Public Property Get QtyYetToPack() As Long ' ACTION: returns the quantity not packed earlier than this package's creation date ' STEPS: ' 1. get all package items referring to the same Order Item ' 2. total the ones whose package is dated earlier than this package ' 3. subtract from the total ordered; return this result.
Dim objPkg As clsPackage Dim dtStart As Date, dtItem As Date Dim objList As Scripting.Dictionary Dim objItem As clsPackageItem Dim qtyPkd As Long Set objPkg = Me.Package If objPkg Is Nothing Then QtyYetToPack = 0 Debug.Print "Package object not returned for ID=" & Me.Package_ID Else dtStart = objPkg.WhenStarted Set objList = Me.Packings If objList Is Nothing Then QtyYetToPack = 0 Else For Each objItem In objList With objItem If .PackageExists Then If .Package Is Nothing Then MsgBox "Package ID=" & .Package_ID & " could not be loaded.", vbCritical, "Internal Error" Else dtItem = .Package.WhenStarted If dtItem < dtStart Then qtyPkd = qtyPkd + .QtyHandled End If End If End If End With Next objItem QtyYetToPack = Me.OrderItem.QtyOrd - qtyPkd End If End If
End Property Public Property Get WasOrdered() As Boolean
WasOrdered = (Me.OrderItem_ID <> 0)
End Property 'Public Property Get Item() As clsItem ACTION: returns the package item's item object, if available, else pops up error messages and allows the user to enter missing data. ' Dim objItRef As clsItemRef ' Dim objItem As clsItem ' ' Set objItRef = Me.ItRef ' If objItRef Is Nothing Then ' MsgBox "An item in the package has no item reference.", vbExclamation, "Data Missing" ' Else ' Set objItem = objItRef.Item ' If objItem Is Nothing Then ' With objItRef ' MsgBox "The item reference " & .DescrText & " (" & .CatNum & ") has no item assigned.", vbExclamation, "Data Missing" ' .Edit ' doCancel = True ' cancel the rest of the operation ' End With ' Else ' Set Item = objItem ' End If ' End If 'End Property Public Property Get ShipCode_Exists() As Boolean
Dim objItem As clsItem Set objItem = Me.Item If objItem Is Nothing Then Exit Property ShipCode_Exists = objItem.ShipCodeExists
End Property Public Property Get ShipCode() As clsShipCode ' ACTION: returns the package item's ship code object, if available, else pops up error messages and allows the user ' to enter missing data.
Dim objItem As clsItem Dim objShip As clsShipCode
Set objItem = Me.Item If objItem Is Nothing Then Exit Property Set objShip = objItem.ShipCode If objShip Is Nothing Then With objItem MsgBox "The item " & .Description & " (" & .CatNum & ") has no shipping code set." .Edit doCancel = True ' cancel the rest of the operation End With Set ShipCode = Nothing Else Set ShipCode = objShip End If
End Property Public Property Get PriceEffective() As Currency ' ACTION: returns the effective price of the item, which is the amount quoted in the order item record (if available) ' or else defaults to the item's current price
Dim objItem As clsItem Dim objPrice As clsPriceCode If Me.OrderItemExists Then PriceEffective = Me.OrderItem.Price Else Set objItem = Me.Item If objItem Is Nothing Then Exit Property Set objPrice = objItem.PriceCode If objPrice Is Nothing Then With objItem MsgBox "The item " & .Description & " (" & .CatNum & ") has no price code set." .Edit doCancel = True ' cancel the rest of the operation End With Else PriceEffective = Me.Item.PriceCode.Price End If End If
End Property Public Property Get ShipPkgEffective() As Currency ' ACTION: returns the effective shipping package cost of the item, which is the amount quoted in the order item record (if available) ' or else defaults to the value in the item's current shipping code
Dim objShip As clsShipCode If Me.OrderItemExists Then ShipPkgEffective = Me.OrderItem.ShipPkg Else Set objShip = Me.ShipCode If objShip Is Nothing Then Exit Property ShipPkgEffective = objShip.PerPkg End If
End Property Public Property Get ShipItmEffective() As Currency ' ACTION: returns the effective shipping per-item cost of the item, which is the amount quoted in the order item record (if available) ' or else defaults to the value in the item's current shipping code
Dim objShip As clsShipCode If Me.OrderItemExists Then ShipItmEffective = Me.OrderItem.ShipItem Else Set objShip = Me.ShipCode If objShip Is Nothing Then Exit Property ShipItmEffective = objShip.PerItem End If
End Property Public Property Get PriceTotal() As Currency ' ACTION: returns the item's effective price multiplied by the quantity being shipped
PriceTotal = Me.PriceEffective * Me.QtyShipped
End Property Public Property Get ShipItemTotal() As Currency ' ACTION: returns the itemized shipping cost multiplied by the quantity being shipped
ShipItemTotal = Me.ShipItmEffective * Me.QtyShipped
End Property Public Property Get Packings() As Scripting.Dictionary ' ACTION: returns a list of all packings of the same line item (including this object)
Dim objOItem As clsOrderItem
If Me.WasOrdered Then Set objOItem = Me.OrderItem If objOItem Is Nothing Then Set Packings = Nothing Else Set Packings = objOItem.Packings End If Else Set Packings = Nothing End If
End Property Private Function Located() As Boolean
Dim isFnd As Boolean
isFnd = True With clsPackageItems With .Data If .EOF Then isFnd = False ElseIf !ID <> vID Then .FindFirst "ID=" & vID If .NoMatch Then MsgBox "Package Item with ID=" & vID & " was not found.", vbCritical, "Internal Error" isFnd = False End If End If End With End With Located = isFnd
End Function Public Sub FetchFromStockLine(iStkLine As Long, iQty As Long)
Dim objStkLine As clsStockItem Set objStkLine = clsStockItems.Item(iStkLine) If objStkLine Is Nothing Then Stop ' internal error objStkLine.FetchToPkgLine iQty, Me.ID
End Sub Public Sub FetchFromLocation(iLoc As Long, iQty As Long)
Dim sqlFilt As String Dim objStkLine As clsStockItem
sqlFilt = "(ID_Location=" & iLoc & ") AND (ID_Item=" & Me.Item_ID & ")" Set objStkLine = New clsStockItem With clsStockItems .DataOpen With .Data .FindFirst sqlFilt Do While Not .NoMatch objStkLine.Init .Fields, clsStockItems objStkLine.FetchToPkgLine iQty, Me.ID .FindNext sqlFilt Loop End With .DataShut End With
End Sub </VB>