我想製作一份表格,主要是創建一張發票,但使用其他相關數據作爲輸入或限制;在將項目添加到發票的過程中,我需要減少另一個表中的項目。由於用戶一次輸入多個項目,因此我想在窗體加載時發出「START TRANSACTION」,然後在窗體更新時執行「COMMIT」。因此,如果他們取消表單,其他相關表(通過子表單顯示)將回滾到以前的值。我可以用交易包裝Access表單嗎?
1
A
回答
2
無法使用綁定表單完成。您可以使用臨時表來存儲數據,然後更新主表。有點混亂,但我過去做過。
請參閱TempTables.MDB page at my website,它說明了如何在您的應用程序中使用臨時MDB。
1
是的,它可以做到,採取控制在你需要使用這個代碼的形式交易:
Private Sub Form_Open(Cancel As Integer) Set Me.Recordset = CurrentDb.OpenRecordset("NAME_OF_YOUR_TABLE_OR_QUERY") End Sub
之後,您可以使用用到dbengine來控制交易。
它爲我工作(即時通訊使用Access 2007年)
注:如果您使用表單界面時提出的Form_AfterInsert事件它是可見插入一個新的記錄,因此,你可以在事件中使用DbEngine.Rollback撤銷更改。
+1
將表單的記錄集設置爲在代碼中創建的記錄集可能會有問題。另外,我不明白你的建議是如何工作的,因爲你需要使用一個數據庫對象,該數據庫對象使用非默認的工作區進行初始化。我也懷疑直接使用CurrentDB.OpenRecordset() - 看起來像是對隱式引用問題的公開邀請,或者是一個破損的記錄集。 – 2010-11-03 19:46:47
0
我已經想通了它有可能在綁定的形式。您需要爲任何父級控件的change事件分配包含ID號的變量。比您需要將該ID值傳輸到子窗體連接字段並在主窗體和子窗體上執行事務。這是我如何做的例子。
Primary Form VBA
Option Compare Database
Option Explicit
Private boolFrmDirty As Boolean
Private boolFrmSaved As Boolean
Private Sub EmpolyeesID_Change()
Dim ordID As Integer
Dim subFormOrdID As Object
Set subFormOrdID = Forms!Order.OrderInstallation.Form!OrderID
ordID = Me.Form!OrderID
subFormOrdID.DefaultValue = ordID
End Sub
Private Sub Form_AfterDelConfirm(Status As Integer)
If Me.Saved = False Then Me.Saved = (Status = acDeleteOK)
End Sub
Private Sub Form_AfterUpdate()
Me.Saved = True
End Sub
Private Sub Form_Delete(Cancel As Integer)
If Me.Dirtied = False Then DBEngine.BeginTrans
Me.Dirtied = True
End Sub
'Check if form has got new values in it
Private Sub Form_Dirty(Cancel As Integer)
If Me.Dirtied = False Then DBEngine.BeginTrans
Me.Dirtied = True
End Sub
'Open Form as a Record Set and set the variables for it
Private Sub Form_Open(Cancel As Integer)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM Orders", dbOpenDynaset, dbAppendOnly)
Set Me.Recordset = rs
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim msg As Integer
If Me.Saved Then
msg = MsgBox("Do you want to commit all changes?", vbYesNoCancel)
Select Case msg
Case vbYes
DBEngine.CommitTrans
Case vbNo
DBEngine.Rollback
Case vbCancel
Cancel = True
End Select
Else
If Me.Dirtied Then DBEngine.Rollback
End If
End Sub
Public Property Get Dirtied() As Boolean
Dirtied = boolFrmDirty
End Property
Public Property Let Dirtied(boolFrmDirtyIn As Boolean)
boolFrmDirty = boolFrmDirtyIn
End Property
Public Property Get Saved() As Boolean
Saved = boolFrmSaved
End Property
Public Property Let Saved(boolFrmSavedIn As Boolean)
boolFrmSaved = boolFrmSavedIn
End Property
Private Sub ProductID_AfterUpdate()
'Calculations of VAT and Floor Price
Dim clcVAT As Integer
Dim sqlQry As String
Dim instID As Integer
instID = Me.Form!ProductID.Value
sqlQry = "SELECT Products.Price FROM Products WHERE Products.ProductID =" & instID & ""
Me.flPrice.RowSource = sqlQry
End Sub
Sub Form VBA
Option Compare Database
Option Explicit
'Transaction for sub-form
Private Sub Form_Open(Cancel As Integer)
Dim db As DAO.Database
Dim rs As DAO.Recordset
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT * FROM OrderInstallation")
Set Me.Recordset = rs
End Sub
Private Sub Form_AfterUpdate()
Dim emplID As Object
Dim cstmID As Object
Dim prdcID As Object
Dim DataArray As Variant
Dim RqrdFieldErorr As String
Dim qry As String
Set emplID = Me.Parent!EmpolyeesID
Set cstmID = Me.Parent!CustomerID
Set prdcID = Me.Parent!ProductID
If IsNull(emplID.Value) Or IsNull(cstmID.Value) Or IsNull(prdcID.Value) Then
MsgBox ("Please enter select required fields first")
Else
End If
End Sub
'Restrict updates of Installation subform if Employee, Customer and Product is not selected
Private Sub InstallationID_AfterUpdate()
Dim instID As Integer
Dim instPrice As Integer
Dim strQry As String
' Create query based on InstallationID value
instID = InstallationID.Value
strQry = "SELECT Installation.Price, Installation.InstallationID FROM Installation WHERE Installation.InstallationID =" & instID & ""
Me.Price.RowSource = strQry
End Sub
相關問題
- 1. 我們在MS-Access中有交易嗎?
- 2. 我可以使用socket.io進行簡單交易嗎?
- 3. 我可以用Python包裝USB棒嗎?
- 4. PHP:我可以使用AJAX在表單中提交表單嗎?
- 5. 我可以使用提交按鈕和JS提交表單嗎?
- 6. 包裝MySQL的交易
- 7. 我可以在交易處理器上使用JavaScript庫嗎?
- 8. 我們可以使用UI進行交易嗎?WEB VIEW iOS
- 9. PayPal交易可以包含第三方嗎?
- 10. 以太坊中的單個錢包有交易隊列嗎?
- 11. 我可以使用eBay API獲取eBay訂單的PayPal交易ID嗎?
- 12. 在提交表單之前,我可以等待$ .get()調用嗎?
- 13. 我們可以使用reportlab創建交互式PDF表單嗎?
- 14. 我可以使用php提交ckEditor textarea的表單嗎?
- 15. 我可以讓Postgresql忽略交易中的錯誤嗎?
- 16. 我可以在主要交易中打開新的連接嗎?
- 17. 我可以在內部進行交易關閉嗎
- 18. 我可以使用GROUP BY在UPDATE表MySQL的交易
- 19. 在交易中包裝交易存儲過程
- 20. Scrapy可以用作實時包裝嗎?
- 21. IntelliJ可以使用Grails包裝嗎?
- 22. MS Access中的交易
- 23. 我可以在提交時添加隱藏的表單域嗎?
- 24. 我可以觸發控制器提交的表單嗎?
- 25. 我可以在使用參考交易時更改信用卡嗎?
- 26. 可以多個表單提交id可以相同嗎?
- 27. 我可以攔截表單提交數據以與AJAX一起使用嗎?
- 28. 使用Firebase提交簡單表單;我可以在離線時檢測嗎?
- 29. PayPal沙箱可以「收取」交易費用嗎?
- 30. PayPal交易完成後可以使用PayPal發票嗎?
討厭的,但它似乎是唯一的答案。 – DGM 2009-08-19 23:43:51