2009-07-12 59 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 
相关问题