Newsgroup: it.comp.appl.access
Titolo: Baco di query su tabelle che richiamano un valore  di un campo = Null

Ho scoperto una cosa strana se inserisco i criteri direttamente in una query parametrica che richiama i campi da una tabella.
Mettiamo di avere una tabella:
Nome  Cognome
Paolo
Marco Rossi
Mettiamo di inserire un criterio nel campo Cognome di una query richiamata da un form:
Like Nz([forms]![RICERCA]![Cognome],"*")
La query elencherà erroneamente solo un record corrispondente a 
Marco Rossi
perchè Paolo non è stato inserito il dato cognome.
E' un problema che ho io sul mio computer o è un baco mostruoso  di Access?
O c'è un modo per ovviare alla mancata elencazione del record?
Grazie
-- 
km5000 
------------------------------------------------------------------------
View this thread: 
http://www.itsistemi.net/viewtopic-776390.html
Inviato via 
http://www.itsistemi.net

 ha scritto nel messaggio 
news:km5000...@no-mx.itsistemi.net...


 Access?
Né l'uno né l'altro!
Tu vorresti che quando il campo [Cognome] della scheda
è Null la query ti ritornasse TUTTI i record come se il "Criteria"
di cognome non contenesse alcuna condizione.
E per fare ciò poni Like Nz(..., "*").
Ma il WildChar "*" tiene luogo di tutti i possibili caratteri ma
non di Null!
Così invece funziona:
[Forms]![RICERCA]![Cognome] Or [Forms]![RICERCA]![Cognome] Is Null
Ciao
Bruno 

Ora provo a cercare
grazie per l'indicazione


Direi proprio che ci siamo!!! ALMENO PER UN CAMPO PARAMETRICO ...
Grazie Bruno
Se perň la condizione che mi hia postato dovessi metterla sull'openReport di un pulsante che mi apre il report, la seguente condizione basata su un controllo di una casella a scelta multipla, come diventerebbe?
DoCmd.OpenReport stDocName, acPreview, , "[codice] In (" & Me!codice& ")"
Sto applicando 10 varianti alla condizione che mi hai postato a non riesco a ottenere nulla.
Inoltre se ho decine di campi parametrici da inserire come faccio?
ho provato ad inserire la seguente condizione per due campi:
WHERE ([Forms]![RICERCA]![Cognome] Or ([Forms]![RICERCA]![Cognome]) Is Null) AND ([Forms]![RICERCA]![Nome] Or ([Forms]![RICERCA]![Nome]) Is Null) 
Ma qualunque risultato della ricerca che faccio mi elenca sempre TUTTIi record.
Se per esempio cerco un cognome la query oltre al cognome che cerco mi elenca tutti i campi in cui nome Is Null o ha altri valori.
Invece devo ottenere solo un record col  il cognome cercato, altrimenti sono punto e accapo...
Tieni conto che ho circa venti parametri da cercare ma se 19 rimangono vuoti non vuol dire che il recordset mi deve elencare tutti i campi delle tab in cui il parqametro corrispondente della ricerca č Null ho ha altri valori ...


 ho provato ad inserire la seguente condizione per due campi:
La cosa allora si complica.
Se ho ben capito, avendo 20 campi in una scheda tu vorresti
il WHERE in modo da comprendere con clausola AND tutti
i campi NON BLANK di quei 20.
Se poi i 20 campi possono essere di tipo Text alcuni, Number altri,
Date altri ancora e poi magari anche Boolean allora il divertimento
è assicurato.
Premesso che le cose andrebbero dette subito come stanno
fin dall'inizio, ché le varianti in corso d'opera fanno solo
incazzare - almeno il sottoscritto - prova a confermarmi
quanto sopra.
Bruno

Ti prego, non t'incazzare...
Quando io faccio una cosa, faccio un prototipo che deve andare bene (in questo caso) per 1 parametro come per 1000 parametri.
Normalmente, usando VBScript per internet, non cerco scorciatoie e scrivo sql parametriche simili alla seguente per fare ricerche in un  Db.
Es:
if Not IsNull(TxtSearch) then Call FNCSearch(TxtSearch, "Nome del fielf", Parametro, strSQL, " Like '", "'")
Function FNCSearch(VarSearch, Field, Parametro, strSQL, CondStart, CondEnd)
ArrSearch = VarSearch
if InStr(ArrSearch,",")> 0 then ArrSearch = Split(trim(ArrSearch),",") else Dim ArrSearch : Redim ArrSearch(0) : ArrSearch(0)= VarSearch
for k = 0 to ubound(ArrSearch)
if k=0 and Parametro<>1 then boleana=" WHERE (" else if k=0 and Parametro=1 then boleana=" AND (" else boleana=" OR "
strSQL = strSQL & boleana & Field & CondStart & trim(ArrSearch(k)) & CondEnd
next
strSQL = strSQL & ")" 
Parametro = 1
End Function
Non sarà un gran chè ma funziona e posso adattare la funzione in mille modi diversi.
Detto questo credevo che le sql parametriche di Access fossero una cosetta facile facile. Invece alcune cose che nella mia ignoranza dovrebbero essere la norma  (come l'elenco di tutti i record se non inserisco parametri nel campo di ricerca) sono un po più complicate. Voglio solo capire cosa devo fare per non fare una cosa che non funziona.
Sto infatti provando ciò che hai suggerito ma con tanti parametri
(PS: Le varianti in corso d'opera almeno per me,purtroppo,  sono la norma: e  soprattutto non sono retribuite)


 e  soprattutto non sono retribuite)
Lo so, rientra sempre nei patti,  "tanto i dati ci sono già tutti, no?"
Ciao
Bruno

Ti posto ilc odice che uso all'apertura del report per costruire la sql.
Mi rendo conto di non scrivere un codice elegante e ottimizzato parò il Db esistente  purtroppo è fatto male.
Per questo ogni singolo campo della form deve richiamare la funzione di costruzione della sql in modo particolare.
'''''''''''''DATI ANAGRAFICI'''''''''''''
If Not IsNull(Me!cognome) Then Call FNCSearch(Me!cognome, "[cognome]", Parametro, strSQL, " Like '*", "*'")
If Not IsNull(Me!nome) Then Call FNCSearch(Me!nome, "[nome]", Parametro, strSQL, " Like '*", "*'")
'''''''''''''DATI ISCRIZIONE'''''''''''''
If Not IsNull(Me!codice) Then Call FNCSearch(Me!codice, "[codice]", Parametro, strSQL, " In (", ")")
If Not IsNull(Me!tipo_iscrizione) Then Call FNCSearch(Me!tipo_iscrizione, "[tipo_iscrizione]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!data1iscr) Then Call FNCSearch(Me!data1iscr, "[data1iscr]", Parametro, strSQL, " = #", "#")
'------------------------------
If Not IsNull(Me!anno1iscr) Then Call FNCSearch(Me!anno1iscr, "[anno1iscr]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!numero) Then Call FNCSearch(Me!numero, "[numero]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!data_pagamento) Then Call FNCSearch(Me!data_pagamento, "[data_pagamento]", Parametro, strSQL, " >= #", "#")
If Not IsNull(Me!data_pagamento1) Then Call FNCSearch(Me!data_pagamento1, "[data_pagamento]", Parametro, strSQL, " <= #", "#")
If Not IsNull(Me!num_ricevuta) Then Call FNCSearch(Me!num_ricevuta, "[num_ricevuta]", Parametro, strSQL, " >= ", "")
If Not IsNull(Me!num_ricevuta1) Then Call FNCSearch(Me!num_ricevuta1, "[num_ricevuta]", Parametro, strSQL, " <= ", "")
If Not IsNull(Me!codice_pagamento) Then Call FNCSearch(Me!codice_pagamento, "[codice_pagamento]", Parametro, strSQL, " = '", "'")
'------------------------------
If Not IsNull(Me!approvato) Then Call FNCSearch(Me!approvato, "[approvato]", Parametro, strSQL, " = #", "#")
If Not IsNull(Me!data_revoca) Then Call FNCSearch(Me!data_revoca, "[data_revoca]", Parametro, strSQL, " = #", "#")
If Not IsNull(Me!quota) Then Call FNCSearch(Me!quota, "[quota]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!stato_abbonamento) Then Call FNCSearch(Me!stato_abbonamento, "[stato_abbonamento]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!note) Then Call FNCSearch(Me!note, "[note]", Parametro, strSQL, " Like '*", "*'")
If Not IsNull(Me!privacyAmcli) Then Call FNCSearch(Me!privacyAmcli, "[privacyAmcli]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!privacyInd) Then Call FNCSearch(Me!privacyInd, "[privacyInd]", Parametro, strSQL, " = '", "'")
'''''''''''''ALTRI DATI '''''''''''''
If Not IsNull(Me!regione) Or Me!regione <> "" Then Call FNCSearch(Me!regione, "[regione1DR],[regione2DR]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!data_nomina) Or Me!data_nomina <> "" Then Call FNCSearch(Me!data_nomina, "[data_nominaDR],[data_elezioniCD],[data_elezioniRC],[data_nomina1CO],[data_nomina2CO],[data_nomina3CO],[data_nomina4CO],[data_nomina5CO],[data_nomina1GL],[data_nomina2GL],[data_nomina3GL],[data_nomina4GL],[data_nomina5GL]", Parametro, strSQL, " = #", "#")
If Not IsNull(Me!data_scad) Or Me!data_scad <> "" Then Call FNCSearch(Me!data_scad, "[data_scadDR],[data_scadCD],[data_scadRC],[data_scad1CO],[data_scad2CO],[data_scad3CO],[data_scad4CO],[data_scad5CO],[data_scad1GL],[data_scad2GL],[data_scad3GL],[data_scad4GL],[data_scad5GL]", Parametro, strSQL, " = #", "#")
If Not IsNull(Me!comitato) Or Me!comitato <> "" Then Call FNCSearch(Me!comitato, "[gruppi_lavoro1],[gruppi_lavoro2],[gruppi_lavoro3],[gruppi_lavoro4],[gruppi_lavoro5],[tipoind1],[comitato1],[comitato2],[comitato3],[comitato4],[comitato5]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!CARICA) Or Me!CARICA <> "" Then Call FNCSearch(Me!CARICA, "[carica_internaDR],[carica_internaCD],[carica_internaRC],[carica_interna1CO],[carica_interna2CO],[carica_interna3CO],[carica_interna4CO],[carica_interna5CO],[carica_interna1GL],[carica_interna2GL],[carica_interna3GL],[carica_interna4GL],[carica_interna5GL]", Parametro, strSQL, " = '", "'")
'''''''''''''SITUAZIONE PROFESSIONALE'''''''''''''
If Not IsNull(Me!titstudio) Then Call FNCSearch(Me!titstudio, "[titstudio]", Parametro, strSQL, " In (", ")")
If Not IsNull(Me!profess) Then Call FNCSearch(Me!profess, "[profess]", Parametro, strSQL, " In (", ")")
If Not IsNull(Me!strutapp) Then Call FNCSearch(Me!strutapp, "[strutapp]", Parametro, strSQL, " Like '*", "*'")
If Not IsNull(Me!attprev) Then Call FNCSearch(Me!attprev, "[attprev]", Parametro, strSQL, " Like '*", "*'")
If Not IsNull(Me!repartoapp) Then Call FNCSearch(Me!repartoapp, "[repartoapp]", Parametro, strSQL, " Like '*", "*'")
If Not IsNull(Me!setinteres) Then Call FNCSearch(Me!setinteres, "[setinteres]", Parametro, strSQL, " Like '*", "*'")
If Not IsNull(Me!spec_micr) Then Call FNCSearch(Me!spec_micr, "[spec_micr]", Parametro, strSQL, " = '", "'")
If Not IsNull(Me!spec) Then Call FNCSearch(Me!spec, "[spec]", Parametro, strSQL, " Like '*", "*'")
Function FNCSearch(ArrSearch, Field, Parametro, strSQL, CondStart, CondEnd)
If Len(Trim(ArrSearch)) = 10 And InStr(ArrSearch, "/") Then ArrSearch = Format$(ArrSearch, "mm/dd/yyyy")
ArrSearch = Split(Trim(ArrSearch), ",")
Field = Split(Trim(Field), ",")
For k = 0 To UBound(Field)
For i = 0 To UBound(ArrSearch)
If k = 0 And i = 0 And Parametro <> 1 Then boleana = " (" Else If k = 0 And i = 0 And Parametro = 1 Then boleana = " AND (" Else boleana = " OR "
strSQL = strSQL & boleana & Field(k) & CondStart & Trim(ArrSearch(i)) & CondEnd
Next
Next
strSQL = strSQL & ")"
Parametro = 1
Forms!RICERCA!Response = strSQL
End Function


 costruzione della sql in modo particolare.
[...]
Da quel che mi è parso di capire, data una scheda con in essa
riportati tutti i possibili campi di ricerca di una tabella, per ognuno
determini, in base al Data Type e al fatto che sia compilato o
meno, il segmento di istruzione SQL, e così via per tutti i campi.
Non credo ci sia diverso criterio da potersi seguire, semmai
esisteranno diverse modalità di realizzazione (leggi: di costruzione
della stringa SQL).
Io ho seguito appunto una diversa modalità che forse, ma non è
detto, può più agevolmente applicarsi alla generalità dei casi.
1 - Ho inserito nella scheda tutti i campi della tabella sui quali
voglio avere la possibilità di ricerca: quei campi che possono
essere indagati con Between sono stati inseriti due volte.
Per la denominazione di detti campi ho seguito il criterio:
F1, F2, F3, F3_, F4, F4_: F5, F6, etc.
Dove F3, F3_ e F4, F4_ sono i campi che andranno indagati
con between.
2 - il codice che chiama la funzione che restituirà la stringa SQL
è così formato (esemplificativamente):
-------------------------------------
ReDim MFA_(1 To 5, 1 To 3)
MFA_(1, 1) = "[Nome]":             MFA_(1, 2) = 1:     MFA_(1, 3) = True
MFA_(2, 1) = "[Cognome]":        MFA_(2, 2) = 1:     MFA_(2, 3) = False
MFA_(3, 1) = "[Età]":                  MFA_(3, 2) = 2:     MFA_(3, 3) = True
MFA_(4, 1) = "[DataNascita]":    MFA_(4, 2) = 3:     MFA_(4, 3) = False
MFA_(5, 1) = "[Coniugato]":       MFA_(5, 2) = 4:     MFA_(5, 3) = True
MsgBox MFA2("And")
------------------------------------
dove:
MFA_() è definito Public in Specifications di un Module
(così lo vedono tutti)
MFA_(n, 1) porta i nomi dei campi della tabella
MFA_(n, 2) porta il corrispondente Data Type:
                 (1 = String
                  2 = Number
                  3 = Date
                  4 = Boolean)
MFA_(n, 3) è posto a True o False a seconda che per il
                    campo si debba applicare o meno l'operatore Between.
La funzione, che ho chiamato MFA2() porta un parametro
(Optional, Default = "And") che può essere anche "XOR", "OR", etc.
Ciao
Bruno

MFA_(n&#8218; 1) porta i nomi dei campi della tabella
MFA_(n&#8218; 2) porta il corrispondente Data Type
anche la mia idea è quella di far corrispondere i field ai vari  DataType(anche se in modo un po sporco). 
(Optional, Default = "And") che può essere anche "XOR", "OR", etc.
Per gli operatori onestamente non permetto la variabilità proprio per la non perfetta coincidenza tra campi e tipi di dati
appena ho tempo approfondisco le tue indicazioni..
grazie per i suggerimenti
