MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração


Participe do fórum, é rápido e fácil

MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

https://www.maximoaccess.com/t48-regras-do-forum

Obrigado

Administração

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    Quem Alterou Quem Excluir

    marcelo3092
    marcelo3092
    Avançado
    Avançado

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 250
    Registrado : 19/08/2010

    Quem Alterou Quem Excluir Empty Quem Alterou Quem Excluir

    Mensagem  marcelo3092 7/12/2020, 19:21

    Ola Pessoal boa tarde Estou com uma duvida aqui e gostaria da ajuda dos amigos ,
    seguinte tem um exemplo muito top de registro de log ou auditoria de ações do grande mestre Jpaulo funciona perfeitamente
    https://www.maximoaccess.com/t526-resolvidohistorico-de-alteracoes

    porem o que aconte e que ele funciona somente se o formulario estiver vinculado a uma tabela, ex o meu problema e que uso formularios desvinculados e campos tambe,
    como poderia usar este modulo para registra a ação de update ou atualização dos registros pois novo e excluir não precisa somente alterar que pega o nome do campo alterado e o valor anterior e o valor atual.

    Sera que alguem ja passo por isso ou tem uma ideia.
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2892
    Registrado : 22/11/2016

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  DamascenoJr. 7/12/2020, 21:41

    É possível usar macro de dados para isso. Dentre as opções, existe a que é acionada no evento "ao alterar"


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    marcelo3092
    marcelo3092
    Avançado
    Avançado

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 250
    Registrado : 19/08/2010

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  marcelo3092 8/12/2020, 00:40

    Damasceno teria algum exemplo para demonstra o funcionamento
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2892
    Registrado : 22/11/2016

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  DamascenoJr. 8/12/2020, 00:47



    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    tauron
    tauron
    VIP
    VIP

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1295
    Registrado : 07/12/2011

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  tauron 8/12/2020, 11:00

    Tente adaptar o código abaixo no evento "ao carregar" do formulário (ele irá vincular o seu campo a uma tabela)


    Dim bd As Database
    Dim rs As Recordset
    Dim strSql As String

    strSql = "SELECT seucampodatabelaFROM suatabelaORDER BY seucampodatabela;"

    Set bd = OpenDatabase("o caminho do seu Back-End", False, False, ";senhadoBackEnd")

    Set rs = bd.OpenRecordset(strSql, dbOpenSnapshot)
    Do Until rs.EOF
       Me!seucampodoformulario.AddItem rs!seucampodadatabela
       rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
    bd.Close
    Set bd = Nothing
    marcelo3092
    marcelo3092
    Avançado
    Avançado

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 250
    Registrado : 19/08/2010

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  marcelo3092 8/12/2020, 23:32

    Blz amigo vou estuda mais ai que ta eu uso access com banco de dados mysql online num servidor ai trago os dados atraves de um recorset para preencher os campos eis o problema.



    Public Function Carrega_Candidato_Lista()
    UserGlobal = ""

    Call Conecta
    UserGlobal = "CALL sp_candidato_candidato(" & vgIdCandidato & ");"
    rstemp.Open UserGlobal, cn, adOpenDynamic, adLockOptimistic
    Me.id_candidato = rstemp("id_candidato").Value
    Me.DataCadastro = rstemp("data_cadastro").Value
    Me.Status = rstemp("status").Value
    Me.Candidato = rstemp("candidato").Value
    Me.endereco = rstemp("endereco").Value
    Me.n = rstemp("n").Value
    Me.Cidade = rstemp("cidade").Value
    Me.UF = rstemp("uf").Value
    Me.obs = rstemp("obs").Value
    Me.bairro = rstemp("bairro").Value
    Me.cep = rstemp("cep").Value
    Me.telefone1 = rstemp("telefone1").Value
    Me.telefone2 = rstemp("telefone2").Value
    Me.whatzapp = rstemp("whatzapp").Value
    Me.Celular2 = rstemp("celular2").Value
    Me.cpf = rstemp("cpf").Value
    Me.RG = rstemp("rg").Value
    Me.OrgaoEmissor = rstemp("orgao_emissor").Value
    Me.Foto1 = rstemp("foto1").Value
    Me.DataNascimento = rstemp("data_nascimento").Value
    Me.Sexo = rstemp("sexo").Value
    Me.estadocivil = rstemp("estado_civil").Value
    Me.email = rstemp("email").Value
    Me.GrauEscolaridade = rstemp("grau_escolaridade").Value
    'me.conjugue = rstemp("conjugue").Value
    'Me.qtdfilho = rstemp("qtd_filho").Value
    Me.nreservista = rstemp("n_reservista").Value
    Me.cnh = rstemp("n_cnh").Value
    Me.categoria = rstemp("categoria").Value
    Me.objetivo = rstemp("objetivo").Value
    Me.pcd = rstemp("pcd").Value
    Me.id_deficiencia = rstemp("id_deficiencia").Value
    Me.TaxaRS = rstemp("taxa_rs").Value
    Me.slug_profissao = rstemp("slug_profissao").Value

    Call FN_FechaRst(rstemp)




    End Function

    ele usa esta função para chamar uma store procedure no mysql e traz o resultado no recorset e popula os dados nos campo.
    ai nem o formulario nem os campos sao vinculados.
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2892
    Registrado : 22/11/2016

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  DamascenoJr. 8/12/2020, 23:57

    O MySQL também tem triggers.


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    marcelo3092
    marcelo3092
    Avançado
    Avançado

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 250
    Registrado : 19/08/2010

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  marcelo3092 9/12/2020, 00:55

    Exatamente Damasceno tem sim porem qual meu problema se vc olhar o exemplo do Jpaulo que coloquei o link ele pega o campo alterado coloca o valor old e o valor new porem funciona pq o formulario e vinculado na tabela, no meu caso n os dados vem do recordset e carrega os campos sem vinculo com tabela, ai eu n consigo pegar os campos alterados e passar para a  triggers fazer o insert.  pois nao salva os campos alterados, e aquele exemplo do Jpaulo é top funciona certim.

    ate montei uma função para pegar os valores e adicionar


    Public Function Grava_Historico_Usuario(p_id_usuario, p_usuario, p_nome_form, p_id_form, p_registro_form, p_valor_old, p_valor_new, p_nome_campo, p_acao)

    UserGlobal = ""

    Call Conecta
    UserGlobal = "CALL sp_usuario_historico('" & p_id_usuario & "','" & p_usuario & "','" & p_nome_form & "'," _
    & "'" & p_id_form & "','" & p_registro_form & "','" & Environ("computername") & "'," _
    & "'" & p_valor_old & "','" & p_valor_new & "','" & p_nome_campo & "','" & p_acao & "');"
    rstemp.Open UserGlobal, cn, adOpenDynamic, adLockOptimistic
    Call FN_FechaRst(rstemp)


    End Function

    ai eu chamo ela dentro do formulario


    '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

    'DoEvents
    'Call GravarAtualizacao
    'DoEvents
    'Call Grava_Historico_Usuario("1", "marcelo", Me.Form.Name, Me.id_candidato, Me.Candidato, ctl.OldValue, ctl.Value, ctl.Name, 2)

    'strChekaDiferente = False
    'Else
    'Cancel = True
    'End If

    'End Select
    'Next ctl
    'End If

    'MsgBox "Candidato Salvo com Sucesso!!!.", vbInformation, Titulo

    tentei assim ele grava se o formulario tiver vinculo com uma tabela se nao tiver nao da certo.
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2892
    Registrado : 22/11/2016

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  DamascenoJr. 9/12/2020, 01:10

    Marcelo, não há o que passar para os triggers. Tudo ocorre a nível de tabela. A tabela mesmo faz q comparação de valores alterados.

    Não há o que se preocupar com formulários, stored procedures, módulo etc. Você programa isso direto no MySQL. Isso é um recurso nativo.


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    marcelo3092
    marcelo3092
    Avançado
    Avançado

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 250
    Registrado : 19/08/2010

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  marcelo3092 9/12/2020, 01:26

    Exatamente Damasceno porem procurei muito a respeito e ate achei mais o codigo era para SQL SERVER e n mysql ai nao funciona pois o SQL SERVER tem um recurso nativo para isso.
    no caso para ele pegar qual campo foi alterado precisaria fazer uma condicão para cada campo algo do tipo.

    if new.descricao_vendedor <> old.descricao_vendedor then
    INSERT INTO tb_usuario_historico
    (
    data_hora,
    id_usuario,
    usuario,
    tipo_historico,
    nome_form,
    id_form,
    registro_form,
    computador
    )
    VALUES
    (
    now()
    ,p_id_usuario
    ,p_usuario
    ,'EDIÇÂO REGISTRO'
    ,'Frm_CANDIDATO'
    ,p_id_form
    ,p_registro_form
    ,p_computador
    );
    end if;

    para cada campo teria que fazer isso ai que vem o problema nao teria como pega o usuario logado no sistema pois nao seria enviado o parametro do access para o mysql
    que no access vc consegue envia tudo de uma vez entendeu. e eu teria que fazer essa condição para todos os campos nao consegui fazer uma verificação mais generica.
    marcelo3092
    marcelo3092
    Avançado
    Avançado

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 250
    Registrado : 19/08/2010

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  marcelo3092 9/12/2020, 02:52

    Damasceno mais perto que to chegando e assim o porem como te dize tem que ser feito pra cada campo na tabela

    DECLARE old1 TEXT;
    DECLARE New1 TEXT;
    DECLARE Coluna TEXT;

    Set @old1='';
    Set @New1='';
    Set @Coluna='';

    if new.candidato <> old.candidato then
    set @old1= old.candidato;
    set @new1= new.candidato;
    set @Coluna = 'Candidato';
    insert into tb_usuario_historico
    (id_form,data_hora,nome_form,tipo_historico,valor_old,valor_new,nome_campo)
    values (old.id_candidato,now(),'Candidato','EDIÇÂO',@old1,@new1,@Coluna);

    end if;

    if new.endereco <> old.endereco then
    set @old1=old.endereco;
    set @new1=new.endereco;
    set @Coluna = 'Endereco';
    insert into tb_usuario_historico
    (id_form,data_hora,nome_form,tipo_historico,valor_old,valor_new,nome_campo)
    values (old.id_candidato,now(),'Candidato','EDIÇÂO',@old1,@new1,@Coluna);

    end if;

    essa e uma adaptação minha a original ele concatena os campos e faz apenas um insert ocasionando varios dados num unico campo tipo se vc altera candidato, endereco, n , bairro, cidade ele fazia assim

    candidato:marcelo antono --> marcelo antonio freitas endereco:rua ramao aniz --> rua campo grande N: 12 --> 30 bairro: centro-->colibri cidade:sao paulo --> campo grande.

    tudo isso num unico campo pois o insert e no final de toda condição ai ele concatena todos os registros e salva num unica campo.

    DECLARE xxx TEXT;
    Set @xxx='';
    Set @old1='';
    Set @New1='';
    if new.candidato <> old.candidato then
    set @old1= old.candidato;
    set @new1 = new.candidato;

    set @xxx=concat(@xxx,'Candidato:',old.candidato,' --> ',new.candidato,'');
    end if;

    if new.endereco <> old.endereco then
    set @xxx=concat(@xxx,'Endereco:',old.endereco,' --> ',new.endereco,'');
    end if;

    insert into tb_usuario_historico
    (id_form,data_hora,nome_form,tipo_historico,nome_campo)
    values (old.id_candidato,now(),'Candidato','EDIÇÂO',@xxx);
    END


    por isso queria fazer uma condição dinamica que pegaria os campos alterados e valores e faria o insert assim daria para eu aproveitar em todas as tabelas porem se nao tem como o jeito e fazer no modo dificil mesmo
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2892
    Registrado : 22/11/2016

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  DamascenoJr. 9/12/2020, 03:02

    Verificação campo a campo não é nada prático. Sugiro uma tabela espelho, aos moldes dos exemplos que mostrei no access usando macro de dados, porém em MySQL com triggers.


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    marcelo3092
    marcelo3092
    Avançado
    Avançado

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 250
    Registrado : 19/08/2010

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  marcelo3092 9/12/2020, 23:49

    entao damasceno mais tabela espelho tb daria trabalho o que poderia ser feito era carrega uma tabela e dessa tabela vincular ao formulario da vincular os campos nessa tabela ai o codigo do Jpaulo funcionaria certo.
    porem nao sei se daria problema no desempenho vou tentar fazer e ver como fica testei uma vez ja e funcionou igual o exemplo dele porem vou ter que fazer algumas alterações nas funções de salvamento e outra la
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às regras : Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2892
    Registrado : 22/11/2016

    Quem Alterou Quem Excluir Empty Re: Quem Alterou Quem Excluir

    Mensagem  DamascenoJr. 9/12/2020, 23:54

    Bom... a tabela espelho com triggers é a forma mais simples que conheço. Era a minha única sugestão.

    Boa sorte, bons estudos.


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.

      Data/hora atual: 24/7/2021, 07:54