1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry...
-
Upload
trinity-hicks -
Category
Documents
-
view
219 -
download
1
Transcript of 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry...
1
All Powder Board and Ski
Microsoft Access WorkbookChapter 7: Integrity and TransactionsJerry PostCopyright © 2007
2
Compute Sales Tax
Sales Tax
From Figure 6.17
3
Action
ActionCreate a new moduleAt the top add: Option ExplicitAdd the function ComputeSalesTaxUse Debug/Compile to find errorsClose the module
4
Create Access Code Module
New Module
Visual Basic Editor
Application code
5
Action
ActionEdit the Sale form in Design viewRight click the SalesTax box and select the Build Code optionSelect the Enter eventAdd the line: SalesTax = ComputeSalesTax(Subtotal)Run the formClick on the SalesTax box to test the calculation
6
Add Event Code to the Sales Form
Right click and Build Code
Choose the Enter event
Call the new function
7
Debugging
Set a break point
Use F8 to step through the code
Roll the cursor over a variable to see its current value
8
Action
ActionOpen the SaleItem subform in Design viewOpen the form properties and modify the Record Source query to add the QuantityOnHand columnView the Field List boxDrag QuantityOnHand onto the formRun the form and improve the layout
9
Adding QuantityOnHand to Subform
Right click to set properties
Build query to add QuantityOnHand
Drag QOH from Field List box onto form
10
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
11
Main Control Events
32
32
131
131
131
131
Enter
GotFocus
Change: keystrokes
Exit
BeforeUpdate
AfterUpdate
time
control event
131 LostFocus
12
Action
ActionEdit the SaleItem subform in Design viewRight click the QOH box and build codeSelect the AfterUpdate eventAdd code to refresh the row and subtract QuantitySold from QuantityOnHandTest the form
13
First Attempt: QOH Code
Private Sub QuantitySold_AfterUpdate() Me.Refresh ‘ Save data for new rows QuantityOnHand = QuantityOnHand - QuantitySoldEnd Sub
14
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
15
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
16
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
17
Action
ActionOpen the SaleItem subform in Design viewChoose View/CodeAdd and modify the code as specified to handle changes in quantityTest the form
18
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
19
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
20
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
21
Action
ActionOpen the SaleItem subform in Design viewAdd the oldSKU variableAdd the SKU event code as describedPlace a breakpoint in the code before the Execute lineTest the form by changing an SKU numberExamine the sql line before it runsAdd the delete code as shownTest multiple changes to validate the code
22
Transactions for Discounts
New table
23
Rental Form
Button to open discount form
24
Action
ActionCreate the Rental Discount form in Design viewAdd the text boxes and buttonSave the formOpen the Rental form in Design viewAdd a button to open the Discount formModify the open code as indicatedRun the form and test the button
25
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
26
Action
ActionOpen the Rental Discount form in Design viewAdd the specified code to the button click eventTest the forms
27
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
28
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 & "')"
29
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
30
Action
ActionCreate a new query in Design viewTables: Sale and SaleItemCreate column SaleWeek: Val(Format([SaleDate],”ww”))Create column Value: [QuantitySold]*[SalePrice])Sum the Value column
31
Query for Cursor: Weekly Sales
Val(Format([SaleDate],”ww”))
32
Action
ActionCreate a new form in Design viewAdd a button Add a text box named txtAverageAdd the specified code to the buttonRun the form and test the codePlace a breakpoint and step through the code as it runs
33
Form to Compute Average Increase
34
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
35
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
36
Action
ActionCreate a new form in Design viewAdd boxes for CustomerID, EmployeeID, SKU, and
txtSaleID as the generated keyCreate a command button and add the indicated codeTest the formPlace a breakpoint at the top of the code and step
through the code
37
Generate Sale Form
IDs and SKU would be scanned, but to test code, set default values
38
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
39
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
40
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
41
Action
ActionCreate a new form in Design viewAdd a combo box to select customersAdd a text box to enter a new ZIP CodeCreate a button and add the indicated code for itTest the form
42
Lock Test Form
Combo box to select customer
43
Action
ActionCreate a CustomerLocks form as a datasheet into the
Customer tableRun the formEdit a ZIP Code but do not leave the cellSwitch to the new form and run it for the same CustomerIDReturn to the table and press the Tab key
44
CustomerLock Test Form
45
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
46
Action
ActionSwitch to design view on the change form and add
the specified error-handling codeOpen the CustomerLocks form in Design view and
set the Record Locks property to Edited RecordRun both formsChange a ZIP Code in CustomerLocksEnter a new ZIP Code in the change form for the
same customer
47
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
48
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