我想制作一份表格,主要是创建一张发票,但使用其他相关数据作为输入或限制;在将项目添加到发票的过程中,我需要减少另一个表中的项目。由于用户一次输入多个项目,因此我想在窗体加载时发出“START TRANSACTION”,然后在窗体更新时执行“COMMIT”。因此,如果他们取消表单,其他相关表(通过子表单显示)将回滚到以前的值。我可以用交易包装Access表单吗?
1
A
回答
2
无法使用绑定表单完成。您可以使用临时表来存储数据,然后更新主表。有点混乱,但我过去做过。
请参阅TempTables.MDB page at my website,它说明了如何在您的应用程序中使用临时MDB。
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
相关问题
- 1. 我可以用Python包装USB棒吗?
- 2. PHP:我可以使用AJAX在表单中提交表单吗?
- 3. 我可以在交易处理器上使用JavaScript库吗?
- 4. 以太坊中的单个钱包有交易队列吗?
- 5. PayPal交易可以包含第三方吗?
- 6. 我可以使用eBay API获取eBay订单的PayPal交易ID吗?
- 7. 我们可以使用reportlab创建交互式PDF表单吗?
- 8. 在提交表单之前,我可以等待$ .get()调用吗?
- 9. 我可以在主要交易中打开新的连接吗?
- 10. 我可以让Postgresql忽略交易中的错误吗?
- 11. MS Access中的交易
- 12. 我可以在提交时添加隐藏的表单域吗?
- 13. 可以多个表单提交id可以相同吗?
- 14. 使用Firebase提交简单表单;我可以在离线时检测吗?
- 15. 我可以在提交表单时停止Drupal重新创建表单吗?
- 16. 使用InstallShield,我可以自签署安装包吗?
- 17. 我可以用另一个FilterOutputStream包装FilterOutputStream吗?
- 18. 我可以避免使用此Flexbox包装纸吗?
- 19. 我可以使用ADO NET实体数据模型创建交易吗?
- 20. 我们可以提交没有提交按钮的PDF表单吗?
- 21. 包装可能吗?
- 22. 当npm包可以重复安装吗?
- 23. 我可以交换文本区域中的单个单词吗?
- 24. @交易方面的建议可能吗?
- 25. 我可以粘贴到Access表中的整个选择吗?
- 26. 安装问题VS .NET 2005 - 我可以提交吗?
- 27. 我可以做到这一点吗,点击单选按钮不提交表单?
- 28. PHP适用于非常大的项目吗?它可以交易安全吗?
- 29. 我可以让用户提交表单并收到PDF副本吗?
- 30. 我可以使用单选按钮列表作为提交按钮吗?
讨厌的,但它似乎是唯一的答案。 – DGM 2009-08-19 23:43:51