Flistro selezione multipla su maschera con Casella di Riepilogo

di il
18 risposte

Flistro selezione multipla su maschera con Casella di Riepilogo

Buongiorno, ho sono un po arrugginito con access, negli ultimi tempi mi sono dedicato alla sicurezza informatica, ma per alcuni motivi devo riprendere in mano i db e access.

 dovrei creare un filtro con selezione multipla su una maschera.

la maschera prende i dati dalla tabella PROCEDURE.

ho creato una query FASI dove filtro il nome delle fasi che sono inserite nella tabella procedure.

la query FASI l'ho collegata ad una Casella di riepilogo (nominata ListaFase) messa nella maschera.

ho creato un pulsante e generato uno script

Private Sub Pulsante_Click()
Dim strfiltro As String
Dim varciclo As Variant

If ListaFase.ItemsSelected.Count = 0 Then
MsgBox "selezionare almeno una categoria", vbInformation
Exit Sub
End If

For Each varciclo In ListaFase.ItemsSelected
If ListaFase.Selected(varciclo) = True Then
strfiltro = strfiltro & ListaFase.ItemData(varciclo) & ","
End If
   
Next
  
strfiltro = Left(strfiltro, Len(strfiltro) - 1)

Me.Filter = "COD_FASE IN(" & strfiltro & ")"
Me.FilterOn = True
End Sub

ora quando seleziono le categorie e clicco il pulsante mi compare il messaggio “immettere valore parametro” come se non riconoscesse il campo che seleziono nella casella combinata. 

io credo che il mio “errore” sia in questa parte di codice, come se non riconoscesse la string strfiltro

Me.Filter = "COD_FASE IN(" & strfiltro & ")"
Me.FilterOn = True

(PS: COD_FASE è un campo testobrebe)

grazie 

18 Risposte

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Buongiorno.

    secondo me mancano i 2 doppi apici tra gli elementi della clausola IN.

    La stringa filtro dovrebbe apparire così:

    “COD_FASE IN(”"Elemento1"",""Elemento2"",""Elemento3"")"

    Prova a sostituire solo questa riga:

    strfiltro = strfiltro & """" & ListaFase.ItemData(varciclo) & ""","
  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Confermo… sembra essere quello l'errore.

    modificato come da suggerimento funziona.

    ora faccio qualche altro test e vedo ma per il momento funziona.

    grazie

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Confermo nuovamente il tutto. funziona. evidentemente il campo testo saza apici non funziona.

    detto cio… se volessi inserire una seconda casella di riepilogo per applicare un ulteriore filtro “multiplo” su un altro campo della tabella, come posso fare?

    ho letto vari tuttorial, di filtri a cascata, ovvero filtro il primo elenco che filtra il secondo elenco ecc. mentre a me semplicemente interessa filtrare campi differenti con selezioni multiple, ovvero duplicare il codice sopra.

    grazie

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Ciao. Che significa filtro multiplo?

    Valori in AND oppure OR.

    Devi filtrare i risultati della query precedente?

    In questo caso è da valutare il metodo me.filter. da applicare dopo la prima query.

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Intendo questo.

    ho una tabella con campi:

    fase e stato

    Nella fase mi trovo , progettazione, taglio, spedizione, ecc - cioè fasi lavorative - mentre nello stato mi trovo , in lavarazione,  lavorato, spedito ecc (ho un po semplificato per rendere l'idea)

    quindi con il filtro sopra ho filtrato le fasi, ovvero voglio vedere tutti i record che sono in taglio e/o in progettazione.

    ma se volessi vedere tutti i record che sono nella fase taglio e progettazione e sono in lavorazione e lavorati ? 

    spero di aver reso l'idea.

    grazie

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Ops…

    Ti chiedo scusa, non avevo visto che avevi usato cun costrutto str con me.filter.

    Una cortesia, quando posti un codice, formattalo con i tag codice. Si legge meglio.

    Una precisazione.

    Per noi di access filtro e query,  anche se il risultato è simile, sono due cose completamente diverse, e costruite in modo diverso.

    Per fare quello che vuoi devi creare una query con le condizioni where applicate al campo che ti interessa.

    Poi dal risultato che vuoi ottenere metterai nella condizione where AND o OR.

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Se nella tua form hai già una lista stati,

    e non ti interessa che tale lista venga filtrata in base a quanto selezionato nella lista fasi

    Puoi duplicare il tuo codice che hai sull'onclick del pulsante mettendo in AND le due stringhe filtro

    così:

    Private Sub Pulsante_Click()
    Dim strfiltro1 As String, Dim strfiltro2 As String
    Dim varciclo As Variant
    
    'If ListaFase.ItemsSelected.Count = 0 Then
    'MsgBox "selezionare almeno una categoria", vbInformation
    'Exit Sub
    'End If
    If ListaFase.ItemsSelected.Count <> 0
    For Each varciclo In ListaFase.ItemsSelected
    	If ListaFase.Selected(varciclo) = True Then
    		strfiltro1 = strfiltro1 & """" & ListaFase.ItemData(varciclo) & ""","
    	End If   
    Next
    strfiltro1 = Left(strfiltro1, Len(strfiltro) - 1)
    strfiltro1 = "COD_FASE IN(" & strfiltro1 & ")"
    end if
    
    If ListaStato.ItemsSelected.Count <> 0
    For Each varciclo In ListaStato.ItemsSelected
    	If ListaStato.Selected(varciclo) = True Then
    		strfiltro2 = strfiltro2 & """" & ListaStato.ItemData(varciclo) & ""","
    	End If  
    Next
    strfiltro2 = Left(strfiltro2, Len(strfiltro) - 1)
    strfiltro2 = "COD_STATO IN(" & strfiltro2 & ")"
    end if
    
    If strfiltro1="" and strfiltro2="" then 
    	MsgBox "Selezionare almeno una fase o uno stato", vbInformation
    	Exit Sub
    else
    	if strfiltro1<>"" and strfiltro2<>"" then
    		Me.Filter=strfiltro1 & " AND " & strfiltro2
    	else
    		if strfiltro1="" then Me.Filter= strfiltro2
    		else: Me.Filter= strfiltro1
    	end if 
    end if
    
    Me.FilterOn = True
    End Sub
    
  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Ok per il codice la prossima volta lo posterò meglio.

    come detto è qualche anno che non “uso” access anche se ho usato MSSQL con relative viste e qury - quindi non sapevo la differenza tra filtro e query nel mondo access.

    detto cio no ho capito la procedura che suggerisi.

    io ora ho una maschera basata su tabella e ho applicao la casella di riepiloto per filtrare quello che mi interessa.

    se scrivo uno quuery (ovviamente so come fare) come faccio a inpostare le clausole ehere and o or “dinamiche”? ovvero da dentro la maschera selezionare di volta in volta ciò che mi interessa? forse suggerisci una procedura tipo quella che si fa con i filtri maschera con casella combinata?

    grazie

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Prima di tutto se cicli la collection ITEMSELECTED non devi preoccuparti che l'item iterato sia SELECTED… ti pare…?

    Ovviamente le cose inutili si evitano e per capire se sono utili basta leggere la guida, questa è veramente inutile.

    Prova a vedere se questo esempio ti è di aiuto:

    https://1drv.ms/u/s!Are2sGzrs4WChnuEZUJWbsVruNsH

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    22/11/2022 - @Alex ha scritto:


    Prima di tutto se cicli la collection ITEMSELECTED non devi preoccuparti che l'item iterato sia SELECTED… ti pare…?

    Ovviamente le cose inutili si evitano e per capire se sono utili basta leggere la guida, questa è veramente inutile.

    Prova a vedere se questo esempio ti è di aiuto:

    https://1drv.ms/u/s!Are2sGzrs4WChnuEZUJWbsVruNsH

    Grazie - il file di esempio mostra come arrivare alla soluzione del filtro facendo varie strade, ma non cita come fare un doppio filtro.

    ovvero il mio codice funziona - ma posso tranquillamente inserire uno dei tuoche sembrano piu “snelli”, solo che mi manca il passaggio del doppio filtro con doppia casella combinata.

    il codice postato sopra,

    Dim strfiltro1 As String, Dim strfiltro2 As Strin

     mi da errore alla prima riga - segnadolo di rosso e se eseguo il ciclo cliccando il pulsante, va in arresto dandomi errore di compilazione e di sintassi

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Dim strfiltro1 As String, Dim strfiltro2 As String
  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    23/11/2022 - Stifone ha scritto:


    Dim strfiltro1 As String, Dim strfiltro2 As String

    scusa io ho scirtto sopra senza la “g”  ma in realtà nel codice c'è! quindi è scritto esattamente come dici te

  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Supposto che le due Caselle di riepilogo si chiamino lstFase e lstStato e che ci sia un pulsante cmdFiltraDati il codice sarebbe il seguente:

    Option Compare Database
    Option Explicit
    
    Private Sub cmdFiltraDati_Click()
        FiltraDati
    End Sub
    
    Private Sub FiltraDati()
    Dim strFiltro As String
        If Me.lstFase.ItemsSelected.Count > 0 Then strFiltro = strFiltro & " AND " & ImpostaFiltro(Me.lstFase, "COD_FASE")
        If Me.lstStato.ItemsSelected.Count > 0 Then strFiltro = strFiltro & " AND " & ImpostaFiltro(Me.lstStato, "COD_STATO")
        If strFiltro = "" Then
            Me.Filter = ""
            Me.FilterOn = False
        Else
            Me.Filter = Mid(strFiltro, 6)
            Me.FilterOn = True
        End If
    End Sub
    
    Private Function ImpostaFiltro(objLst As Object, strCampoFiltro As String) As String
    Dim strFiltro As String
    Dim varCiclo As Variant
        If objLst.ItemsSelected.Count > 0 Then
            For Each varCiclo In objLst.ItemsSelected
                If objLst.Selected(varCiclo) = True Then
                    strFiltro = strFiltro & """" & objLst.ItemData(varCiclo) & ""","
                End If
            Next
            ImpostaFiltro = strCampoFiltro & " IN (" & Left(strFiltro, Len(strFiltro) - 1) & ")"
        End If
    End Function
  • Re: Flistro selezione multipla su maschera con Casella di Riepilogo

    Cosi funziona.

    ora se volessi aggiungere ulteriori filtri lista, basta che nel codice aggiungo una riga.

    Dim strFiltro As String
        If Me.lstFase.ItemsSelected.Count > 0 Then strFiltro = strFiltro & " AND " & ImpostaFiltro(Me.lstFase, "COD_FASE")
        If Me.lstStato.ItemsSelected.Count > 0 Then strFiltro = strFiltro & " AND " & ImpostaFiltro(Me.lstStato, "COD_STATO")
        If strFiltro = "" Then

     If Me.ULTERIORELISTA.ItemsSelected.Count > 0 Then strFiltro = strFiltro & " AND " & ImpostaFiltro(Me.ULTERIORELISTA, "COD_ULTERIORELISTA")

    giusto?

    Aggiungo un ragionamento, ovviamente scritta cosi devo per forza selezionare tutte le liste, ma se volessi selezionarle tutte o alcune?

    cambio operatore AND - OR?

    grazie mille

Devi accedere o registrarti per scrivere nel forum
18 risposte