vb class with access data please see speaker notes for additional information!
TRANSCRIPT
VB Class with Access Data
Please see speaker notes for additional information!
SavAcct07.vbpSavAcct07.vbp
Option ExplicitDim WithEvents objSavAcct As SavAcctDim colSavAccts As SavAcctDBIDim wkAcctNbr As StringDim wkBalance As CurrencyDim wkIntRate As IntegerDim wkTranAmt As CurrencyDim ans As String
Private Sub cmdAddAcct_Click()On Error GoTo AddAcctErr colSavAccts.Add wkAcctNbr, wkIntRate Call cmdRetrvAcct_Click Exit SubAddAcctErr: If Err.Number = saerrDupKey Then MsgBox "Account already exists.", vbOKOnly Else MsgBox "Unexpected Error!" & vbCrLf & Err.Number & " " & Err.Description & " " & Err.Source, vbInformation End If End Sub
Private Sub cmdApplyInt_Click()On Error GoTo ApplyIntErr With colSavAccts.Item(wkAcctNbr) .PostInterest lblClsBal.Caption = .Balance End With Exit SubApplyIntErr: If Err.Number = saerrKeyNF Then MsgBox "Account does not exist.", vbOKOnly Else MsgBox "Unexpected Error!" & vbCrLf & Err.Number & " " & Err.Description & " " & Err.Source, vbInformation End IfEnd Sub
I am now using a database as opposed to the collection in version 04.
As noted above, colSavAccts now refers to SavAcctDBI as opposed to the collection discussed before.
Private Sub cmdDpsit_Click()On Error GoTo DpsitErr With colSavAccts.Item(wkAcctNbr) .Deposit wkTranAmt lblClsBal.Caption = .Balance End With txtTrnAmt.Text = "" wkTranAmt = 0 txtTrnAmt.SetFocus Exit SubDpsitErr: If Err.Number = saerrKeyNF Then MsgBox "Account does not exist.", vbOKOnly Else MsgBox "Unexpected Error!" & vbCrLf & Err.Number & " " & Err.Description & " " & Err.Source, vbInformation End IfEnd Sub
Private Sub cmdDsplyAccts_Click()lstDsplyAcct.Clear With colSavAccts If .Count > 0 Then Dim i As Long For i = 0 To .Count - 1 Dim objDsplyAcct As SavAcct Set objDsplyAcct = .Item(i) With objDsplyAcct Dim DsplyLine As String DsplyLine = .AccountNumber & " " & .Balance & " " & .IntRate lstDsplyAcct.AddItem DsplyLine End With Next i End If End WithEnd Sub
Private Sub cmdDsplyTrans_Click()On Error GoTo DsplyTransErr lstDsplyTrn.Clear With colSavAccts.Item(wkAcctNbr).Transactions If .Count > 0 Then Dim i As Long For i = 0 To .Count - 1 Dim objDsplyTran As Transaction Set objDsplyTran = .Item(i) With objDsplyTran Dim DsplyLine As String DsplyLine = .AccountNumber & " " & .TransactionNumber & " " & .TransactionType & " " & .TransactionAmount
lstDsplyTrn.AddItem DsplyLine End With Next i End If End With Exit Sub
DsplyTransErr: If Err.Number = saerrKeyNF Then MsgBox "Account does not exist.", vbOKOnly Else MsgBox "Unexpected Error!" & vbCrLf & Err.Number & " " & Err.Description & " " & Err.Source, vbInformation End IfEnd Sub
Transactions references to the Transaction DBI that contains this particular accounts transactions.
Private Sub cmdReset_Click() Call Initialize_Variables txtAcctNbr.SetFocusEnd Sub
Private Sub cmdRetrvAcct_Click()On Error GoTo RetrvErr Set objSavAcct = colSavAccts.Item(wkAcctNbr) With objSavAcct lblOpnBal.Caption = .Balance lblClsBal.Caption = "" txtIntRate.Locked = False txtIntRate.Text = .IntRate txtIntRate.Locked = True End With Exit SubRetrvErr: If Err.Number = saerrKeyNF Then MsgBox "Account does not exist.", vbOKOnly Else MsgBox "Unexpected Error!" & vbCrLf & Err.Number & " " & Err.Description & " " & Err.Source, vbInformation End IfEnd SubPrivate Sub cmdRmvAcct_Click()On Error GoTo RmvAcctErr colSavAccts.Remove wkAcctNbr Exit SubRmvAcctErr: Select Case Err.Number Case saerrKeyNF MsgBox "Account does not exist. " & Err.Number, vbOKOnly Case saerrnzbal MsgBox Err.Description, vbOKOnly Case Else MsgBox "Unexpected Error! " & Err.Number & " " & Err.Description, vbInformation End SelectEnd Sub
This calls the Remove in the SavAcctDBI which removes the account and the accompanying transactions.
Using SavAcctDBI Item method gives me a savings account object with this account number.
Private Sub cmdSetInt_Click() With txtIntRate .Appearance = 1 .BackColor = &H80000005 .BorderStyle = 1 .Locked = False .SetFocus End WithEnd Sub
Private Sub cmdWthDrwl_Click()On Error GoTo WthDrwlErr ans = "" With colSavAccts.Item(wkAcctNbr) .WithDrawal wkTranAmt If ans = "" Then lblClsBal.Caption = .Balance End If wkTranAmt = 0 txtTrnAmt.Text = "" txtTrnAmt.SetFocus End With Exit SubWthDrwlErr: If Err.Number = saerrKeyNF Then MsgBox "Account does not exist.", vbOKOnly Else MsgBox "Unexpected Error!" & vbCrLf & Err.Number & " " & Err.Description & " " & Err.Source, vbInformation End IfEnd Sub
Private Sub Form_Load() Set colSavAccts = New SavAcctDBI Call Initialize_VariablesEnd Sub
Private Sub lstDsplyAcct_Click() Call cmdReset_Click With lstDsplyAcct wkAcctNbr = Left(.List(.ListIndex), 4) End With txtAcctNbr.Text = wkAcctNbr Call cmdRetrvAcct_Click Call cmdDsplyTrans_ClickEnd Sub
Private Sub objSavAcct_InsufficientFunds() ans = MsgBox("Insfficient funds to cover withdrawal!", vbOKOnly)End Sub
Private Sub txtAcctNbr_LostFocus() wkAcctNbr = txtAcctNbr.TextEnd Sub
Private Sub txtIntRate_LostFocus() With txtIntRate .Appearance = 0 .BackColor = &H8000000F .BorderStyle = 0 .Locked = True wkIntRate = .Text End WithEnd Sub
Database rather than collection!
Private Sub txtTrnAmt_LostFocus() If txtTrnAmt.Text <> "" Then wkTranAmt = txtTrnAmt.Text End IfEnd Sub
Public Sub Initialize_Variables() wkAcctNbr = "" wkBalance = 0 wkIntRate = 0 wkTranAmt = 0 txtAcctNbr.Text = "" lblOpnBal.Caption = "" lblClsBal.Caption = "" txtIntRate.Locked = False txtIntRate.Text = "" txtIntRate.Locked = True txtTrnAmt.Text = "" cmdDpsit.Enabled = True cmdWthDrwl.Enabled = True cmdReset.Enabled = True
End Sub
Option ExplicitEvent InsufficientFunds()Private strAcctNbr As StringPrivate curBalance As CurrencyPrivate intIntRate As IntegerPrivate colTransactions As TransactionDBI
Public Property Get Balance() As Currency Balance = curBalanceEnd Property
Public Property Let Balance(ByVal vBalance As Currency)Static BalanceSet As Boolean If Not BalanceSet Then curBalance = vBalance BalanceSet = True End IfEnd Property
Public Property Get IntRate() As Integer IntRate = intIntRateEnd Property
Public Property Let IntRate(ByVal vIntRate As Integer) intIntRate = vIntRateEnd Property
We are now dealing with a database rather than a collection.
Public Sub WithDrawal(ByVal vTranAmt As Currency) If curBalance < vTranAmt Then RaiseEvent InsufficientFunds Else curBalance = curBalance - vTranAmt colTransactions.Add strAcctNbr, "WTH", vTranAmt End IfEnd Sub
Public Sub Deposit(ByVal vTranAmt As Currency) curBalance = curBalance + vTranAmt colTransactions.Add strAcctNbr, "DEP", vTranAmt End Sub
Public Property Get AccountNumber() As String AccountNumber = strAcctNbrEnd Property
Public Property Let AccountNumber(ByVal vAcctNbr As String)Static AcctNbrSet As Boolean If Not AcctNbrSet Then strAcctNbr = vAcctNbr AcctNbrSet = True End IfEnd Property
Public Sub PostInterest()Dim IntAmt As Currency IntAmt = curBalance * (IntRate / 100) curBalance = curBalance + IntAmt colTransactions.Add strAcctNbr, "INT", IntAmtEnd Sub
Private Sub Class_Initialize() Set colTransactions = New TransactionDBI' MsgBox "Calling # = " & strAcctNbr, , "SavAcctClass"
End Sub
Public Sub LoadTransactions() colTransactions.LoadRecordSet strAcctNbrEnd Sub
Public Property Get Transactions() As TransactionDBI Set Transactions = colTransactionsEnd Property
Form uses to Get transactions properties (gives outside world access).
Instantiates the DBI. Creates link to Transaction DBI.
TransactionDBI LoadRecordSet method is passed the account number. Creates a record set of only the active savings account transactions.
Returns a reference to the connection.
Option Explicit
Private SavAcctConn As New SavAcctConnectionPrivate SavAcctRS As ADODB.RecordsetPrivate WithEvents retSavAcct As SavAcct
Public Enum SavAcctDBIErrors saerrDupKey = vbObjectError + 512 + 1001 saerrKeyNF = vbObjectError + 512 + 1002 saerrnzbal = vbObjectError + 512 + 1003 saerrInvalidDataType = vbObjectError + 512 + 1004End Enum
Private Sub Class_Initialize()On Error GoTo ClassInitError
Set SavAcctRS = New ADODB.Recordset Dim SavAcctSQL As String SavAcctSQL = "SELECT * FROM SavingsAccounts ORDER BY AcctNum" With SavAcctRS .CursorLocation = adUseClient .CursorType = adOpenDynamic .ActiveConnection = SavAcctConn.Object .LockType = adLockOptimistic .Open SavAcctSQL, , , , adCmdText End WithExit Sub
ClassInitError: Err.Raise Err.Number, "SavAcctDBI-Class_Initialize", Err.Source & vbCrLf & Err.DescriptionEnd Sub
See SavAcctConnection for this.
Private Sub SetUpSavAcct()On Error GoTo SetUpSavAcctError Set retSavAcct = New SavAcct With retSavAcct .AccountNumber = SavAcctRS!AcctNum .IntRate = SavAcctRS!IntRate .Balance = SavAcctRS!Balance .LoadTransactions End With Exit SubSetUpSavAcctError: Err.Raise Err.Number, "SavAcctDBI-SetUpSavAcct", Err.Source & vbCrLf & Err.Description End SubPublic Function Count() As Long Count = SavAcctRS.RecordCountEnd Function
Public Sub Add(ByVal vAcctNbr As String, vIntRate As Integer)On Error GoTo AddError Update retSavAcct With SavAcctRS .AddNew !AcctNum = vAcctNbr !IntRate = vIntRate !Balance = 0 .Update .Requery End With Exit Sub AddError: Err.Raise Err.Number, "SavAcctDBI-Add", Err.Source & vbCrLf & Err.DescriptionEnd Sub
Sets up a new SavAcct object from a savings account in the database.
Counts the number of records in the savings account table in the database.
This updates the existing record that has just been used prior to setting up the new account.
Puts the passed data into fields. Use ! To designate fields of the recordset.
This is an update of the database with the data just setup. The Requery updates the recordset and in this process puts it into order (the additions were done at the end).
Public Sub Remove(vAcctNbr)On Error GoTo RemoveError: Update retSavAcct Set retSavAcct = Nothing With SavAcctRS .MoveFirst .Find "AcctNum ='" & vAcctNbr & "'" If .EOF Then Err.Raise saerrKeyNF, "SavAcctDBI", "Saving Account does not exists" ElseIf !Balance = 0 Then Dim DeleteTranSQL As String DeleteTranSQL = "DELETE FROM Transactions WHERE AcctNum = '" & _ vAcctNbr & "'" SavAcctConn.Object.Execute DeleteTranSQL, , adCmdText .Delete .MoveFirst If Not .BOF Then .Requery End If Else Err.Raise saerrnzbal, "SavAcctDBI", "Saving Account has a non-zero balance. Cannot delete." End If End With Exit SubRemoveError: Err.Raise Err.Number, "SavAcctDBI-Remove", Err.Source & vbCrLf & Err.DescriptionEnd SubPrivate Sub Class_Terminate() Set SavAcctRS = Nothing Set retSavAcct = Nothing Set SavAcctConn = NothingEnd Sub
If not empty database.
Deletes the transactions associated with the account.
Deletes from the SavAcctRS.
Public Function Item(vKeyIndex As Variant) As SavAcct
On Error GoTo ItemError Update retSavAcct With SavAcctRS If VarType(vKeyIndex) = vbLong Then .Move vKeyIndex, adBookmarkFirst If .EOF Then Set Item = Nothing Else Call SetUpSavAcct Set Item = retSavAcct End If ElseIf VarType(vKeyIndex) = vbString Then .MoveFirst .Find "AcctNum ='" & vKeyIndex & "'" If .EOF Then Set Item = Nothing Err.Raise saerrKeyNF, "SavAcctDBI", "Saving Account does not exist" Else Call SetUpSavAcct Set Item = retSavAcct End If Else Err.Raise saerrInvalidDataType, "SavAcctDBI", "KeyIndex is not a String or Long Data Type" End If End With Exit Function
ItemError: Err.Raise Err.Number, "SavAcctDBI-Item", Err.Source & vbCrLf & Err.Description End Function
Is sent a field that is either a key or an index.
Returns SavAcct object.
Setting up the SavAcct that was asked for by transferring values into a savings account object.
Returns the SavAcct.
Private Sub Update(vSavAcct As SavAcct)
On Error GoTo UpdateError
If vSavAcct.AccountNumber <> "" Then With SavAcctRS .MoveFirst .Find "AcctNum ='" & vSavAcct.AccountNumber & "'" If .EOF Then Err.Raise saerrKeyNF, "SavAcctDBI-Update", "Saving Account '" & vSavAcct.AccountNumber & "' does not exists" Else !Balance = vSavAcct.Balance !IntRate = vSavAcct.IntRate .Update .Requery End If End With End If
Exit Sub
UpdateError:
If Err.Number <> 91 Then Err.Raise Err.Number, "SavAcctDBI-Update", Err.Source & vbCrLf & Err.Description End If
End Sub
Option Explicit
Private SavAcctConn As New SavAcctConnectionPrivate TransactionRS As ADODB.RecordsetPrivate retTransaction As Transaction
Public Enum TransactionDBIErrors trnerrDupKey = vbObjectError + 512 + 2001 trnerrKeyNF = vbObjectError + 512 + 2002 trnerrInvalidDataType = vbObjectError + 512 + 2004End Enum
Private Sub Class_Initialize() Set TransactionRS = New ADODB.RecordsetEnd Sub
Private Sub Class_Terminate() Set TransactionRS = Nothing Set retTransaction = Nothing Set SavAcctConn = NothingEnd Sub
Public Function Item(ByVal vKeyIndex As Variant) As TransactionOn Error GoTo ItemError
With TransactionRS If VarType(vKeyIndex) = vbLong Then .Move vKeyIndex, adBookmarkFirst If .EOF Then Set Item = Nothing Err.Raise trnerrKeyNF, "TransactionDBI", "Transaction does not exist" Else Call SetUpTran Set Item = retTransaction End If ElseIf VarType(vKeyIndex) = vbString Then .MoveFirst .Find "TranNbr ='" & vKeyIndex & "'" If .EOF Then Set Item = Nothing Err.Raise trnerrKeyNF, "TransactionDBI", "Transaction does not exist" Else Call SetUpTran Set Item = retTransaction End If Else Err.Raise trnerrInvalidDataType, "TransactionDBI", "KeyIndex is not a String or Long Data Type" End If End With Exit FunctionItemError: Err.Raise Err.Number, "TransactionDBI-Item", Err.Source & vbCrLf & Err.DescriptionEnd Function
Private Sub SetUpTran() Set retTransaction = New Transaction With retTransaction .AccountNumber = TransactionRS!AcctNum .TransactionNumber = TransactionRS!TranNbr .TransactionType = TransactionRS!TranType .TransactionAmount = TransactionRS!TranAmt End WithEnd Sub
Public Function Count() As Long Count = TransactionRS.RecordCountEnd Function
Public Sub Add(ByVal vAcctNbr As String, vTranType As String, vTranAmt As Currency)On Error GoTo AddError
Dim TranNbr As String TranNbr = Right(Format(100000 + Count + 1), 5) With TransactionRS .AddNew !AcctNum = vAcctNbr !TranNbr = TranNbr !TranType = vTranType !TranAmt = vTranAmt .Update End With Exit SubAddError: Err.Raise Err.Number, "TransactionDBI-Add", Err.Source & vbCrLf & Err.DescriptionEnd Sub
Public Sub LoadRecordSet(vAcctNum As String)
On Error GoTo LoadRecSetError
Dim TransactionsSQL As String TransactionsSQL = "SELECT * FROM Transactions " & _ "WHERE AcctNum = '" & vAcctNum & "' " & _ "ORDER BY TranNbr" With TransactionRS .CursorLocation = adUseClient .CursorType = adOpenDynamic .ActiveConnection = SavAcctConn.Object .LockType = adLockOptimistic .Open TransactionsSQL, , , , adCmdText End With Exit Sub
LoadRecSetError:
Err.Raise Err.Number, "TransactionDBI-LoadRecordSet", Err.Source & vbCrLf & Err.Description
End Sub
See Class_Initialize() on next slide.
Item is passed the wkAcctNbr and after processing objSavAcct is set to this account.
Retrieve AccountRetrieve Account
If you are using the index, you will use this code to get to the first record.
See next slide and return
Advance two slides to see the code and then return.
Update retSavAcctUsing the record set, we move to the first and then find the account # that matches the account number of the passed savings account.
If the record was found we update the record with the Balance and IntRate that were passed with the savings account and then requery to establish the order.
Call SetUpSavAcct
See code on next slide.
Option ExplicitDim WithEvents objSavAcct As SavAcctDim colSavAccts As SavAcctDBI
Add AccountAdd Account
Option Explicit
Private SavAcctConn As New SavAcctConnectionPrivate SavAcctRS As ADODB.RecordsetPrivate WithEvents retSavAcct As SavAcct The passed account
number and interest rate are received.
See the update sub on the next slide. (retSavAcct is passed to the Update) - then return to this slide.
Public Sub Add(ByVal vAcctNbr As String, vIntRate As Integer)On Error GoTo AddError Update retSavAcct Using the record set, we move to the first and then find the
account # that matches the account number of the passed savings account.
If the record was found we update the record with the Balance and IntRate that were passed with the savings account and then requery to establish the order.
Remove AccountRemove Account
Receives the account number passed from the remove on the form.
“The Nothing keyword is used to disassociate an object variable from an actual object. Use the Set statement to assign Nothing to an object variable.’ from Microsoft VB Help
Display AccountsDisplay Accounts
Clear is a method associated with the list box, lstDsplyAcct.
Private SavAcctRS As ADODB.Recordset
From SavAcctDBI
Once I have the objDsplyAcct, I can set up the display line and put it in the list box using AddItem.
vKeyIndex is vbLong so it is an index.
retSavAcct is used in Set Item.
SavingsAccounts
Table
TransactionsTable
DATABASE SAVACCTDBISAVACCTAccountNumberBalanceIntRate
TransactionDBI
When you select an item in a list box, the ListIndex gets set to the index of that item. I then go to the lstDsplyAcct.List and get the right line using the index and take the first four characters from that line (account numbers are 4 digits).
The user clicked on the 7777 savings account in the savings account list box and immediately the transactions associated with that transaction appeared in the transaction list box.
The set is because you are passing a reference to an object and the object is colTransactions which has been defined as TransactionDBI.
With colSavAccts.Item(wkAcctNbr).Transactions
retSavAcct is used in Set Item.
DepositDeposit
colSavAccts.Item(wkAcctNbr.Deposit wkTranAmt handles the deposit.
If for example this Item method is executed after the deposit, the update will be done and the deposit will be credited to the account.
The Update retSavAcct code has been added to fix an error - it does not appear in previous views of this code.