1 all powder board and ski microsoft access workbook chapter 7: integrity and transactions jerry...
TRANSCRIPT
1
All Powder Board and Ski
Microsoft Access WorkbookChapter 7: Integrity and TransactionsJerry PostCopyright © 2003
2
Compute Sales Tax
Sales Tax
From Figure 6.17
3
Create Access Code Module
New Module
Visual Basic Editor
Application code
4
Add Event Code to the Sales Form
Right click and Build Code
Choose the Enter event
Call the new function
5
Debugging
Set a break point
Use F8 to step through the code
Roll the cursor over a variable to see its current value
6
Adding QuantityOnHand to Subform
Right click to set properties
Build query to add QuantityOnHand
Drag QOH from Field List box onto form
7
Form Events
1) Open 2) Load 3) Resize 4) Activate 5) Current
1233b
a
d
6) Enter
1233b
a
d
7) GotFocus
1233b
a
d
5) Close 4) Deactivate 3) Unload 2) LostFocus
1233b
a
d
1) Exit
1233b
a
d
ControlsForms
Change rows Close a Form
Open a Form
8
Main Control Events
32
32
131
131
131
131
Enter
GotFocus
Change: keystrokes
Exit
BeforeUpdate
AfterUpdate
time
control event
131 LostFocus
9
First Attempt: QOH Code
Private Sub QuantitySold_AfterUpdate() Me.Refresh ‘ Save data for new rows QuantityOnHand = QuantityOnHand - QuantitySoldEnd Sub
10
Problems
What if the clerk entered the wrong value and should have entered 1 instead of 2 units?
Test it, and the code subtracts 1 from the QOH, leaving 7.
You need to add the original 2 units back.
QuantityOnHand = QuantityOnHand – QuantitySold + OldQuantity
11
Clerk Changes SKU
950049 10
950050 10
Enter SKU 950049, Quantity 2 8
Inventory SKU QOH
Change SKU to 950050
Subtract
8
10
Add back to 950049
Subtract for 950050
12
Clerk Changes SKU: Events
Clerk enters original SKU (950049) and Quantity
Code subtracts QuantitySold from QuantityOnHand (10 - 2 = 8)
Clerk changes SKU to new value (950050)
Active row becomes set for new value
Need to subtract QuantitySold from QuantityOnHand for 950050
Need to add QuantitySold back into QuantityOnHand for 950049
Private Sub cboSKU_Enter() If IsNull(cboSKU.Value) Then OldSKU = "-1" Else OldSKU = cboSKU.Value End IfEnd Sub
13
SKU Changes: CodePrivate Sub cboSKU_Enter() If IsNull(cboSKU.Value) Then OldSKU = "-1" Else OldSKU = cboSKU.Value End IfEnd SubPrivate Sub cboSKU_AfterUpdate() If OldSKU <> "-1" And Not IsNull(QuantitySold) Then QuantityOnHand = QuantityOnHand - QuantitySold Dim sql As String sql = "UPDATE Inventory SET QuantityOnHand = QuantityOnHand + " _ & QuantitySold & " WHERE SKU='" & OldSKU & "'" Dim cmd As ADODB.Command Set cmd = CreateObject("ADODB.Command") cmd.ActiveConnection = CurrentProject.Connection cmd.CommandText = sql cmd.Execute End IfEnd Sub
14
Delete CodeDim DelQuantity() As StringDim DelSKU() As StringDim nDel As IntegerPrivate Sub Form_Delete(Cancel As Integer) If IsNull(cboSKU.Value) Or IsNull(QuantitySold) Then Exit Sub If (nDel = 0) Then ReDim DelQuantity(Me.CurrentView) ReDim DelSKU(Me.CurrentView) End If DelSKU(nDel) = cboSKU.Value DelQuantity(nDel) = QuantitySold nDel = nDel + 1End SubPrivate Sub Form_AfterDelConfirm(Status As Integer) Dim i As Integer For i = 0 To nDel - 1 DeleteOneRow DelSKU(i), DelQuantity(i) Next i nDel = 0End Sub
15
Delete Code 2
Private Sub DeleteOneRow(ByVal SKU As String, ByVal Qty As String) Dim sql As String sql = "UPDATE Inventory SET QuantityOnHand = QuantityOnHand + " _ & Qty & " WHERE SKU='" & SKU & "'" Dim cmd As ADODB.Command Set cmd = CreateObject("ADODB.Command") cmd.ActiveConnection = CurrentProject.Connection cmd.CommandText = sql cmd.ExecuteEnd Sub
16
Transactions for Discounts
New table
17
Rental Form
Button to open discount form
18
Rental Discount Form
RentID and Amount are filled in by code on the Rental form
Date default value is set to =Now() This is an unbound form built from
design view with no Record Source
19
Rental Form Code: Discount Button
Private Sub cmdDiscount_Click()On Error GoTo Err_cmdDiscount_Click Dim stDocName As String Dim stLinkCriteria As String
stDocName = "GiveRentDiscount" DoCmd.OpenForm stDocName, , , stLinkCriteria Forms!GiveRentDiscount!txtRentID = RentID Forms!GiveRentDiscount!txtDiscountAmount = SubTotalCharges
Exit_cmdDiscount_Click: Exit Sub
Err_cmdDiscount_Click: MsgBox Err.Description Resume Exit_cmdDiscount_ClickEnd Sub
20
Discount Code
Private Sub cmdDiscount_Click() Dim cmd As ADODB.Command Dim SQL1 As String, SQL2 As String Set cmd = CreateObject("ADODB.Command") cmd.ActiveConnection = CurrentProject.Connection SQL1 = "UPDATE RentItem SET RepairCharges=0 WHERE RentID=" & txtRentID SQL2 = "INSERT INTO RentalDiscount (RentID, DiscountDate, DiscountAmount, Reason)" & _ " VALUES (" & txtRentID & _ ", #" & txtDiscountDate & "#" & _ ", " & txtDiscountAmount & _ ", '" & txtReason & "')"
21
Discount Code Continued
On Error GoTo Err_DiscountTrans cmd.ActiveConnection.BeginTrans cmd.CommandText = SQL1 cmd.Execute cmd.CommandText = SQL2 cmd.Execute cmd.ActiveConnection.CommitTrans lblMessage.Caption = "Changes recorded."
Exit1: Exit Sub
Err_DiscountTrans: cmd.ActiveConnection.RollbackTrans lblMessage.Caption = Err.Description Resume Exit1End Sub
22
Query for Cursor: Weekly Sales
Val(Format([SaleDate],”ww”))
23
Form to Compute Average Increase
24
Code to Compute Average Increase
Dim rst As ADODB.Recordset Set rst = CreateObject("ADODB.Recordset") Dim SQL As String SQL = "SELECT SaleWeek, [Value] FROM qryWeeklySales" rst.Open SQL, CurrentProject.Connection, adOpenStatic, adLockReadOnly Dim avg1 As Double, n As Integer Dim prior As Currency prior = -1 Do Until rst.EOF If (prior > 0) Then avg1 = avg1 + (rst("Value") - prior) / prior n = n + 1 End If prior = rst("Value") rst.MoveNext Loop rst.Close Me.txtAverage = avg1 / n
Open the SQL statement or table
Skip the first week because there is no prior value
Compute the percent change and keep a running total
Save the current value and move to the next row
25
Keys: Create Sales and Items (barcode)
Customer ID card is scanned
Create new sale
Scan an item
Save sale item, update QOH and totals
Repeat until done (payment key)
Get SaleID
Save SaleID, SKU, Quantity
26
Generate Sale Form
IDs and SKU would be scanned, but to test code, set default values
27
Generate Sale Code-1
Dim sqlSale As String, sqlItem As String, sqlSaleItem As String Dim rstSale As ADODB.Recordset, rstModel As ADODB.Recordset Dim rstSaleItem As ADODB.Recordset Set rstSale = CreateObject("ADODB.Recordset") Set rstModel = CreateObject("ADODB.Recordset") Set rstSaleItem = CreateObject("ADODB.Recordset") sqlSale = "SELECT SaleID, CustomerID, EmployeeID, SaleDate FROM Sale" sqlItem = "SELECT ModelID, ListPrice FROM Inventory INNER JOIN “ & _
“ItemModel ON Inventory.ModelID = ItemModel.ModelID “ & _“WHERE SKU='" & SKU & "'"
sqlSaleItem = "SELECT SaleID, SKU, SalePrice, QuantitySold FROM SaleItem"
Dim cnn As ADODB.Connection Set cnn = CurrentProject.Connection
28
Generate Sale Code-2
' Get the List Price for the SKU rstModel.Open sqlmodel, cnn, adOpenStatic, adLockReadOnly Dim ListPrice As Currency ListPrice = rstModel("ListPrice") rstModel.Close
' Open the Sale table and create a new sale rstSale.Open sqlSale, cnn, adOpenDynamic, adLockOptimistic Dim SaleID As Long rstSale.AddNew rstSale("SaleDate") = Now rstSale("CustomerID") = CustomerID rstSale("EmployeeID") = EmployeeID SaleID = rstSale("SaleID") rstSale.Update rstSale.Close
29
Generate Sale Code-3
' Add the SKU to the SaleItem table using the new SaleID rstSaleItem.Open sqlSaleItem, cnn, adOpenDynamic, adLockOptimistic rstSaleItem("SaleID") = SaleID rstSaleItem("SKU") = SKU rstSaleItem("SalePrice") = ListPrice rstSaleItem("QuantitySold") = 1 rstSaleItem.Update rstSaleItem.Close
txtSaleID = SaleID
30
Lock Test Form
Combo box to select customer
31
CustomerLock Test Form
32
Optimistic Lock on the Form
Change the ZIP but do not leave the cell
Select the first customer, enter a ZIP code and change it
Switch back here and Tab out of the cell
Error message that value was changed
33
Pessimistic Lock on Forms
Change the ZIP but do not leave the cell
Select the first customer, enter a ZIP code and change it
The change is not made and the error is trapped because the row is locked
34
Handle Optimistic Locks in Code
RetryUpdate: rst.Open SQL, cnn, adOpenDynamic, adLockOptimistic rst("ZIP") = NewZIPCode rst.Update rst.Close
Exit_cmdNewZipCode_Click: Exit Sub
Err_cmdNewZipCode_Click: If (MsgBox(Err.Description, vbRetryCancel) = vbCancel) Then Resume Exit_cmdNewZipCode_Click End If rst.Cancel rst.Requery Resume RetryUpdate