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

    Banco de Dados em Rede - Login

    Compartilhe

    CassioFerreira
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 8
    Registrado : 10/07/2014

    Banco de Dados em Rede - Login

    Mensagem  CassioFerreira em 6/11/2018, 03:17

    Tenho um banco de dados de controle de contas a pagar principal com os fomulários instalado em duas máquinas, e, em rede, está o banco de dados com as tabelas. Pelo login, via vba eu identifico o usuário e a data e hora do acesso na máquina (datahora = Format(Now(), "yyyy/mm/dd hh:nn:ss") e registrar nas tabelas quem e quando se inseriu ou alterou informações. Acontece que quando o segundo usuário faz o login a primeira máquina logada assume sua identidade. Estou tentando identificar pelo ID das máquinas para assim evitar esse problema, já que não faz o registro do verdadeiro usuário nas tabelas. Só que me perco na hora que tento uma forma de executar esse processo. Espero ter me expressado bem e fazer entender a situação.
    avatar
    Gleilsonblensh
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 36
    Registrado : 02/07/2018

    Re: Banco de Dados em Rede - Login

    Mensagem  Gleilsonblensh em 6/11/2018, 11:47

    Ola Cassio, para exibir no formulário o nome do usuário logado na maquina eu utilizo:


    Código:
    Me.campo = Environ("UserName")

    coloco no formulário ao carregar, você pode adaptar para o que você precisa.

    Gleilson Pedro
    avatar
    thiagomcosta
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 308
    Registrado : 23/01/2017

    Re: Banco de Dados em Rede - Login

    Mensagem  thiagomcosta em 6/11/2018, 12:27

    Eu utilizo uma tabela no arquivo com os formulários. Nesta tabela local identifico o usuário logado do windows e então distribuo as permissões, registros, etc., conforme o usuário.
    Também localmente tenho uma tabela com a versão atual do sistema e comparo com a última versão que deixo registrada em outra tabela no servidor. Isso para saber se a versão utilizada é a última liberada.

    Resumindo:
    - Na máquina uma tabela com o usuário logado no momento.
    - Na rede a lista de acessos com horários para controle de tráfego.

    - Na máquina a versão instalada.
    - Na rede a última versão liberada.
    avatar
    Gleilsonblensh
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 36
    Registrado : 02/07/2018

    Re: Banco de Dados em Rede - Login

    Mensagem  Gleilsonblensh em 6/11/2018, 13:33

    ok então se eu entendi direito vc precisa identificar o nome da maquina...tem um exemplo que peguei aqui no forum adaptação de um código do JPaulo que mostra ip da maquina...

    Download
    avatar
    thiagomcosta
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 308
    Registrado : 23/01/2017

    Re: Banco de Dados em Rede - Login

    Mensagem  thiagomcosta em 6/11/2018, 14:38

    Para esclarecer melhor, segue o meu código que registra o login e o ambiente de desenvolvimento.

    Isso na inicialização do sistema.
    Depois eu busco os dados na tabela tb_LocalUser com um DLookup. A tabela tb_LocalUser fica na máquina, junto com os formulários (front end).

    Por exemplo, se eu quero saber se o usuário tem acesso ao módulo da Arte, eu busco o campo Arte_Usuario e vejo se o valor é verdadeiro.
    Foi a solução mais prática que eu encontrei pro MEU caso.

    O ambiente eu uso para bloquear alguns recursos durante o desenvolvimento, como envio de email para o cliente. Quando eu libero para Produção eu mudo este código.

    Código:
    Public Function QualUsuario()
    'Define o usuario logado e o tipo de ambiente
    Dim vNetwork As Object
    Dim vLogado As Variant
    Dim rsUsuario As Recordset
    Dim vSQLInsert
    Dim vAmbiente As String

    '===== ALTERAR AQUI O AMBIENTE ==============================================================================
    vAmbiente = "Desenvolvimento"
    'vAmbiente = "Produção"
    '============================================================================================================

    Set vNetwork = CreateObject("WScript.Network")
    vLogado = vNetwork.UserName

    'Procura usuario
    Set rsUsuario = CurrentDb.OpenRecordset("SELECT * FROM tb_Usuarios WHERE Usuario_Usuario='" & vLogado & "'")
    If rsUsuario.RecordCount = 0 Then
        MsgBox "Usuario não cadastrado", vbCritical
        rsUsuario.Close
        Set rsUsuario = Nothing
        Application.Quit
    End If

    'Define usuario
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE * FROM tb_LocalUser"
    vSQLInsert = "INSERT INTO tb_LocalUser (UsuarioLogado, Admin_Usuario, Financeiro_Usuario, Atendimento_Usuario, Arte_Usuario, Producao_Usuario, Isagraph_Usuario) "
    vSQLInsert = vSQLInsert & "VALUES ('" & vLogado & "', " & IIf(rsUsuario!Admin_Usuario, 1, 0) & ", " & IIf(rsUsuario!Financeiro_Usuario, 1, 0) & ", " & IIf(rsUsuario!Atendimento_Usuario, 1, 0) & ", "
    vSQLInsert = vSQLInsert & IIf(rsUsuario!Arte_Usuario, 1, 0) & ", " & IIf(rsUsuario!Producao_Usuario, 1, 0) & ", " & IIf(rsUsuario!Isagraph_Usuario, 1, 0) & ") "
    DoCmd.RunSQL vSQLInsert
    DoCmd.RunSQL "INSERT INTO tb_Logins(Usuario_Logins, DataHora_Logins, Local_Logins) VALUES ('" & vLogado & "', '" & Now & "', '" & CurrentProject.Path & "')"

    'Define ambiente
    DoCmd.RunSQL "DELETE * FROM tb_LocalAmbiente"
    DoCmd.RunSQL "INSERT INTO tb_LocalAmbiente ([AmbienteAtual]) VALUES ('" & vAmbiente & "')"
    DoCmd.SetWarnings True

    rsUsuario.Close
    Set rsUsuario = Nothing

    VerificaHora

    End Function

    CassioFerreira
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 8
    Registrado : 10/07/2014

    Re: Banco de Dados em Rede - Login

    Mensagem  CassioFerreira em 6/11/2018, 16:47

    Uma informação que deixei escapar é que o usuário é identificado pelo horário de acesso, no VBA, uma função DMax seleciona o último usuário que entrou, por esse motivo que, se um segundo usuário entra, a primeira máquina assume a identidade deste. Por isso que achei que deveria identificar o ID de cada máquina para filtrar o usuário de cada máquina.
    Abraços e obrigado a todos que manifestou interesse em ajudar.
    avatar
    Gleilsonblensh
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 36
    Registrado : 02/07/2018

    Re: Banco de Dados em Rede - Login

    Mensagem  Gleilsonblensh em 7/11/2018, 14:44

    Cassio, infelizmente não tenho tanta experiência neste caso não posso te ajudar, ainda não executei nada parecido e tb não tenho idéia de como fazer, uma coisa que funcionou comigo foi quando me deparei com um problema que não consegui resolver e tb não encontrei quem me ajudasse, tive que rever meu projeto ou seja fiz o que eu queria mas de outra forma e até se tornou mais fácil, talvez vc encontre outra forma de fazer o que vc precisa, no meu caso eu so salvo logs com acesso data e hora assim que abre o bd, fica salvo em um arquivo txt, faço isto atravéz de um bat que o proprio bd puxa, espero ter ajudado com algo.
    Boa Sorte e bons estudos!

    Gleilson Pedro
    avatar
    Estuardo
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 20
    Registrado : 24/09/2014

    Re: Banco de Dados em Rede - Login

    Mensagem  Estuardo em 9/11/2018, 20:28

    Boa noite,
    Sem ver o código é muito difícil de tentar perceber a origem do problema, principalmente porque mesmo com o código seria preciso poder replicar o ambiente de rede.
    Dito isto, penso que a origem esta na arquitectura da solução e não propriamente no código. Antes de continuar e apontar para algum lado qualquer gostava de perceber o seguinte:
    Se tem 2 FE's (1 para cada cliente) com um conjunto de tabelas locais e um BE com todas as tabelas gerais, o que acontece quando o FE1 faz o login?
    Quem, Como e onde é que esta a atribuir a identidade?
    Pode executar este procedimento em cada um dos FE's e no BE

    Código:

    Public Sub ConnectedUsers()
      Dim rs As ADODB.Recordset
          Set rs = Application.CurrentProject.Connection.OpenSchema(adSchemaProviderSpecific, , "{947bb102-5d43-11d1-bdbf-00c04fb92675}")
          Debug.Print rs.GetString
          rs.Close
      End Sub
    Qual é o resultado?

      Data/hora atual: 16/11/2018, 04:04