[RISOLTO] Problema con operatore OR su multifiltro

di il
35 risposte

[RISOLTO] Problema con operatore OR su multifiltro

Ciao a tutti
A un db contabile che uso da anni, dove ho sulla maschera principale "Operazioni" (origine record tblDati) una serie di cbo per filtrare i vari campi col classico "multifiltro di Alex" (...non me ne vogliate se - forse impropriamente - gliene attribuisco la paternità, ma l'ho imparato da lui), ho inserito una cboDR relativa a due nuovi campi booleani aggiunti nella tblDati: "detraibili" e "rimborsabili".

La cboDR deve prevedere tutte le combinazioni possibili, quindi:

- tutti (non filtrato)
- detraibili (non rimborsabili)
- rimborsabili (non detraibili)
- detraibiliPlus (anche se rimborsabili)
- rimborsabiliPlus (anche se detraibili)
- entrambi (solo detraibili e rimborsabili)
- entrambiMinus (solo detraibili o solo rimborsabili)
- nessuno (tutti i record con i due campi non flaggati)

tra le altre numerose cbo, è presente anche una cboSceltaAnno, ma se seleziono dalla cboDR il valore "entrambiMinus", dove ho inserito l'operatore "OR", la selezione dell'anno non filtra più, e la maschera mi restituisce anche i record di tutti gli anni precedenti e successivi, se pur correttamente filtrati secondo il criterio entrambiMinus (solo detraibili o solo rimborsabili).

Questa la parte di codice in questione:

   If Len(Me!cboSceltaAnno.Value & vbNullString) > 0 Then strWH = strWH & "Year(Data) = " & _
       Me!cboSceltaAnno.Value & " AND "
       										' .....
       If Me!cboDR.Value = "detraibili" Then strWH = strWH & "detraibili=-1" & " AND " & "rimborsabili=0" & " AND "
       If Me!cboDR.Value = "rimborsabili" Then strWH = strWH & "rimborsabili=-1" & " AND " & "detraibili=0" & " AND "
       If Me!cboDR.Value = "detraibiliPlus" Then strWH = strWH & "detraibili=-1" & " AND "
       If Me!cboDR.Value = "rimborsabiliPlus" Then strWH = strWH & "rimborsabili=-1" & " AND "
       If Me!cboDR.Value = "entrambi" Then strWH = strWH & "detraibili=-1" & " AND " & "rimborsabili=-1" & " AND "
       		' stringa in oggetto:
       If Me!cboDR.Value = "entrambiMinus" Then strWH = strWH & ("detraibili=-1" & " AND " & "rimborsabili=0") & _
       " OR " & ("rimborsabili=-1" & " AND " & "detraibili=0") & " AND "
       
       If Me!cboDR.Value = "nessuno" Then strWH = strWH & "detraibili=0" & " AND " & "rimborsabili=0" & " AND "
        	' soluzione alternativa:
   If Len(Me!txtDataInizio.Value & vbNullString) > 0 And Me!txtDataInizio.Value <> "" Then _
                           strWH = strWH & "[Data]>=#" & Format$(Me!txtDataInizio.Value, "mm/dd/yyyy") & "#" & " AND "
   If Len(Me!txtDataFine.Value & vbNullString) > 0 And Me!txtDataFine.Value <> "" Then _
                           strWH = strWH & "[Data]<=#" & Format$(Me!txtDataFine.Value, "mm/dd/yyyy") & "#" & " AND "


In realtà, avendo in maschera anche due controlli txtDataInizio e txtDataFine, sempre dal multifiltro, posso aggirare il problema inserendo l'intervallo del primo e ultimo giorno dell'anno che mi interessa. In tal modo i record vengono filtrati correttamente.
Tuttavia non mi spiego perchè la cboSceltaAnno viene resa inefficiente quando la cboDR seleziona un valore che filtra con la presenza dell'operatore "OR".

35 Risposte

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    Hai scritto tanto ma non scritto l'unica cosa che può aiutare noi ad aiutarti : il valore della stringa strWH alla fine della concatenazione…

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    Oltre alla giusta considerazione di MAX, aggiungo una cosa…

    Questo che senso ha…?

    If Len(Me!txtDataInizio.Value & vbNullString) > 0 And Me!txtDataInizio.Value <> "" Then

    Hai capito come funziona la prima parte…? non mi pare altrimenti non avresti scritto la seconda…

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    29/04/2024 - max.riservo ha scritto:


    Hai scritto tanto ma non scritto l'unica cosa che può aiutare noi ad aiutarti : il valore della stringa strWH alla fine della concatenazione…

    Hai ragione. Scusa..

       If Len(strWH) <> 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
      Me.Filter = strWH
      Me.FilterOn = True
  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    29/04/2024 - @Alex ha scritto:


    Oltre alla giusta considerazione di MAX, aggiungo una cosa…

    Questo che senso ha…?

    If Len(Me!txtDataInizio.Value & vbNullString) > 0 And Me!txtDataInizio.Value <> "" Then

    Hai capito come funziona la prima parte…? non mi pare altrimenti non avresti scritto la seconda…

    Qui non serve a nulla infatti, perchè il controllo è una txt.

    Lo scrivo automaticamente in tutte le cbo, perchè lascio sempre una riga (valore) vuota per deselezionare il filtro rapidamente.

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    Probabilmente in questa

    If Me!cboDR.Value = "entrambiMinus" Then strWH = strWH & ("detraibili=-1" & " AND " & "rimborsabili=0") & _
           " OR " & ("rimborsabili=-1" & " AND " & "detraibili=0") & " AND "

    sbagli ad inserire quelle parentesi, che andrebbero così

    If Me!cboDR.Value = "entrambiMinus" Then strWH = strWH & "(detraibili=-1 AND rimborsabili=0)" & _
           " OR " & "(rimborsabili=-1 AND detraibili=0)" & " AND "
  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    30/04/2024 - oregon ha scritto:


    sbagli ad inserire quelle parentesi, che andrebbero così

    If Me!cboDR.Value = "entrambiMinus" Then strWH = strWH & "(detraibili=-1 AND rimborsabili=0)" & _
           " OR " & "(rimborsabili=-1 AND detraibili=0)" & " AND "

    Identico risultato.

    Il problema non è nelle parentesi, ma nell'operatore OR. L'avevo già provato in altre stringhe prive di parentesi, con risultati analoghi (sballa il filtro della cboSceltaAnno)

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    29/04/2024 - surfgarden ha scritto:


    29/04/2024 - max.riservo ha scritto:


    Hai scritto tanto ma non scritto l'unica cosa che può aiutare noi ad aiutarti : il valore della stringa strWH alla fine della concatenazione…

    Hai ragione. Scusa..

       If Len(strWH) <> 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
      Me.Filter = strWH
      Me.FilterOn = True

    Ci serve la Stampa a video della STRINGA RISOLTA per capire l'errore…

     Debug.Print strWH
  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    Ma un codice più snello no?

    MyFilter= Array("detraibili=-1 AND rimborsabili=0", 
                   "rimborsabili=-1 AND detraibili=0", 
                   "...",
                   "(detraibili=-1 AND rimborsabili=0) OR (rimborsabili=-1 AND detraibili=0)")
    ....
    ....
    strWH = MyFilter(combo.item)

    qualcosa del genere?

    comunque controlla la OR, le parentesi dovrebbero andare all'interno delle virgolette.

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    Ah, già te lo aveva segnalato oregon…

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    So che vergognoso, ma non sono abituato a debugare.

    Sto provando … ma dovrò cercare un un bel po' di informazioni sul web  prima di riuscire a farlo correttamente

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    30/04/2024 - sihsandrea ha scritto:


    Ma un codice più snello no?

    MyFilter= Array("detraibili=-1 AND rimborsabili=0", 
                   "rimborsabili=-1 AND detraibili=0", 
                   "...",
                   "(detraibili=-1 AND rimborsabili=0) OR (rimborsabili=-1 AND detraibili=0)")
    ....
    ....
    strWH = MyFilter(combo.item)

    qualcosa del genere?

    comunque controlla la OR, le parentesi dovrebbero andare all'interno delle virgolette.

    Anche se uso access da anni, mettendo mano una decine di volte l'anno, col vba sono meno che principiante. 

    Speravo in un problema/soluzione  più semplice

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    29/04/2024 - surfgarden ha scritto:


    If Len(Me!txtDataInizio.Value & vbNullString) > 0 And Me!txtDataInizio.Value <> "" Then _ strWH = strWH & "[Data]>=#" & Format$(Me!txtDataInizio.Value, "mm/dd/yyyy") & "#" & " AND " If Len(Me!txtDataFine.Value & vbNullString) > 0 And Me!txtDataFine.Value <> "" Then _ strWH = strWH & "[Data]<=#" & Format$(Me!txtDataFine.Value, "mm/dd/yyyy") & "#" & " AND "

    Con il bonus 110% le variabili non le paghi... usa una variabile datetime e lascia che se ne occupi access del formato o di estrapolare anno, mese o giorno.

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

    30/04/2024 - surfgarden ha scritto:


    Anche se uso access da anni, mettendo mano una decine di volte l'anno, col vba sono meno che principiante. 

    Speravo in un problema/soluzione  più semplice

    Aggira l'ostacolo: associa la combo di scelta ad una combo (nascosta) con la striga filtro (magari caricate da file o tabella settaggi per future manutenzioni o implementazioni di filtro)

    • tutti (non filtrato)                                                                           =====>>>> combo2: ‘’
      - detraibili (non rimborsabili)                                                      =====>>>> combo2: "detraibili=-1 AND rimborsabili=0"
      - rimborsabili (non detraibili)                                                      =====>>>> Combo2: ecc…
      - detraibiliPlus (anche se rimborsabili)
      - rimborsabiliPlus (anche se detraibili)
      - entrambi (solo detraibili e rimborsabili)
      - entrambiMinus (solo detraibili o solo rimborsabili)
      - nessuno (tutti i record con i due campi non flaggati)

    funziona come un array: ha un indice ed un valore.

    combo2.ItemIndex=Combo1.ItemIndex (o come lo vuole scritto access)

    strWH = combo2.item(combo1.ItemIndex)

    per l'anno usa una variabile datetime.

  • Re: [RISOLTO] Problema con operatore OR su multifiltro

       If Len(Me!cboSceltaAnno.Value & vbNullString) > 0 Then strWH = strWH & "Year(Data) = " & _
           Me!cboSceltaAnno.Value & " AND "
       If Me!cboDR.Value = "detraibili" Then strWH = strWH & "detraibili=-1 AND rimborsabili=0 AND "
       If Me!cboDR.Value = "rimborsabili" Then strWH = strWH & "rimborsabili=-1 AND detraibili=0 AND "
       If Me!cboDR.Value = "detraibiliPlus" Then strWH = strWH & "detraibili=-1 AND "
       If Me!cboDR.Value = "rimborsabiliPlus" Then strWH = strWH & "rimborsabili=-1 AND "
       If Me!cboDR.Value = "entrambi" Then strWH = strWH & "detraibili=-1 AND rimborsabili=-1 AND "
       If Me!cboDR.Value = "entrambiMinus" Then strWH = strWH & "((detraibili=-1 AND rimborsabili=0)" & _
           " OR (rimborsabili=-1 AND detraibili=0)) AND "       
       If Me!cboDR.Value = "nessuno" Then strWH = strWH & "detraibili=0 AND rimborsabili=0 AND "
       If Len(Me!txtDataInizio.Value & vbNullString) > 0 And Me!txtDataInizio.Value <> "" Then _
                               strWH = strWH & "[Data]>=" & CLng(Me!txtDataInizio.Value) & " AND "
       If Len(Me!txtDataFine.Value & vbNullString) > 0 And Me!txtDataFine.Value <> "" Then _
                               strWH = strWH & "[Data]<=" & CLng(Me!txtDataFine.Value) & " AND "
                               
       If Len(strWH) = 0 Then 
           Me.FilterOn = False
       else
           Me.Filter = Mid$(strWH, 1, Len(strWH) - 5)
           Me.FilterOn = True
       End If
Devi accedere o registrarti per scrivere nel forum
35 risposte