MaximoAccess

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

Obrigado

Administração do MaximoAccess

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


    [Resolvido]Comparar 2 campos em 2 tabelas diferentes

    avatar
    vileman
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 561
    Registrado : 25/05/2011

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty [Resolvido]Comparar 2 campos em 2 tabelas diferentes

    Mensagem  vileman em 4/7/2019, 14:55

    Bom dia a todos!

    Após pesquisas neste site sobre o tópico, achei alguns parecidos e tentei adaptar, mas não consegui resolver a minha questão, a saber:

    1) No formulário F15_GuiasRemessa no campo 'IDRecebedor' é informado o código do usuário que irá receber a Guia de Remessa.                                    ** OK
    2) no evento 'Após atualizar' do campo 'IDRecebedor' é capturado o código do recebedor e gravado no campo 'LoginRecebedor' o login do usuário.             ** OK
    3) Quando entrega a Guia de Remessa ao usuário no mesmo formulário, o usuário recebedor informa no campo 'AssinaturaGuia' sua Assinatura eletronica. ** OK
    4) Após o usuário recebedor digitar sua assinatura eletronica preciso comparar para saber se a assinatura digitada no campo 'AssinaturaGuia' confere com sua assinatura eletronica gravada em outra tabela: 'Usuario' onde tem o campo 'AssinaturaEletronica' cadastrada previamente para cada usuário.
    5) Ao mesmo tempo preciso comparar se o login do usuário recebedor confere com o campo 'Login' também na tabela 'Usuario', ou seja, preciso comparar o Login e a Assinatura eletronica em ambas tabelas, para ter certeza que o usuário recebedor é o mesmo junto com sua assinatura na Guia de Remessa, a saber:

    Tabelas x Campos a comparar:
    T15_GuiasRemessa : LoginRecebedor e AssinaturaGuia
    Usuario                  : Login e AssinaturaEletronica

    Fiz da seguinte forma:

    Código:
    Private Sub AssinaturaGuia_AfterUpdate()
            [b]If DLookup("LoginRecebedor", "T15_GuiasRemessa") And DLookup("AssinaturaGuia", "T15_GuiasRemessa") = DLookup("Login", "Usuario") And DLookup("AssinaturaEletronica", "Usuario") Then[/b]
               MsgBox "Assinatura Eletrônica confere! O Recebimento foi concluído com êxito!", vbInformation + vbOKOnly, "Sistema informa:"
               Me!Status = 2  'GUIA ENTREGUE
               Me!StatusNome = Status.Column(1)
               Exit Sub
           Else
               MsgBox "ALERTA! Assinatura não confere com Assinatura Eletrônica cadastrada OU Assinatura está incorreta!" & vbCr & "Verifique e faça a devida correção!", vbInformation + vbOKOnly, "Sistema informa:"
               Me!AssinaturaGuia = ""
               Me!AssinaturaGuia.SetFocus
               Exit Sub
           End If
    End Sub

    Mas, ao informar a assinatura na Guia de Remessa apresenta a mensagem de erro, mesmo que o Login e as assinaturas sejam iguais, após eu conferir os 2 campos nas 2 tabelas:
    MsgBox "ALERTA! Assinatura não confere com Assinatura Eletrônica cadastrada OU Assinatura está incorreta!" & vbCr & "Verifique e faça a devida correção!"

    PS: Preciso também Bloquear o campo ‘AssinaturaGuia’ no formulário após inserção correta, para que não mais seja alterado ou excluído
    avatar
    renpv
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 211
    Registrado : 12/01/2015

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty Re: [Resolvido]Comparar 2 campos em 2 tabelas diferentes

    Mensagem  renpv em 5/7/2019, 02:54

    Minha sugestão:

    Separe as tarefas. Crie uma função para cada tarefa que você precisa. Assim, o código fica mais organizado e de melhor manutenção.
    Ex.
    Código:

    Function validaRemessa(LoginRecebedor, AssinaturaGuia)
    'Rotina para validar a assinatura
    end sub

    Function validaUsuario(Login, AssinaturaEletronica)
    'Rotina para validar se o usuário é recebedor daquela guia
    end sub

    depois você poderá chamar assim:
    Código:

    if(validaRemessa(me.campoLogin, me.assinaturaEletronica) and validaUsuario(Me.Login, Me.AssinaturaEletronica)

    Outra coisa que percebi é que você não está setando os critérios na função Dlookup. Embora o critério seja um argumento opcional, se você não fornecer nenhum valor, a função retorna um valor aleatório no domínio.
    avatar
    vileman
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 561
    Registrado : 25/05/2011

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty Comparar 2 campos em 2 tabelas diferentes

    Mensagem  vileman em 5/7/2019, 13:45

    Bom dia, renpv

    Seguindo sua sugestão fiz conforme abaixo:

    Código:
    Private Sub AssinaturaGuia_AfterUpdate()
          'LINHA NULA: If DLookup("LoginRecebedor", "T15_GuiasRemessa") And DLookup("AssinaturaGuia", "T15_GuiasRemessa") = DLookup("Login", "Usuario") And DLookup("AssinaturaEletronica", "Usuario") Then
         
           If validaRemessa(Me.LoginRecebedor, Me.AssinaturaGuia) And validaUsuario(Me.Login, Me.AssinaturaEletronica) Then
              MsgBox "Assinatura Eletrônica confere! O Recebimento foi concluído com êxito!", vbInformation + vbOKOnly, "Sistema JANUS informa:"
              Me!Status = 2  'GUIA ENTREGUE
              Me!StatusNome = Status.Column(1)
              Exit Function
           Else
              MsgBox "ALERTA! Assinatura não confere com Assinatura Eletrônica cadastrada OU Assinatura está incorreta!" & vbCr & "Verifique e faça a devida correção!", vbInformation + vbOKOnly, "Sistema informa:"
              Me!AssinaturaGuia = ""
              Me!AssinaturaGuia.SetFocus
              Exit Function
           End If
         
    Function validaRemessa(LoginRecebedor, AssinaturaGuia)
    'Rotina para validar a assinatura
    DLookup("LoginRecebedor", "T15_GuiasRemessa", "LoginRecebedor=" & Me!Login) = DLookup("Login", "Usuario")
    End Sub

    Function validaUsuario(Login, AssinaturaEletronica)
    'Rotina para validar se o usuário é recebedor daquela guia
    DLookup("AssinaturaGuia", "T15_GuiasRemessa", "AssinaturaGuia=" & Me!AssinaturaEletronica) = DLookup("AssinaturaEletronica", "Usuario")
    End Sub

    Mas, ao executar aparece a mensagem de erro: "Método ou membro de dados não encontrado" na linha e marca em destaque o campo em negrito e vermelho abaixo:
    Código:
           If validaRemessa(Me.LoginRecebedor, Me.AssinaturaGuia) And validaUsuario(Me.[b][color=#ff6633]Login[/color][/b], Me.AssinaturaEletronica) Then

    Não tenho muita experiência com VBA, e embora tenha tentado acertar não sei se fiz os comandos e as funções da forma correta e não sei onde estaria o erro
    avatar
    renpv
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 211
    Registrado : 12/01/2015

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty Re: [Resolvido]Comparar 2 campos em 2 tabelas diferentes

    Mensagem  renpv em 6/7/2019, 02:08

    Veja se esse campo existe no seu formulário. Caso não exista, troque o código pelo nome do campo que tem o login a procurar na função.
    Código:
    Me.Login

    Toda função deve retornar um valor. Veja como setar o retorno de uma função:
    Código:

    Function validaRemessa(LoginRecebedor, AssinaturaGuia)
    'Rotina para validar a assinatura
    validaRemessa = DLookup("LoginRecebedor", "T15_GuiasRemessa", "LoginRecebedor=" & Me!Login) = DLookup("Login", "Usuario")
    End Sub

    Você deve decidir se vai mandar as variáveis como argumento na função ou se a própria função vai buscar os campos no formulário. Nesse caso eu preferiria mandar as variáveis como argumento. Veja abaixo a diferença e você decide como vai fazer:

    Exemplo de função que recebe variáveis como argumento:

    Código:

    Function validaUsuario(Login, AssinaturaEletronica)
    'Rotina para validar se o usuário é recebedor daquela guia
     validaUsuario = DLookup("AssinaturaGuia", "T15_GuiasRemessa", "AssinaturaGuia=" & AssinaturaEletronica) = DLookup("AssinaturaEletronica", "Usuarios", "Usuario=" & Login)
    End Sub

    Como chamar uma função com argumento
    Código:
    call validaUsuario(Me.CampoComLogin, Me.CampoComAssinatura)

    Exemplo de função sem argumento:

    Código:

    Function validaUsuario()
    'Rotina para validar se o usuário é recebedor daquela guia
     validaUsuario = DLookup("AssinaturaGuia", "T15_GuiasRemessa", "AssinaturaGuia=" & Me!AssinaturaEletronica) = DLookup("AssinaturaEletronica", "Usuarios", "Usuario=" & Me!Login)
    End Sub

    Como chamar uma função sem argumento
    Código:
    call validaUsuario()

    A vantagem de criar funções com variáveis como argumento é que você cria uma função e pode usar em vários locais, com outros dados, bastando mudar as variáveis na chamada. Já a função sem argumento é fixa. Sempre vai apontar para os mesmos campos.

    PS. Eu não testei os códigos. São apenas exemplos.
    PS 2. Sempre use os três argumentos da função Dlookup
    avatar
    vileman
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 561
    Registrado : 25/05/2011

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty Comparar 2 campos em 2 tabelas diferentes

    Mensagem  vileman em 7/7/2019, 17:46

    Boa tarde, Renato

    Tentei fazer das 2 formas: com argumento e sem argumento, mas dá o mesmo erro em ambas tentativas:


    'Erro em tempo de execução '2471'. A expressão que você inseriu como parâmetro da tabela ou consulta gerou este erro: 'gerusa'
    'Ao Depurar: validaRemessa = DLookup("LoginRecebedor", "T15_GuiasRemessa", "LoginRecebedor=" & Me!login) = DLookup("Login", "Usuario")

    PS: O parâmetro 'gerusa' é o nome do 1º usuário cadastrado na tabela 'Usuario', embora eu esteja usando o nome de outro Usuário: 'sergiotf' como teste.
    Dentro do formulário 'F15_GuiasRemessa' eu explico mais detalhes, caso precise de outros, claro estou a disposição

    Tomei a liberdade de está enviando em anexo o arquivo apenas com alguns registros pra testes para você ver melhor toda rotina.

    Rotina: caso precise relembrar toda rotina, favor veja mensagem n. 1 deste tópico.

    PS: Sim, pretendo usar esta rotina em outros locais, então seria melhor, conforme seu texto: "A vantagem de criar funções com variáveis como argumento é que você cria uma função e pode usar em vários locais, com outros dados, bastando mudar as variáveis na chamada. Já a função sem argumento é fixa. Sempre vai apontar para os mesmos campos"
    Anexos
    [Resolvido]Comparar 2 campos em 2 tabelas diferentes AttachmentFMA - AssinaturaEletronica.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (134 Kb) Baixado 4 vez(es)
    avatar
    renpv
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 211
    Registrado : 12/01/2015

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty Re: [Resolvido]Comparar 2 campos em 2 tabelas diferentes

    Mensagem  renpv em 8/7/2019, 03:23

    Eu fiz algumas alterações. Veja se está em conformidade com os requisitos.

    PS. Deixei apenas os códigos necessários para testar a função de validação de assinatura.
    Anexos
    [Resolvido]Comparar 2 campos em 2 tabelas diferentes AttachmentFMA - AssinaturaEletronica.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (446 Kb) Baixado 7 vez(es)
    avatar
    vileman
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 561
    Registrado : 25/05/2011

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty Comparar 2 campos em 2 tabelas diferentes

    Mensagem  vileman em 9/7/2019, 00:15

    Renato, boa noite

    Valeu pela ajuda e orientação, funcionou perfeitamente e ficou melhor que a encomenda.

    PS: apenas coloquei o comando Me.Refresh no inicio do evento 'Ao Perder Foco' do campo 'AssinaturaGuia', pois estava comparando a assinatura de forma intermitente, ou seja, as vezes conferia e as vezes não conferia e aparecia a mensagem: MsgBox "Usuário logado não é o recebedor dessa Guia"

    Valeu muito mesmo.

    Obrigado. Muita Paz!

    Conteúdo patrocinado

    [Resolvido]Comparar 2 campos em 2 tabelas diferentes Empty Re: [Resolvido]Comparar 2 campos em 2 tabelas diferentes

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 15/11/2019, 08:46