Transações em subform folha de dados no Access
Esta boa pergunta foi postada pelo Ira_boy no Fórum Access (http://forumaccess.com/eve/forums?a=tpc&s=92260328&f=273606921&m=4321067051&r=6791048051#6791048051):
"Estou com um dilema...
Existe a possibilidade de criar formulario continuo sem uma tabela ou consulta de origem ?
Explico.
Tenho o frm_principal e dentro dele dois subformularios um não acoplado e outro com origem de dados a uma consulta.
No primeiro sub eu atualizo os dados na tabela somente no final de todo o tramite, porém no sub2 eu não consigo fazer isso pq eu baseio o sub formulario em uma consulta e qdo eu digito ao passar para o campo de baixo automaticamente é salvo o registro...
Qual é a melhor forma de implantar uma transação tendo em vista essa situação.
Pois qdo alguém finalizar antes de efetivar algum procedimento fico com dados inconsistentes na tabela.
Já pensei em usar consulta exclusão porém gostaria de aprender a utilizar metodos de transação. "
Uma vez que os formulários do Access (a partir da versão 2000) têm a propriedade Recordset, é possível sim abrir uma transação, editar registros do subform (folha de dados, por exemplo), e ter um botão para salvar (Commit) e outro para desfazer as alterações (Rollback), mesmo que o usuário tenha mexido em vários registros diferentes.
Neste código de exemplo, há um formulário principal (TeuForm), um subform folha de dados (TeuSubform), e três botões no form principal: cmdEditar, cmdSalvar e cmdDesfazer.
Posso editar vários registros do subform e só salvar quando clicar no "Salvar", ou desfazer todas as alterações. Há um exemplo anexo (link no final do artigo).
Option Compare Database
Option Explicit
Private Wks As DAO.Workspace
Private blnIsTrans As Boolean
Private Sub Form_Open(Cancel As Integer)
Dim rst As DAO.Recordset
Set Wks = DBEngine.Workspaces(0)
Set rst = Wks.Databases(0).OpenRecordset("SELECT * FROM Table1")
Set Me.TeuSubform.Form.Recordset = rst
Wks.BeginTrans
blnIsTrans = True
Call BloqueiaDesbloqueiaSubform
End Sub
Private Sub cmdEditar_Click()
If blnIsTrans = False Then
Wks.BeginTrans
blnIsTrans = True
Call BloqueiaDesbloqueiaSubform
End If
End Sub
Private Sub cmdSalvar_Click()
If blnIsTrans = True Then
Wks.CommitTrans
blnIsTrans = False
Call BloqueiaDesbloqueiaSubform
End If
End Sub
Private Sub cmdDesfazer_Click()
If blnIsTrans = True Then
Wks.Rollback
blnIsTrans = False
Call BloqueiaDesbloqueiaSubform
End If
End Sub
Private Sub Form_Close()
If blnIsTrans = True Then
If MsgBox("Deseja salvar as alterações?", vbYesNo) = vbYes Then
Wks.CommitTrans
Else
Wks.Rollback
End If
End If
blnIsTrans = False
Set Wks = Nothing
End Sub
Sub BloqueiaDesbloqueiaSubform()
'Bloqueia ou desbloqueia os registros do subform
Me.TeuSubform.Form.AllowAdditions = blnIsTrans
Me.TeuSubform.Form.AllowEdits = blnIsTrans
Me.TeuSubform.Form.AllowDeletions = blnIsTrans
End Sub