MaximoAccess

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

Obrigado

Administração do MaximoAccess

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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

    [Resolvido]Filtrar relatório com um ou mais ComboBox

    annissima
    annissima
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Feminino
    Localização : Brasil
    Mensagens : 146
    Registrado : 24/10/2017

    [Resolvido]Filtrar relatório com um ou mais ComboBox Empty [Resolvido]Filtrar relatório com um ou mais ComboBox

    Mensagem  annissima em 8/6/2020, 14:36

    Olá,

    Tenho o form abaixo, e ele tem 3 combos de pesquisa (cmbCorretor, cmbStatus, e cmbStatusDet)

    [Resolvido]Filtrar relatório com um ou mais ComboBox Form_p10


    Eu tenho o seguinte AFTER UPDATE de cada combo:

    Código:
    Private Sub cmbCorretor_AfterUpdate()
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.Corretor = forms!cst_procs![cmbCorretor]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End Sub

    Private Sub cmbStatus_AfterUpdate()
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.STATUSgeral = forms!cst_procs![cmbStatus]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End Sub


    Private Sub cmbStatusDet_AfterUpdate()
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.StatusSub = forms!cst_procs![cmbStatusDet]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End Sub

    Porém, ele pesquisa apenas pelo combo que eu alterar.

    Eu gostaria de, por exemplo, selecionar o primeiro (ele vai filtrar o corretor) e depois o segundo combo (ele vai selecionar o status, dentre os resultados anteriores, daquele corretor).
    Gostaria de, se eu limpar apenas um campo, ele refaça a pesquisa, de acordo com o que estiver preenchido.

    Tentei fazer com If mas deu tudo errado.
    Pesquisei um modelo aqui no forum, mas nao consegui fazer funcionar também..

    Será que alguém consegue me ajudar?

    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2453
    Registrado : 22/11/2016

    [Resolvido]Filtrar relatório com um ou mais ComboBox Empty Re: [Resolvido]Filtrar relatório com um ou mais ComboBox

    Mensagem  DamascenoJr. em 8/6/2020, 23:48

    Ana, estude a lógica aplicada, corrija e adapte se for necessário

    Código:
    Private Sub cmbCorretor_AfterUpdate()
        call fncMontaRecordSourceAvaliandoSePrecisaWhere
    End Sub

    Private Sub cmbStatus_AfterUpdate()
        call fncMontaRecordSourceAvaliandoSePrecisaWhere
    End Sub

    Private Sub cmbStatusDet_AfterUpdate()
        call fncMontaRecordSourceAvaliandoSePrecisaWhere
    End Sub

    Private Sub fncMontaRecordSourceAvaliandoSePrecisaWhere()

        dim strParteDoSelect as string
        dim strParteDoFrom as string
        dim strParteDoWhere as string
        dim strParteDoOrderBy as string

        'montando a parte do select, afinal, ela é fixa
        strParteDoSelect = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome"

        'montando a parte do from, afinal, ela é fixa
        strParteDoFrom = "FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente"

        'montado a parte do order by, afinal, ela é fixa
        strParteDoOrderBy = "ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"

        'agora farei avaliações para saber se preciso montar o where
        'deixarei fixo o operador de AND para juntar os filtros

        'se a combo Corretor não estiver vazia então
        if nz(forms!cst_procs![cmbCorretor]) <> "" then
            'adicionarei o filtro para esta combo
            strParteDoWhere = strParteDoWhere & " AND processo.Corretor = forms!cst_procs![cmbCorretor]"
        end if

        'se a combo Status não estiver vazia então
        if nz(forms!cst_procs![cmbStatus]) <> "" then
            'adicionarei o filtro para esta combo
            strParteDoWhere = strParteDoWhere & " AND processo.STATUSgeral = forms!cst_procs![cmbStatus]"
        end if

        'se a comboStatusDet não estiver vazia então
        if nz(forms!cst_procs![cmbStatusDet]) <> "" then
            'adicionarei o filtro para esta combo
            strParteDoWhere = strParteDoWhere & " AND processo.StatusSub = forms!cst_procs![cmbStatusDet]"
        end if

        'se em algum momento o where foi montado então
        if strParteDoWhere <> "" then

            'terminarei de montar essa parte
            'para isso, retirarei o primeiro AND, isto é, considerarei da variável somente o que houver a partir do sexto caractere
            'afinal, essa cláusula não é montada como "where AND filtro1... mas sim, where filtro1 AND filtro2...
            strParteDoWhere = mid(strParteDoWhere, 6)
            'adicionarei o where inicial
            strParteDoWhere = "where" & " " & strParteDoWhere

            'agora juntarei tudo
            me.recordsource = strParteDoSelect & " " & strParteDoFrom & " " & strParteDoWhere & " " & strParteDoOrderBy

        else 'senão, ou seja, se o where não foi montado em por combo nenhuma
       
            'juntarei tudo
            me.recordsource = strParteDoSelect & " " & strParteDoFrom & " " & strParteDoOrderBy

        end if

    End Sub


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    annissima
    annissima
    Intermediário
    Intermediário

    Respeito às Regras 100%

    Sexo : Feminino
    Localização : Brasil
    Mensagens : 146
    Registrado : 24/10/2017

    [Resolvido]Filtrar relatório com um ou mais ComboBox Empty Re: [Resolvido]Filtrar relatório com um ou mais ComboBox

    Mensagem  annissima em 14/6/2020, 16:36

    Tentei do jeito acima e não deu certo. Consegui colocando um monte de IFs e um botão para com uma função para filtrar após preencher as combo... funcionou!


    Código:
    Private Function filtrar()

    'corretor apenas
    If Not IsNull(Me.cmbCorretor) Then
    If IsNull(Me.cmbStatus) And IsNull(Me.cmbStatusDet) Then
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.Corretor = forms!cst_procs![cmbCorretor]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End If
    End If

    'status apenas
    If Not IsNull(Me.cmbStatus) Then
    If IsNull(Me.cmbCorretor) And IsNull(Me.cmbStatusDet) Then
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.STATUSgeral = forms!cst_procs![cmbStatus]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End If
    End If

    'status detalhe apenas
    If Not IsNull(Me.cmbStatusDet) Then
    If IsNull(Me.cmbCorretor) And IsNull(Me.cmbStatus) Then
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.StatusSub = forms!cst_procs![cmbStatusDet]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End If
    End If

    'corretor e status
    If Not (IsNull(Me.cmbCorretor) And IsNull(Me.cmbStatus)) Then
    If IsNull(Me.cmbStatusDet) Then
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.Corretor = forms!cst_procs![cmbCorretor]) and (processo.STATUSgeral = forms!cst_procs![cmbStatus]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End If
    End If

    'corretor e status detalhe
    If Not (IsNull(Me.cmbCorretor) And IsNull(Me.cmbStatusDet)) Then
    If IsNull(Me.cmbStatus) Then
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.Corretor = forms!cst_procs![cmbCorretor]) and (processo.StatusSub = forms!cst_procs![cmbStatusDet]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End If
    End If

    'status e status detalhe
    If Not (IsNull(Me.cmbStatus) And IsNull(Me.cmbStatusDet)) Then
    If IsNull(Me.cmbCorretor) Then
    Me.RecordSource = "SELECT processo.NumProc, processo.NumCliente, processo.Corretor, processo.observações, processo.STATUSgeral, processo.DataStatusG, processo.StatusSub, processo.DataSub, clientes.Nome FROM clientes INNER JOIN processo ON clientes.NumCliente = processo.NumCliente WHERE (processo.STATUSgeral = forms!cst_procs![cmbStatus]) and (processo.StatusSub = forms!cst_procs![cmbStatusDet]) ORDER BY clientes.Nome, processo.Corretor, processo.STATUSgeral, processo.StatusSub"
    End If
    End If

    End Function

      Data/hora atual: 30/11/2020, 07:05