34
1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

Embed Size (px)

Citation preview

Page 1: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

1

All Powder Board and Ski

Microsoft Access WorkbookChapter 7: Integrity and TransactionsJerry PostCopyright © 2003

Page 2: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

2

Compute Sales Tax

Sales Tax

From Figure 6.17

Page 3: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

3

Create Access Code Module

New Module

Visual Basic Editor

Application code

Page 4: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

4

Add Event Code to the Sales Form

Right click and Build Code

Choose the Enter event

Call the new function

Page 5: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

5

Debugging

Set a break point

Use F8 to step through the code

Roll the cursor over a variable to see its current value

Page 6: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

6

Adding QuantityOnHand to Subform

Right click to set properties

Build query to add QuantityOnHand

Drag QOH from Field List box onto form

Page 7: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 8: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

8

Main Control Events

32

32

131

131

131

131

Enter

GotFocus

Change: keystrokes

Exit

BeforeUpdate

AfterUpdate

time

control event

131 LostFocus

Page 9: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

9

First Attempt: QOH Code

Private Sub QuantitySold_AfterUpdate() Me.Refresh ‘ Save data for new rows QuantityOnHand = QuantityOnHand - QuantitySoldEnd Sub

Page 10: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 11: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 12: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 13: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 14: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 15: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 16: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

16

Transactions for Discounts

New table

Page 17: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

17

Rental Form

Button to open discount form

Page 18: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 19: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 20: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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 & "')"

Page 21: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 22: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

22

Query for Cursor: Weekly Sales

Val(Format([SaleDate],”ww”))

Page 23: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

23

Form to Compute Average Increase

Page 24: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 25: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 26: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

26

Generate Sale Form

IDs and SKU would be scanned, but to test code, set default values

Page 27: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 28: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 29: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 30: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

30

Lock Test Form

Combo box to select customer

Page 31: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

31

CustomerLock Test Form

Page 32: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 33: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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

Page 34: 1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry Post Copyright © 2003

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