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]Como Filtrar listbox com combobox?

    Compartilhe

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 5/2/2018, 16:24

    Boa tarde.
    Não estou a conseguir aplicar filtro a uma listbox a partir de uma combobox.
    Tenho 8 combos para pesquisar por categoria, e queria ao carregar o botão pesquisar filtrar a listbox.
    Os Campos são de diferentes tipos, basicamente texto breve e número.
    Actualmente tenho as combobox´s carregadas através de: "SELECT meucampo FROM minhatabela" tal como a listbox.
    Qual código colocar no botão procurar? alguém pode ajudar?
    Já vim alguns exemplos mas não consegui adaptar.


    avatar
    CassioFabre
    Moderador
    Moderador

    Respeito às Regras 100%

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

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  CassioFabre em 6/2/2018, 10:44

    Bom dia,

    Crie sua combo com duas colunas, sendo que uma delas tenha um campo identificador que também vai existir na sua listbox. Normalmente esse campo é o código do registro. Este campo não precisa ser visível para o usuário. No evento Ao Abrir do formulário, faça:
    Código:
    suaCombo.RowSource = "SELECT codigo, fornecedor FROM tblFornecedores"

    No evento após atualizar da sua combo, faça com que o sql da listbox seja filtrado através desse campo identificador.
    Código:
    suaListBox.RowSource = "SELECT * FROM tblProdutos WHERE codigofornecedor = " & suaCombo.Column(0) & ""

    Ambos os código acima são exemplos, voce terá que adaptar à sua necessidade. Em anexo estou mandando um exemplo que montei pra voce, justamente com esses códigos e mais alguns. Mas é bem básico, voce teria que fazer diversos tratamentos como por exemplo prever quando a combo estiver em branco, etc.

    Abraço.
    Anexos
    filtraListBox.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (33 Kb) Baixado 28 vez(es)


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

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 8/2/2018, 10:39

    Bom dia.
    CassioFabre estive a dar uma olhada no teu exemplo e não consegui adaptar ou tirar ideias para o que eu preciso.
    O que eu preciso, filtrar uma listbox a partir de uma combobox clicando botão procurar, teoricamente não me parece que seja difícil, não estou é a conseguir aplicar até porque tenho campos de vários tipos.
    Em anexo tenho o designer de um exemplo que preparei, simples com as combo's e listbox carregadas para ver se consegues/conseguem me ajudar.
    Os dados inseridos não fazem sentido mas para um exemplo serve.
    Vejam o "exemplo" está bem explicado.

    Cumprimentos
    Anderson Catarino
    Anexos
    teste.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (56 Kb) Baixado 10 vez(es)
    avatar
    tauron
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 936
    Registrado : 07/12/2011

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  tauron em 8/2/2018, 11:46

    Me permitam a intromissao!

    Anderson, da uma olhadinha
    Anexos
    teste1.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (113 Kb) Baixado 8 vez(es)

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 8/2/2018, 12:28

    Boas tauron. Olha a imagem em anexo.
    Nesse caso a listbox não deveria mostrar registos.
    Não existe o ID 125A, Numero 1, Data 1-1-2018, Code 2.6.
    A função AfterUpdate "não" funciona no que pretendo, por isso que o codigo tem que estar no botão procurar.
    Escolho numero 1, na CboNumero, carrego procurar aparece os 3 resgistos, coloco ID 125A carrego em procurar e devera aparecer só 1 registo, pois so existe 1 registo com ID 125U e Numero 1
    avatar
    CassioFabre
    Moderador
    Moderador

    Respeito às Regras 100%

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

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  CassioFabre em 8/2/2018, 15:16

    Boa tarde,

    O que voce quer é muito simples de fazer. Basta que faça um filtro que é composto à medida que se verifica cada combo.

    Código:
    Sub filtraListBox()
        Dim str, filtro As String
        
        If Not IsNull(CboID) = True Then
            str = "ID = '" & CboID.Column(0) & "'"
        End If
        
        If Not IsNull(CboNumero) = True Then
            If str <> "" Then str = str & " and "
            
            str = str & "numero = " & CboNumero.Column(0) & ""
        End If
        
        If Not IsNull(CboData) = True Then
            If str <> "" Then str = str & " and "
            
            str = str & "data = #" & Format(CboData.Column(0), "MM/dd/YYYY") & "#"
        End If
        
        If Not IsNull(CboCode) = True Then
            If str <> "" Then str = str & " and "
            
            str = str & "code = " & Replace(CboCode.Column(0), ",", ".") & ""
        End If
        
        filtro = "SELECT * FROM tabela"
        
        If str <> "" Then filtro = filtro & " WHERE " & str
        
        Lista.RowSource = filtro
        Lista.ColumnCount = 6
    End Sub

    Obs: altera o nome da tabela de "table" para "tabela", pois table é uma palavra reservada em VBA.

    Depois de colocar este código no form, basta chamá-lo no evento após atualizar de cada uma das combobox:
    Código:
    Call filtraListBox

    Em anexo um modelo.

    ps.: Voce nao precisa de todas aquelas consultas para preencher as combobox. Isso é facilmente feito via VBA com uma linha para cada combo. Fiz a função abaixo para fazer isso no abrir do formulário:
    Código:
    Sub preencheComboBox()
        CboID.RowSource = "SELECT ID FROM tabela GROUP BY ID"
        CboNumero.RowSource = "SELECT numero FROM tabela GROUP BY numero"
        CboData.RowSource = "SELECT data FROM tabela GROUP BY data"
        CboCode.RowSource = "SELECT code FROM tabela GROUP BY code"
    End Sub

    Abraço.
    Anexos
    teste.zip
    Você não tem permissão para fazer download dos arquivos anexados.
    (207 Kb) Baixado 20 vez(es)


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

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 8/2/2018, 16:54

    Obrigado CassioFabre.
    Adaptei um ou outro aspecto e ficou a funcionar como eu queria.
    As mudanças que fiz foi em relação aos eventos das combobox´s AfterUpdate, retirei e coloquei o código filtraListBox no botão procurar.
    Vou colocar o tópico como resolvido.
    Obrigado.
    Abraço

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 19/2/2018, 11:44

    Bom dia.
    CassioFabre (ou alguém) preciso de uma ajuda.
    No meu programa no formulário de pesquisa, quando filtro a listbox a partir de combobox se filtrar só por uma combobox funciona direito, se conjugar mais do que uma combobox, sendo só uma com o campo do tipo texto funciona sem problema, mas se for duas combobox de campo tipo texto ja não funciona direito.

    **** Exemplo ****

    Dados (ambos os campos são do tipo texto)
    Produto   Diametro
    Euroline  6.0
    Premium 6.0

    Se pesquisar por Euroline ou Premium vai filtrar por um dos 2, mas se colocar Euroline 6.0, na listbox produto e diametro aparece os 2 registos, Fiz me perceber?


    ******************************************************Codigo************************************************

    Sub filtraListBox()
       Dim str, filtro As String
       
       ' combo Fornecedor - texto
       If Not IsNull(Me.Fornecedor) = True Then
           str = "Fornecedor = '" & Me.Fornecedor.Column(0) & "'"
       End If
       
       'combo Op - texto
       If Not IsNull(Me.Op) = True Then
           str = "Op = '" & Me.Op.Column(0) & "'"
       End If
       
       'combo Produto - texto
       If Not IsNull(Me.Produto) = True Then
           str = "Produto = '" & Me.Produto.Column(0) & "'"
       End If
       
       'combo Diametro - texto
       If Not IsNull(Me.DIAM) = True Then
           str = "Diam = '" & Me.DIAM.Column(0) & "'"
       End If
       
       'combo Força Rotura - numero inteiro longo
       If Not IsNull(Me.FRotEsp) = True Then
           If str <> "" Then str = str & " and "
           
           str = str & "FRotEsp = " & Me.FRotEsp.Column(0) & ""
       End If
       
       'combo Conformidade - texto
       If Not IsNull(Me.Conformidade) = True Then
           str = "Conformidade = '" & Me.Conformidade.Column(0) & "'"
       End If
       
         'combo data - Data/hora
       If Not IsNull(Me.Data) = True Then
           If str <> "" Then str = str & " and "
           
           str = str & "Data = #" & Format(Me.Data.Column(0), "MM/dd/YYYY") & "#"
       End If
       
       'combo Rubrica - texto
       If Not IsNull(Me.Rubrica) = True Then
           str = "Rubrica = '" & Me.Rubrica.Column(0) & "'"
       End If

       
       filtro = "SELECT BELN,Fornecedor,Op,Produto,Diam,Cor,Peso,FRotEsp, FRot,Conformidade,Obs,Data,Rubrica FROM FiosEntrancados"
     
       
       If str <> "" Then filtro = filtro & " WHERE " & str
       
       Me.PesquisaFE.RowSource = filtro
       Me.PesquisaFE.ColumnCount = 13
    End Sub

    ***********************************************************************************************************
    avatar
    CassioFabre
    Moderador
    Moderador

    Respeito às Regras 100%

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

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  CassioFabre em 19/2/2018, 12:13

    Bom dia,

    Você está esquecendo de colocar a condição If str <> "" Then str = str & " and " nas combos Op, produto e diâmetro e outras abaixo. Do jeito que você montou, caso uma dessas combos seja preenchida, a string str automaticamente desconsidera o que estiver antes dela, e monta o filtro a partir dessa combo.

    Repita o código no mesmo modelo que está na combo Força Rotura nos trechos referentes à todas as combos que não o possuem:
    'combo Força Rotura - numero inteiro longo
      If Not IsNull(Me.FRotEsp) = True Then
          If str <> "" Then str = str & " and "
         
          str = str & "FRotEsp = " & Me.FRotEsp.Column(0) & ""
      End If

    Abraço.


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

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 19/2/2018, 13:47



    Eu não coloquei a parte que mencionaste que estava em falta porque no exemplo que me fizeste, onde era campo texto não colocaste, mas naquele exemplo que montaste só tinha 4 combobox e os campos associados eram todos diferentes: numero longo, data, texto e decimal

    Tu tinhas assim :
    ****************************************************************************************
    Sub filtraListBox()
    Dim str, filtro As String


    'TEXTO
    If Not IsNull(CboID) = True Then
    str = "ID = '" & CboID.Column(0) & "'"
    End If

    'NUMERO LONGO
    If Not IsNull(CboNumero) = True Then
    If str <> "" Then str = str & " and "

    str = str & "numero = " & CboNumero.Column(0) & ""
    End If
    'DATA/HORA
    If Not IsNull(CboData) = True Then
    If str <> "" Then str = str & " and "

    str = str & "data = #" & Format(CboData.Column(0), "MM/dd/YYYY") & "#"
    End If
    'DECIMAL
    If Not IsNull(CboCode) = True Then
    If str <> "" Then str = str & " and "

    str = str & "code = " & Replace(CboCode.Column(0), ",", ".") & ""
    End If

    filtro = "SELECT * FROM tabela"

    If str <> "" Then filtro = filtro & " WHERE " & str

    Lista.RowSource = filtro
    Lista.ColumnCount = 6
    End Sub

    ****************************************************************************************

    Continua a não funcionar, mesmo acrescentando If str <> "" Then str = str & " and "

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 19/2/2018, 14:05

    CassioFabre já está a funcionar.

         If str <> "" Then str = str & " and "
         
         str = str & "FRotEsp = " & Me.FRotEsp.Column(0) & ""

    Tinha acrescentado a primeira linha a negrito mas faltava o que esta a negrito na segunda linha.
    avatar
    CassioFabre
    Moderador
    Moderador

    Respeito às Regras 100%

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

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  CassioFabre em 19/2/2018, 15:45

    Boa tarde,

    Só para fins de esclarecimento:

    Eu não inclui a linha de verificação da string na combo CBOID pelo motivo dela ser a primeira combo da cadeia, ou seja, qual é o sentido de eu fazer uma verificação na string str na combo CBOID se, independente de qualquer coisa, a string será vazia no momento em que essa combo for verificada? Então, não é pelo fato da combo ser do tipo TEXTO, mas sim porque não há dado algum para verificar antes dessa combo. Se voce alterar a ordem de verificação e passar a CBODATA para a primeira, também não colocaria a verificação de nulidade da string, porém neste caso teria que colocá-la na CBOID.

    No seu caso, todas as combos devem ter essa verificação, exceto a combo Fornecedor pelo simples fato de que no ordem do seu código essa combo está em primeiro lugar, e não pelo fato de ser do tipo texto, booleano, date ou outro qualquer que seja.

    Entendeu a ideia?

    Abraço.


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

    Anderson Catarino
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Portugal
    Mensagens : 64
    Registrado : 28/08/2017

    Re: [Resolvido]Como Filtrar listbox com combobox?

    Mensagem  Anderson Catarino em 22/2/2018, 13:50

    Boa tarde CassioFabre.
    Obrigado pelo esclarecimento, faz todo o sentido.
    Como as combo´s não são sequenciais, no sentido que na combo seguinte não me aparece só os valores relacionados com a anterior, não pensei nisso na altura.
    Abraço.

      Data/hora atual: 20/7/2018, 11:46