1 All Powder Board and Ski Microsoft Access Workbook Chapter 7: Integrity and Transactions Jerry...

Preview:

Citation preview

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

Recommended