Non era facile spiegarlo.
Premesso che uso di norma altri sistemi. In presenza di tanti filtri anche complessi trasformo la query in una query di accodamento su una tabella di transito che preventivamente svuoto (la prima volta la genero con una query di creazione tabella). La INSERT INTO la eseguo con docmd.runsql con la stringa composta in modo parametrico nel campo where.
Quindi il comando è efficente quando ho null non carico nulla nella where, posso aprire l'esito con un opentable per trasferire dati, ho una tabella d'appoggio per esperimenti, posso fare una cancellazione/update in passaggi progressivi sull'esito ecc.
Rovescio della medaglia non è updatabile.
Potrei creare una query con querydef ma comandi di questo tipo possono difettare il DB in caso di anomalia per cui cerco di evitarli.
La strada del filter è interessante, di fatto non l'ho mai usato, ma preferirei il tentativo iniziale in quanto se ad esempio sotto un form ho una query e qualcuno vuole i dati per un copia incolla nello spreadsheet, associo ad un tasto una opentable o una openquery e ho risolto per cui vorrei una query o una table che mi desse già da sola il risultato dipendendo solo dal campo filtro.
Delle volte però prima di fare una lavorata e non c'è tempo si vorrebbe una 'pezza veloce'.
Ma poco fa credevo di esserci riuscito (ci sono riuscito quasi).
Ecco cosa ho fatto.
Data una combo su un form forms.venditeart.soloclasse
Una tabella in cui ho prodotti di classe A e B ad esempio, e prodotti senza classe (null)
Se ad esempio nel filtro metto null voglio vederli tutti, se metto classe A solo quelli di classe A.
SELECT QVenditeArt.CodiceGestionale, QVenditeArt.Classe FROM QVenditeArt
WHERE QVenditeArt.Classe=ClasseSel([forms].[venditeart].[soloclasse],[Classe])
Function ClasseSel(ClasseFiltro, ClasseRec)
If IsNull(ClasseFiltro) Then
ClasseSel = ClasseRec
Else
If ClasseFiltro = ClasseRec Then
ClasseSel = ClasseRec
Else
ClasseSel = Null
End If
End If
End Function