Vídeo recomendado
https://youtu.be/Ju8Esra5--I

Dados do código mais recente

Discussões sobre a integração do Excel com o Banco de Dados Access

Moderador: joseA

Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: Dados do código mais recente

Mensagem por Reinaldo »

Ao utilizar o Group By em uma consulta sql, e esperado que todos os dados/termos dos registros sejam iguais, havendo uma diferença de um dos "termos" , e considerado um outro registro.
Como em seu modelo/exemplo temos; por exemplo; "visitante" TESTE2 (entre outros) com uma entrada as 14hs e outra as 16:30hs; na consulta o retorno será de 2 registros,
Uma possibilidade para contornar esse "problema" será antes de preencher o formulario se posicionar no ultimo recordset da consulta
algo +/- assim

Código: Selecionar todos

Private Sub CbxNome_Change()
 Application.ScreenUpdating = False
 'On Error GoTo Erro
 Set Rs = New ADODB.Recordset
 ConectarBD
 Rs.Open "SELECT Nome_Visitante, RG, CPF, Nome_Paciente, Setor, Leito, Hora_entrada, OBS, Max(Código)" & _
         "FROM Banco_Visita WHERE Nome_Visitante='" & Cadastrado.CbxNome.Text & "'" & _
         "Group by Nome_Visitante, RG, CPF, Nome_Paciente, Setor, Leito, Hora_entrada, OBS", Conexao, adOpenKeyset, adLockReadOnly

 If Rs.RecordCount > 0 Then
 Rs.MoveLast
  Cadastrado.CbxNome.Text = Rs!Nome_Visitante
  Cadastrado.TxtRG = Rs!RG
  Cadastrado.TxtCPF = Rs!CPF
  Cadastrado.TxtPaciente = Rs!Nome_Paciente
  Cadastrado.TxtSetor = Rs!Setor
  Cadastrado.TxtLeito.Text = Rs!Leito
  ''Cadastrado.TxtData = VBA.Date
  Cadastrado.TxtHoras = Rs!Hora_entrada
  Cadastrado.TxtOBS = Rs(8) 'Rs!OBS
 Else
  MsgBox "Não encontrado!", vbInformation, "ReCadastrado"
 End If
 Módulo1.Fechar_RS
 DesconectarBD
 Exit Sub
Erro:
 MsgBox "Erro!", vbCritical, "ERRO"
 Application.ScreenUpdating = True
End Sub
uma outra possibilidade e na consulta retornar apenas o ultimo registro
algo +/- assim:

Código: Selecionar todos

Private Sub CbxNome_Change()
 Application.ScreenUpdating = False
 'On Error GoTo Erro
 Set Rs = New ADODB.Recordset
 ConectarBD
 Rs.Open "SELECT Last(Nome_Visitante), Last(RG), Last(CPF), Last(Nome_Paciente), Last(Setor), Last(Leito), Last(Hora_entrada), Last(OBS), Last(Código) AS cod " & _
 "FROM Banco_Visita WHERE Nome_Visitante='" & Cadastrado.CbxNome.Text & "' " & _
 "ORDER BY Last(CPF), Last(Nome_Paciente), Last(Setor), Last(Leito), Last(Hora_entrada), Last(OBS), Last(Código)", Conexao, adOpenKeyset, adLockReadOnly

 If Rs.RecordCount > 0 Then
  Cadastrado.CbxNome.Text = Rs(0) 'Rs!Visitante
  Cadastrado.TxtRG = Rs(1)
  Cadastrado.TxtCPF = Rs(2)
  Cadastrado.TxtPaciente = Rs(3)
  Cadastrado.TxtSetor = Rs(4)
  Cadastrado.TxtLeito.Text = Rs(5)
  Cadastrado.txtCod.Text = Rs!cod
  ''Cadastrado.TxtData = VBA.Date
  Cadastrado.TxtHoras = Rs(6)
  Cadastrado.TxtOBS = Rs(7)
 Else
  MsgBox "Não encontrado!", vbInformation, "ReCadastrado"
 End If
 Módulo1.Fechar_RS
 DesconectarBD
 Exit Sub
Erro:
 MsgBox "Erro!", vbCritical, "ERRO"
 Application.ScreenUpdating = True
End Sub
Teste/experimente e veja qual se aplica melhor a sua realidade


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Jorge Luiz Nunes
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Sex Set 23, 2022 10:12 pm

Re: Dados do código mais recente

Mensagem por Jorge Luiz Nunes »

Reinaldo, de antemão gostaria de agradecer pela sua atenção em ajudar, as 2 rotinas estão funcionado normalmente nos teste ate o momento.
No que diz respeito a códigos vba excel, SQL access sou leigo no assunto, então, só algumas perguntas.
1º exemplo - Cadastrado.TxtOBS = Rs(8) 'Rs!OBS nesta linha do código vba você usou Rs(8) e comentou Rs!OBS foi opcional ou faz parte do desempenho do código ?

2º exemplo
- Last(Código) AS cod o que seria o "cod" ?
- Cadastrado.CbxNome.Text = Rs(0) 'Rs!Visitante, em vídeos que assisti o Rs(0) seria o campo "Código" e "Rs!Visitante" seria Rs(3), mais você usou Rs!Visitante como sendo o Rs(0), mais uma duvida.

Para finalizar, no banco de teste usei nome iguais e cpf diferentes, uma situação que poderá acontecer, pergunto como seria a rotina de comparação dos eventos "Private Sub UserForm_Activate() - CbxNome.AddItem Rs!Nome_Visitante" e Private Sub CbxNome_Change() para você escolher o primeiro nome com cpf 111.111.111-11 ou o segundo nome com o cpf 222.222.222-22.

Obrigado pela atenção.


Avatar do usuário
Reinaldo
Jedi
Jedi
Mensagens: 1537
Registrado em: Sex Ago 01, 2014 4:09 pm
Localização: Garça - SP / SCS - SP

Re: Dados do código mais recente

Mensagem por Reinaldo »

"1º exemplo - Cadastrado.TxtOBS = Rs(8) 'Rs!OBS"
Somente para "trazer;visualizar" no formulario o numero do codigo obtido; esqueci de retornar ao original
"Last(Código) AS cod o que seria o "cod" "
Renomeação do campo, altera a denominação de retorno, para um "valor" desejado
"Cadastrado.CbxNome.Text = Rs(0) 'Rs!Visitante"
O Campo/Field é retornado na sequencia da consulta efetuada; onde nessa consulta "Last(Nome_Visitante" e o primeiro campo (RS(0)) e "Last(Código)" e o ultimo (Rs(8))
"vídeos que assisti o..." Muito provavelmente nesse vidio, o primeiro registro/campo da consulta seria Código.
A Ordem de retorno do campo/registro/field, segue a ordem utilizada na consulta.
Nessa situação, mesmo nome e identificação diferente, creio que deva "trazer" para a combo, inserindo na mesma os dois campos
Nome e CPF
Algo como "SELECT DISTINCT Nome_Visitante, CPF FROM Banco_visita..."
e na segunda rotina incluir na pesquisa na clausila Where o campo CpF tambem
Algo como "WHERE Nome_Visitante='" & Cadastrado.CbxNome.Text & "' and CPF=...
Obs.Não tenho certeza/lembro da sintaxe correta, e estou sem sistema para testar/montar. Tente se não obtiver exito retorne com a necessidade.


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder