Newsgroup: it.comp.appl.access
Titolo: query per scadenze compleanni

Buongiorno a tutti, sono un "collega" di it.comp.lang.delphi.
Vengo da voi perche' ho un problema di composizione query che non riesco a
risolvere. ho gia' cercato in google groups su questo ng in alcuni thread
passati, ma ho dei problemi di implementazione query.
Il mio programma ha come base dati access 2000, mi e' stato chiesto uno
scadenziario dei compleanni, cioe' dato un parametro di intervallo, devo
visualizzare tutti i compleanni che si verificheranno da oggi in
quell'intervallo.
Ho realizzato una semplice tabella:
Tabella1: 
Datanascita ! nome
------------+----------
20/12/2001  ! natoil20
25/12/1985  ! natoil25
30/12/1999  ! natoil30
Ho aggiunto questa query, ricavata da un thread di questo ng:
SELECT [Tabella1].[datanascita], [Tabella1].[nome]
FROM Tabella1
WHERE
(nz([Tabella1].[datanascita])-dateserial(year(nz([Tabella1].[datanascita]))+(month([Tabella1].[datanascita])<month(date())),month(date()),day(date())))<intervallo;
il problema accade che quando lancio la query e gli do' come parametro 5, mi
ritorna 
20/12/2001  ! natoil20
30/12/1999  ! natoil30
Non capisco perche' mi tira fuori anche il 30 !!!
C'e' qualche buon'anima che mi sa dire dov'e' l'errore nella query ??
Ciao a tutti
-- 
Morde. 
(
mo...@despammed.com
)


Quindi l'intervallo è definito per mese e giorno, a meno dell'anno, esatto?
select nome from Tabella1 where (format(Datanascita, "mm") &
format(Datanascita, "dd")) between (format([DataInizioIntervallo], "mm") &
format([DataInizioIntervallo], "dd")) and (format([DataFineIntervallo],
"mm") & format([DataFineIntervallo], "dd"))
Controlla virgole e parentesi ma il concetto dovrebbe essere questo

Quindi l'intervallo è definito per mese e giorno, a meno dell'anno, esatto?
Cavolo, purtroppo devo tenere conto dell'anno...la tua query funziona bene ma
solo fino al 31/12 dell'anno corrente.
Vediamo di riassumere il problema: ho un elenco di date di nascita, devo
visualizzare tutti i compleanni almeno 30 giorni prima che accadano.
Detto questo, definisco un intervallo di date "Datainizio" e "Datafine" dove
ho come Datainizio la data di oggi Date(), e Datafine la data di oggi + 30
giorni (Date()+30).
Dovrei percio' visualizzare tutti i compleanni che cadono in questo
intervallo, ma c'e' il problema del cambio di anno (2003->2004)
Come faccio a estrarre tutte le date di questo intervallo a prescindere
dall'anno?
Ti ringrazio di cuore perche' mi stai aiutando a capire, anche se sono
impedito con questo sql e access basic!
-- 
Morde. 
(
mo...@despammed.com
)

 solo fino al 31/12 dell'anno corrente.
Scusa, ho messo giù la query in fretta e non ho pensato ad intervalli che
coprissero più anni. Quindi l'obbiettivoè: capire chi fa il compleanno da
qui a 30 gg.
SELECT Tabella1.nome, Tabella1.datanasc
FROM Tabella1
WHERE
(((DateDiff('d',Date(),DateSerial(IIf(Month([datanasc])-Month(Date())>0,Year
(Date()),Year(Date())+1),Month([datanasc]),Day([datanasc]))))<=30));
Riprova, ciao
Stefano

Riprova, ciao
Ok, finalmente ci sono arrivato, senza il tuo preziosissimo aiuto non so se ci
sarei riuscito. Nel ringraziarti, posto a tutto il ng, per chi dovesse averne
bisogno in futuro, la soluzione. Non e' sicuramente la migliore, e' una delle
tante, ma funziona.
Dati:
Una tabella di esempio Tabella1 con due campi: Tabella1.datanascita,
Tabella1.nome.
Scopo: costruire una query che mostri tutti i compleanni con un anticipo in
giorni, rispetto alla data di sistema, indicato dal parametro [GiorniAvviso].
Soluzione:
Da ogni data di nascita ne ricavo il compleanno (DTCOMPLE) attualizzato
all'anno corrente:  se il compleanno rispetto alla data odierna (di sistema)
e' gia' passato, lo devo "futurizzare" all'anno prossimo (DTFUTURA).
Fatto questo, estraggo tutti quei record compresi tra la data odierna (di
sistema) e il limite di tempo dell'intervallo imposto dai giorni di preavviso
[GiorniAvviso].
DTCOMPLE =
DateSerial(Year(Date()),Month(Tabella1.datanascita),Day(Tabella1.datanascita))
DTFUTURA = 
IIf((DateSerial(Year(Date()),Month(Tabella1.datanascita),Day(Tabella1.datanascita))<Date()),
DateSerial(Year(Date())+1,Month(Tabella1.datanascita),Day(Tabella1.datanascita)),
DateSerial(Year(Date()),Month(Tabella1.datanascita),Day(Tabella1.datanascita)))
Definite queste variabili, non resta che completare l'SQL definitivo:
************************************************************** [SQL inizio]
SELECT Tabella1.datanascita, Tabella1.nome,
DateSerial(Year(Date()),Month(Tabella1.datanascita),Day(Tabella1.datanascita))
AS DTCOMPLE,
IIf((DateSerial(Year(Date()),Month(Tabella1.datanascita),Day(Tabella1.datanascita))<Date()),DateSerial(Year(Date())+1,Month(Tabella1.datanascita),Day(Tabella1.datanascita)),DateSerial(Year(Date()),Month(Tabella1.datanascita),Day(Tabella1.datanascita)))
AS DTFUTURA
FROM Tabella1
WHERE
(((IIf((DateSerial(Year(Date()),Month([Tabella1].[datanascita]),Day([Tabella1].[datanascita]))<Date()),DateSerial(Year(Date())+1,Month([Tabella1].[datanascita]),Day([Tabella1].[datanascita])),DateSerial(Year(Date()),Month([Tabella1].[datanascita]),Day([Tabella1].[datanascita]))))<=(Date()+[GiorniAvviso])
And
(IIf((DateSerial(Year(Date()),Month([Tabella1].[datanascita]),Day([Tabella1].[datanascita]))<Date()),DateSerial(Year(Date())+1,Month([Tabella1].[datanascita]),Day([Tabella1].[datanascita])),DateSerial(Year(Date()),Month([Tabella1].[datanascita]),Day([Tabella1].[datanascita]))))>=Date()));
**************************************************************  [SQL fine]
Ciao a tutti, grazie ancora Stefano. :)
-- 
Morde. 
(
mo...@despammed.com
)


Grazie per i ringraziamenti, ma perché hai aggiunto tutta quella roba nella
query? Mi sembrava giŕ funzonasse cosě...

query? Mi sembrava già funzonasse così...
In realta' se confronti il mese corrente (data di sistema con data di nascita
=) la query non ritorna i record giusti.
neanche se aggiungi il maggior o uguale a 0:
IIf(Month([datanascita])-Month(Date())>= 0
                                      ^^^
a questo punto, ho sviluppato la mia, pero' la query gigantesca che utilizzo
mi manda in palla access dice che e' troppo complessa.... :-(((
-- 
Morde. 
(
mo...@despammed.com
)

                                       ^^^
A me col >= funziona...
SELECT Tabella1.nome, Tabella1.datanasc,
DateDiff('d',Date(),DateSerial(IIf(Month([datanasc])-Month(Date())>=0,Year(D
ate()),Year(Date())+1),Month([datanasc]),Day([datanasc]))) AS Espr1
FROM Tabella1;

A me col >= funziona...
Anche a me! Espr1 contiene la differenza in giorni dalla data di sistema, se
ho ben capito.
Molto probabilmente mi e' sfuggito qualcosa, non capisco... cmq l'errore e'
mio sicuramente. dev'essere lo stress pre natalizio da programmatore stanco..!
Grazie ancora per la disponibilita' :-)
ciao!
-- 
Morde. 
(
mo...@despammed.com
)

 ho ben capito.
Esatto.