Newsgroup: it.comp.appl.access
Titolo: Problema con le query

Innanzi tutto buongiorno a tutto il gruppo e buon lavoro.
Potete aiutarmi a risolvere il seguente problema? Grazie in ogni caso.
Problema
Ho una query con diverse righe così composte
Numprog - data - articolo - valore.
Devo aggiungere un ulteriore campo chiamato variazione percentuale che sia
appunto la variazione percentuale dove articolo è lo stesso e data sia la
data precedente.
Mi spiego con un esempio
1     29/12/2000 01 10000
2     30/12/2000 01 13000
Campo da aggiungere: nella riga 1 niente ma nella riga 2 la variazione
percentuale tra 13000 e 10000.
Aiutatemi   ........ahhhhhhh...
--
li...@asinform.it

(.....)
Con una query sarà difficile (vorrei dire impossibile, ma potrebbe
esserci qualcuno più bravo che mi smentisce !).
Il problema non è banale come sembra a prima vista: richiede che per
ogni record tranne il primo, si tenga traccia del valore del record
precedente; e questo, per quanto ne so, con le query di Access non si
può fare.
Credo che l'unica strada sia tramite VBA, ma a questo punto bisogna
sapere dove ti serve fare il calcolo della variazione: in  un report,
in una form ...?
Vincenzo Turturro
---------------------------------------------------------
Se no diventiamo tutti **** dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(Così disse 
ivan....@tiscalinet.it
 Ven 25 Aug 2000 09:34:52 +0200)

Cosě a prima vista, mi sa che quello che vuoi fare si faccia soltanto con una
procedura, per esempio in VB.
Devi infatti accedere ai record in modo sequenziale e fare degli update ogni
volta, il che non č quello che fanno le query normalmente.
Ciao,
    Matteo

 
li...@asinform.it
Naturalmente si puo' fare via codice, come dicono Vincenzo e Matteo, pero'
forse con due query successive ci si riesce.
La tabella principale (miaTab) e' fatta cosi':
mID  mData       mCosto
1    01/02/2000  1000
2    02/02/2000  1500
3    03/02/2000  2000
4    04/02/2000  2500
5    06/02/2000  3000
La prima query (qry01) calcola la percentuale:
SELECT T1.mID, ([T1].[mCosto]-[T2].[mCosto])*100/[T2].[mCosto] AS P
FROM miaTab AS T1, miaTab AS T2
WHERE (((T1.mData)=[T2].[mData]+1))
ORDER BY miaTab.mData
costruita in questo modo visualizza solo i record per cui esiste quello del
giorno precedente (controlla la formula per la percentuale):
Risultato
mID   P
2    50
3    33,33
4    25
Se vuoi visualizzare le date prese in considerazione, aggiungi T1.mData e
T2.mData nella select
Con questa seconda visualizzi tutti i record della tabella miaTab con le
percentuali (se ci sono):
SELECT miaTab.mID, miaTab.mData, miaTab.mCosto, qry01.P
FROM miaTab LEFT JOIN qry01 ON miaTab.ID = qry01.mID
ORDER BY miaTab.mData
Risultato
mID  mData       mCosto  P
1    01/02/2000  1000
2    02/02/2000  1500    50
3    03/02/2000  2000    33,33
4    04/02/2000  2500    25
5    06/02/2000  3000
Spero di non essermi sbagliato.
Naturalmente controlla il tutto e facci sapere se funziona a dovere.
-- 
Federico
--------------------------------------
Sito Comune di it.comp.appl.access
http://members.xoom.it/it_db_access
mailto:
it_db_...@usa.net
--------------------------------------
Tutte le richieste che mi arrivano
in privato, vengono cestinate.
--------------------------------------
Rimuovi paperino. per e-mail
--------------------------------------

(.....)
E' vero, non ci avevo pensato !
Però .....
- se le date non sono consecutive, la percentuale non viene calcolata.
- in questo modo Access fa il prodotto cartesiano tra i record delle
due tabelle; se hanno cardinalità elevata, le prestazioni rischiano di
essere inaccettabili.


 Vincenzo Turturro
Non ti seguo molto, perdonami.
Il campo data dovrebbe essere una chiave, quindi ad un record della T1
corrisponde al massimo un solo record della T2.


data precedente.
premesso che sarebbe mooolto piů facile appoggiare tutto in una
tabella (magari temporanea) e scorrersela via codice con un recordset,
sarebbe necessario che i record siano identificabili per mezzo di una
chiave, cioč per mezzo di un campo o una combinazione di campi che li
rendono tutti sicuramente diversi uno dall'altro.
non solo, ma servirebbe anche che la chiave li ordini
progressivamente.
ipotizzo che tale chiave possa essere costituita dal campo NumProg.
il concetto č quello, per ogni record, di identificare il record
"precedente" (prima e dopo non sono concetti scontati su una tabella),
per mezzo di una query che identifichi il record piů "alto" al di
sotto del record corrente.
si utilizza questo valore in una funzione da richiamare nella query.
la funzione potrebbe essere:
function PercPrec(valore as double, NumProg as long) as double
dim ssql as string
dim rst as recordset
ssql = "SELECT TOP 1 valore FROM tabella WHERE NumProg < " & NumProg &
" ORDER BY NumProg DESC"
set rst = currentdb.openrecordset(ssql)
PercPrec = (valore - rst(0)) / (valore / 100)
end function
se utilizzi l'"editor" delle query la richiami scrivendo in una
casella qualcosa tipo:
PercPrec([valore];[NumProg])
non l'ho provata e sono andato a braccio, dovrebbe funzionare...


corrisponde al massimo un solo record della T2.
"Dovrebbe" vuol dire che dev'essere definito come tale nella struttura
della tabella, oppure che Access lo considera chiave per il solo fatto
di averlo utilizzato in un criterio di selezione ?
E comunque: non conosco così a fondo jet, ma sei sicuro che se non si
specifica esplicitamente una join tra due tabelle in una query, non
venga fatto il prodotto cartesiano tra le due?
Da qualche prova che avevo fatto (molto) tempo fa, mi ricordo che
succedeva proprio questo: una tabella di 1.000 record utilizzata in
una query simile produceva un insieme di 1.000.000 di record.
Di sicuro però ho provato sotto Access 95; forse adesso il jet è più
furbo !
----------------------------------
Se no diventiamo tutti Ilbi dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(
ivan....@tiscalinet.it
 Ven 25 Aug 2000 09:34:52 +0200)

 furbo !
No, non lo e' :-)
Infatti se elimini i criteri ottieni proprio il prodotto cartesiano tra le due
tabelle.
La differenza sta nel criterio di selezione, che evidentemente si comporta come
fosse un join.
Non ho la certezza di questa cosa, ma da prove fatte sembra essere cosi'.


sarebbe come dire buona malattia.  mah.
Beh, se e' ogni tanto... ;-)
Come suona "lbo dal buon lavoro (ogni tanto)"?
--
Lorenzo Coronati
--
<<Si perché forse Ilbo (ed altri come lui) sono 
convinti che noi poveri principianti (nel senso 
ironico) scrivano le domande senza pensare.>>
(Ivan Lelli, 25/08/2000)
--

Federico
Buono a sapersi, ne terrň conto.
Vincenzo Turturro
---------------------------------------------------------
Se no diventiamo tutti **** dai portatili o peggio ancora 
provetti poeti fiorentini come vturturro.
(Cosě disse 
ivan....@tiscalinet.it
 Ven 25 Aug 2000 09:34:52 +0200)

 Verificherò il tutto e vi farò sapere.
In generale, per capire se una cosa e' semplice o no (almeno a grandi linee)
prova a scrivere su un foglio cosa devi fare usando il minor numero di
parole possibili e accertandoti che non vi siano ambiguita' in cio' che
scrivi.
Ciao, Sib

>prova a scrivere su un foglio cosa devi fare usando il minor numero di
anticooo... e gli editor di testo che ce stanno a fà?
(o intendevi un foglio excel?)

 (o intendevi un foglio excel?)
hehehe... intendevo proprio un foglio di carta.
Parlando seriamente rimane sempre importante fissare le idee su carta prima
di iniziare a buttare giu' codice, lavorando a braccio si fa un gran casino.
Ciao

Aiutatemi   ........ahhhhhhh...
Bhe' ho voluto cimentarmi anche io:
anche se ho utilizzato una funzione di dominio
che non e' certo di grande
classe (ma quanno ce vo' ce vo' !!!).
Prova cosi' :
SELECT Tabella3.id, Tabella3.data, Tabella3.codice, Tabella3.valore,
[valore]-DFirst("[VALORE]","TABELLA3","[codice]=" & [codice] & " AND
[TABELLA3].[DATA] < " & "#" & Format([DATA],"yyyy/mm/dd") & "#") AS
Differenza
FROM Tabella3
ORDER BY Tabella3.id, Tabella3.data;
(i campi sono questi :
Tabella3=Nome tabella
id=campo chiave record
data=data del record
valore=importo del record
codice=codice articolo record
differenza=campo con la differenza ottenuta
)
in pratica per ogni record letto, si va a cercare con
la dfirs il primo record dello stesso codice con
data inferiore . Nell'esempio che io ho fatto, ti riporta
la differenza tra i due valori, attuale e precedente.
Comunque rende l'idea, e funziona anche con date
non necessariamente conseguenti.
Bye :o)