Newsgroup: it.comp.appl.access
Titolo: Funzione Nz con criterio query che fa cilecca...

Ciao!
Data la query seguente:
SELECT tblDonatori.IdDonatore, tblDonatori.Cognome, tblDonatori.Nome,
tblDonatori.DataNascita, tblDonatori.SedeIscrizione,
tblDonatori.Residenza, tblDonatori.Gruppo,
Format(Max(tblDonazioni.DataDonazione),"dddd dd mmm yyyy") AS
MaxDiDataDonazione, Count((Date()-[DataDonazione])) AS Diff
FROM tblDonatori LEFT JOIN tblDonazioni ON tblDonatori.IdDonatore =
tblDonazioni.IdDonatore
GROUP BY tblDonatori.IdDonatore, tblDonatori.Cognome,
tblDonatori.Nome, tblDonatori.DataNascita, tblDonatori.SedeIscrizione,
tblDonatori.Residenza, tblDonatori.Gruppo, tblDonatori.Sesso
HAVING (((tblDonatori.Cognome) Like Nz("*" &
[forms]![frmCercaDonatori]![txtCerca] & "*","*")) AND
((tblDonatori.SedeIscrizione) Like Nz("*" &
[forms]![frmCercaDonatori]![txtSedeIscrizione] & "*","*")) AND
((tblDonatori.Residenza) Like Nz("*" &
[forms]![frmCercaDonatori]![txtResidenza] & "*","*")) AND
((tblDonatori.Gruppo) Like
Nz([forms]![frmCercaDonatori]![txtGruppo],"*")) AND
((Count((Date()-[DataDonazione]))) Like
Nz([forms]![frmCercaDonatori]![txtNumDonazioni],"*")) AND
((tblDonatori.Sesso) Like
Nz([forms]![frmCercaDonatori]![txtSesso],"*")) AND
((Date()-Max([tblDonazioni].[DataDonazione]))>=[forms]![frmCercaDonatori]![txtNonDonaDa]))
ORDER BY tblDonatori.Cognome, tblDonatori.Nome;
ho una maschera a partire dalla quale, impostando alcuni criteri di
ricerca nelle opportune textbox, riesco a cercare i Donatori di sangue
che rispettano certe caratteristiche.
Andava tutto alla perfezione fino a quando ho introdotto un ulteriore
parametro di ricerca che serve per vedere da quanto tempo non dona un
donatore.
Nella query il criterio che non funziona č:
...((Date()-Max([tblDonazioni].[DataDonazione]))>=[forms]![frmCercaDonatori]![txtNonDonaDa]))...
non solo non valuta bene quando un valore č effettivamente maggiore o
uguale a un altro, ma addirittura se provo ad aggiungere la funzione
Nz per evitare il solito problema dei valori Null:
Like Nz(((Date()-Max([tblDonazioni].[DataDonazione]))>=[forms]![frmCercaDonatori]![txtNonDonaDa]));"*")
non funziona proprio niente! O meglio, risolvo il problema dei valori
Null (quando lascio vuota la sua textbox) ma non mi da' i record che
effettivamente rispettano i criteri impostati!
Mi sapete dire dove sbaglio???
grazie!
luca

 luca

 > luca
Capisco il non aver voglia di leggere tutto quel popo di codice sql...
 :)
comunque sia Max([tblDonazioni].[DataDonazione]) fa esattamente quello
che deve fare, cioè mi da il valore massimo di tutte le date di
donazione associate ad ogni donatore (il quale viene raggruppato di
volta in volta). E quindi direi che funziona perfettamente.
Il problema rimane il fatto che non riesco a trovare un sistema per
aggiungere un altro parametro alla query parametrica che ho scritto.
Il parametro che voglio aggiungere riguarda la possibilità di vedere
da quanto tempo un donatore non dona. Quindi ho pensato bene di
introdurre un campo calcolato del tipo
x:Date()-Max([tblDonazioni].[DataDonazione]) in modo tale che ho il
numero di giorni trascorsi dall'ultima donazione.
Poi però mi occorre un criterio che mi vada a selezionare solo quei
periodi di tempo che sono magiori o uguali di un numero che imposto su
una txtbox!
E quando la txtbox è vuota lo consideri come "*".
E' questo che non riesco a fare...
spero di essere stato più chiaro...
grazie!  :))
luca

 luca


...

Grazie per la pazienza e l'interesse!!!
Avevo già risolto il problema con una piccola acrobazia logica,
ma la tua soluzione è sicuramente più elegante!
Adotterò la tua!
grazie ancora! :))
luca

...

Sorge un altro problema in seguito all'ultima modifica apportata alla
query:
come avrai capito ci sono due tabelle, tblDonatori e tblDonazioni su
cui la query lavora. Esse sono in relazione uno-a-molti (con int.
referenziale e tipo join #2).
Da quando ho aggiunto la possibilità di cercare "quelli che
NonDonanoDa", non riesco più a vedere i donatori che non hanno mai
donato; ovvero tutti quei record (che prima vedevo grazie al join 2)
della tabella tblDonatori che NON hanno un corrispettivo in
tblDonazioni!
Come mai???
Ti riallego la query con la speranza che vorrai dargli una
ripassatina...
SELECT tblDonatori.IdDonatore, tblDonatori.Cognome, tblDonatori.Nome,
tblDonatori.DataNascita, tblDonatori.SedeIscrizione,
tblDonatori.Residenza, tblDonatori.Gruppo,
Max(tblDonazioni.DataDonazione) AS MaxDiDataDonazione,
Count(tblDonazioni.IdDonazione) AS Diff
FROM tblDonatori LEFT JOIN tblDonazioni ON tblDonatori.IdDonatore =
tblDonazioni.IdDonatore
GROUP BY tblDonatori.IdDonatore, tblDonatori.Cognome,
tblDonatori.Nome, tblDonatori.DataNascita, tblDonatori.SedeIscrizione,
tblDonatori.Residenza, tblDonatori.Gruppo, tblDonatori.Sesso
HAVING (((tblDonatori.Cognome) Like Nz("*" &
[forms]![frmCercaDonatori]![txtCerca] & "*","*")) AND
((tblDonatori.SedeIscrizione) Like Nz("*" &
[forms]![frmCercaDonatori]![txtSedeIscrizione] & "*","*")) AND
((tblDonatori.Residenza) Like Nz("*" &
[forms]![frmCercaDonatori]![txtResidenza] & "*","*")) AND
((tblDonatori.Gruppo) Like
Nz([forms]![frmCercaDonatori]![txtGruppo],"*")) AND
((Count(tblDonazioni.IdDonazione)) Like
Nz([forms]![frmCercaDonatori]![txtNumDonazioni],"*")) AND
((tblDonatori.Sesso) Like
Nz([forms]![frmCercaDonatori]![txtSesso],"*")) AND
((Date()-Max([tblDonazioni].[DataDonazione]))>=Nz([forms]![frmCercaDonatori]![txtNonDonaDa],"*")))
ORDER BY tblDonatori.Cognome, tblDonatori.Nome;
Se tolgo 
((Date()-Max([tblDonazioni].[DataDonazione]))>=Nz([forms]![frmCercaDonatori]![txtNonDonaDa],"*"))
tutto funziona (cioè vedo tutti i record) ma non posso cercare con
questo criterio importante! (txtNonDonaDa).
grazie per la pazienza!  :))
luca

 ha scritto nel messaggio
news:d95188c8.05032...@posting.google.com...

Per prima cosa non ti avevo suggerito di scrivere:
Nz([forms]![frmCercaDonatori]![txtNonDonaDa],"*")
ma di scrivere:
Nz([forms]![frmCercaDonatori]![txtNonDonaDa], 0)
D'altra parte il carattere jolly "*" ha significato SOLAMENTE se l'operatore
è Like, ma visto che nel tuo caso l'operatore è >= non ha assolutamente
senso usare tale carattere jolly.
Poi se non esistono record nella tblDonazioni per un certo donatore,
l'espressione:
Max([tblDonazioni].[DataDonazione])
ti restituirà Null, ed anche l'espressione:
((Date()-Max([tblDonazioni].[DataDonazione])
ti restituirà Null e quindi la condizione di quel criterio di selezione non
si verificherà (sicuramente Null non sarà mai >= di un valore essendo esso
un NON valore) con la conseguenza che il record in questione non verrà
selezionato.
Prova a scrivere così:
....
((Date() - Nz(Max([tblDonazioni].[DataDonazione]),
0))>=Nz([forms]![frmCercaDonatori]![txtNonDonaDa], 0)))
....
Io cercherò di essere paziente a condizione che tu cominci a studiare un po'
Access: ad esempio comincia con leggere cosa c'è scritto sull'help circa la
funzione Nz e l'operatore Like e i relativi caratteri jolly; insomma sono
contento di aiutarti ad imparare Access, ma se non lo studi sarà molto
improbabile che ciò accada e allora la pazienza potrebbe finire. ;-)


...

Funzia!
La tua pazienza è inversamente proporzionale alla mia voglia di
studiare access più di quanto abbia già fatto finora...
E' che mi sono accorto che si impara molto di più cercando di
risolvere problemi reali che leggendo manuali o guide.
Comunque ce la metterò tutta!
Grazie ancora!  ;-)
luca

 luca
-- 
