Problema query e campi vuoti

di il
7 risposte

Problema query e campi vuoti

Buongiorno a tutti! Sono alle prese con un database per uno studio legale, in questo momento sto costruendo le Query per la ricerca e la visualizzazione dei dati.
Ho fatto una query che mi visualizzi tutti i miei contatti (chiamati da me “soggetti”) [QryVisSogg], i cui campi, i quali hanno origine da una tabella dei soggetti [TblSogg], sono:
- [CognDen] (che sta per: Cognome / Denominazione)
- [Nome] (che sta per: Nome)
- [CFPIva] (che sta per: Cod.Fisc./P.Iva)
Parallelamente ho fatto una tabella per interrogare la query [TblIntSogg], i cui campi sono:
- [CognDen]
- [Nome]
Fin qui, tutto ok! Il problema mi si è presentato quando ho inserito i criteri della Query.
Bisogna preventivamente specificare che, mentre il campo del cognome/denominazione [CognDen] è obbligatorio e quindi sarà sempre compilato, il campo nome potrebbe essere vuoto
Sotto il campo [CognDen] ho inserito l’espressione:
 Like "*" & [TblIntSogg].[CognDen] & "*" 
Sotto il campo [Nome]:
IIf([TblIntSogg]![Nome] Is Null;[TblSogg].[Nome];[TblIntSogg].[Nome])
Tuttavia con questi criteri, se faccio una ricerca per nome o cognome, mi trova correttamente il soggetto interessato, ma se lascio i campi dell’interrogativa vuoti, quindi se eseguo la ricerca senza inserire niente, dovrebbe visualizzarmi tutti i miei contatti inseriti, ma invece, mi restituisce tutti i contatti ad eccezione di quelli in cui non ho indicato il nome dove, conseguentemente tale campo è vuoto.
Invece, io vorrei che se eseguo la query senza impostare alcun riferimento di ricerca, mi visualizzasse tutti i contatti, anche quelli in cui il campo [Nome] è vuoto.
Ho pensato a varie soluzioni:
- Inserire “-“ come simbolo preimpostato nel campo [Nome] della Tabella dei soggetti [TblSogg], così che non sia mai vuoto.
- Unire i campi [CognDen] e [Nome] in un unico campo nella Query.
Ma nessuna delle due soluzioni è fattibile, perché, seppur potrebbe aggirare il problema specifico di questa query, poiché ho molte altre query che dovrei realizzare che presentano lo stesso inconveniente dei campi vuoti, rimanderebbe solo la ricerca di una soluzione definitiva al problema.
Per questo motivo o pensato di cambiare criterio del campo [Nome]:
- Criterio del Campo [Nome]:
Like [TblIntSogg]![Nome] & "*" Or Is Null
- Criterio del Campo [CognDen]:
Like [TblIntSogg].[CognDen] & "*"
Tuttavia tale soluzione non ha dato l’esito sperato, in quanto vengono visualizzati tutti i campi, sia che siano o meno compilati, ma se faccio una ricerca specifica nel campo [Nome] mi restituisce oltre al risultato della mia ricerca, anche i record con i campi vuoti.

Avete qualche consiglio da darmi? Dove sto sbagliando?

7 Risposte

  • Re: Problema query e campi vuoti

    marcios ha scritto:


    Ho pensato a varie soluzioni:- Inserire “-“ come simbolo preimpostato nel campo [Nome] della Tabella dei soggetti [TblSogg], così che non sia mai vuoto.
    Che succede se scrivi in [Nome]:
    Valore predefinito: ""
    ...ossia la stringa di lunghezza zero?

    In alternativa, quando appare la finestra di richiesta Nome, digita l'asterisco (*).
  • Re: Problema query e campi vuoti

    OsvaldoLaviosa ha scritto:


    Che succede se scrivi in [Nome]:
    Valore predefinito: ""
    ...ossia la stringa di lunghezza zero?
    innanzitutto, grazie per la tua risposta.
    Ho provato a mettere come valore predefinito del campo [Nome]
    ""
    ed apparentemente, sembrava funzionare, ma solo se qualcuno non scrive niente nel campo [Nome], se per esempio, dopo avere formato il contatto con questo valore predefinito, scrivo qualcosa sul campo [nome] e poi cancello quello che ho scritto, siamo a punto e accapo! non si visualizza più il record con il campo vuoto!
    forse in questo caso si potrebbe impostare un evento su tale campo, che, nel caso in cui il valore sia Null allora deve essere impostato il valore come "".
    Tuttavia non saprei se tale via è percorribile in quanto, tale problema, mi si riproporrebbe con i campi data/ora, che saranno oggetto di una successiva query che dovrò fare, in cui alcuni campi con tale formato potrebbero non esser compilati,

    OsvaldoLaviosa ha scritto:


    In alternativa, quando appare la finestra di richiesta Nome, digita l'asterisco (*).
    mi sono accorto che provando a metter "*" nel campo [Nome] dell'interrogativa...non mi restituisce nessun risultato!
    alla luce della tua risposta farò altri tentativi, se nel frattempo qualcuno ha qualche altra idea, sono tutt'orecchi.
  • Re: Problema query e campi vuoti

    marcios ha scritto:


    Ho provato a mettere come valore predefinito del campo [Nome] "" ed apparentemente, sembrava funzionare, ma solo se qualcuno non scrive niente nel campo [Nome], se per esempio, dopo avere formato il contatto con questo valore predefinito, scrivo qualcosa sul campo [nome] e poi cancello quello che ho scritto, siamo a punto e accapo
    Allora scrivi nella proprietà:
    Valido se: Is Not Null
    in questo modo sarà impedito a chiunque di lasciare il campo [Nome] vuoto.
  • Re: Problema query e campi vuoti

    OsvaldoLaviosa ha scritto:


    Allora scrivi nella proprietà:
    Valido se: Is Not Null
    in questo modo sarà impedito a chiunque di lasciare il campo [Nome] vuoto.
    purtroppo, anche se questa sembra una soluzione che risolve il problema, a volte non si può compilare il campo perchè ancora si è in attesa del dato da inserire (dato che esula dalla volontà dello scrivente), perciò avrei voluto evitare la soluzione di fare inserire un qualsiasi segno per riempire il campo, ma se non riesco a trovare di meglio, credo che dovrò optare per questa strada che tu mi hai indicato.
    grazie per i tuoi consigli.
  • Re: Problema query e campi vuoti

    Facendo varie prove sono arrivato a quella che sembrerebbe una soluzione.
    ho messo nei due campi sopra nominati questi codici:
    Like "*" & [TblIntSogg].[Nome] & "*"
    Like "*" & [TblIntSogg].[CognDen] & "*"
    questo, come scrivevo sopra, mi impediva di vedere i record con i campi vuoti.
    per questo motivo ho fatto alcuni passaggi:
    - nella Tabella, in corrispondenza del campo Nome ho inserito come valore predefinito
    ""
    in questo modo, se qualcuno si scorda di compilarlo non ci sono problemi
    -nella maschera, in corrispondenza del campo Nome ho inserito una macro, che si attiva prima dell'aggiornamento
    Function MacroXCampoNome()
    
        With CodeContextObject
            If (Eval("[Nome] Is Null")) Then
                .Nome = ""
            End If
        End With
    
    End Function
    tuttavia, con tale metodo, tutto fila liscio se non si tocca mai il campo Nome, ma se per caso si scrive qualcosa in questo campo e poi si cancella quanto scritto in precedenza, è come se la macro non facesse il suo lavoro, infatti, chiudendo la maschera ed eseguendo la query non mi appare tale ultimo risultato.
    facendo la stessa azione, di scrittura e cancellazione del nome, le cose cambiano se precedentemente ho impostato "" sull'opzione "richiesto", nella tabella, in corrispondenza del campo Nome, infatti, in questo caso mi appare il record se eseguo la query.
    a questo punto, io credo di aver risolto il problema, ma vi chiedo un aiuto, perchè non capisco proprio su che basi logiche questo passaggio mi cambia il risultato e mi fa vedere il record! non me la sento di usare quella che sembra una soluzione se non ne comprendo la ragione di fondo.
    chiedo aiuto ai più esperti di me!
  • Re: Problema query e campi vuoti

    Ma non fai prima se invece di complicare i CRITERI di una Query, agisci sulla proprietà FILTER di Maschera dopo aver VALIDATO i campi oggetto di criterio...?
    
    Dim strWH As String
    Dim strCONC As String
    StrCONC=" AND "  ' Quì eventualmente puoi valutare la Questione AND/OR
    If Len(Me!txt1.Value & vbNullstring)>0 Then strWH=strWH & "Campo1 LIKE '*" & Me!txt2.Value & "*'" & strCONC
    If Len(Me!txt2.Value & vbNullstring)>0 Then strWH=strWH & "Campo2 LIKE '*" & Me!txt2.Value & "*'" & strCONC
    If Len(Me!txt3.Value & vbNullstring)>0 Then strWH=strWH & "Campo3 LIKE'*" & Me!txt3.Value & "*'" & strCONC
    If Len(Me!txt4.Value & vbNullstring)>0 Then strWH=strWH & "Campo4 LIKE'*" & Me!txt4.Value & "*'" & strCONC
    If Len(strWH)>0 Then 
        strWH=Mid$(strWH,1,Len(strWH)-Len(StrCONC)
        Me.FilterOn=False
        Me.Filter=strWH
        Me.FilterOn=True
    Else
        Me.FilterOn=False
    End If
    Ovviamente aggiusta i NomiCampi e il Tipo per la tua esigenza...
  • Re: Problema query e campi vuoti

    @Alex ha scritto:


    Ma non fai prima se invece di complicare i CRITERI di una Query, agisci sulla proprietà FILTER di Maschera dopo aver VALIDATO i campi oggetto di criterio...?
    
    Dim strWH As String
    Dim strCONC As String
    StrCONC=" AND "  ' Quì eventualmente puoi valutare la Questione AND/OR
    If Len(Me!txt1.Value & vbNullstring)>0 Then strWH=strWH & "Campo1 LIKE '*" & Me!txt2.Value & "*'" & strCONC
    If Len(Me!txt2.Value & vbNullstring)>0 Then strWH=strWH & "Campo2 LIKE '*" & Me!txt2.Value & "*'" & strCONC
    If Len(Me!txt3.Value & vbNullstring)>0 Then strWH=strWH & "Campo3 LIKE'*" & Me!txt3.Value & "*'" & strCONC
    If Len(Me!txt4.Value & vbNullstring)>0 Then strWH=strWH & "Campo4 LIKE'*" & Me!txt4.Value & "*'" & strCONC
    If Len(strWH)>0 Then 
        strWH=Mid$(strWH,1,Len(strWH)-Len(StrCONC)
        Me.FilterOn=False
        Me.Filter=strWH
        Me.FilterOn=True
    Else
        Me.FilterOn=False
    End If
    Ovviamente aggiusta i NomiCampi e il Tipo per la tua esigenza...
    Grazie Alex per il tuo suggerimento.
    a questa soluzione non ci sono arrivato, perchè le mie conoscenze di Access non sono ad un livello tale da permettermi di fare il tuo ragionamento...figurarsi creare il codice che hai scritto!
    tuttavia, grazie al tuo aiuto, posso avere un codice di riferimento da studiare.
Devi accedere o registrarti per scrivere nel forum
7 risposte