List 5-8 プロシージャとして実装した例
1: Public Sub acceptOrder(ByVal ProductID As Long, _
ByVal CustomerName As String, _
ByVal Number As Long)
2: '受注を受けるメソッド
3: 'ProductID = 製品ID(在庫テーブルのIDフィールドの値)
4: 'CustomerName = 受注者名
5: 'Number = 受注する数
6: Dim objCon As ADODB.Connection
7: Dim objRec As ADODB.Recordset
8: Dim Stock As Long
9:
10:
11: 'コネクションオブジェクトの作成
12: Set objCon = CreateObject("ADODB.Connection")
13:
14: 'データベースを開く
15: objCon.Open "Driver=SQL Server; Server=(local); UID=sa;" & _
" Database=dbsample"
16:
17:
18: 'トランザクション開始
19: objCon.BeginTrans
20:
21: 'エラーハンドラの設定
22: On Error GoTo ErrorHandler
23:
24: '在庫テーブルを開き,指定されたテーブルの在庫を取得する
25: Set objRec = objCon.Execute("SELECT STOCK FROM 在庫テーブル" & _
" WHERE ID=" & ProductID)
26: If objRec.EOF Then
27: '指定された製品が見つからない
28: Err.Raise 1 + 513 + vbObjectError, "acceptOrder", _
"指定された製品は見つかりません"
29: End If
30:
31: '在庫を取得
32: Stock = objRec.Fields("STOCK")
33:
34: 'レコードセットを閉じて破棄
35: objRec.Close
36: Set objRec = Nothing
37:
38: '在庫が足りるかを確認
39: Stock = Stock - Number
40: If Stock < 0 Then
41: '在庫が足りない
42: Err.Raise 2 + 513 + vbObjectError, "acceptorder", _
"在庫が足りません"
43: End If
44:
45: '在庫を減らす
46: objCon.Execute "UPDATE 在庫テーブル SET STOCK=" & Stock & _
" WHERE ID=" & ProductID
47:
48:
49: '受注レコードを書く
50: objCon.Execute "INSERT INTO 受注テーブル" & _
" (DATE, CUSTOMERNAME, PRODUCTID, NUMBER)" & _
" VALUES ('" & Now() & "'," & "'" & CustomerName & _
"'," & ProductID & "," & Number & ")"
51:
52: 'トランザクションをコミット
53: objCon.CommitTrans
54:
55: 'エラーハンドラを無効化
56: On Error GoTo 0
57:
58: 'コネクションを閉じて破棄
59: objCon.Close
60: Set objCon = Nothing
61:
62: Exit Sub
63:
64: ErrorHandler:
65: 'エラーハンドラ
66: 'エラーが発生したときにはロールバックする
67: objCon.RollbackTrans
68: objCon.Close
69: MsgBox Err.Description
70: End Sub