2009-07-12 83 views
1

我想製作一份表格,主要是創建一張發票,但使用其他相關數據作爲輸入或限制;在將項目添加到發票的過程中,我需要減少另一個表中的項目。由於用戶一次輸入多個項目,因此我想在窗體加載時發出「START TRANSACTION」,然後在窗體更新時執行「COMMIT」。因此,如果他們取消表單,其他相關表(通過子表單顯示)將回滾到以前的值。我可以用交易包裝Access表單嗎?

回答

2

無法使用綁定表單完成。您可以使用臨時表來存儲數據,然後更新主表。有點混亂,但我過去做過。

請參閱TempTables.MDB page at my website,它說明了如何在您的應用程序中使用臨時MDB。

+0

討厭的,但它似乎是唯一的答案。 – DGM 2009-08-19 23:43:51

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 
相關問題