Filtro multiplo

di il
28 risposte

Filtro multiplo

Buon giorno a tutti, ho creato un pulsante su una maschera che dovrebbe avere il compito di filtrare un campo e restituire il dato su un'altra maschera, fin qui tutto bene, MA se al posto di filtrare un campo gli chiedessi di filtrare più campi (AND)(no OR), come dovrei modificare il codice qui postato?
Grazie a chi vorra intervenire.

Private Sub questo_Click()
On Error GoTo Err_questo_Click

Dim stDocName As String
Dim stLinkCriteria As String

stDocName = "M_RicercaImm"

stLinkCriteria = "[cerco]=" & "'" & Me![vendo] & "'"
DoCmd.OpenForm stDocName, , , stLinkCriteria

Exit_questo_Click:
Exit Sub

Err_questo_Click:
MsgBox Err.Description
Resume Exit_questo_Click

End Sub

28 Risposte

  • Re: Filtro multiplo

    Non ci capisco molto di VBA, ma non fai prima ad aprire un "filtro in base a maschera"? Esso mostra tutti i campi, tu scrivi dentro quelli che desideri filtrare e lui automaticamente li considera come un filtro AND.
  • Re: Filtro multiplo

    StLinkCriteria = "[cerco]=" & "'" & Me![VENDO] & "' and [prendo]=" & "'" & Me![compro] & "'"

    in rosso ho scritto quello che ho aggiunto/modificato...

    in questo caso nel criterio è stato aggiunto l'operatore AND
    [prendo] è il nome campo della tabella
    Me![compro] è un textbox
  • Re: Filtro multiplo

    Per Osvaldo un filtro a base maschera non va bene perchè dovrebbe aprire un altra maschera per filtrare i dati.
    Per Angelo forse potrebbe essere la strada giusta ma facendo la modifica da te suggerita
    stLinkCriteria = "[città]=" & "'" & Me![citta] & "'" And [cerco] = " & " '" & Me![vendo] & "'"
    mi risponde dicendo "Impossibile trovare il campo '|' a cui si fa riferimento nell'espressione.

    c'è un errore... ma dove???
    ilnome dei campi è giusto.
  • Re: Filtro multiplo

    Nelle parentesi quadre sei tu che devi mettere i nomi

    postameli tu se hai problemi a comporre la stringa... nome campi e nome dei controlli nella form
  • Re: Filtro multiplo

    No i nomi dei campi sono giusti, ti posto i nomi e le condizioni domani mattina appena metto le mani sul pc grazie ciao buona serata
  • Re: Filtro multiplo

    Allora questo è la routine evento:
    Private Sub questo_Click()
    On Error GoTo Err_questo_Click

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "M_RicercaImm"

    stLinkCriteria = "[dimens]=" & "'" & Me![dimensione] & "'"
    DoCmd.OpenForm stDocName, , , stLinkCriteria

    Exit_questo_Click:
    Exit Sub

    Err_questo_Click:
    MsgBox Err.Description
    Resume Exit_questo_Click
    End Sub

    Dove i campi da inserire per il confronto sono:
    nella maschera che apre "M_RicercaImm" [cerco] , [dimens] , [città]
    nella maschera di confronto: [vendo] , [dimensione] , [citta]
    grazie ciao
  • Re: Filtro multiplo

    Prima di postarti il codice devo farti alcune precisazioni e visto che non sono sicuro che i nomi siano stati usati correttamente ti "progetto di seguito un esempio:

    Poniamo di avere una tabella "tbl_info" con tre campi: "vendo","dimensione" e "citta"

    Poniamo di avere una maschera "frm_confronto" dove, nel corpo, hai inserito 3 textbox il cui nome elemento (dalle proprietà) è "vendo","dimensione" e "citta" e un pulsante il cui nome elemento è "cmd_Apri" che, alla pressione, esegua una routine per aprire un'altra maschera "frm_info" basata sulla tabella "tbl_info" applicandovi un filtro in base ai tre textbox.

    Quando premi il pulsante "cmd_Apri" devi tenere presente che i record visualizzati nella mascherà "frm_info" varieranno in base a come imposterai tali filtri.

    Nell'evento click del pulsante cmd_Apri (all'interno della routine senza cancellare inizio e fine):
    
    On Error GoTo Err_questo_Click
    
     Dim stDocName As String
     Dim stLinkCriteria As String
    
     stDocName = "frm_info"
    
     stLinkCriteria = CRITERIO DI CONFRONTO
    
     DoCmd.OpenForm stDocName, , , stLinkCriteria
    
    Exit_questo_Click:
     Exit Sub
    
    Err_questo_Click:
     MsgBox Err.Description
     Resume Exit_questo_Click
    
    CRITERIO DI CONFRONTO (nel codice) va sostituito con la stringa filtro che dovremo valutare e rappresenta il cuore della routine... detto questo devi sapere che:
     "[dimensione]=" & "'" & Me![dimensione] & "'" 
    controlla solo dimensione che deve essere compilata altrimenti non ti visualizza nulla ( ameno che non sia vuota anche nella tabella) e ignora gli altri 2 campi
     "[dimensione]=" & "'" & Me![dimensione] & "' And [citta]=" & "'" & Me![citta] & "'"
    
    ignora solo 1 campo e gli altri 2 devono essere compilati altrimenti non ti visualizza nulla ( ameno che non siano vuoti anche nella tabella)
     "[dimensione]=" & "'" & Me![dimensione] & "' And [citta]=" & "'" & Me![citta] & "' And [vendo]=" & "'" & Me![vendo] & "'" 
    richiede che tutti e 3 siano compilati altrimenti non ti visualizza nulla (a meno che non siano vuoti anche nella tabella)

    se in vece utilizzi l'operatore "Or" invece di "and" ottieni condizioni diverse... tu che risultato vuoi ottenere?

    Ps:
    se esegui passo passo l'esempio sopra i filtri funzioneranno ma solo a quelle condizioni...
  • Re: Filtro multiplo

    Private Sub Comando88_Click()
    On Error GoTo Err_88_Click

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "M_RicercaImm"

    stLinkCriteria = "[cerco]=" & "'" & Me![vendo] & "' And [città]=" & "'" & Me![citta] & "' And [dimens]=" & "'" & Me![dimensione] & "'"
    DoCmd.OpenForm stDocName, , , stLinkCriteria

    Exit_88_Click:
    Exit Sub

    Err_88_Click:
    MsgBox Err.Description
    Resume Exit_88_Click
    End Sub

    questo codice funziona con i nomi dei campi che ho postato .
    MA c'è sempre un MA...
    il problema è che vorrei che IL CRITERIO DI CONFRONTO [dimensione] lavorasse solo quando la ricerca viene effettuata quando sui campi VENDO/CERCO la tipologia immobile è=ALLOGGIO, mentre vorrei che non fosse presa in considerazione su tutte le altre tipologio di immobili.
    Si potrebbe ipotizzare un "when [vendo]="alloggio" .... e poi non so piu come andare avanti, ma il senso vorrebbe essere: quando il campo VENDO/CERCO è uguale a ALLOGGIO, allora considera il campo di confronto DIMENSIONE , diverso da ALLOGGIO allora no!!
    Mi raccomando non mettetevi a ridere
  • Re: Filtro multiplo

    Perdonami, io voglio aiutarti e sicuramente so anche come, però.. c'è sempre un però , visto che ho difficoltà a comprendere i nomi dei campi e la loro locazione potresti, per piacere compilare il prospetto sotto riportato senza modificarne la tipologia di struttura?

    finestra filtro - finestra visualizzazione e condizioni -> dovresti compilare tutto...

    Finestra dove metti i criteri: (quella dove hai il pulsante che richiama l'altra finestra)
    Nome della finestra: (inserire qui il nome)
    Campo da valutare 1: (inserire qui il "nome elemento")
    Campo da valutare 2: (inserire qui il "nome elemento")
    Campo da valutare 3: (inserire qui il "nome elemento")
    ...continua come sopra se ci sono altri campi da valutare

    Finestra Richiamata: (quella dove visualizzi i valori filtrati)
    Nome della finestra: (inserire qui il nome)
    Campo filtrato 1: (inserire qui il "nome elemento") // (inserire qui l' "origine dati")
    Campo filtrato 2: (inserire qui il "nome elemento") // (inserire qui l' "origine dati")
    Campo filtrato 3: (inserire qui il "nome elemento") // (inserire qui l' "origine dati")
    ...continua come sopra se ci sono altri campi filtrati
    l problema è che vorrei che IL CRITERIO DI CONFRONTO [dimensione] lavorasse solo quando la ricerca viene effettuata quando sui campi VENDO/CERCO la tipologia immobile è=ALLOGGIO, mentre vorrei che non fosse presa in considerazione su tutte le altre tipologio di immobili.
    Si potrebbe ipotizzare un "when [vendo]="alloggio" .... e poi non so piu come andare avanti, ma il senso vorrebbe essere: quando il campo VENDO/CERCO è uguale a ALLOGGIO, allora considera il campo di confronto DIMENSIONE , diverso da ALLOGGIO allora no!!
    Mi raccomando non mettetevi a ridere
    tutto quello che hai scritto = non ho capito

    Condizioni che ho capito io e che applichero (se ne hai altre aggiungile e sii precisissimo che le query sono bastarde...)

    condizione1:
    Se un solo campo tra [VENDO] e [CERCO] è compilato con la parola "ALLOGGIO" (intendo proprio solo con quella parola... se invece a te basta che sia compilato con qualsiasi valore devi scrivermelo esplicitamente)
    allora mi devi necessariamente compilare anche il campo [dimensione] (che nel codice tu hai messo [dimens] e nel testo [dimensione] ... non farmi impazzire dai... ... dimmi come si chiama... ) e [citta] lo lascio in bianco. (allora cosa lo hai messo a fare???)

    condizione2:
    *al momento posso solo ipotizzare che in tutti gli altri casi vedi tutta la tabella... compila le altre condizioni altrimenti non posso aiutarti.... i filtri multipli particolari sono molto rognosi ...

    condizione3:
    continua pure se ci sono...
  • Re: Filtro multiplo

    Finestra dove metti i criteri: (quella dove hai il pulsante che richiama l'altra finestra)
    Nome della finestra: (inserire qui il nome)
    Campo da valutare 1: (VENDO)
    Campo da valutare 2: (DIMENSIONE)
    Campo da valutare 3: (CITTA)
    ...continua come sopra se ci sono altri campi da valutare

    Finestra Richiamata: (quella dove visualizzi i valori filtrati)
    Nome della finestra: (inserire qui il nome)
    Campo filtrato 1: (CERCO) // (Q_AcquirRicercaImm)
    Campo filtrato 2: (DIMENS) // (Q_AcquirRicercaImm)
    Campo filtrato 3: (CITTA') // (Q_AcquirRicercaImm)
    ...continua come sopra se ci sono altri campi filtrati

    Scusa se non riesco a farmi capire, nell'eventualità ti mando il file esempio
    Grazie
  • Re: Filtro multiplo

    Credo che hai omesso di compilare altri dati... nomi finestre e condizioni...

    non c'è nulla da farsi scusare e solo che per aiutarti mi serve di sapere le codizioni nel file d'esempio quelle non puoi metterle... devi per forza scrivermele...
  • Re: Filtro multiplo

    Guardiamo se riesco a spiegarti.
    Quando CERCO/VENDO è un ALLOGGIO , allora il CMD dovrebbe prendere in considerazione anche il criterio DIMENSIONE , in quanto solo per la tipologia di immobile=ALLOGGIO esiste la differenziazione PICCOLO,MEDIO,GRANDE, mentre tutte le altre tipologie di immobili nei campi VENDO/CERCO <> diverse da ALLOGGIO non dovrebbero tenere conto del confronto DIMENSIONE.
    Il criterio CITTA invece è sempre preso in considerazione.


    Non so se sono riuscito a spiegarti.
    Grazie ciao
  • Re: Filtro multiplo

    Ora si
    On Error GoTo Err_88_Click
    
    Dim stDocName As String
    Dim stLinkCriteria As String
    
    stDocName = "M_RicercaImm"
    
    ' [CITTA] è sempre obbligatorio altrimenti non vedi nulla
    If Me.VENDO = "ALLOGGIO" Then
        stLinkCriteria = "[CERCO]=" & "'" & Me![VENDO] & "' And [CITTA']=" & "'" & Me![CITTA] & "' And [DIMENS]=" & "'" & Me![DIMENSIONE] & "'"
    ElseIf Me.VENDO = "" Or IsNull(Me.VENDO) Then ' Se VENDO rimane vuota mi cerca tutto quello che c'è in determinata Città
        stLinkCriteria = "[CITTA']=" & "'" & Me![CITTA] & "'" '' Se VENDO rimane vuota mi cerca tutto quello che c'è in determinata Città
    Else
        stLinkCriteria = "[CERCO]=" & "'" & Me![VENDO] & "' And [CITTA']=" & "'" & Me![CITTA] & "'"
    End If
    
    DoCmd.OpenForm stDocName, , , stLinkCriteria
    
    Exit_88_Click:
    Exit Sub
    
    Err_88_Click:
    MsgBox Err.Description
    Resume Exit_88_Click
    così dovrebbe andare... ci ho aggiunto una condizione in più... se non ti piace l'effetto cancella tutta la riga dove c'è scritto elseif.... e cancella anche la riga seguente

    Se non va scrivi pure...

    ciao
  • Re: Filtro multiplo

    Grande Angelo... mi hai spianato la strada
Devi accedere o registrarti per scrivere nel forum
28 risposte