基本的に請求書を作成するフォームを作成したいのですが、他の関連データを入力または制限として使用します。請求書にアイテムを追加する過程で、別のテーブルのアイテムを削減する必要があります。ユーザーは一度に複数の項目を入力するので、フォームがロードされたときに「START TRANSACTION」を発行し、フォームが更新されたときに「COMMIT」を実行したいと思います。したがって、フォームをキャンセルすると、他の関連テーブル (サブフォームを介して表示) は以前の値にロールバックされます。
2318 次
3 に答える
3
バインドされたフォームを使用して行うことはできません。一時テーブルを使用してデータを保存し、メイン テーブルを更新できます。少し面倒ですが、私は過去にそれをしました。
アプリで一時的な MDB を使用する方法を示す、私の Web サイトの TempTables.MDB ページを参照してください。
于 2009-07-12T23:40:16.663 に答える
1
はい、可能です。必要な形式でトランザクションを制御するには、次のコードを使用します。
Private Sub Form_Open(整数でキャンセル) Set Me.Recordset = CurrentDb.OpenRecordset("NAME_OF_YOUR_TABLE_OR_QUERY") サブ終了
その後、DBEngine を使用してトランザクションを制御できます。
それは私のために働きます(私はAccess 2007を使用しています)
注: フォーム インターフェイスを使用して新しいレコードを挿入すると、Form_AfterInsert イベントが発生したときに表示されるため、そのイベントで DbEngine.Rollback を使用して変更を元に戻すことができます。
于 2010-11-03T13:17:32.233 に答える
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
于 2014-09-24T18:04:19.837 に答える