2009-07-12 15 views
1

フォームを作成したいのは基本的に請求書を作成しますが、他の関連するデータを入力または制限として使用します。請求書にアイテムを追加する際に、別のテーブルのアイテムを減らす必要があります。ユーザーは一度に複数の項目を入力するので、フォームのロード時には「START TRANSACTION」を発行し、フォームが更新されると「COMMIT」を実行します。したがって、フォームをキャンセルすると、他の関連テーブル(サブフォームを介して表示)は以前の値にロールバックされます。Accessフォームをトランザクションでラップすることはできますか?

答えて

2

バインドフォームを使用して行うことはできません。テンポラリ・テーブルを使用してデータを格納し、メイン・テーブルを更新することができます。 kludgeのビットが、私は過去にそれをやった。

アプリで一時的にMDBを使用する方法を示しTempTables.MDB page at my websiteを参照してください。

+0

厄介な、唯一の答えであるように思われます。 – DGM

1

はい、あなたがこのコードを使う必要がある形式でトランザクションの制御を取るために、行うことができます。その後

 
Private Sub Form_Open(Cancel As Integer) 
    Set Me.Recordset = CurrentDb.OpenRecordset("NAME_OF_YOUR_TABLE_OR_QUERY") 
End Sub 

は、トランザクションを制御するためには、DBEngineを使用することができます。

それは(アクセス2007を使用してIM)を私のために働く

注:フォームインターフェイスを使用して、新しいレコードを挿入した場合Form_AfterInsertイベントが発生したときにそれが表示され、したがって、あなたはそのイベントでDbEngine.Rollbackを使用することができます変更を元に戻す。

+1

フォームのレコードセットをコードで作成されたレコードセットに設定することは問題になります。また、デフォルト以外のワークスペースで初期化されたデータベースオブジェクトを使用する必要があるので、私はあなたの提案がどのように機能するか分かりません。私はまた、CurrentDB.OpenRecordset()を直接使用することに懐疑的です - 暗黙的な参照の問題のためのオープンな招待状、または壊れたレコードセットのように見えます。 –

0

私は、バインドされたフォームにそれを持っているために、その可能性を、それを考え出しました。親コントロールのいずれかの変更イベントに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 
関連する問題