Filtros sequenciais

Neste exemplo é mostrado como criar filtros que vão afunilando os resultados conforme vão sendo aplicados.

Por exemplo, ao filtrar uma cidade somente os registros referentes àquela cidade são mostrados no formulário e as caixas de combinação dos demais  filtros também apresentam somente os itens relacionados a essa cidade.

A filtragem pode ser iniciada em qualquer das caixas de combinação e pode ser feita em qualquer ordem.

Arquitetura

A única exigência em termos estruturais é que o nome da caixa de combinação  tenha o prefixo “fm” + “origem do registro” do campo que ela seleciona.

Por. ex.: Origem do registro do campo = Cidade -> Nome da caixa de combinação -> fmCidade.

Você pode criar quantos conjuntos de caixa de combinação e campo quiser.

Uma função cria a SQL para o filtro e para a Origem da linha das caixas de combinação a cada filtragem que é feita.

O código está comentado e são necessárias poucas alterações para adaptá-lo às suas necessidades.

SÓ VALE PARA CAMPOS DO TIPO TEXTO !!!

Veja a nova versão  que filtra outros tipos de campo :  Filtros Sequenciais V2

Veja também : Filtros sequencias para subformulários

Antes de baixar, veja este exemplo que é muito mais versátil

(Versão 0.07 – Revisada em 31/07/10)

Veja os termos de uso na página Sobre

36 Responses to Filtros sequenciais

  1. Malfer disse:

    Muito bom !!

    Mas gostaria de ajuda para alterar. Pois no momento que estou intercalando seleção entre uma caixa e outra esta ocorrendo msg(Tipo de dados incompatíveis na expressão de critério), após msg o combo fica em branco.
    Outro evento é quando seleciona botão de limpar filtros, onde ocorre o seguinte erro, quando clica para selecionar valores no compo para novo filtro (Erro de sintaxe na expressão de consulta ‘008_operacao.local_operacao’.) sendo que o combo perde os valores e fica vazio. Voltando ao normal quando fecho e abro o form novamente.

  2. Malfer
    O erro está ocorrendo no exemplo ou na adaptação que você está fazendo ?
    Se for na adaptação, a mensagem “Tipo de dados incompatíveis …” deve estar ocorrendo porque o campo que você está tentando selecionar NÃO deve ser do tipo texto. Se isso for verdade, o erro ao tentar limpar os filtros é decorrente do anterior.
    Abraço
    Paulão

  3. Henrique disse:

    Gostaria de aplicar um desses filtros a um campo memorando, e que o criterio de busca fosse “Contém” e não “é igual à”

    Estou usando
    DoCmd.ApplyFilter , “campo = ‘” & fmcampo & “‘”

    testei colocar *s mas não obtive sucesso.
    Como posso fazer isso?

  4. Henrique

    Se você for usar o campo tipo memorando em conjunto com outros campos em que o critério for “igual a”, não vai conseguir o resultado desejado. Isto porque tanto a SQL usada como filtro como a usada como RowSource da caixa de combinação são construídas “em bloco” através da instrução “For Each ctrl In frm.Controls” e nelas o critério é “igual a”.

    Se você estiver tentando usar o filtro apenas para o seu campo memorando e digamos que ele contenha as seguintes frases:

    1) A cidade de Campinas fica em São Paulo
    2) Eu moro em Campinas

    Para achar os registros que contém a palavra Campinas, você teria que usar uma SQL com um critério como o abaixo:

    SELECT [Dados].[memo]
    FROM Dados
    WHERE ((([Dados].[memo]) Like “*Campinas*”));

    Observe que antes e depois de Campinas há um asterico.

    Abraço

    Paulão

  5. Otacilio disse:

    Bom dia!

    Adorei o site e já inclui em meus materias de pesquisa. Porém cheguei até ele por uma necessidade:

    Possuo 3 combos com informações fixas e preciso que ao selecionar um combo em qualquer ordem o meu sub formulário fosse filtrado.

    Em outras palavras os filtros não são sequenciais, porém caso escolha mais de uma opção que seja aplicado o filtro dentro do filtro existente.

    Obrigado

    Otacilio

  6. Juarez disse:

    Olá. Bom dia. estou tentando adaptar seu exemplo de filtro sequencial a uma necessidade particular e não estou conseguindo. Já descobri que é na coluna SOBRENOME.
    Vou dizer o que estou tentando fazer.
    Estou usando o campo NOME no formato 000000-0 (como texto mesmo).
    Estou usando o campo SOBRENOME no formato 00000.000000/0000-00 (texto também).
    Estou usando o campo CIDADE como texto normal sem formatação.
    Percebi que o problema está no campo SOBRENOME. Existe alguma restrição ao formato que estou usando? mesmo sendo tratado como texto?
    Obrigado

  7. ana rita disse:

    Ups até me assustei quando cliquei em download e vim parar aqui. Bom Bblog. Excelente e bom exemplo

  8. Guida disse:

    Gostei muito da aplicação Formulário sempre no topo que decidi baixar esta. Muito bem, parabéns pelo Blog. Vou deixar um post também na SVC para que a galera saiba desta aplicação.

  9. M Helena disse:

    Parabéns. Serviu-me perfeitamente como exemplo.

  10. Augusto disse:

    Parabéns pelo tarabalho. Excelente!

  11. Humberto Pereira disse:

    adorei o seu blog mas gostaria de colocar umas duvidas.

    1º No exemplo dado estão todos os registos numa folha de dados e eu gostaria de saber como é que depois de filtrar o que interessa ele mostre o resultado do filtro após carregar no botão ok e ele criar um relatório.

    2º como é que eu posso pesquisar uma palavra “Almirante” inserida de várias formas como por exemplo:

    Almirantes
    Almir.
    Alm.

    e no fim ele listar tudo conforme o que inseri.

    No filtro normal tem a opcção contem e ai eu posso colocar alm e o filtro mostra tudo que contenha alm.

    Obrigado e continuação de bom trabalho

  12. nando disse:

    muito bom !!! consegui fazer a adaptação.
    Tentei fazer a adaptação para outro form, (com outro módulo), mas estraguei tudo, agora nem um nem outro.

    Alguem pode dar umas dicas?

    ob

  13. Norimar disse:

    Muito bom, mas minha adaptação esta dando erro:
    Quando seleciono o filtro fica em branco o resultado (lista) mas esta mostrando 1 filtrado.
    Quando removo o filtro volta a lista.
    Quando clico novamente no filtro, retorna erro de sintaxe na origem.
    Já revisei e não acho o erro.

  14. Sérgio Felipe Barra de Oliveira disse:

    Boa tarde, estou com um problema para executar uma consulta que filtre dados em um campo texto, de acordo com o que eu escrevo numa caixa texto num formulário.
    SELECT emop.DESCRICAO
    FROM emop
    WHERE ((([emop.descricao]) Like [Formulários]![C-Filtra Serviços]![Texto2]));

  15. Rogerio disse:

    Vê se pode me ajudar…. tenho um formulário que ligado a uma consulta. Nesta consula no campo critério inseri tres combobox do formulário para filtrar os registros.

    A duvida é a seguinte: é possível anular uma combox de (ou colocar opção exibir todos registros). Ocorre que tenho que selecionar as tres combox para que exiba os registros. Enfim gostaria que o formulário exibisse todos os registros caso não queira usar a combobox.

    (espero ter sido claro o suficiente para explanar minha duvida)

    • Rogerio

      Desculpa aí, mas tá confusa a tua dúvida.

      Ao invés de tentar me explicar como você está tentando fazer, me explica o quê você quer fazer.

      Abraço

      Paulão

  16. Rodrigo disse:

    Paulão,

    Não consigo baixar o arquivo.

    Abraço

  17. Clayton disse:

    Boa Noite,
    Como faço para filtrar uma consulta de tabela cruzada?

    Ela da um erro tipo não conhece o comando ..

    Abraços

  18. Adonis Born disse:

    Estava tentando usar seu exemplo, porém descobri que o Access já possui uma função parecida: FiltrarPorFormulário. Basta criar uma macro Executar Comando > FiltrarPorFormulário.
    Foi uma alternativa mais facil pra mim, já que nao tenho conhecimento em VB.
    Abraço

  19. Estou usando o código fonte desse exemplo, fiz algumas alterações e ficou muito bom, só que me deparei com um problema.
    Eu configurei para que quando entro no Form de Pesquisa, os dados cadastrados apareçam de forma decrescente “[IMOVEIS].[DataEntrada] DESC”, porem quando filtro os dados eles aparecem de forma crescente (mostrando o primeiro registro), quando removo o filtro ele mostra de forma crescente também, estou tentando deixar ele de forma decrescente quando se aplica o filtro e quando se remove o mesmo, más estou tendo dificuldades.
    Se quizer te mando o código fonte do Sistema, mas por favor me ajude.

  20. 4lamp disse:

    Bom dia! Estou tentado fazer um formulario de cadastro onde o usuário tem que informa o seu endereço, porém gostaria que o mesmo selecionasse primeiro a Combobox Estado para depois selecionar a combobox cidade sendo que a segunda só traria as cidades referente ao estado selecionado na primeira essa mesma regra será aplicada a combo bairro que ira efetuar carregar somente os bairros da cidade selecionada. Como fazer isso já tentei váriias forma porem nada deu certo. Pensei que assim resolveria SELECT conCidade.codigo, conCidade.cidade FROM conCidade WHERE (((conCidade.estado)=[Formulários]![fmendereco]![estado])); mas não funcionou, alguém sabe como posso resolver esse problema?

  21. Claudio disse:

    Bom dia Paulo, tudo bem?

    Estou precisando utilizar estes conceitos de caixas de combinação em um formulário que utilizaremos aqui no trabalho. O detalhe é que estamos usando Office 2007/2010, seus exemplos funcionam nele? Nos testes que fiz aqui tanto o formulário v1 quanto o V2 não funcionaram, e o filtro de subformulário também não.

    Não sei se é possível, mas se este for o caso acredito que seria interessante atualizar os códigos para que funcionem normalmente nas versões mais recentes de Office.

    Abraços, e obrigado!

    Claudio

    • Cláudio

      Testei todos os exemplos que você citou no Access 2007 (não tenho o 2010) e eles funcionaram perfeitamente.

      Dá uma explicada no que significa “não funcionaram” que talvez eu possa te ajudar.

      Abraço

      Paulo

  22. Carlos disse:

    Ola importei os 02 formularios FS E FSSUB PARA MEU ACCess 2000 . Importei tambem modulo FS
    Eu tenho tabela que tem os campos NCHEQUE(REFERE-SE AO NUMERO DO CHEQUE) NOME e BANCO . Nas caixas de combinação troquei os nomes dos campos para estes nomes .
    Atribui ao sub formulario uma consulta da tabela cheque para poder filtrar valores nulos no campo NCHEQUE . Quando clico no botão REMOVER FILTRO ele limpa todas informações do subformulario . Quando clico em filtro em qualquer caixa de combinação da a mensagem que ele não localizou a tabela .

    • Carlos

      Me parece que você está usando o exemplo referente a Filtros sequenciais para subformulários e não o exemplo desta página.

      Já faz tempo que criei o exemplo acima e não tenho tudo fresco na cabeça, mas parece é que você colocou um critério no campo NCHEQUE para filtrar os valores nulos e usou essa consulta no subformulário.

      Se for isto, não vai funcionar. A SQL que é origem do registro do subformulário só pode ter os campos sem nenhum critério, pois o código que faz a filtragem lê a SQL original e a reescreve incluindo os filtros das caixas de combinação e nessa reescrita não inclui o critério.

      Experimenta fazer o seguinte:

      1) Crie uma consulta com todos os campos que te interessam e aplique nela o critério para NCHEQUE nulo.
      2) Crie uma segunda consulta a partir da anterior só com os campos e use esta como origem do registro do seu subformulário.

      Só para reforçar : as origens do registro do formulário e subformulário tem que ser instruções SQL e não os nomes de tabelas ou consultas.

      Tente esta solução e dá um retorno para eu saber se funcionou.

      Abraço

      Paulo

  23. Tcamms disse:

    E ai blz…muito bom eu estava precisando de um exemplo desse..
    Agora eu estou precisando criar um botão para exportar os dados do filtro para o Excel…vc consegue me ajudar?

  24. André Peixoto disse:

    Boa noite !
    Criei um filtro que busca dados de uma consulta, e após selecionar, eu dou um duplo click, e então ele abre um outro formulário exatamente com um dos itens que eu escolhi com um duplo click. esta funcionando bem. Sendo que estou querendo em vez de abrir um outro formulário gostaria de abrir uma página em HTML sobre o mesmo assunto.
    As páginas HTML já estão montadas por assuntos, sendo que desejo fazer uma pesquisa no access primeiro.
    Pode me ajudar, não estou conseguindo. Obrigado !

  25. Johnny Lima disse:

    Boas, adorei este exemplo e pode dar muito jeito aqui para um trabalho que tenho para fazer.
    Gostaria apenas de alterar o seguinte:
    Nome –> Dia
    Sobrenome –> Hora
    Cidade –> Morada
    Profissão –> Observações

    Já tentei mas não consigo alterar só esses nomes.
    Desde já obrigado

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: