AJUDAR EM CONSULTA SQL!

JONASJTG 16/06/2016 19:54:26
#463666
Boa Noite queria te agradecer pela ajuda que vc esta me dando mas não e o que tá na imagem ai que eu quero.

Vou anexar a base nova com dados e a imagem para vc ver o que eu quero.

Olhando a imagem você vera que tem 2 brinco x243 com datas 06/01/2016 e 07/05/2016.

O que eu quero que só mostre 07/05/2016 ou seja a ultima data da vacina e assim para os outros.

Estou postando uma base nova para vc testar já com dados a mais e se for possível posta modelo com as alterações para eu aprender.

como eu disse sou iniciante e estou apreendendo tudo na raça.

ALVAROVB2009 16/06/2016 22:14:51
#463682
Problema resolvido, agora que entendi o que vc quer, acho que pude te ajudar

Jonas o problema não esta se resolvendo no distinct do SQL, porque sempre irá um campo com data diferente,
A cláusula distinct não permite exibir um registro duplicado, DESDE QUE , TODOS os campos da seleção tenham o mesmo resultado, coisa que no seu caso não acontece, pois a data de vacina , id e observação tem dados diferentes, e como eles tem que aparecer no list, então não da para tira-los da seleção
Então o que fiz, foi organizar o select por ID e por data de vacina e criei um variável para comparar quando o ID for diferente joga ele para o list, quando for igual passa para o próximo registro
Como a organização esta feita primeira por ID e segundo pela data de vacina e organizada da mais atual para a mais antiga, sabemos que o primeiro registro de cada ID possui a data que vc quer

O comando é quase o mesmo que te passei
ComandoSQL = [Ô]SELECT or1.*, orv.dtvacina,orv.Vacinado FROM Origem or1 LEFT JOIN Origemvacina orv on or1.Brinco = orv.Brinco [Ô]
ComandoSQL = ComandoSQL & [Ô]WHERE orv.dtvacina Between #[Ô] & Format(CDate(Me.txt_data_inicial), [Ô]mm/dd/yyyy[Ô]) & [Ô]# And #[Ô] & Format(CDate(Me.txt_data_final), [Ô]mm/dd/yyyy[Ô]) & [Ô]# [Ô]
ComandoSQL = ComandoSQL & [Ô]order by or1.id, orv.dtvacina desc[Ô]
Call Conecta
Set consulta = banco.OpenRecordset(ComandoSQL)

Repare como ordenei [Ô]order by or1.id, orv.dtvacina desc[Ô]

A jogada vem agora
Antes de preencher o list faça o seguinte
Dim Codigo
Codigo = 0

While Not consulta.EOF
[ô]Aqui se compara, aqui o primeiro registro irá entrar, pois o codigo esta zerado
[ô]Depois de preencher o list, igualar o codigo ao código da consulta
[ô]Agora é só adaptar para o que vc precisa, dessa forma que esta nem precisa colocar as datas que ele ja esta trazendo o resultado esperado, isso por causa da comparação que esta sendo feita

If Codigo <> consulta(0) Then
Preencher o list
codigo = consulta(0)
end fi
consulta.movenext
wend

Estou te devolvendo o projeto com a alteração e agora como eu disse é adaptar para o que vc precisa

Qqer coisa é só perguntar, senão não esqueça de encerrar o post e de me pontuar caso tenha te ajudado
JONASJTG 16/06/2016 22:57:41
#463686
NOSSA MUITO OBRIGADO!

Mas estamos quase lá só uma coisa que eu não te avisei foi erro meu.

No controle de pesquisa tem 3 opções para escolher para filtrar.

Porque isso!
1 opção ela deve só mostra as ultima vacina. Porque quando for vacinar novamente será feito. (Data nova Vacina)
2 opção será uma consulta da vacina exemplo x243 ele vacino em 2014,2015 e 2016 trazer todas as datas. (Data da vacinação)
3 opção já esta certa. (Sem Vacinar)

Obs. estou tentando entender o que você e demais isso!
ALVAROVB2009 17/06/2016 09:50:17
#463714
Jonas da para fazer sim, nesse caso é como coloquei, precisa adaptar a minha resposta final para o que vc precisa

O comando será o mesmo, mudando apenas o que esta no Where, no order by e lá embaixo onde se compara o código
No where eu já vi que vc já faz isso

No order by, vc terá que ordenar pela data da vacina que vc deseja exibir e lembre de colocar o comando DESC ( Com esse comando exibi a data da mais atual para mais velha, sem esse comando a ordem é inversa da mais velha para mais atual )

Lá embaixo na comparação do código, faça um if perguntado se for a opção 3 entra na comparação do código que vai exibir somente essa data única, senão preenche o list sem a comparação e ai ele vai preencher o list com todas as datas que estiver no recordset

São essas 3 mudanças que vc precisa adaptar, qqer dúvida posta ai
JONASJTG 17/06/2016 12:48:11
#463732
MUITO OBRIGADO VOCÊ ME AJUDO BASTANTE ALVARO!

Fazendo favor vê se o código está certo da forma que fiz(Ta forma que entende e até onde meus conhecimentos vão)

Private Sub filtro_multi_Click()
On Error GoTo trata_erro

Dim brinco As String
Dim pbrinco As String
Dim Nantigo As String
Dim Animal As String
Dim Especificar As String
Dim Observacoes As String
Dim ativo As String
Dim vacinado As String

Dim ComandoSQL As String

Dim i As Integer
Dim Soma As Double
Dim Soma2 As Double
Dim Soma3 As Double
Dim Soma4 As Double

Application.ScreenUpdating = False

brinco = txtBrincop.Text
pbrinco = txtpbrincop.Text
Nantigo = txtNantigop.Text
Animal = txtanimalp.Text
Especificar = txtEspecificarp.Text
Observacoes = txtObservacoesp.Text
ativo = txtativop.Text
vacinado = txtvacinadop.Text

If txt_data_inicial.Text = [Ô][Ô] Or txt_data_final.Text = [Ô][Ô] Then
If Me.optDatanovavacina.Value = False Or Me.optDataVacina.Value = False Then

ComandoSQL = [Ô]SELECT or1.*, orv.dtvacina,orv.Vacinado FROM Origem or1, Origemvacina orv WHERE or1.Brinco = orv.Brinco[Ô]

End If
End If
If Me.optDatanovavacina.Value = True Then

ComandoSQL = [Ô]SELECT or1.*, orv.dtvacina,orv.Vacinado FROM Origem or1 LEFT JOIN Origemvacina orv on or1.Brinco = orv.Brinco [Ô]
ComandoSQL = ComandoSQL & [Ô]WHERE orv.dtvacina Between #[Ô] & Format(CDate(Me.txt_data_inicial), [Ô]mm/dd/yyyy[Ô]) & [Ô]# And #[Ô] & Format(CDate(Me.txt_data_final), [Ô]mm/dd/yyyy[Ô]) & [Ô]# [Ô]

End If

If Me.optDataVacina.Value = True Then
data_inicial = Format(Me.txt_data_inicial, [Ô]mm/dd/yyyy[Ô])
data_final = Format(Me.txt_data_final, [Ô]mm/dd/yyyy[Ô])

ComandoSQL = [Ô]SELECT or1.*, orv.dtvacina,orv.Vacinado FROM Origem or1 LEFT JOIN Origemvacina orv on or1.Brinco = orv.Brinco WHERE orv.dtvacina Between #[Ô] & data_inicial & [Ô]# And #[Ô] & data_final & [Ô]#[Ô]
End If

If brinco = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND or1.Brinco like[ô][Ô] & brinco & [Ô][ô] [Ô]
End If
If pbrinco = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND or1.Pbrinco like[ô][Ô] & pbrinco & [Ô][ô] [Ô]
End If
If Nantigo = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND or1.Nantigo like[ô][Ô] & Nantigo & [Ô][ô] [Ô]
End If
If Animal = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND or1.Animal like[ô][Ô] & Animal & [Ô][ô] [Ô]
End If
If Especificar = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND or1.Especificar like[ô][Ô] & Especificar & [Ô][ô] [Ô]
End If
If Observacoes = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND or1.Observacoes like[ô][Ô] & Observacoes & [Ô][ô] [Ô]
End If
If ativo = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND or1.ativo like[ô][Ô] & ativo & [Ô][ô] [Ô]
End If
If vacinado = [Ô][Ô] Then
Else
ComandoSQL = ComandoSQL & [Ô] AND orv.vacinado like[ô][Ô] & vacinado & [Ô][ô] [Ô]
End If

ComandoSQL = ComandoSQL & [Ô]order by or1.id, orv.dtvacina desc[Ô]
Call Conecta
Set consulta = banco.OpenRecordset(ComandoSQL)
lstLista.ListItems.Clear
lstLista.ColumnHeaders.Clear

With lstLista
.Gridlines = True
.View = lvwReport
.FullRowSelect = True
.ColumnHeaders.Add(, , [Ô]Nº[Ô], Width:=100).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Brinco[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]P.Brinco[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]NºAnca[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Nascimento[Ô], Width:=10).Tag = [Ô]date[Ô]
.ColumnHeaders.Add(, , [Ô]Raca[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Animal[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Situação[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Fazenda[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Observações[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Era(Idade Atual)[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Ativo[Ô], Width:=10).Tag = [Ô][Ô]
.ColumnHeaders.Add(, , [Ô]Vacinação[Ô], Width:=10).Tag = [Ô]date[Ô]
.ColumnHeaders.Add(, , [Ô]Vac.[Ô], Width:=48).Tag = [Ô][Ô]
End With

Dim Codigo
Codigo = 0

While Not consulta.EOF
If Codigo <> consulta(0) Then
If Me.optDatanovavacina.Value = True Then
Set List = lstLista.ListItems.Add(Text:=consulta(0)) [ô]id
[ô]Deixa em branco se a data estiver zerada
If consulta(1) = [Ô]0000[Ô] Then
List.SubItems(1) = [Ô][Ô]
Else
List.SubItems(1) = consulta(1)
End If [ô]Brinco
If consulta(2) = [Ô]0000[Ô] Then
List.SubItems(2) = [Ô][Ô]
Else
List.SubItems(2) = consulta(2)
End If [ô]Pbrinco
If consulta(3) = [Ô]0000[Ô] Then
List.SubItems(3) = [Ô][Ô]
Else
List.SubItems(3) = consulta(3)
End If [ô]Nantigo
If consulta(4) = [Ô]00:00:00[Ô] Then
List.SubItems(4) = [Ô][Ô]
Else: List.SubItems(4) = consulta(4)
End If [ô]DatadeNasc
List.SubItems(5) = consulta(5) [ô]raca
List.SubItems(6) = consulta(6) [ô]animal
List.SubItems(7) = consulta(7) [ô]Especificar
List.SubItems(8) = consulta(8) [ô]fazenda
List.SubItems(9) = consulta(9) [ô]Observacoes
List.SubItems(10) = consulta(10) [ô]IdadeAtualdasVacas
List.SubItems(11) = consulta(11) [ô]ativo
If consulta(12) = [Ô]00:00:00[Ô] Then
List.SubItems(12) = [Ô][Ô]
Else: List.SubItems(12) = consulta(12)
End If [ô]Vacinação
List.SubItems(13) = consulta(13) [ô]Vac.
Codigo = consulta(0)

Else [ô]Sem comparação na listview

Set List = lstLista.ListItems.Add(Text:=consulta(0)) [ô]id
[ô]Deixa em branco se a data estiver zerada
If consulta(1) = [Ô]0000[Ô] Then
List.SubItems(1) = [Ô][Ô]
Else
List.SubItems(1) = consulta(1)
End If [ô]Brinco
If consulta(2) = [Ô]0000[Ô] Then
List.SubItems(2) = [Ô][Ô]
Else
List.SubItems(2) = consulta(2)
End If [ô]Pbrinco
If consulta(3) = [Ô]0000[Ô] Then
List.SubItems(3) = [Ô][Ô]
Else
List.SubItems(3) = consulta(3)
End If [ô]Nantigo
If consulta(4) = [Ô]00:00:00[Ô] Then
List.SubItems(4) = [Ô][Ô]
Else: List.SubItems(4) = consulta(4)
End If [ô]DatadeNasc
List.SubItems(5) = consulta(5) [ô]raca
List.SubItems(6) = consulta(6) [ô]animal
List.SubItems(7) = consulta(7) [ô]Especificar
List.SubItems(8) = consulta(8) [ô]fazenda
List.SubItems(9) = consulta(9) [ô]Observacoes
List.SubItems(10) = consulta(10) [ô]IdadeAtualdasVacas
List.SubItems(11) = consulta(11) [ô]ativo
If consulta(12) = [Ô]00:00:00[Ô] Then
List.SubItems(12) = [Ô][Ô]
Else: List.SubItems(12) = consulta(12)
End If [ô]Vacinação
List.SubItems(13) = consulta(13) [ô]Vac.
End If
End If
consulta.MoveNext
Wend

Dim X, j As Integer
For X = 1 To Me.lstLista.ListItems.Count
With Me.lstLista
If .ListItems(X).ListSubItems(11).Text = [Ô]Não[Ô] Then
For j = 1 To .ColumnHeaders.Count - 1
.ListItems(X).ListSubItems(j).ForeColor = vbRed
Next
ElseIf .ListItems(X).ListSubItems(7).Text = [Ô]Novilha Cab. Local[Ô] Then
For j = 1 To .ColumnHeaders.Count - 1
.ListItems(X).ListSubItems(j).ForeColor = vbBlack
Next
ElseIf .ListItems(X).ListSubItems(7).Text = [Ô]Vaca Leiteira Local[Ô] Then
For j = 1 To .ColumnHeaders.Count - 1
.ListItems(X).ListSubItems(j).ForeColor = vbBlack
Next
ElseIf .ListItems(X).ListSubItems(7).Text = [Ô]Touro Local[Ô] Then
For j = 1 To .ColumnHeaders.Count - 1
.ListItems(X).ListSubItems(j).ForeColor = vbBlue
Next
End If
End With
Next

Call Desconecta
Call RedimensionaColuna

Me.lbl_registros = Me.lstLista.ListItems.Count & [Ô] Animal(is) encontrado(s).[Ô]

For i = 1 To lstLista.ListItems.Count
If lstLista.ListItems.Item(i).SubItems(7) = [Ô]Vaca Local[Ô] Then
Soma = Soma + 1
End If
Next i
Me.lbl_registros2 = Soma & [Ô] Vaca(s) encontrada(s).[Ô]

For i = 1 To lstLista.ListItems.Count
If lstLista.ListItems.Item(i).SubItems(7) = [Ô]Novilha Cab. Local[Ô] Then
Soma2 = Soma2 + 1
End If
Next i
Me.lbl_registros3 = Soma2 & [Ô] Novilha(s) Cabeceira(s) encontrada(s).[Ô]

For i = 1 To lstLista.ListItems.Count
If lstLista.ListItems.Item(i).SubItems(7) = [Ô]Vaca Leiteira Local[Ô] Then
Soma3 = Soma3 + 1
End If
Next i
Me.lbl_registros4 = Soma3 & [Ô] Vaca Leiteira(s) encontrada(s).[Ô]

For i = 1 To lstLista.ListItems.Count
If lstLista.ListItems.Item(i).SubItems(7) = [Ô]Touro Local[Ô] Then
Soma4 = Soma4 + 1
End If
Next i
Me.lbl_registros5 = Soma4 & [Ô] Touro(s) encontrada(s).[Ô]

Exit Sub
trata_erro:
Call RedimensionaColuna
End Sub
ALVAROVB2009 17/06/2016 13:11:28
#463734
Sei que vc esta no começo, por isso que estou te ajudando
Depois que vc pegar a manha, a primeira coisa que precisa é fazer é melhorar os códigos, esta muito bagunçado

Más sei como são as coisas, passei por isso também rsrsrs

Vamos aos erros e corrigir
1º Esse comando vai em todos os scripts da data, vc não vai mais usar a variavel que vc criou, e sim o format e o cdate
[Ô]WHERE orv.dtvacina Between #[Ô] & Format(CDate(Me.txt_data_inicial), [Ô]mm/dd/yyyy[Ô]) & [Ô]# And #[Ô] & Format(CDate(Me.txt_data_final), [Ô]mm/dd/yyyy[Ô]) & [Ô]# [Ô]

2º Troca a posição dessa linha
If Codigo <> consulta(0) Then
If Me.optDatanovavacina.Value = True Then

o correto é esse
If Me.optDatanovavacina.Value = True Then
If Codigo <> consulta(0) Then

Aqui só vai comparar se o código é igual somente se a opção para isso estiver selecionada, da forma que esta fica errado


No mais acho que é isso
JONASJTG 17/06/2016 22:25:00
#463755
Nossa Alvaro essas dicas são muito boas!

Só fico uma coisa errada eu achei que tinha conseguido fazer funcionar e a 3 opção de (Sem vacinar) mas não consegui.

Pq eu teria que fazer uma conferencia de dada por ano.
Exemplo
Brinco x243 vacino em qualquer data de 2014
Brinco x243 vacino em qualquer data de 2015
Só que em 2016 não vacino
Ai eu queria que no listview só mostra-se esses que não vacino.

Obs: Desculpa estar te atrapalhando tanto se for possivel continuar me ajudar agradeço bastante!

Como devo fazer para resolver isso?

ALVAROVB2009 17/06/2016 22:41:40
#463757
Jonas a opção 3 não é a que ajustamos para exibir somente 1 resultado no list??
JONASJTG 17/06/2016 22:44:30
#463758
E só pra mostra o que não foi vacinado no ano atual.

JONASJTG 18/06/2016 08:14:49
#463770
Bom dia alvaro não tinha lido corretamente sua pergunta!

Alvaro
Jonas a opção 3 não é a que ajustamos para exibir somente 1 resultado no list??

Jonas
E sim mas como eu achei que tinha dado certo a 3 opção mas não tava errado essa 3 opção tem que trazer so o que nao foi vacinado não sei se tem como vc me ajudar!

Página 3 de 7 [65 registro(s)]
Tópico encerrado , respostas não são mais permitidas