Boa tarde a todos,
* Uso Access 2003
Através do tópico: Dúvida sobre o exemplo "Registra um histórico de alterações" postado pelo usuário Nocte em que o usuário Convidad colocou a seguinte resposta (Onde ele informa que fez uma adaptação do código do nosso amigo JPaulo):
Public Function GravaLogDel(strRegistro As String, strNome As String)
Dim strUser As String
Dim strSQL As String
strUser = Trim(login.Usuario)
strSQL = "INSERT INTO tblLog (Usuário,LogData,NomeForm,Código,Nome,Status) " & _
"Values('" & strUser & "', Now(),'" & Screen.ActiveForm.Name & "','" & strRegistro & "','" & strNome & "','" & "Registro Excluido" & "')"
DoCmd.RunSQL strSQL
End Function
‘================================================================================
Public Function GravaAlteraçao(strNome As String, strCodigo As String)
Dim strChekaDiferente As Boolean
Dim strSQL As String
Dim ctl As control
Dim strUser As String
'By JPaulo ® Maximo Access - http://maximoaccess.forumeiros.com/
'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 = Trim(login.Usuario)
DoCmd.SetWarnings False
If Screen.ActiveForm.NewRecord Then 'verifica se é um novo registro, se for registra com novo
strChekaDiferente = True
strSQL = "INSERT INTO tblLog (Usuário,LogData,NomeForm,Código,Nome,Status) " & _
"Values('" & strUser & "', Now(),'" & Screen.ActiveForm.Name & "','" & strCodigo & "','" & strNome & "','" & "Novo Registro" & "')"
DoCmd.RunSQL strSQL
Else
' se não for um novo registro, coloca a variável de chekar alterações como False
strChekaDiferente = False
For Each ctl In Screen.ActiveForm.Controls
' Percorre todos os tipos de controles
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox
Debug.Print ctl.Name
Debug.Print ctl.OldValue
Debug.Print ctl.Value
If Not IsNull((ctl.Value <> ctl.OldValue)) Or (ctl.Value <> "" And ctl.Value <> "") Then
If ctl.Value <> ctl.OldValue 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 (Usuário,LogData,NomeForm,Código,Nome,NomeCampo,ValorAntigo,ValorAtual,Status) " & _
"Values('" & strUser & "', Now(),'" & Screen.ActiveForm.Name & "','" & strCodigo & "','" & strNome & "','" & ctl.Name & "','" & ctl.OldValue & "','" & ctl.Value & "','" & "Registro Alterado" & "')"
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
'termina e volta a colocar a variável de chekar alterações como False
strChekaDiferente = False
Else
Cancel = True
End If
End If
End Select
Next ctl
End If
'Salva tudo o que foi feito
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings True
End Function
Campos da minha tabela:
Usuário
LogData
NomeForm
Código
Nome ---> pode ser nome do cliente - produto etc
NomeCampo
ValorAntigo
ValorAtual
Status
Fiz da seguinte forma:
1) Copiei e colei o módulo acima, conforme orientação dada. Gravei este módulo com o nome de ModLog.
2) Criei a tabela tblLog com os campos acima, acrescentando apenas o campo CodLog como Autonumeração.
3) No formulário F156_Conselheiros criei um botão com o seguinte comando: Call GravaAlteraçao no procedimento "ao clicar" e deu a seguinte mensagem: "Erro de compilação. O argumento não é opcional"
A intenção é gravar além de outros campos, o código autonumeração da tabela que dá origem ao formulário citado, então como resolver?
* Uso Access 2003
Através do tópico: Dúvida sobre o exemplo "Registra um histórico de alterações" postado pelo usuário Nocte em que o usuário Convidad colocou a seguinte resposta (Onde ele informa que fez uma adaptação do código do nosso amigo JPaulo):
Public Function GravaLogDel(strRegistro As String, strNome As String)
Dim strUser As String
Dim strSQL As String
strUser = Trim(login.Usuario)
strSQL = "INSERT INTO tblLog (Usuário,LogData,NomeForm,Código,Nome,Status) " & _
"Values('" & strUser & "', Now(),'" & Screen.ActiveForm.Name & "','" & strRegistro & "','" & strNome & "','" & "Registro Excluido" & "')"
DoCmd.RunSQL strSQL
End Function
‘================================================================================
Public Function GravaAlteraçao(strNome As String, strCodigo As String)
Dim strChekaDiferente As Boolean
Dim strSQL As String
Dim ctl As control
Dim strUser As String
'By JPaulo ® Maximo Access - http://maximoaccess.forumeiros.com/
'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 = Trim(login.Usuario)
DoCmd.SetWarnings False
If Screen.ActiveForm.NewRecord Then 'verifica se é um novo registro, se for registra com novo
strChekaDiferente = True
strSQL = "INSERT INTO tblLog (Usuário,LogData,NomeForm,Código,Nome,Status) " & _
"Values('" & strUser & "', Now(),'" & Screen.ActiveForm.Name & "','" & strCodigo & "','" & strNome & "','" & "Novo Registro" & "')"
DoCmd.RunSQL strSQL
Else
' se não for um novo registro, coloca a variável de chekar alterações como False
strChekaDiferente = False
For Each ctl In Screen.ActiveForm.Controls
' Percorre todos os tipos de controles
Select Case ctl.ControlType
Case acTextBox, acComboBox, acListBox, acOptionGroup, acCheckBox
Debug.Print ctl.Name
Debug.Print ctl.OldValue
Debug.Print ctl.Value
If Not IsNull((ctl.Value <> ctl.OldValue)) Or (ctl.Value <> "" And ctl.Value <> "") Then
If ctl.Value <> ctl.OldValue 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 (Usuário,LogData,NomeForm,Código,Nome,NomeCampo,ValorAntigo,ValorAtual,Status) " & _
"Values('" & strUser & "', Now(),'" & Screen.ActiveForm.Name & "','" & strCodigo & "','" & strNome & "','" & ctl.Name & "','" & ctl.OldValue & "','" & ctl.Value & "','" & "Registro Alterado" & "')"
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
'termina e volta a colocar a variável de chekar alterações como False
strChekaDiferente = False
Else
Cancel = True
End If
End If
End Select
Next ctl
End If
'Salva tudo o que foi feito
DoCmd.RunCommand acCmdSaveRecord
DoCmd.SetWarnings True
End Function
Campos da minha tabela:
Usuário
LogData
NomeForm
Código
Nome ---> pode ser nome do cliente - produto etc
NomeCampo
ValorAntigo
ValorAtual
Status
Fiz da seguinte forma:
1) Copiei e colei o módulo acima, conforme orientação dada. Gravei este módulo com o nome de ModLog.
2) Criei a tabela tblLog com os campos acima, acrescentando apenas o campo CodLog como Autonumeração.
3) No formulário F156_Conselheiros criei um botão com o seguinte comando: Call GravaAlteraçao no procedimento "ao clicar" e deu a seguinte mensagem: "Erro de compilação. O argumento não é opcional"
A intenção é gravar além de outros campos, o código autonumeração da tabela que dá origem ao formulário citado, então como resolver?