Pessoal, Boa Tarde!
Estou com um problema no meu bd que está me tirando o sono e já tem uma semana, revisando os códigos, tabelas, estruturas e etc... mas não consegui resolver até o momento em duas situações.
No sistema que tenho de controle de acesso (Portaria), inclusive disponível no repositório de exemplos aqui no fórum.
Tenho um Form chamado fm_ZZMovimentos com diversos campos e pesquisas em outras tabelas, onde no momento que insiro a matricula do funcionário na portaria ele busca o último registro deste funcionário baseado no status dele E- Entrada ou S-Saída, na qual se for entrada ele assume S e se for saída ele assume E, uso o código abaixo para buscar o último registro:
Me.ID_Pessoa = DLookup("ID_Pessoa", "ZZ19_Pessoas", "Pessoa='" & Me!N_Documento & "'")
Me.ID_TipoPessoa = DLookup("ID_TipoPessoa", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa)
If Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 1 Then
Me.ID_Status.Value = 2
Me.Hora_Saida = Now
Me.Hora_Entrada = Null
ElseIf Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 2 Then
Me.ID_Status.Value = 1
Me.Hora_Entrada = Now
Me.Hora_Saida = Null
ElseIf Me.ID_TipoPessoa.Value <> 1 Then
Me.ID_Status.Value = 1
Me.Hora_Entrada = Now
End If
e diversas outras pesquisas que não coloquei aqui, mas o problema é este aqui acima.
Lembrando: Que as tabelas estão relacionadas, os campos que vão as pesquisas estão indexados, e a tabela ou consulta que busca a pesquisa estão ordenadas pelo ID_Pessoa que seria a busca.
o que ocorre que as vezes ele se perde na informação ( Era para buscar a Saida e Busca a entrada) e a partir daí o funcionário específico e outros ficam somente assumindo e registrando a entrada que foi a informação errada trazida. aí o que tenho que fazer compactar e reparar para voltar ao normal. mas logo em seguida ocorre novamente. abaixo deste tópico vou colocar todo o código do form para se alguem puder analisar e me dá uma luz. ou até mesmo incompatibilidade de run Time.
Quando o executo com o access instalado na minha máquina raramente ocorre o problema como mencionado acima, mas já aconteceu também ( Uso o access 2016 )
Quando executo na máquina do cliente (RunTime 2007) logo ocorre o erro mencionado
Abaixo segue o código completo do formZZMOVIMENTO que mencionei:
Private Sub N_Documento_AfterUpdate()
Me.Compara_Pessoa = DLookup("Pessoa", "ZZ19_Pessoas", "Pessoa='" & Me!N_Documento & "'") ' Busca na tabela Pessoas o registro, caso existente
If IsNull(Me.N_Documento <> Me.Compara_Pessoa) Then
Me.DocNovo = Me.N_Documento
Me.Undo
DoCmd.OpenForm "frm_ZZAtencaoFuncionarioNulo1"
Forms!frm_ZZAtencaoFuncionarioNulo1!CopiaID = Me.DocNovo
Cancel = True ' Verifica se o número digitado no campo N_Documento é existente
Else
Me.ID_Pessoa = DLookup("ID_Pessoa", "ZZ19_Pessoas", "Pessoa='" & Me!N_Documento & "'") 'Pesquisa o ID_Pessoa na tabela pessoas onde é igual ao N_Documento digitado
Me.Data_Movimento = Date ' Insere a data atual no campo Data_Movimento
Me.ID_TipoDoc = DLookup("ID_TipoDoc", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o tipo do documento
Me.ID_TipoPessoa = DLookup("ID_TipoPessoa", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa)' Pesquisa na Tab Pessoas o tipo de pessoa (Funcionario, Visitante, etc...)
Me.Func_Bloqueado = DLookup("Pessoa_Ativo", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas se a pessoa está bloqueada
Me.ID_DepartFunc = DLookup("ID_Departamento", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o departamento da pessoa
Me.ID_Veiculo = DLookup("ID_DetTipoVeiculo", "qry_ZZ19PESSOASXVEICULOS1", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o veículo da pessoa
Me.ID_Empresa_Fornec = DLookup("Empresa_Fornec", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas a empresa do visitante
Me.Caminho_Foto = DLookup("Caminho", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o caminho da foto do visitante
On Error Resume Next
Forms!frm_ZZMOVIMENTOS![Reg_Por] = Forms!FormMenuPrincipal![ID_Pessoa] ' Pesquisa no Form Principal quem efetuou o registro
End If
'O código mencionado acima'
If Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 1 Then
Me.ID_Status.Value = 2 ' Pesquisa na Consulta o último registro se a pessoa for 1 e status for 1, assume o campo como status 2
Me.Hora_Saida = Now
Me.Hora_Entrada = Null
ElseIf Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 2 Then
Me.ID_Status.Value = 1 ' Pesquisa na Consulta o último registro se a pessoa for 1 e status for 2, assume o campo como status 1
Me.Hora_Entrada = Now
Me.Hora_Saida = Null
ElseIf Me.ID_TipoPessoa.Value <> 1 Then ' Se a pessoa for diferente de 1 ele assume o status como 1
Me.ID_Status.Value = 1
Me.Hora_Entrada = Now
End If
Bem é ISSo aí, caso alguem possa me dar uma luz.
Lembro que no repositório tem o banco de exemplo,
FAVOR testarem no runtime também
Estou com um problema no meu bd que está me tirando o sono e já tem uma semana, revisando os códigos, tabelas, estruturas e etc... mas não consegui resolver até o momento em duas situações.
No sistema que tenho de controle de acesso (Portaria), inclusive disponível no repositório de exemplos aqui no fórum.
Tenho um Form chamado fm_ZZMovimentos com diversos campos e pesquisas em outras tabelas, onde no momento que insiro a matricula do funcionário na portaria ele busca o último registro deste funcionário baseado no status dele E- Entrada ou S-Saída, na qual se for entrada ele assume S e se for saída ele assume E, uso o código abaixo para buscar o último registro:
Me.ID_Pessoa = DLookup("ID_Pessoa", "ZZ19_Pessoas", "Pessoa='" & Me!N_Documento & "'")
Me.ID_TipoPessoa = DLookup("ID_TipoPessoa", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa)
If Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 1 Then
Me.ID_Status.Value = 2
Me.Hora_Saida = Now
Me.Hora_Entrada = Null
ElseIf Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 2 Then
Me.ID_Status.Value = 1
Me.Hora_Entrada = Now
Me.Hora_Saida = Null
ElseIf Me.ID_TipoPessoa.Value <> 1 Then
Me.ID_Status.Value = 1
Me.Hora_Entrada = Now
End If
e diversas outras pesquisas que não coloquei aqui, mas o problema é este aqui acima.
Lembrando: Que as tabelas estão relacionadas, os campos que vão as pesquisas estão indexados, e a tabela ou consulta que busca a pesquisa estão ordenadas pelo ID_Pessoa que seria a busca.
o que ocorre que as vezes ele se perde na informação ( Era para buscar a Saida e Busca a entrada) e a partir daí o funcionário específico e outros ficam somente assumindo e registrando a entrada que foi a informação errada trazida. aí o que tenho que fazer compactar e reparar para voltar ao normal. mas logo em seguida ocorre novamente. abaixo deste tópico vou colocar todo o código do form para se alguem puder analisar e me dá uma luz. ou até mesmo incompatibilidade de run Time.
Quando o executo com o access instalado na minha máquina raramente ocorre o problema como mencionado acima, mas já aconteceu também ( Uso o access 2016 )
Quando executo na máquina do cliente (RunTime 2007) logo ocorre o erro mencionado
Abaixo segue o código completo do formZZMOVIMENTO que mencionei:
Private Sub N_Documento_AfterUpdate()
Me.Compara_Pessoa = DLookup("Pessoa", "ZZ19_Pessoas", "Pessoa='" & Me!N_Documento & "'") ' Busca na tabela Pessoas o registro, caso existente
If IsNull(Me.N_Documento <> Me.Compara_Pessoa) Then
Me.DocNovo = Me.N_Documento
Me.Undo
DoCmd.OpenForm "frm_ZZAtencaoFuncionarioNulo1"
Forms!frm_ZZAtencaoFuncionarioNulo1!CopiaID = Me.DocNovo
Cancel = True ' Verifica se o número digitado no campo N_Documento é existente
Else
Me.ID_Pessoa = DLookup("ID_Pessoa", "ZZ19_Pessoas", "Pessoa='" & Me!N_Documento & "'") 'Pesquisa o ID_Pessoa na tabela pessoas onde é igual ao N_Documento digitado
Me.Data_Movimento = Date ' Insere a data atual no campo Data_Movimento
Me.ID_TipoDoc = DLookup("ID_TipoDoc", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o tipo do documento
Me.ID_TipoPessoa = DLookup("ID_TipoPessoa", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa)' Pesquisa na Tab Pessoas o tipo de pessoa (Funcionario, Visitante, etc...)
Me.Func_Bloqueado = DLookup("Pessoa_Ativo", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas se a pessoa está bloqueada
Me.ID_DepartFunc = DLookup("ID_Departamento", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o departamento da pessoa
Me.ID_Veiculo = DLookup("ID_DetTipoVeiculo", "qry_ZZ19PESSOASXVEICULOS1", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o veículo da pessoa
Me.ID_Empresa_Fornec = DLookup("Empresa_Fornec", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas a empresa do visitante
Me.Caminho_Foto = DLookup("Caminho", "ZZ19_Pessoas", "ID_Pessoa=" & Me!ID_Pessoa) ' Pesquisa na Tab Pessoas o caminho da foto do visitante
On Error Resume Next
Forms!frm_ZZMOVIMENTOS![Reg_Por] = Forms!FormMenuPrincipal![ID_Pessoa] ' Pesquisa no Form Principal quem efetuou o registro
End If
'O código mencionado acima'
If Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 1 Then
Me.ID_Status.Value = 2 ' Pesquisa na Consulta o último registro se a pessoa for 1 e status for 1, assume o campo como status 2
Me.Hora_Saida = Now
Me.Hora_Entrada = Null
ElseIf Me.ID_TipoPessoa.Value = 1 And DLast("[ID_Status]", "qry_MOVIMENTOS", "[ID_Pessoa]=" & Me!ID_Pessoa) = 2 Then
Me.ID_Status.Value = 1 ' Pesquisa na Consulta o último registro se a pessoa for 1 e status for 2, assume o campo como status 1
Me.Hora_Entrada = Now
Me.Hora_Saida = Null
ElseIf Me.ID_TipoPessoa.Value <> 1 Then ' Se a pessoa for diferente de 1 ele assume o status como 1
Me.ID_Status.Value = 1
Me.Hora_Entrada = Now
End If
Bem é ISSo aí, caso alguem possa me dar uma luz.
Lembro que no repositório tem o banco de exemplo,
FAVOR testarem no runtime também