Pessoal, boa tarde!
Tenho um banco de dados que estou fazendo e apliquei no mesmo o código para histórico de alterações do amigo JPaulo (que por sinal funcionou show de bola). Porém, tenho duas dúvidas:
1 - Como faço para ele reconhecer também o subformulário nesta aplicação?
2 - Quando tentei aplicar no evento ao sair, ele não aceitou. Está certo, ou fiz alguma coisa errada?
Segue código:
[color=blue]Private Sub CmdClose_Click()
Dim strChekaDiferente As Boolean
Dim strSQL As String
Dim ctl As Control
Dim strUser As String
'By JPaulo ® Maximo Access
'Importante: Todos os botões de navegação devem conter a chamada de toda esta instrução.
'O form não deve ter o botão fechar ativo, deve colocar um botão para esse efeito e chamar a instrução.
On Error Resume Next
strChekaDiferente = False
strUser = GetUserName_TSB
If Me.NewRecord Then 'verifica se é um novo registro, se for registra com novo
strChekaDiferente = True
strSQL = "INSERT INTO tblLog (Utilizador, LogData, NomeForm, NomeCampo, ValorAntigo, ValorAtual, Status) Values('" & strUser & "', Now(),'" & Me.Form.Name & "','" & Me.[ER ID] & "','" & Me.Locked & "','" & Me.Name & "','" & Me.Data & "', '" & Me.Tipo & "', '" & Me.Consultor_Resp & "', '" & Me.Report_Currency & "', '" & Me.Report_XRate & "', '" & Me.Dados_para_pagamento & "', '" & "Novo Registro" & "')"
DoCmd.RunSQL strSQL
DoEvents
CurrentDb.Execute "DELETE * FROM tblLog WHERE [ValorAntigo]=' ' ", dbFailOnError
Else
' se não for um novo registro, coloca a variável de chekar alterações como False
strChekaDiferente = False
For Each ctl In Me.Controls
' Percorre todos os tipos de controles
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox
If ctl.Value <> ctl.OldValue Or IsNull(ctl.Value) And Len(ctl.OldValue) > 0 Or ctl.Value = "" And Len(ctl.OldValue) > 0 _
Or IsNull(ctl.OldValue) And Len(ctl.Value) > 0 Or ctl.OldValue = "" And Len(ctl.Value) > 0 Then 'se algum valor foi alterado ou deletado, coloca a variável de chekar alterações como True
strChekaDiferente = True
'e registra na tabela do Log
DoCmd.SetWarnings False
strSQL = "INSERT INTO tblLog (Utilizador, LogData, NomeForm, NomeCampo, ValorAntigo, ValorAtual, Status) Values('" & strUser & "', Now(),'" & Me.Form.Name & "','" & ctl.Name & "','" & ctl.OldValue & "','" & ctl.Value & "','" & "Registro Alterado" & "')"
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
DoEvents
'termina e volta a colocar a variável de chekar alterações como False
strChekaDiferente = False
Else
Cancel = True
End If
End Select
Next ctl
End If
'Salva tudo o que foi feito
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
DoCmd.Close
End Sub[/color]
Gostaria de ressaltar que tentei colocar na instrução (strSQL) o seguinte:
[b]'" & Form_Nomedosubformulário.nomedocontrole & "'[/b]
Porém não funcionou...
Muito Obrigado!
Tenho um banco de dados que estou fazendo e apliquei no mesmo o código para histórico de alterações do amigo JPaulo (que por sinal funcionou show de bola). Porém, tenho duas dúvidas:
1 - Como faço para ele reconhecer também o subformulário nesta aplicação?
2 - Quando tentei aplicar no evento ao sair, ele não aceitou. Está certo, ou fiz alguma coisa errada?
Segue código:
[color=blue]Private Sub CmdClose_Click()
Dim strChekaDiferente As Boolean
Dim strSQL As String
Dim ctl As Control
Dim strUser As String
'By JPaulo ® Maximo Access
'Importante: Todos os botões de navegação devem conter a chamada de toda esta instrução.
'O form não deve ter o botão fechar ativo, deve colocar um botão para esse efeito e chamar a instrução.
On Error Resume Next
strChekaDiferente = False
strUser = GetUserName_TSB
If Me.NewRecord Then 'verifica se é um novo registro, se for registra com novo
strChekaDiferente = True
strSQL = "INSERT INTO tblLog (Utilizador, LogData, NomeForm, NomeCampo, ValorAntigo, ValorAtual, Status) Values('" & strUser & "', Now(),'" & Me.Form.Name & "','" & Me.[ER ID] & "','" & Me.Locked & "','" & Me.Name & "','" & Me.Data & "', '" & Me.Tipo & "', '" & Me.Consultor_Resp & "', '" & Me.Report_Currency & "', '" & Me.Report_XRate & "', '" & Me.Dados_para_pagamento & "', '" & "Novo Registro" & "')"
DoCmd.RunSQL strSQL
DoEvents
CurrentDb.Execute "DELETE * FROM tblLog WHERE [ValorAntigo]=' ' ", dbFailOnError
Else
' se não for um novo registro, coloca a variável de chekar alterações como False
strChekaDiferente = False
For Each ctl In Me.Controls
' Percorre todos os tipos de controles
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox
If ctl.Value <> ctl.OldValue Or IsNull(ctl.Value) And Len(ctl.OldValue) > 0 Or ctl.Value = "" And Len(ctl.OldValue) > 0 _
Or IsNull(ctl.OldValue) And Len(ctl.Value) > 0 Or ctl.OldValue = "" And Len(ctl.Value) > 0 Then 'se algum valor foi alterado ou deletado, coloca a variável de chekar alterações como True
strChekaDiferente = True
'e registra na tabela do Log
DoCmd.SetWarnings False
strSQL = "INSERT INTO tblLog (Utilizador, LogData, NomeForm, NomeCampo, ValorAntigo, ValorAtual, Status) Values('" & strUser & "', Now(),'" & Me.Form.Name & "','" & ctl.Name & "','" & ctl.OldValue & "','" & ctl.Value & "','" & "Registro Alterado" & "')"
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
DoEvents
'termina e volta a colocar a variável de chekar alterações como False
strChekaDiferente = False
Else
Cancel = True
End If
End Select
Next ctl
End If
'Salva tudo o que foi feito
DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
DoCmd.Close
End Sub[/color]
Gostaria de ressaltar que tentei colocar na instrução (strSQL) o seguinte:
[b]'" & Form_Nomedosubformulário.nomedocontrole & "'[/b]
Porém não funcionou...
Muito Obrigado!