Para quem trabalha com formulários acoplados nem sempre é fácil fazer o controle de registros que são, com bastante frequência, gravados sem que o usuário tenha completado as informações de todos os campos. O Resultado, muitas vezes, são tabelas parcialmente preenchidas e dados inconsistentes.
A solução passa por alguns cuidados que o programador deve ter. Nas propriedades do formulário preencha conforme figura abaixo:
Veja que apenas Permitir filetros e edições estão marcadas como sim.
Para controlar a gravação do registro você precisa:
1. Inserir o código abaixo dentro do Evento Antes de Atualizar do formulário.
On Error Resume Next
Dim sConfirma As String
If sGrava <> "N" Then 'se for sim permite gravar normalmente
Else
If Me.Dirty = True Then 'se foi alterado
Beep
sConfirma = MsgBox("O Registro foi alterado. Deseja gravar as alterações?", vbQuestion + vbYesNoCancel, Me.Caption)
If sConfirma = vbYes Then
If VerCampos = True Then '*
Else
DoCmd.CancelEvent 'cancela evento atualizar porque houve problemas nos campos
End If
Exit Sub
End If
If sConfirma = vbCancel Then
DoCmd.CancelEvent 'apenas cancela evento atualizar
Exit Sub
End If
If sConfirma = vbNo Then
Me.Undo 'volta alterações
Exit Sub
End If
End If
End If
2. Criar uma variável no módulo do formulário chamada sGrava como string
Dim sGrava As String
3. No botão gravar insira o código abaixo:
On Error goto ErroGravar
If VerCampos = True Then
sGrava = "S" 'Habilita a gravação que será examinada no Evento Antes de atualizar
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
sGrava = "N" 'Desabilita para gravar
Me.AllowAdditions = False 'Volta o formulário para não aceitar novos registros
End If
Exit Sub
ErroGravar:
sGrava="N"
msgbox Err.Number & " " & Err.Description, VbInformation, Me.Caption
Exit Sub
4. No evento Ao Abrir
sGrava = "N"
Esses cuidados serão suficientes para que toda e qualquer gravação do registro possa ser feita única e exclusivamente pelo botão Gravar.
* VerCampos é uma função que retorna false caso algum campo obrigatório ficou sem ser preenchido:
Private Function VerCampos() As Boolean
If Me.Nome <> Empty Then
Else
MsgBox "Nome é obrigatório", vbInformation, Me.Caption
Me.Nome.SetFocus
VerCampos = False
Exit Function
End IfVerCampos = True
End Function
Notas
Botão Novo Registro
If Me.ID_Integracao <> Empty Then 'Campo Autonumeração – chave primária
Me.AllowAdditions = True
DoCmd.GoToRecord , , acNewRec
Me.Nome.SetFocus
Else
MsgBox "Você já está em um registro novo", vbInformation, Me.Caption
End If
Botão Excluir Registro
On Error GoTo ErroExclusao
Me.AllowDeletions = True 'Altera formulário para aceitar exclusão
DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
DoCmd.DoMenuItem acFormBar, acEditMenu, 6, , acMenuVer70Exit Sub
ErroExclusao:
MsgBox Err.Description, VbInformation, Me.Caption
Exit Sub