Vídeo recomendado
https://youtu.be/diWPPPhW-9E

FILTRAR INTERVALO DE DATAS [RESOLVIDO]

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

Moderador: joseA

Avatar do usuário
LEANDRO ALVES
Manda bem
Manda bem
Mensagens: 161
Registrado em: Dom Jul 25, 2010 7:41 pm

FILTRAR INTERVALO DE DATAS [RESOLVIDO]

Mensagem por LEANDRO ALVES »

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 :mrgreen:

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.


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.


Avatar do usuário
joseA
Jedi
Jedi
Mensagens: 1048
Registrado em: Qui Out 22, 2009 7:22 am
Localização: Cel. Fabriciano - MG

Re: FILTRAR INTERVALO DE DATAS

Mensagem por joseA »

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:

Código: Selecionar todos

sql = "SELECT Codigo, Pedido, Cliente, DtPedido, Entrega, Frete, Nome FROM Pedidos"


Avatar do usuário
LEANDRO ALVES
Manda bem
Manda bem
Mensagens: 161
Registrado em: Dom Jul 25, 2010 7:41 pm

Re: FILTRAR INTERVALO DE DATAS

Mensagem por LEANDRO ALVES »

Bom dia Jose,

Neste caso o "*" faz referência a todos os campos da tabela.

Código: Selecionar todos

sql = "SELECT * FROM Pedidos"
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?


Avatar do usuário
joseA
Jedi
Jedi
Mensagens: 1048
Registrado em: Qui Out 22, 2009 7:22 am
Localização: Cel. Fabriciano - MG

Re: FILTRAR INTERVALO DE DATAS

Mensagem por joseA »

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. :oops:

Abraços.


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.


Avatar do usuário
LEANDRO ALVES
Manda bem
Manda bem
Mensagens: 161
Registrado em: Dom Jul 25, 2010 7:41 pm

Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]

Mensagem por LEANDRO ALVES »

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. :mrgreen: 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
Abraços :lol:
Anexos
FiltroData.rar
(67.65 KiB) Baixado 790 vezes


Avatar do usuário
joseA
Jedi
Jedi
Mensagens: 1048
Registrado em: Qui Out 22, 2009 7:22 am
Localização: Cel. Fabriciano - MG

Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]

Mensagem por joseA »

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:

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
Nesste tópico aprendi três coisas:
01 -
LEANDRO ALVES escreveu:...o "*" faz referência a todos os campos da tabela.

Código: Selecionar todos

sql = "SELECT * FROM Pedidos"
...
02 - A maneira "enxuta" como carregastes o ListView;

03 - Sobre pesquisa com datas (fiquei mais tranquilo quanto ao futuro das minhas pesquisas com datas :lol: ).

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.


Avatar do usuário
LEANDRO ALVES
Manda bem
Manda bem
Mensagens: 161
Registrado em: Dom Jul 25, 2010 7:41 pm

Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]

Mensagem por LEANDRO ALVES »

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". :D

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
Abraços


Avatar do usuário
joseA
Jedi
Jedi
Mensagens: 1048
Registrado em: Qui Out 22, 2009 7:22 am
Localização: Cel. Fabriciano - MG

Re: FILTRAR INTERVALO DE DATAS [RESOLVIDO]

Mensagem por joseA »

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.

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 "


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