MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    [Resolvido]Filtro em Combobox - Se selecionado, filtrar, se vazio, não filtrar (mostrar tudo)

    Compartilhe

    miguel.serra
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 32
    Registrado : 20/01/2011

    [Resolvido]Filtro em Combobox - Se selecionado, filtrar, se vazio, não filtrar (mostrar tudo)

    Mensagem  miguel.serra em Qua 04 Out 2017, 02:54

    Caros amigos, tenho uma série de combobox onde uma é indiretamente relacionada a outra. Se seleciono um Cliente numa, a combobox de imóveis só irá exibir como opção os imóveis deste cliente, e a combobox de Municípios só exibirá cidades onde há imóveis daquele cliente.

    Se seleciono um município, a combobox de imóveis só mostrará imóveis daquele município.

    Para funcionar, nas consultas de cada combobox, utilizo o critério Como "*" & [Formulários]![0_CADASTRO - GERAL]![CADASTRO-CONTROLE].[Form]![FiltroMunicípio] & "*"

    Mas isto carrega sobremaneira as consultas de cada combobox, que demora uns 15 segundos só para abrir na primeira consulta de cada. Um horror

    Se removo o critério, o retorno da consulta vem num piscar de olhos. Se coloco um critério objetivo (exemplo: "RIO DE JANEIRO" no campo município), também é super rápido.

    Para sanar eu gostaria de um critério que, se uma combobox está com conteúdo, as outra são filtradas quando abertas. Se não, remove-se o filtro

    Tentei os seguintes critérios:

    SeImed([Formulários]![0_CADASTRO - GERAL]![CADASTRO-CONTROLE].[Form]![FiltroMunicípio] & ""<>"";[Formulários]![0_CADASTRO - GERAL]![CADASTRO-CONTROLE].[Form]![FiltroMunicípio]; Como "*")
    ou

    SeImed([Formulários]![0_CADASTRO - GERAL]![CADASTRO-CONTROLE].[Form]![FiltroMunicípio] & ""<>"";[Formulários]![0_CADASTRO - GERAL]![CADASTRO-CONTROLE].[Form]![FiltroMunicípio]; "*")
    ou

    SeImed([Formulários]![0_CADASTRO - GERAL]![CADASTRO-CONTROLE].[Form]![FiltroMunicípio] & ""<>"";[Formulários]![0_CADASTRO - GERAL]![CADASTRO-CONTROLE].[Form]![FiltroMunicípio]; )

    Mas não funcionam de jeito nenhum quando a combobox está vazia. Por exemplo, se a combobox Município estiver vazia, a combobox de imóveis retorna vazia. Mas se seleciono um município, ok, a de imóveis apresenta os registros daquela cidade

    Alguém teria uma solução?

    Muito obrigado!
    Abs
    Miguel Serra
    avatar
    CassioFabre
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 525
    Registrado : 18/01/2013

    Re: [Resolvido]Filtro em Combobox - Se selecionado, filtrar, se vazio, não filtrar (mostrar tudo)

    Mensagem  CassioFabre em Qua 04 Out 2017, 14:56

    Bom dia,

    Vou citar aqui como Combo1 e Combo2 (voce relaciona aí qual é a primeira combo da sua cadeia e qual a segunda, depois é só extrapolar a lógica pro restante).

    No evento após atualizar da Combo1 coloque o seguinte:
    Código:
    Dim str As String

    str = "SELECT * FROM [tabela que popula a combo2]"

    If Not IsNull(Combo1) = True Then
        str = str & " WHERE [campo criterio da tabela que popula a combo2] = '" & cbxCombo1 & "'" 'Estou supondo aqui que é critério é do tipo texto
    End if

    combo2.RowSource = str
    Combo2.ColumnCount = x 'quantidade de colunas da tabela que popula a combo2

    Abraço.

    miguel.serra
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 32
    Registrado : 20/01/2011

    Re: [Resolvido]Filtro em Combobox - Se selecionado, filtrar, se vazio, não filtrar (mostrar tudo)

    Mensagem  miguel.serra em Qui 05 Out 2017, 00:07

    Excelente, Cassio!!!  Very Happy  Very Happy  Very Happy
    Segui nesta linha. Como eram múltiplas combobox, precisei fazer uns ajustes e, na minha miopia (deve ser um código terrível na visão de um programador de verdade!), fiz da seguinte maneira, mas atendeu:
    Código:

    Dim strFiltraMun As String 'Com isto, podemos "montar" uma codificação, baseada em quais combobox foram utilizadas, e o script irá selecionar a consulta adequada

    Dim strCLI As String
    Dim strMun As String
    Dim strProj As String
    Dim strGrupo As String



    ' checa se há clientes selecionados
    If Me.FiltroCliente & "" = "" Then
    strCLI = "0"
    Else
    strCLI = "C"
    End If

    strFiltro = strCLI

    ' checa se há municípios selecionados
    If Me.FiltroMunicípio & "" = "" Then
    strMun = "0"
    Else
    strMun = "M"
    End If

    strFiltro = strFiltro & strMun

    ' checa se há projetos selecionados
    If Me.FiltroProjeto & "" = "" Then
    strProj = "0"
    Else
    strProj = "P"
    End If

    strFiltro = strFiltro & strProj

    ' checa se há grupos selecionados
    If Me.FiltroGrupo & "" = "" Then
    strGrupo = "0"
    Else
    strGrupo = "G"
    End If

    strFiltro = strFiltro & strGrupo

    ' checa se o filtro existente é compatível ou se será necessário alterar a consulta
    If Me.FiltroUnidade.Tag = strFiltro Then
    Exit Sub
    End If

    ' define a parte inicial comum a todas as opções de consulta (apenas para economizar epaço)
    strFiltraMun = "SELECT ... FROM ..."

    ' Define a Tag da combobox com o nome do filtro a ser utilizado
    Me.FiltroUnidade.Tag = strFiltro

    ' Aplica o filtro correto, de acordo com as combobox selecionadas
    Select Case strFiltro

    Case "0000"
    strFiltraMun = strFiltraMun & " GROUP BY ...;"

    Case "00P0"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "000G"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "00PG"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "0M00"
    strFiltraMun = strFiltraMun & " GROUP BY ...;"

    Case "0M0G"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "0MPG"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "C000"
    strFiltraMun = strFiltraMun & " GROUP BY ...;"

    Case "C0P0"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "C00G"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "C0PG"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "CM00"
    strFiltraMun = strFiltraMun & " GROUP BY ...;"

    Case "CMP0"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "CM0G"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    Case "CMPG"
    strFiltraMun = strFiltraMun & " WHERE ...;"

    End Select

     Me.FiltroUnidade.RowSource = strFiltraMun

    Obrigado novamente! Abs
    avatar
    CassioFabre
    Developer
    Developer

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 525
    Registrado : 18/01/2013

    Re: [Resolvido]Filtro em Combobox - Se selecionado, filtrar, se vazio, não filtrar (mostrar tudo)

    Mensagem  CassioFabre em Qui 05 Out 2017, 11:24

    Bom dia,

    Muito bom! Pra mim código ruim é aquele que não funciona hehe

    Agradecemos o retorno.

    Abraço.


    .................................................................................
    Só não tem código pra morte!

      Data/hora atual: Qua 22 Nov 2017, 10:41