Funzione nella Where di una query per gestire i null [SOLVED]

di il
19 risposte

Funzione nella Where di una query per gestire i null [SOLVED]

Non è facile da spiegare ma ci provo.

In una query devo gestire un filtro null, in pratica la Where della query punta ad un campo del form che contiene o un valore oppure null.
Se contiene un valore deve mostrare solo i records con quel valore, con null deve mostrarli tutti.
Col valore va con null non va.

Di solito metto * nel campo per poi mettere il like nel filtro, ma nel caso in esame non lo posso fare per una serie di mofivi che non sto a spiegare.

Pensavo di mettere nella Where una funzione passando come parametro il nome del campo fuori e il contenuto del campo stesso per restituire un true se coincidono o null o qualcosa che rendesse indifferente il filtro.
Non funziona, qualche idea?

19 Risposte

  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    paoloholzl ha scritto:


    Se contiene un valore deve mostrare solo i records con quel valore, con null deve mostrarli tutti.
    Mi sembra troppo banale quindi probabilmente non ho compreso l'esigenza :
    - se il campo del form contiene un valore la query contiene la Where
    - se il campo del form è null la query NON contiene la clausola Where
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    Mi associo a MAX... e non capisco...!
    Riassumo:
    Se ho un valore filtro per il valore se Null non filtro.

    Premesso che non userei la WHERE condition in questi casi ma la proprietà FILTER se si tratta di maschera... mi pare banale realizzarlo così, faccio esempio per eventuali MULTIPARAMETRI
    
    
    Dim strFilter As String
    If Len(Me!Parametro1 & vbNullstrinf)>0 Then strFilter=strFilter + "NomeCampo1 Like '" & Me!Parametro1 & "*' AND "
    If Len(Me!Parametro2 & vbNullstrinf)>0 Then strFilter=strFilter + "NomeCampo1 Like '" & Me!Parametro2 & "*' AND "
    If Len(Me!Parametro3 & vbNullstrinf)>0 Then strFilter=strFilter + "NomeCampo1 Like '" & Me!Parametro3 & "*' AND "
    If Len(Me!ParametroN & vbNullstrinf)>0 Then strFilter=strFilter + "NomeCampo1 Like '" & Me!ParametroN & "*' AND "
    If Len(strFilter)>0 Then 
        strFilter=Mid$(strFilter,1,Len(strFilter)-5)
        Me.Filter=strFilter
        Me.Filter=On
    Else
        Me.FilterOn=False
        Me.Filter=vbNullstring
    End If
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    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
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    Per il codice devi usare i tag code

    questa
    SELECT QVenditeArt.CodiceGestionale, QVenditeArt.Classe FROM QVenditeArt
    WHERE QVenditeArt.Classe=ClasseSel([forms].[venditeart].[soloclasse],[Classe])
    ti vincola e limita.
    Non è codice che componi da vba dentro ad un form? nel caso non puoi comporlo con concatenazione?

    poi una cosa imparata anni fa da Alex, invece del docmd.runsql che di norma si accompagna al setwarning prova
    dbengine(0)(0).execute "tuocodiceSQL",option
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    ERRATA CORRIGE il problema rimane!
    Ovvero filtro null mostra categoria A e B (ok), filtro A categoria A (ok).
    Ma io vorrei che fitro null mostrasse anche quelli con categoria null!
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    muttley005 ha scritto:


    Per il codice devi usare i tag code
    Fatto grazie
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    muttley005 ha scritto:


    Per il codice devi usare i tag code
    questa
    SELECT QVenditeArt.CodiceGestionale, QVenditeArt.Classe FROM QVenditeArt
    WHERE QVenditeArt.Classe=ClasseSel([forms].[venditeart].[soloclasse],[Classe])
    ti vincola e limita.
    Non è codice che componi da vba dentro ad un form? nel caso non puoi comporlo con concatenazione?
    Lo avrei potuto fare costruendo al volo il recordsource (spesso faccio così), ma in questo caso volevo tenermi una query di esito da usare per altre cose (verifiche, o anche semplicemente per fare una openquery per chi si vuole copiare i dati in Excel).

    muttley005 ha scritto:


    poi una cosa imparata anni fa da Alex, invece del docmd.runsql che di norma si accompagna al setwarning prova
    dbengine(0)(0).execute "tuocodiceSQL",option
    In questo caso non mi interessa ma questa non la sapevo, lo provo sicuramente.
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    paoloholzl ha scritto:


    ...
    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
    Il problema sta tutto qui If IsNull(ClasseFiltro) Then ClasseSel = ClasseRec
    Ho provato a mettreci True, 'like *' niente da fare.
    Esiste qualcosa che ci posso mettere per far venir fuori un record che ha null?
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    Forse non sto capendo bene ma non basta un NZ?
    
    SELECT CodiceGestionale, Classe FROM QVenditeArt
    WHERE Classe=Nz([forms].[venditeart].[soloclasse],[Classe])
    
    se non è così allora puoi rispiegare cosa vuoi che esca in base alla cbo soloclasse?
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    Prova a ragionare con me...!
    Se un campo ha Valore NULL ed effettui un confronto con una Stringa con JOLLY che succede...? (non restituisce nulla ovvio)
    Il problema non è nel Criterio ma nel campo, che se vale NULL non è confrontabile con la stringa, quindi per consentire al filtro di confrontare NULL con stringa devi fare il CASTING del NULL a NULLSTRING.

    Questo si ottiene così
    
    ([NomeCampo] + "") LIKE ....
    Oppure, come dicevo NON metti il criterio.
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    @Alex ha scritto:


    Questo si ottiene così
    
    ([NomeCampo] + "") LIKE ....
    Ok è una cosa legata ai tipi di dato.
    Effettivamente nelle query come confronto si usa IS NULL e non = NULL che sarebbe l'esito della mia funzione nel caso di campo a null.
    Volendo mantenere la struttura come si potrebbe a questo punto correggere query e funzione?
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    paoloholzl ha scritto:


    @Alex ha scritto:


    Questo si ottiene così
    
    ([NomeCampo] + "") LIKE ....
    Ok è una cosa legata ai tipi di dato.
    Effettivamente nelle query come confronto si usa IS NULL e non = NULL che sarebbe l'esito della mia funzione nel caso di campo a null.
    Volendo mantenere la struttura come si potrebbe a questo punto correggere query e funzione?
    Non posso non mettere il criterio, non costruisco la query al volo ma vorrei fosse un 'monoblocco'.
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    muttley005 ha scritto:


    Forse non sto capendo bene ma non basta un NZ?
    
    SELECT CodiceGestionale, Classe FROM QVenditeArt
    WHERE Classe=Nz([forms].[venditeart].[soloclasse],[Classe])
    
    se non è così allora puoi rispiegare cosa vuoi che esca in base alla cbo soloclasse?
    questo l'hai letto?
  • Re: Funzione nella Where di una query per gestire i null [SOLVED]

    paoloholzl ha scritto:


    @Alex ha scritto:


    Questo si ottiene così
    
    ([NomeCampo] + "") LIKE ....
    Ok è una cosa legata ai tipi di dato.
    Effettivamente nelle query come confronto si usa IS NULL e non = NULL che sarebbe l'esito della mia funzione nel caso di campo a null.
    Volendo mantenere la struttura come si potrebbe a questo punto correggere query e funzione?
    Hai 2 Opzioni, fai il CASTING del Campo e ti tigli il problema come già suggerito ed io userei questo, oppure devi concatenare il criterio ...
    
    NomeCampo=NomeCriterio OR NomeCampo Is Null
Devi accedere o registrarti per scrivere nel forum
19 risposte