Filtrare campo booleano mediante cbo

di il
9 risposte

Filtrare campo booleano mediante cbo

Ciao a tutti. Premetto che sono super arruginito nel poco VBA che conoscevo.
Stò mettendo mano ad un db contabile realizzato anni fa, su esempio del vecchissimo PRIMANOTA di Alberto Fortunato.
I dati sono attualmente filtrati attraverso una sottomaschera "Interrogativa" (con cbo basate su SQL allucinanti!)
mentre nella sottomaschera Operazioni (origine tabella Dati) filtravo "ulteriormente" un campo booleano
attraverso un gruppo di opzioni.

I due filtraggi agivano simultaneamente, senza interferire tra loro.
Volendo semplificare e snellire, ora vorrei filtrare tutto direttamente nella maschera Operazioni
col classico multifiltro, ed eliminando così la maschera interrogativa.

Tutto bene sui campi data, importo, e testo. Sul campo booleano (tripla opzione: si/no/tutti) mi sono invece arenato, e le mie
ricerche sul web portano sempre a riferimenti su discussioni e articoli del, ahimè, defunto masterdrive.

Da quel che ho trovato, mi pare di capire che le vie migliori sono due.
O riporto nel multifiltro il gruppo opzioni (non ci sono riuscito), mantenendo i tre pulsanti, e cosa che per motivi estetici
e di spazio in maschera vorrei evitare,
oppure aggiungo una cbo (che preferirei!) con elenco valori Si/No/Tutti, forzando il filtro su false.
e riportando poi in multifiltro, del tipo:

...
 If Len(Me!cboCampoBooleano.Value & vbNullString) > 0 And Me!cboCampoBooleano.Value <> "Tutti" Then _
                                   strWH = strWH & "CampoBooleano=-1" & " AND "
...

Gentilmente, potreste indicarmi alcuni link sull'argomento ancora "attivi", così vi evito di guidarmi su argomenti
vecchi, triti e ritriti?

Grazie infinite in anticipo.

9 Risposte

  • Re: Filtrare campo booleano mediante cbo

    Apperte il fatto che quello che intendi non lo definirei booleano. Un dato booleano per definizione ammette due soli valori true/false, che convertiti im tipi numerici diventano -1/0. Nelle ultime due settimane ci sono state due discussioni utili al tuo scopo. Guarda a ritroso.

  • Re: Filtrare campo booleano mediante cbo

    Sono andato a ritroso nei thread ben oltre le due settimane, ma non ho trovato quello che cercavo.

    Proviamo ad andare per gradi, ed evitiamo per ora le opzioni su cbo, mantenendo i 3 pulsanti del gruppo.

    Il campo booleano NC_Contributi è filtrato direttamente su evento AfterUpdate() per Tutti/Si/No:

    Private Sub GRPOpzioni_AfterUpdate()
    
       Dim strWH As String
       Select Case GRPOpzioni
           Case 1
                Me.FilterOn = False
                Me.Filter = vbNullString
                Exit Sub
           Case 2
                strWH = "NC_Contributi=False"
           Case 3
                strWH = "NC_Contributi=True"
        End Select
      Me.Filter = strWH
      Me.FilterOn = True
    
    End Sub


    mentre gli altri controlli (cbo su campi testo/data/valuta) sub AfterUpdate richiamano il multi filtro:

    Sub SetFilter()
      Dim strWH As String
    If Len(Me!cboMovimento.Value & vbNullString) > 0  Then _
                  strWH = strWH & "Movimento='" & Me.cboMovimento.Value & "'" & " AND "
    If Len(Me!txtDataInizio.Value & vbNullString) > 0  Then _
                   strWH = strWH & "[Data]>=#" & Format$(Me!txtDataInizio.Value, "mm/dd/yyyy") & "#" & " AND "
    ....
    If Len(Me!txtImportoMin.Value & vbNullString) > 0 Then strWH = strWH & "[Importo]>=" & Me!txtImportoMin.Value & " AND " 
    ....
    ecc....
    
      If Len(strWH) <> 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
      Me.Filter = strWH
      Me.FilterOn = True
    
    End Sub
    
    NB: nel set filter ho qui cancellato alcune assegnazioni, 
    né torniamo a discutere assenza dell' end if, già affrontato in altra discussione:
     il filtro multiplo funziona perfettamente!!).

    Per evitare che i filtri si escludano a vicenda, il target è dunque  riportare i valori 1,2 e 3 del case nel set filter.
    Se potete aiutarmi, anche solo linkandomi articoli o discussioni che svolgono esaustivamente il problema ve ne sarei grato.
    Le mie nozioni di VBA si sono così atrofizzate che da solo non riesco a scrivere l'istruzione, per quanto semplice possa essere.

    Grazie ancora per ogni aiuto vogliate fornirmi.

  • Re: Filtrare campo booleano mediante cbo

    Devi lavorare costruendo due funzioni che restituiscano una stringa, la cui combinazione andrà poi filtrata. Quarda questa discussione, con la giusta osservazione fatta da @Alex:

    https://www.iprogrammatori.it/forum-programmazione/access/ricerca-caselle-combinate-a-cascata-t51307.html

  • Re: Filtrare campo booleano mediante cbo

    Buondì.
    Allora, la soluzione che preferivo (Combobox) era di una facilità disarmante,
    tant'é che inizio a preoccuparmi della mia salute mentale.
    Una volta creato l'elenco valori della cbo (Tutti / Contabili / Contributi)
    era sufficiente aggiungere l'assegnazione = “ValoreInElenco” (testo) associandolo nella stringa al valore numerico booleano del campo.

       If Len(Me!cboNatura.Value & vbNullString) > 0 And Me!cboNatura.Value = "Contabili" And Me!cboNatura.Value <> "Tutti" Then _
                                        strWH = strWH & "NC_Contributi=-1" & " AND "
       If Len(Me!cboNatura.Value & vbNullString) > 0 And Me!cboNatura.Value = "Contributi" And Me!cboNatura.Value <> "Tutti" Then _
                                        strWH = strWH & "NC_Contributi=0" & " AND "


    Peccato che non riesca più a ritrovare quella discussione (molto datata) in cui @Alex trattava la gestione del case del gruppo opzioni nel set filter, e mi sembra riportasse poi l'assegnazione dei valori 1,2,3 del GPROpzioni
    in un unica istruzione. Ma potrei ricordare o aver visto male.
    Comunque il problema è risolto esattamente nei termini in cui lo desideravo.


    Grazie per l'aiuto e scusate per la ripetitività/banalità del thread.

  • Re: Filtrare campo booleano mediante cbo

    Ma non ti pare ci sia qualche cosa di troppo in quello che hai scritto..?

    Dal momento che vincoli a 2 valori Contabili/Contributi ti pare possa avere “Tut” come valore…?

    Sorvolo sulla scelta di usare valori di testo per le selezioni e non Valori indice numerico… ti accorgerai da solo del problema… almeno però ragiona meglio sulle condizioni.

  • Re: Filtrare campo booleano mediante cbo

    01/03/2023 - @Alex ha scritto:


    Dal momento che vincoli a 2 valori Contabili/Contributi ti pare possa avere “Tut” come valore…?

    Ciao Alex. I valori booleani sono 2, ma la casistica prevede 3 opzioni (come anche tu hai fatto notare in altri thread).
    Io sono abituato ad inserire sempre nel filtro multiplo per ogni controllo l'assegnazione AND NomeControllo.Value <> "Tutti" (o <> "", "NonFiltrato"...).
    Inserisco la rispettiva dicitura  su una riga del menù a tendina, trovandomi la deselezione filtro comodissima.
    Non mi ha mai causato problemi, e la leggo bene sul SetFilter.
    Se mi dici che concettualmente è meglio non farlo, funziona anche impostato così:

         If Me!cboNatura.Value = "tutti" Then
                 Me.FilterOn = False
                 Me.Filter = vbNullString
         End If
                 
       If Len(Me!cboNatura.Value & vbNullString) > 0 And Me!cboNatura.Value = "Contabili" Then _
                                        strWH = strWH & "NC_Contributi=0" & " AND "
       If Len(Me!cboNatura.Value & vbNullString) > 0 And Me!cboNatura.Value = "Contributi" Then _
                                        strWH = strWH & "NC_Contributi=-1" & " AND "

    01/03/2023 - @Alex ha scritto:


    Sorvolo sulla scelta di usare valori di testo per le selezioni e non Valori indice numerico… ti accorgerai da solo del problema…

    Anche qui ad oggi non ho trovato problemi. Ma detto da te mi mette una certa ansia!! Puoi spiegarti meglio per favore?

    Che problema incontrerei? 

    Meglio evitare l'elenco valori in origine riga e optare per una tabella/query a due colonne ?

    Grazie

  • Re: Filtrare campo booleano mediante cbo

    Tu non devi dare per assunto che quello che ti suggerisce un'altro sia la bibbia…. devi capire in modo critico per crescere…

    Ora analizziamo questo:

    If Len(Me!cboNatura.Value & vbNullString) > 0 And Me!cboNatura.Value = "Contabili" Then

    Lo speriamo in 2 condizioni che devono essere soddisfatte entrambe contemporaneamente:

    1. If Len(Me!cboNatura.Value & vbNullString) > 0
    2. If Me!cboNatura.Value = "Contabili"

    Se è vera la 2… non ti pare che automaticamente sia soddisfatta anche la 1…?

    Il contrario no ovviamente ma siccome la condizione dirimente è la 2… e dal momento che se vera soddisfa pure pare la 1… va da sé che la 1 non serve… ti torna…?

    Questo non significa che la condizione 1 non serve MAI ma solo che nel tuo caso non serve.

    Se il criterio fosse più generico Tipo:

    If Len(Me!cboNatura.Value & vbNullString) > 0 Then
       strWH = strWH & "NomeCampo=" & Me!cboNatura.Value & " AND "

    Allora la verifica serve ad evitare che il criterio venga costruito senza un contenuto…

    per l'altro tema è una questione di esperienza…

    Utilizzare i campi testuali spesso comporta dei problemi nel tempo… i campi testuali sono per lo più usati a descrizione, per far capire l'argomento che risulta più assimilabile al concetto che un numero…

    Il problema a è che se una definizione o una attribuzione descrittiva domani cambia… tu non trovi più nulla o sei costretto a modificare tutte le descrizioni.

    Se invece si sfrutta una tabella a riferimento con una PK ed il campo descrittivo… l'utente vede sempre e solo il testo, ma dietro la combo ha l'indice relativo che non cambia mai, w se cambiasse la descrizione ti basterebbe cambiarlo nella tabella… e potrebbe farlo chiunque abilitato, mentre nell'altro caso serve fare una azione nel database più invasiva.

    Meglio evitare l'elenco valori in origine riga e optare per una tabella/query a due colonne ?

    Decisamente si.

  • Re: Filtrare campo booleano mediante cbo

    Se ho compreso bene, pur funzionando impeccabilmente, entrambe le istruzioni nel blocco contenevano
    ben due condizioni assolutamente inutili (in rosso)

     If Len(Me!cboNatura.Value & vbNullString) > 0 And Me!cboNatura.Value = "Contabili" And Me!cboNatura.Value <> "Tutti" Then _
                                       strWH = strWH & "NC_Contributi=-1" & " AND "
      If Len(Me!cboNatura.Value & vbNullString) > 0 And Me!cboNatura.Value = "Contributi" And Me!cboNatura.Value <> "Tutti" Then _
                                       strWH = strWH & "NC_Contributi=0" & " AND "

    Me!cboNatura.Value & vbNullString) > 0
    Me!cboNatura.Value <> "Tutti"

    poiché, una volta assegnati i valori booleani nelle due istruzioni:

      If Me!cboNatura.Value = "Contabili" Then strWH = strWH & "NC_Contributi=0" & " AND "
      If Me!cboNatura.Value = "Contributi" Then strWH = strWH & "NC_Contributi=-1" & " AND "

    La prima condizione esclude la seconda e "Tutti" 
    La seconda eslude la prima e, anch'essa, "Tutti" 
    L'assenza di selezione corrispondente ad una delle due istruzioni, conferma la validità di "tutti" (FilterOn=false), laddove selezionato in cbo.

    Utilizzare i campi testuali spesso comporta dei problemi nel tempo… i campi testuali sono per lo più usati a descrizione, per far capire l'argomento che risulta più assimilabile al concetto che un numero…

    Il problema a è che se una definizione o una attribuzione descrittiva domani cambia… tu non trovi più nulla o sei costretto a modificare tutte le descrizioni.

             Meno male!! …temevo altro tipo di problemi.

    L'elenco valori lo utilizzo solo laddove sono certo al 99% di non dover mai apportare future modifiche.
    Nel caso: cboMovimento (Entrata/Uscita); cboConto(Cassa/Banca) e appunto cboNatura (contabile/contributi, ossia non contabile) 

    Tu non devi dare per assunto che quello che ti suggerisce un'altro sia la bibbia….devi capire in modo critico per crescere…

    Con una eccezione però: dove non capisco, nessuno può  dissuadermi dalla validità dell'equazione PadreEterno : Creato = @Alex : VBA

    Grazie mille della spiegazione.

    Ciao

  • Re: Filtrare campo booleano mediante cbo

    Si le condizioni mi pare argomento compreso.

    Ora ti faccio un esempio proprio per le combo di cui parlavi… (Entrata/Uscita).

    Io avrei usato la stessa Logica:
    PkMovimento (E/U)
    DescrizioneMovimento (Entrata/Uscita)

    Perchè… ipotizza di dover modificare per utilizzo estero… Entrata/Uscita facilmente diventerebbero Eingang/Ausgang… ;-)

    Ragionerei sempre in modo da rendere flessibile l'applicazione perchè il metodo corretto si adatta sempre.

Devi accedere o registrarti per scrivere nel forum
9 risposte