Newsgroup: it.comp.appl.access
Titolo: quattro query dinamiche

buongiorno a tutti.
Ho quattro query che mi filtrano i dati di aprile, marzo, febbraio e gennaio.
Ciascuna di queste query ha un campo data con filtro pari a : "Like "*/04/2013".(l'esempio si riferisce ovviamente a aprile).
 
Il mio quesito è questo: vorrei poter aggiornare i dati per il futuro inserendo il filtro mensile solo per il mese più recente (cfr. Maggio) e vorrei che le tre query precedenti si adattassero con dati pari a maggio -1, -2 -3.
In parole povere mensilmente, non devo piu modificare quattro query ma agire solo sulla più recente e le altre adattano il loro filtro.
 
Qualcuno mi può aiutare ?
grazie infinite.

ignazio.pilone explained :

Cioè definito il parametro m per il mese corrente
(1<=m<=12) vorresti che il programma ti eseguisse
nell'ordine pe query per m, m-1, m-2, ... 1.
 
Inoltre, m lo definisci tu o lo definisce il
programma prendendo il mese della data corrente?
 
Metti online una delle query...
 
Bruno
 
Bruno
 
 

Bruno, grazie per l'attenzione.
Allora ti allego il codice in sql della query per i dati di Aprile.
 
A me serve avere i valori del mese inserito, che non è quello in corso ma quello per cui mi pubblicano i dati, ad esempio maggio e dei tre mesi (-1,-2,-3) precedenti.
 
SELECT Dati.POD, Dati.DATA, Dati.ORA, Dati.ENATTIVA, Dati.ENREATTIVA, IIf([ENATTIVA]>0,([ENREATTIVA]/[ENATTIVA]),0) AS Incidenza, IIf([Incidenza]>0.5,0.5,[Incidenza]) AS Adeguato, IIf(IsNull([Incidenza]),0,IIf([Incidenza]>0.5,([Incidenza]-[Seconda]-[Adeguato]),0)) AS Prima, IIf([Incidenza]>0.75,[Incidenza]-0.75,0) AS Seconda, Format(IIf(([ENREATTIVA]>([ENATTIVA]*"0,5")),([ENREATTIVA]-([ENATTIVA]*0.5))*0.0151,"0"),"0.###")*"1" AS Penale, Format(IIf(([ENREATTIVA]>([ENATTIVA]*"0,75")),([ENREATTIVA]-([ENATTIVA]*0.75))*0.0038,"0"),"0.###")*"1" AS Ulteriore, Format((CSng(Nz([Penale],0))+CSng(Nz([Ulteriore],0))*1.21),"0.###")*"1" AS Penaliva, IIf([Incidenza]<0.5,1,0) AS flag1, IIf([Incidenza]>0.5 And [Incidenza]<0.75,1,0) AS flag2, IIf([Incidenza]>0.75,1,0) AS flag3
FROM Dati
WHERE (((Dati.DATA) Like "*/04/2013"));
 
grazie infinite per l'interessamento e per l'aiuto...

on 15-07-13, ignazio.pilone supposed :

Ma questa come fa a funzionarti da programma?
 
Spiegami bene: da programma devi eseguire le query che il programma 
stesso ha creato|modificato o da programma crei|modifichi le query che 
poi esegui interattivamente?
 
Bruno
 
 

Bruno, cerco di spiegarmi meglio, scusami se non sono ancora stato abbastanza chiaro.
Il mio access mi consente tramite una trentina di query di alimentare alcune tabelle di excel da cui stampo dei report in pdf.
Nello specifico al momento ho quattro query funzionanti che mi estraggono i dati di cascun mese, così impostate : 
"Like "*/04/2013" per Aprile 
"Like "*/03/2013" per Marzo
"Like "*/02/2013" per Febbraio
"Like "*/01/2013" per Gennaio
 
Vorrei modificare tale filtro inserendo nella prima query il valore del mese di maggio ("Like "*/05/2013" o qualcosa di equivalente) e nelle altre tre query tre formule che collegate alla prima, mi valorizzino i mesi n-1,n-2,n-3.
 
Grazie mille per l'aiuto ti ringrazio di cuore.

ignazio.pilone presented the following explanation :

Quindi tu esegui le query, una dopo l'altra, dalla finestra database e 
vorresti fornire solo il parametro della prima query (per esempio 5 per 
maggio) e ottenere che i parametri delle altre tre query fossero di 
conseguenza modificati per ottenere i dati dei mesi 4, 3, 2.
 
1 -
Usando un po' di codice VBA ti sarebbe possibile creare la prima query 
col parametro m, eseguirla, creare ed eseguire le altre tre query coi 
parametri m-1, m-2, m-3.
 
2 -
Senza VBA potresti costruire le query in modo che il mese ti venisse 
richiesto, per ogni query, come parametro.
Allora eseguendo la prima forniresti 5, eseguendo la seconda forniresti 
4, etc.
 
Se ho ben inteso però tu vorresti ottenere l'automatismo del punto 1 
con  la modalità del punto 2.
La qual cosa non mi sembra proprio possibile.
 
Bruno
 
 

Quindi tu esegui le query, una dopo l'altra, dalla finestra database e 
vorresti fornire solo il parametro della prima query (per esempio 5 per 
maggio) e ottenere che i parametri delle altre tre query fossero di 
conseguenza modificati per ottenere i dati dei mesi 4, 3, 2. 
 
1 - 
Usando un po' di codice VBA ti sarebbe possibile creare la prima query 
col parametro m, eseguirla, creare ed eseguire le altre tre query coi 
parametri m-1, m-2, m-3. 
 
si Bruno vorrei fare proprio questo ma non ho idea del codice da scrivere nella/e query. Ma se nella prima (maggio) inserissi 5 nella condizione della data, posso nelle altre 3 querry puntare a questo valore per ottenere -1,-2,-3 ?
A me basterebbe anche così....
grazie  mille ciao

 grazie  mille ciao
 
 
Ma lo devi proprio inserire a mano il parametro o ti basta avere le query 
'Mese corrente' e '1 mese precedente', '2 mesi precedenti', .....?
Ciao.
-Marco-
 
 
 
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

ignazio.pilone submitted this idea :

Non devi scrivere alcun codice nelle query: son le query che debbono 
essere scritte nel codice.
 
Dunque, "programmatically" scriviamo le quattro query passando un solo 
parametro (es. 5).
Cosicché queste vengono create nella finestra dababase (q1, q2, q3, q4) 
e da qui eseguite interattivamente (DoubleClick su ciascuna 
sequenzialmente)? o debbono aggiornare/filtrare qualche tabella/report?
 
Bruno
 
PS
Sai come eseguire una routine VBA?
 
 

 Sai come eseguire una routine VBA?
 
 
Direi che non serve sprecarsi a riscrivere le query da VBA, se lui fa una 
mascherina con una combo o textbox in cui seleziona il mese basta usare
come 
criterio 
Forms![Nome maschera]!Mese
Forms![Nome maschera]!Mese - 1
Forms![Nome maschera]!Mese - 2
ecc...
Ovviamente la maschera deve rimanere aperta, magari nascosta, altrimenti
le 
query non possono leggere il valore del parametro.


 query non possono leggere il valore del parametro.
 
Sì certo, restando nella filosofia di eseguire le query 
interattivamente è una soluzione semplice.
Altra, altrettanto semplice, è quella di inserire il mese in ciascuna 
query come parametro.
DblClick sulla prima e inserisci 5, DblClick sulla seconda e inserisci 
4, etc.
Non è molto complicato e non vi sono tante possibilità di sbagliarsi.
 
Per altra via, con qualche automatismo in più, premi un pulsante, 
fornisci il parametro m, e nella finestra database ti trovi le quattro 
query pronte per essere eseguite interattivamente.
 
Per altra via ancora, con tutti gli automatismi posti in essere, premi 
un pulsante fornisci il parametro m, e una procedura crea, esegue ed 
applica le quattro query.
 
De gustibus...
 
Bruno
Bruno
 
 

Bruno Campanini ha scritto:

Già, ci sono svariate possibilità. Gli ho chiesto in un altro post se gli 
serve sempre il mese corrente con i 3 precedenti perché pensavo che si può 
fare anche senza parametri e senza VBA, usando la data di sistema per 
impostare i criteri nelle 4 query.


 Sai come eseguire una routine VBA?
 
Intanto puoi provare a sostituire la tua clausola WHERE:
WHERE (((Dati.DATA) Like "*/04/2013"));
 
con questa:
WHERE DatePart("m",[Data])=[Mese];
così puoi utilizzare una sola query.
 
Bruno
 
 

Direi che non serve sprecarsi a riscrivere le query da VBA, se lui fa una 
mascherina con una combo o textbox in cui seleziona il mese basta usare 
come 
criterio 
Forms![Nome maschera]!Mese 
Forms![Nome maschera]!Mese - 1 
Forms![Nome maschera]!Mese - 2 
ecc... 
 
Vi ringrazio tutti per il costruttivo aiuto.
Allora ricapitolo cosa ho fatto e cosa non capisco ancora bene.
Preciso che le query mi servono tutte e quattro perchè alimentano quattro grafici diversi (mese in corso e tre mesi precedenti) e quindi la query non si deve riscrivere su se stessa.
Ho inserito nel linguaggio sql il codice suggerito da Bruno 
"WHERE DatePart("m",[Data])=[Mese]; "
 
quindi quando lancio la query Lui mi chiede il mese con una inputbox io gli scrivo 5 e "Lui" mi lancia la query...quindi tutto ok.
Posso nelle altre tre query "puntare a questo valore ?
 
 
Solleticato dal vostro consiglio, ho creato una maschera "frm_sceltamese" con una combinata con valori da 1 a 12.
Dopo aggiornamento della combinata con il mese ultimo (maggio) la stessa mi memorizza il valore (ad esempio 5)nella casella di testo "mesescelto" della stessa maschera.
Ora vorrei che la mia query con il codice di bruno puntasse anche a :
[frm_sceltamese]![mesescelto]
ma non riesco a  farlo, cioè a fondere i codici....sono abbastanza impedito.
Avreste ancora la pazienza di farmi capire cosa sbaglio ?

grazie infinite a tutti...
ho finalmente capito....grazie grazie grazie.
 
ho fatto come suggerito e poi ho cosi modificato la query:
 
SELECT Dati.POD, Dati.DATA, DatePart("m",[DATA]) AS mese, Dati.ORA, Dati.ENATTIVA, Dati.ENREATTIVA, IIf([ENATTIVA]>0,([ENREATTIVA]/[ENATTIVA]),0) AS Incidenza, IIf([Incidenza]>0.5,0.5,[Incidenza]) AS Adeguato, IIf(IsNull([Incidenza]),0,IIf([Incidenza]>0.5,([Incidenza]-[Seconda]-[Adeguato]),0)) AS Prima, IIf([Incidenza]>0.75,[Incidenza]-0.75,0) AS Seconda, Format(IIf(([ENREATTIVA]>([ENATTIVA]*"0,5")),([ENREATTIVA]-([ENATTIVA]*0.5))*0.0151,"0"),"0.###")*"1" AS Penale, Format(IIf(([ENREATTIVA]>([ENATTIVA]*"0,75")),([ENREATTIVA]-([ENATTIVA]*0.75))*0.0038,"0"),"0.###")*"1" AS Ulteriore, Format((CSng(Nz([Penale],0))+CSng(Nz([Ulteriore],0))*1.21),"0.###")*"1" AS Penaliva, IIf([Incidenza]<0.5,1,0) AS flag1, IIf([Incidenza]>0.5 And [Incidenza]<0.75,1,0) AS flag2, IIf([Incidenza]>0.75,1,0) AS flag3
FROM Dati
WHERE (((DatePart("m",[DATA])) Like [forms]![frm_sceltamese]![mesescelto]));


niente like
 
WHERE (((DatePart("m",[DATA])) = [forms]![frm_sceltamese]![mesescelto]));