Newsgroup: it.comp.appl.access
Titolo: query e stampe periodiche

salve a tutti di questo NG...
mi servo di un Db anagrafico cone relazione 1>molti
per stampare ogni 3 mesi alle stesse persone dei prodotti, quindi ho una
qry_Scad ed una qryUpDate che ad ogni stampa periodica mi azzera la data
alla data di stampa e mi rende disponibile la stampa dopo 3 mesi,
fin qui spero di essermi spiegato...
inoltre esse mi calcolano in base alla data odierna immessa la data di
stampa dopo 80 giorni trascorsi, ebbene a me serve calcolarla dopo i 90
giorni...(ho provato a cambiare [MaxDidata_erogazione],80)) AS Scad) ma
non
funziona...
meglio ancora,volendo essere + pignoli mi servirebbero le stampe
periodiche
di tutto il mese dopo il primo dei 3 mesi....:-((
mi spiego meglio facendo un esempio:
anche se sul pc ho i soggetti inseriti supponiamo dal 1 settembre 2007
al 30
settembre 2007 devo poter stampare a Dicembre tutto il range di
settembre...
quindi facendo un calcolo, se non sbaglio >90 e <120 giusto ??
il problema però sarebbe di mesi che finiscono con 30 e quelli con 31...
come fare ???
ecco i rispettivi codici delle query
qry_Scad
SELECT Anagrafe.ID_Anagrafe, Anagrafe.TxTCognome, Anagrafe.TxTNome,
Anagrafe.TxTCodiceFiscale, Anagrafe.Indirizzo, Tabprodotti.ID,
Tabprodotti.Prodotto, Tabprodotti.CodASL, Tabprodotti.CodEsenzione,
Tabprodotti.data_scadenza, Tabprodotti.quantità, Max
(Tabprodotti.data_erogazione) AS MaxDidata_erogazione, Min(DateDiff("d",
[data_erogazione],Date())) AS gg, IIf(Min(DateDiff("d",
[data_erogazione],Date()))>60 And
Min(DateDiff("d",[data_erogazione],Date
()))<91,3,0) AS gg6090, (DateAdd("d",[MaxDidata_erogazione],80)) AS Scad
FROM Anagrafe INNER JOIN Tabprodotti ON Anagrafe.ID_Anagrafe =
Tabprodotti.IdAnagrafica
GROUP BY Anagrafe.ID_Anagrafe, Anagrafe.TxTCognome, Anagrafe.TxTNome,
Anagrafe.TxTCodiceFiscale, Anagrafe.Indirizzo, Tabprodotti.ID,
Tabprodotti.Prodotto, Tabprodotti.CodASL, Tabprodotti.CodEsenzione,
Tabprodotti.data_scadenza, Tabprodotti.quantità
ORDER BY Anagrafe.ID_Anagrafe, Max(Tabprodotti.data_erogazione);
-----------------------------------------------------------------------
qryUpDate
SELECT qry_Scad.ID_Anagrafe, qry_Scad.ID, qry_Scad.Scad
FROM qry_Scad
WHERE (((qry_Scad.gg6090)=3));
-----------------------------------------------------------------------
ringrazio anticipatamente per l'aiuto
GLuigi

 GLuigi
Ciao.
-- 
Sergio MAZZA 

 Sergio MAZZA
--------------------
ciao Sergio... grazie per avermi risposto...
premetto che il Db non l'ho fatto io e d'altronde sono poco pratico di 
Access....
quindi ho capito ben poco di quello che hai scritto... :-((
mi puoi fare un esempio "pratico" sull'Sql che ho mandato ???
grazie 

 grazie
Select ...,year([data_erogazione]) as Anno, month([data_erogazione]) as 
mese,...
From ...
Where anno=2007 and (mese between 1 and 5)
Ciao.
-- 
Sergio MAZZA 

 Where anno=2007 and (mese between 1 and 5)
---------------------->
Argghhh, xchè non ho studiato Access ;-((
ho tentato varie volte di modificare la query ma mi dà sempre un errore 
diverso...
evidentemente non riesco a "collocare" nel punto giusto il tuo codice...
potresti aggiungerlo tu nella query....??
ps-- se non fattibile la soluzione potrei anche ovviare a stampe >90 e < 
di 120
ma come modificare la query... ho anche tentato in questo senso ma non 
funziona...
Ciao a grazie per l'aiuto
SELECT Anagrafe.ID_Anagrafe, Anagrafe.TxTCognome, Anagrafe.TxTNome, 
Anagrafe.TxTCodiceFiscale, Anagrafe.Indirizzo, Tabprodotti.ID, 
Tabprodotti.Prodotto, Tabprodotti.CodASL, Tabprodotti.CodEsenzione, 
Tabprodotti.data_scadenza, Tabprodotti.quantità, 
Max(Tabprodotti.data_erogazione) AS MaxDidata_erogazione, 
Min(DateDiff("d",[data_erogazione],Date())) AS gg, 
IIf(Min(DateDiff("d",[data_erogazione],Date()))>60 And 
Min(DateDiff("d",[data_erogazione],Date()))<91,3,0) AS gg6090, 


 Ciao a grazie per l'aiuto
In visualizzazione struttura della query, crei due campi calcolati; ti 
posizioni in una colonna vuota, nella riga "Campo", inserisci il nome 
(scelto da te, senza spazi o caratteri strani) del campo calcolato seguito 
da carattere ":" e  poi l'espressione che ritorna il valore.
Es.
Anno: year([data_erogazione])
(in un'altra colonna)
Mese: month([data_erogazione])
Per inserire i criteri di selezione ti sposti nella riga "Criteri" (stessa 
colonna "Anno") e inserisci: 2007; nella colonna "Mese" (stessa riga 
"Criteri") inserisci: Between 1 and 5.
1 and 5 significa da Gennaio a Maggio...
Ciao.
-- 
Sergio MAZZA 

 1 and 5 significa da Gennaio a Maggio...
-----------
ciao sergio... mi da errore, mi dice "impossibile eseguire una query che 
non include l'espressione "Year([data_erogazione])" specificata come 
parte di una funzione di aggregazione.
ho provato a cambiare Year in Anno e mi dice:
funzione 'Anno' non definita nell'espressione...
ecco il codice...
SELECT Anagrafe.ID_Anagrafe, Anagrafe.TxTCognome, Anagrafe.TxTNome, 
Anagrafe.TxTCodiceFiscale, Anagrafe.Indirizzo, Tabprodotti.ID, 
Tabprodotti.Prodotto, Tabprodotti.CodASL, Tabprodotti.CodEsenzione, 
Tabprodotti.data_scadenza, Tabprodotti.quantità, 
Max(Tabprodotti.data_erogazione) AS MaxDidata_erogazione, 
Min(DateDiff("d",[data_erogazione],Date())) AS gg, 
IIf(Min(DateDiff("d",[data_erogazione],Date()))>60 And 
Min(DateDiff("d",[data_erogazione],Date()))<91,3,0) AS gg6090, 
(DateAdd("d",[MaxDidata_erogazione],80)) AS Scad, 
Year([data_erogazione]) AS Anno, Month([data_erogazione]) AS Mese
FROM Anagrafe INNER JOIN Tabprodotti ON Anagrafe.ID_Anagrafe = 
Tabprodotti.IdAnagrafica
GROUP BY Anagrafe.ID_Anagrafe, Anagrafe.TxTCognome, Anagrafe.TxTNome, 
Anagrafe.TxTCodiceFiscale, Anagrafe.Indirizzo, Tabprodotti.ID, 
Tabprodotti.Prodotto, Tabprodotti.CodASL, Tabprodotti.CodEsenzione, 
Tabprodotti.data_scadenza, Tabprodotti.quantità
HAVING (((Year([data_erogazione]))=2007) AND ((Month([data_erogazione])) 
Between 1 And 5))
ORDER BY Anagrafe.ID_Anagrafe, Max(Tabprodotti.data_erogazione);
grazie Sergio

 grazie Sergio
Ciao.
-- 
Sergio MAZZA 

 selezioni la voce "Dove"...
---------------
purtroppo non posso inserire i campi nuovi...ed inserendo "Dove"
non mi fa vedere i campi...ed inoltre da una FrmScadenze che ho
modificando la query non visulalizzo + i vari filtraggi eseguiti dalla
query....;.((
sono finalmente riuscito a trovare la routine dove mi da la data di 
scadenza dopo 80 giorni
dall'inserimento eccola:
=DMax("[data_erogazione]";"tabprodotti";"idanagrafica=" & 
nz([idanagrafica];0))+90
però il mio problema sono le date... spiego se io inserisco un soggetto 
il 01/11/2007
la data di stampa me la da il 30/11 ed anche se inserisco 02/11/2007 me 
la da il 31/11...
mentre io vorrei che inserendo tutti quelli di Novembre poi possa 
stamparli a febbraio ossia dopo 3 mesi, è possibile modificare la 
stringa sopra ???
grazie...
ps--- IDEA... !! e se tralasciassi la FrmScadenze con i suoi filtraggi e
facessi una query che mi stampi da data a data ( esempio dal 01/11/2007
al 30/11/2007 ??) forse sarebbe una soluzione migliore ??? che dici ???
arigrazie

 ??? che dici ??? arigrazie
Ciao.
-- 
Sergio MAZZA 

 & nz([idanagrafica];0)))
Ok...ottimo ho fatto delle prove e sembra essere moltro meglio di 
prima...
però ho qualche problema con la FrmScadenze che mi deve filtrare i dati
pronti in scadenza ossia quelli dopo 3 mesi, per poi riazzerarli dopo la 
data di stampa...
purtroppo non so dove intervenire... ma credo che sia interessato questo 
codice inserito
nella FrmScadenze...cmq x me è molto difficile da spiegare...
se mi dai il permesso di farlo ti potrei inviare il Db che compattato è 
di pochi Kb, in maniera da renderti conto del problema....naturalmente a 
tempo perso...
fammi sapere... ciao... Giuseppe
Function AggiornaDate()
    Dim cSQL As String
    Dim cWhere As String
    Dim dbs As Database
    Dim rst As Recordset
    Dim rstProd As Recordset
    Dim rPro, rAna As Integer
  Set dbs = CurrentDb
  Set rst = dbs.OpenRecordset("select * from qryUpdate")
  If Not rst.EOF() Then
    rst.MoveFirst
        While Not rst.EOF()
        rPro = rst!ID
        rAna = rst!ID_Anagrafe
            Set rstProd = dbs.OpenRecordset("select * from Tabprodotti 
where Tabprodotti.ID = " & rPro & " AND Tabprodotti.iDAnagrafica=" & 
rAna)
              rstProd.Edit
              rstProd.Fields![data_erogazione] = rst![scad]
              rstProd.Update
          rstProd.Close
      rst.MoveNext
    Wend
  End If
  rst.Close
  dbs.Close
  Forms!frmAnagrafe!frmProdotti.Requery
End Function

 tempo perso...
Per ora sarebbe (parecchio)tempo perso per te perché non ho tempo.
Cerchiamo di risolvere qui, magari si aggiunge qualche altro amico alla 
discussione.

Fondamentalmente non capisco quando dici: "... filtrare i dati pronti in 
scadenza ossia quelli dopo 3 mesi, per poi riazzerarli dopo la data di 
stampa..."
Io lo traduco in: "...filtrare i dati pronti in scadenza da oggi a 3 mesi 
fa,..."; quindi:
..."Select * From Tabprodotti Where Tabprodotti.ID = " & rPro & " AND 
Tabprodotti.iDAnagrafica=" & rAna & " And [data_erogazione] Between 
DateAdd('m';-3;Date()) And Date())"
Ciao.
-- 
Sergio MAZZA 

 alla discussione.
OK.....

-------------
io penso sia doverosa una spiegazione sintetica e dettagliata di quello 
che dovrebbe fare il database:
il db contiene grossomodo 3000 utenti sono sempre gli stessi,chiaramente 
capiterà di aggiungerne anche altri nel corso degli anni....a questi 
devono venir erogati dei prodotti (1 > Molti) a scadenza trimestrale ed 
anche questi ultimi chiaramente possono subire variazioni nel corso 
degli anni.
Con il filtrare i dati, intendo, dato che devo fare delle stampe 
trimestrali, che poi in base alla scadenza, diventano stampe mensili, 
però x l'utente sempre dopo tre mesi che ha preso la prima fornitura, 
dopo la stampa delle ricette, agli utenti stampati deve azzerarsi la 
data alla stampa odierna e renderli disponibili e stampabili dopo i 
successivi 3 mesi... ;-((
spero sia chiara ma mia spiegazione....(ecco il xchè avrei voluto che 
visionassi il db, in quanto ho già una FRMScadenze che mi filtra i dati 
per la prossima stampa... ma inserendo delle date pregresse per vedere 
se la stampa dopo 3 mesi è disponibile, noto che visualizzo alcuni 
record altri no... e purtroppo non mi posso permettere questi 
errori)....
ora sono al lavoro, e purtroppo non potrò risponderti da casa in quanto 
ho il Pc down...
ci risentiamo lunedì....Ciao Sergio e buon weekend dell'Immacolata...
Ciao Giuseppe

 Ciao Giuseppe
Provo a riepilogare per vedere se ho capito.
Io ho bisogno di una fornitura di medicinali; vengo oggi 22/12/2007 e la 
prossima volta sarà:
[data_erogazione]=22/12/2007+90gg
e scrivo la data nel campo.
(veniamo alla funzionalità dell'applicazione)Il mio programma, ogni giorno 
(o a richiesta), mi verifica se oggi, nei record delle forniture ci sono dei 
record che hanno:
[data_erogazione] = Date()
Le stampe, essendo a richiesta, le potrai fare giornalmente o quando vuoi; 
se ci sarànno record con una [data_erogazione] che corrisponde alla data 
odierna li troverai (es.) elencati nel report.
Nel momento che verrà erogata la fornitura, mi comporterò come al primo 
paragrafo; aggiornerò la [data_erogazione] ad Date()+90gg.
Ciao.
-- 
Sergio MAZZA