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.
4 participantes
Banco de Dados em Rede - Login
CassioFerreira- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 8
Registrado : 10/07/2014
- Mensagem nº1
Banco de Dados em Rede - Login
Gleilsonblensh- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 51
Registrado : 02/07/2018
- Mensagem nº2
Re: Banco de Dados em Rede - Login
Ola Cassio, para exibir no formulário o nome do usuário logado na maquina eu utilizo:
coloco no formulário ao carregar, você pode adaptar para o que você precisa.
Gleilson Pedro
- Código:
Me.campo = Environ("UserName")
coloco no formulário ao carregar, você pode adaptar para o que você precisa.
Gleilson Pedro
thiagomcosta- Avançado
- Respeito às regras :
Sexo :
Localização :
Mensagens : 377
Registrado : 23/01/2017
- Mensagem nº3
Re: Banco de Dados em Rede - Login
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.
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.
Gleilsonblensh- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 51
Registrado : 02/07/2018
- Mensagem nº4
Re: Banco de Dados em Rede - Login
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
Download
thiagomcosta- Avançado
- Respeito às regras :
Sexo :
Localização :
Mensagens : 377
Registrado : 23/01/2017
- Mensagem nº5
Re: Banco de Dados em Rede - Login
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.
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
- Respeito às regras :
Sexo :
Localização :
Mensagens : 8
Registrado : 10/07/2014
- Mensagem nº6
Re: Banco de Dados em Rede - Login
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.
Abraços e obrigado a todos que manifestou interesse em ajudar.
Gleilsonblensh- Intermediário
- Respeito às regras :
Sexo :
Localização :
Mensagens : 51
Registrado : 02/07/2018
- Mensagem nº7
Re: Banco de Dados em Rede - Login
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
Boa Sorte e bons estudos!
Gleilson Pedro
Estuardo- Novato
- Respeito às regras :
Sexo :
Localização :
Mensagens : 20
Registrado : 24/09/2014
- Mensagem nº8
Re: Banco de Dados em Rede - Login
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
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