Vídeo recomendado
https://youtu.be/diWPPPhW-9E
https://youtu.be/diWPPPhW-9E
FILTRAR INTERVALO DE DATAS [RESOLVIDO]
Moderador: joseA
- LEANDRO ALVES
- Manda bem
- Mensagens: 161
- Registrado em: Dom Jul 25, 2010 7:41 pm
FILTRAR INTERVALO DE DATAS [RESOLVIDO]
Caros colegas,
Não estou conseguindo realizar o filtro com intervalo de datas. O form até filtra, mas o intervalo não está correto.
Já quebrei a cabeça e até agora não tive sucesso. Tentei recursos como ">= and <=" , tambem não funcionou.
Se alguem puder dar uma ajudinha, fico muito agradecido.
Oh JoseA, socorre aí meu amigo...rsrsrs
Abraços
Não estou conseguindo realizar o filtro com intervalo de datas. O form até filtra, mas o intervalo não está correto.
Já quebrei a cabeça e até agora não tive sucesso. Tentei recursos como ">= and <=" , tambem não funcionou.
Se alguem puder dar uma ajudinha, fico muito agradecido.
Oh JoseA, socorre aí meu amigo...rsrsrs
Abraços
- Anexos
-
- FiltroData.rar
- (59.84 KiB) Baixado 900 vezes
Editado pela última vez por LEANDRO ALVES em Dom Jan 15, 2012 1:04 pm, em um total de 1 vez.
- joseA
- Jedi
- Mensagens: 1048
- Registrado em: Qui Out 22, 2009 7:22 am
- Localização: Cel. Fabriciano - MG
Re: FILTRAR INTERVALO DE DATAS
Olá Leandro,
Nesse exemplo (viewtopic.php?f=22&t=1408) existe uma pesquisa com datas.
Olhei rapidamente, não testei, mas me parece que faltou referenciar todos os campos da base, tipo:
Nesse exemplo (viewtopic.php?f=22&t=1408) existe uma pesquisa com datas.
Olhei rapidamente, não testei, mas me parece que faltou referenciar todos os campos da base, tipo:
Código: Selecionar todos
sql = "SELECT Codigo, Pedido, Cliente, DtPedido, Entrega, Frete, Nome FROM Pedidos"
- LEANDRO ALVES
- Manda bem
- Mensagens: 161
- Registrado em: Dom Jul 25, 2010 7:41 pm
Re: FILTRAR INTERVALO DE DATAS
Bom dia Jose,
Neste caso o "*" faz referência a todos os campos da tabela.
Eu utilizei o topico que voce citou (Um Norte) como base, mas não funcionou. Eu testei com numeros e o comdando "Between" funcionou perfeitamente, mas com datas não deu certo. Tentei utilizar o recurso que voce me passou neste tópico e tambem nao funcionou.
viewtopic.php?f=5&t=981&start=10
Eu estou pensando em converter as datas para número, mas temo quando filtrar uma tabela com 10.000 registros por exemplo, o desempenho do applicativo cairá muito.
O que voce acha?
Neste caso o "*" faz referência a todos os campos da tabela.
Código: Selecionar todos
sql = "SELECT * FROM Pedidos"
viewtopic.php?f=5&t=981&start=10
Eu estou pensando em converter as datas para número, mas temo quando filtrar uma tabela com 10.000 registros por exemplo, o desempenho do applicativo cairá muito.
O que voce acha?
- joseA
- Jedi
- Mensagens: 1048
- Registrado em: Qui Out 22, 2009 7:22 am
- Localização: Cel. Fabriciano - MG
Re: FILTRAR INTERVALO DE DATAS
Leandro,
Me lembro que certa vez peguei o Modelo Cadastro e copiei/colei vários dados nele e os botões de navegação e pesquisa deixaram de funcionar corretamente, simplesmente "desprezavam" alguns dados. Depois de muito tempo, em um tópico, o nosso amigo Mauro Coutinho informou que haveria incompatibilidades de formatação nesse colar/copiar e os dados não seriam lidos. Aconteceu comigo também quando copiei/colei do Excel para o Access a pesquisa com datas parou de funcionar, se me recordo bem, refiz toda coluna e digitei manualmente uma a uma, eram poucas datas.
Testei sua instrução com poucos dados (31), deletando várias linhas, e funcionou, ou seja o procedimento está correto.
Tenho pouca experiência com Access, espero que o Tomás tenha uma orientação.
Quanto a converter as datas para número, penso que esse é um caminho, se funciona. Afinal o formato utilizado é texto.
P. S.: Se a pesquisa com datas apresentar problemas com um grande volume de dados, estou perdido, por equanto tenho poucos dados.
Abraços.
Me lembro que certa vez peguei o Modelo Cadastro e copiei/colei vários dados nele e os botões de navegação e pesquisa deixaram de funcionar corretamente, simplesmente "desprezavam" alguns dados. Depois de muito tempo, em um tópico, o nosso amigo Mauro Coutinho informou que haveria incompatibilidades de formatação nesse colar/copiar e os dados não seriam lidos. Aconteceu comigo também quando copiei/colei do Excel para o Access a pesquisa com datas parou de funcionar, se me recordo bem, refiz toda coluna e digitei manualmente uma a uma, eram poucas datas.
Testei sua instrução com poucos dados (31), deletando várias linhas, e funcionou, ou seja o procedimento está correto.
Tenho pouca experiência com Access, espero que o Tomás tenha uma orientação.
Quanto a converter as datas para número, penso que esse é um caminho, se funciona. Afinal o formato utilizado é texto.
P. S.: Se a pesquisa com datas apresentar problemas com um grande volume de dados, estou perdido, por equanto tenho poucos dados.
Abraços.
- LEANDRO ALVES
- Manda bem
- Mensagens: 161
- Registrado em: Dom Jul 25, 2010 7:41 pm
Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]
Olá JoseA,
Eu também passei pelo problema de incompatibilidade no Modelo de Cadastro com BD Access. Depois que importei os dados da planilha para o Access e fui filtrar, os campos que estavam vazios geravam um erro. Então eu tive refazer cadastro por cadastro até preenche todos os registro. Interessante que se voce fizer um cadastro no form e deixar algum campo em branco não tem problema, o filtro acontece normalmente, mas se importar dados de outra fonte o Recordset reconhece o campo vazio como nulo, logo não dá para filtrar.
Vamos ao que interessa. Eu não tinha observado que o meu campo "DtPedido" estava como texto, assim não funcionaria nunca. Muito obrigado pela observação. Modifiquei na tabela para Data/Hora e ainda assim o filtro não funciou corretamente. Sempre aparecia alguns registros que não correspondiam com o critério de pesquisa. Achei a solução no seguinte site: http://www.macoratti.net/ado_filt.htm
Nesta página eu aprendi que no filtro as datas devem ser envolvidas por #(tralha) e não por aspas simples como eu estava fazendo.
Também conheci a propriedade "Filter" do recordset que atendeu perfeitamente à minha necessidade. Enfim, o filtro por intervalo de datas funcionou muito bem. Estou compartilhando para quem precisar.
O código ficou assim:
Abraços
Eu também passei pelo problema de incompatibilidade no Modelo de Cadastro com BD Access. Depois que importei os dados da planilha para o Access e fui filtrar, os campos que estavam vazios geravam um erro. Então eu tive refazer cadastro por cadastro até preenche todos os registro. Interessante que se voce fizer um cadastro no form e deixar algum campo em branco não tem problema, o filtro acontece normalmente, mas se importar dados de outra fonte o Recordset reconhece o campo vazio como nulo, logo não dá para filtrar.
Vamos ao que interessa. Eu não tinha observado que o meu campo "DtPedido" estava como texto, assim não funcionaria nunca. Muito obrigado pela observação. Modifiquei na tabela para Data/Hora e ainda assim o filtro não funciou corretamente. Sempre aparecia alguns registros que não correspondiam com o critério de pesquisa. Achei a solução no seguinte site: http://www.macoratti.net/ado_filt.htm
Nesta página eu aprendi que no filtro as datas devem ser envolvidas por #(tralha) e não por aspas simples como eu estava fazendo.
Também conheci a propriedade "Filter" do recordset que atendeu perfeitamente à minha necessidade. Enfim, o filtro por intervalo de datas funcionou muito bem. Estou compartilhando para quem precisar.
O código ficou assim:
Código: Selecionar todos
Me.ListView1.ListItems.Clear
cx.Provider = "Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\banco.accdb"
cx.Open
sql = "SELECT * FROM Pedidos"
Set banco = New ADODB.Recordset
banco.Open sql, cx, adOpenKeyset, adLockOptimistic
banco.Filter = "DtPedido>=#" & Format(Me.TextBox1, "dd/mm/yyyy") & "# and DtPedido<=#" & Format(Me.TextBox2, "dd/mm/yyyy") & "#"
Call PreencheLista
Set banco = Nothing
cx.Close
- Anexos
-
- FiltroData.rar
- (67.65 KiB) Baixado 790 vezes
- joseA
- Jedi
- Mensagens: 1048
- Registrado em: Qui Out 22, 2009 7:22 am
- Localização: Cel. Fabriciano - MG
Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]
Olá Leandro,
Não poderíamos perder essa empreitada. Antes do almoço havia pesquisado aqui mesmo no fórum e achei esta referência: viewtopic.php?f=5&t=375&hilit=clausula+where
Baseado nela havia adaptado sua pesquisa, confira:
Nesste tópico aprendi três coisas:
01 -
03 - Sobre pesquisa com datas (fiquei mais tranquilo quanto ao futuro das minhas pesquisas com datas ).
Aliás, se der explique o preenchimento "enxuto" do ListView, pricipalmente a interpretação de formato. Tem um exemplo do Mauro que ajusta as colunas automático.
Abraços.
Em tempo: Aliás quatro, tem a propriedade Filter também.
Não poderíamos perder essa empreitada. Antes do almoço havia pesquisado aqui mesmo no fórum e achei esta referência: viewtopic.php?f=5&t=375&hilit=clausula+where
Baseado nela havia adaptado sua pesquisa, confira:
Código: Selecionar todos
Me.ListView1.ListItems.Clear
cx.Provider = "Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.Path & "\banco.accdb"
cx.Open
sql = "SELECT * FROM Pedidos"
' sql = sql & " WHERE DtPedido BETWEEN '" & CDate(Me.TextBox1) & "' AND '" & CDate(Me.TextBox2) & "'"
sql = "Select * From [Pedidos] Where [DtPedido] >= #" & Format(Me.TextBox1, "mm/dd/yyyy") & "# AND DtPedido <= #" & Format(Me.TextBox2, "mm/dd/yyyy") & "#ORDER BY DtPedido "
Set banco = New ADODB.Recordset
banco.Open sql, cx, adOpenKeyset, adLockOptimistic
Call PreencheLista
Set banco = Nothing
cx.Close
01 -
02 - A maneira "enxuta" como carregastes o ListView;LEANDRO ALVES escreveu:...o "*" faz referência a todos os campos da tabela.
...Código: Selecionar todos
sql = "SELECT * FROM Pedidos"
03 - Sobre pesquisa com datas (fiquei mais tranquilo quanto ao futuro das minhas pesquisas com datas ).
Aliás, se der explique o preenchimento "enxuto" do ListView, pricipalmente a interpretação de formato. Tem um exemplo do Mauro que ajusta as colunas automático.
Abraços.
Em tempo: Aliás quatro, tem a propriedade Filter também.
- LEANDRO ALVES
- Manda bem
- Mensagens: 161
- Registrado em: Dom Jul 25, 2010 7:41 pm
Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]
Olá JoseA,
Sou muito grato pelo seu desempenho em me ajudar com este problema que mais parecia um monstro de 7 cabeças. Ainda não testei a rotina que voce postou, mas baseado no que vi e no tópico que voce citou eu creio que ela dará resultados eficazes. Fico muito feliz que tenhamos aprendido coisas novas, junto e num só tópico. A intensão é esta mesmo, sempre aprender e compartilhar.
O método de preenchimento do listview eu aprendi no seguinte artigo do José Carlos Macoratti. http://www.macoratti.net/vb_tdl1.htm. Eu não sei se é proibido citar outros autores aqui, mas vou arriscar a dizer que o trabalho do Macoratti é muitíssimo excelente assim como o do Tomás (Este dois são responsáveis por hoje eu me considerar um aprendiz de programação) . Neste artigo o Macoratti trata de varias utilidades do listview e algumas possiveis configuraçoes para nossas aplicações e pelos teste que fiz todas podem ser usadas em vba. Lembrando que este modo de preencher o listview só pode user utilizado através do recordset, pelo menos nos teste que fiz foi assim.
Este preenchimento consiste em dois loops, um para Linhas (registros) e outra para colunas (campos). Poderia ter utilizado dois for next por exemplo, mas como a proposta original era utilizar o While e o For e assim tem funcionado muito bem eu não quis mudar. Fica à criterio. Lembrando que é muito importante declarar a variavel como ListItem, para que funcione corretamente. Sendo assim o If verifica se a variável i esta referenciando o campo "Frete" que é unidade monetaria, caso sim ele formata o registro como "Currency". Simples assim. "Eu sei, é só VBA. Mas eu gosto".
Abraços
Sou muito grato pelo seu desempenho em me ajudar com este problema que mais parecia um monstro de 7 cabeças. Ainda não testei a rotina que voce postou, mas baseado no que vi e no tópico que voce citou eu creio que ela dará resultados eficazes. Fico muito feliz que tenhamos aprendido coisas novas, junto e num só tópico. A intensão é esta mesmo, sempre aprender e compartilhar.
O método de preenchimento do listview eu aprendi no seguinte artigo do José Carlos Macoratti. http://www.macoratti.net/vb_tdl1.htm. Eu não sei se é proibido citar outros autores aqui, mas vou arriscar a dizer que o trabalho do Macoratti é muitíssimo excelente assim como o do Tomás (Este dois são responsáveis por hoje eu me considerar um aprendiz de programação) . Neste artigo o Macoratti trata de varias utilidades do listview e algumas possiveis configuraçoes para nossas aplicações e pelos teste que fiz todas podem ser usadas em vba. Lembrando que este modo de preencher o listview só pode user utilizado através do recordset, pelo menos nos teste que fiz foi assim.
Este preenchimento consiste em dois loops, um para Linhas (registros) e outra para colunas (campos). Poderia ter utilizado dois for next por exemplo, mas como a proposta original era utilizar o While e o For e assim tem funcionado muito bem eu não quis mudar. Fica à criterio. Lembrando que é muito importante declarar a variavel como ListItem, para que funcione corretamente. Sendo assim o If verifica se a variável i esta referenciando o campo "Frete" que é unidade monetaria, caso sim ele formata o registro como "Currency". Simples assim. "Eu sei, é só VBA. Mas eu gosto".
Código: Selecionar todos
Public lst As ListItem
Sub PreencheLista()
With Me.ListView1
While Not banco.EOF = True
Set lst = .ListItems.Add(, , banco(0))
For i = 1 To banco.Fields.Count - 1
If i = 5 Then
lst.SubItems(i) = Format(banco(i), "Currency")
Else
lst.SubItems(i) = banco(i)
End If
Next
banco.MoveNext
Wend
End With
End Sub
- joseA
- Jedi
- Mensagens: 1048
- Registrado em: Qui Out 22, 2009 7:22 am
- Localização: Cel. Fabriciano - MG
Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]
Vlw,
Obrigado por citar essa referência do Macoratti, já conhecia o site, não essa página do ListView, tentarei exercitar.
Estava verificando no Modelo Cadastro ocorre esse loop para preenchimento, não havia atentado para isso.
Quanto a rotina é a sua mesmo só adaptei a linha de critério de pesquisa, funcionou corretamente. Com o formato data na base de dados.
Obrigado por citar essa referência do Macoratti, já conhecia o site, não essa página do ListView, tentarei exercitar.
Estava verificando no Modelo Cadastro ocorre esse loop para preenchimento, não havia atentado para isso.
Quanto a rotina é a sua mesmo só adaptei a linha de critério de pesquisa, funcionou corretamente. Com o formato data na base de dados.
Código: Selecionar todos
sql = "Select * From [Pedidos] Where [DtPedido] >= #" & Format(Me.TextBox1, "mm/dd/yyyy") & "# AND DtPedido <= #" & Format(Me.TextBox2, "mm/dd/yyyy") & "#ORDER BY DtPedido "