フォームを作成したいのは基本的に請求書を作成しますが、他の関連するデータを入力または制限として使用します。請求書にアイテムを追加する際に、別のテーブルのアイテムを減らす必要があります。ユーザーは一度に複数の項目を入力するので、フォームのロード時には「START TRANSACTION」を発行し、フォームが更新されると「COMMIT」を実行します。したがって、フォームをキャンセルすると、他の関連テーブル(サブフォームを介して表示)は以前の値にロールバックされます。Accessフォームをトランザクションでラップすることはできますか?
答えて
バインドフォームを使用して行うことはできません。テンポラリ・テーブルを使用してデータを格納し、メイン・テーブルを更新することができます。 kludgeのビットが、私は過去にそれをやった。
アプリで一時的にMDBを使用する方法を示しTempTables.MDB page at my websiteを参照してください。
はい、あなたがこのコードを使う必要がある形式でトランザクションの制御を取るために、行うことができます。その後
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を使用することができます変更を元に戻す。
フォームのレコードセットをコードで作成されたレコードセットに設定することは問題になります。また、デフォルト以外のワークスペースで初期化されたデータベースオブジェクトを使用する必要があるので、私はあなたの提案がどのように機能するか分かりません。私はまた、CurrentDB.OpenRecordset()を直接使用することに懐疑的です - 暗黙的な参照の問題のためのオープンな招待状、または壊れたレコードセットのように見えます。 –
私は、バインドされたフォームにそれを持っているために、その可能性を、それを考え出しました。親コントロールのいずれかの変更イベントに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. PostgreSQLのトランザクションでDDLの変更をラップすることはできますか?
- 2. MS Accessのフォームからクエリを印刷することはできますか?
- 3. WinForms TreeViewでノードテキストをラップすることはできますか?
- 4. Reveal.jsをSCORMでラップすることはできますか?
- 5. 長いファイル名をラップすることはできますか?
- 6. カスタムデスクトップアプリケーションをドッカーコンテナにラップすることはできますか?
- 7. これはMicrosoft Accessで行うことができますか?
- 8. MS-Accessフォーム:ガントチャートとダイナミックタイムラインを作成できますか?
- 9. Accessマクロを別のAccessデータベースで使用するアドインとして保存することはできますか?
- 10. jQueryイベントでjavascriptイベントをラップすることはできますか?
- 11. FilterOutputStreamを別のFilterOutputStreamでラップすることはできますか?
- 12. 自分のクラスでブーストグラフをラップすることはできますか?
- 13. MVC 3 HTMLヘルパーでWebフォームコントロールをラップすることはできますか?
- 14. Geolocation.watchPosition()などの関数をPromiseでラップすることはできますか?
- 15. Log4Net Log Statementをtry/catchでラップすることはできますか?
- 16. フォームをタブレットで実行することはできますか?
- 17. Derby(JDBC)でトランザクションをコミットする前にトランザクション内の文を閉じることはできますか?
- 18. AccessフォームをSQL Serverビューに接続することは可能ですか
- 19. Accessで再帰クエリを作成することはできますか?
- 20. SharePoint 2010でAccess 2010データベースを使用することはできますか
- 21. トランザクションをコミットする前にSQLプロシージャを返すことはできますか?
- 22. フォームなしでAccessにドロップダウンリストを表示できますか?
- 23. MSDeployは「フレンドリー」か、MSIファイルにラップすることができますか
- 24. RolePrincipalをカスタムIPrincipalオブジェクトにラップすることはできますか?
- 25. RustにC列挙型をラップすることはできますか?
- 26. MS Accessの行をPowerShellから更新することはできますか?
- 27. 並列ネストされたトランザクションを実行することはできますか?
- 28. ラップSQL文トランザクション
- 29. Djangoフォームを使わずにフォームをビルドすることはできますか?
- 30. #+ BIND:ラップできますか?
厄介な、唯一の答えであるように思われます。 – DGM