Newsgroup: it.comp.appl.access
Titolo: trasportare i dati

i miei 2-3 post precedenti non hanno avuto successo e allora cambiamo
mentalita'
Ho una tabella "movimenti" con
ID,data,distributore,nomeprodotto_inserito,nomeprodotto_presente
Con dei campi calcolati in una maschera sommo il penultimo valore di
"inserito+presente" e sottraggo l'ultimo valore "presente"
Facendo cosi ho la quantita' del prodotto venduto.
Il mio problema e' che questa e' una soluzione ...temporanea, in
quanto non ho uno storico del venduto
Ho creato una tabella "venduto" con ID,data,distributore,nomeprodotto
dove vorrei che i calcoli che i campi calcolati effettuano nella
maschera venissero riportati
Posso fare una query , una macro , un comando qualcosa ?
o addirittura una formula che faccia la stessa cosa dei miei campi
calcolati , controlla che la data sia diversa, ed eventualmente scrive
nella tabella "venduto" ?!?
Aspetto ansioso un consiglio anche perche sono veramente fermo con il
mio piccolo progetto.
Grazie 

Teamnetwork ha scritto:

Il problema č che stai usando una struttura dati non normalizzata, quindi
ti tocca fare i salti mortali per ottenere un valore che in teoria si
calcola con una banale query o una Dsum().
Diventa complicato anche per noi riuscire a capire la struttura e darti
dei consigli.
Ma forse questo lo risolviamo...
visto che hai il campo data nella tua tabella non serve un'altra tabella
"storica" dove salvare i valori di tanto in tanto, dovrebbe essere
sufficiente usare la stessa formula dei campi calcolati perň aggiungendo
il filtro "data<=[data_riferimento]" per escludere tutti i movimenti
successivi a [data_riferimento] ed ottenere quindi lo stato del magazzino
a quella data.
Namor
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Namor
uhm , pero' non avro la possibilita' di dire, controlliamo quanto
prodotto e' stato venduto dal 01/09/03 al 30/09/03
Questo mi e' indispensabile per capire quale prodotto e' maggiormente
apprezzato nei diversi distributori

Teamnetwork ha scritto:




Calcoli il venduto al 30/09/03 e gli sottrai il venduto al 31/08/03.
Ma il tuo campo "nomeprodotto_inserito" cosa contiene di preciso? Non è lì
che salvi la quantità del venduto per ogni movimento?


Namor
il campo nomeprodotto_inserito contiene un valore numerico cosi come
nomeprodotto_presente
il problema e' che il valore venduto (che io non ho e non riesco a
salvare in nessuna tabella) lo calcolo sommando i PENULTIMI valori di
"inserito+presente" e sottraendo l'ULTIMO "presente" con la formula
che mi hai aiutato tu a trovare.. te la riporto
=DLookUp("WELCOME_inserite + WELCOME_presenti";"movimenti";"id=" &
DMax("id";"movimenti";"Distributore=""Piazza Domenicani"" AND ID<" &
DMax("id";"movimenti";"Distributore=""Piazza
Domenicani""")))-DLookUp("WELCOME_presenti";"movimenti";"id=" &
DMax("id";"movimenti";"Distributore=""Piazza Domenicani"""))
WELCOME e' il nomeprodotto in questo caso (ho 8 prodotti FISSI)
Piazza Domenicani e' uno dei 3 distributori ed e' una stringa fissa
nella tabella "movimenti"
Come conciliare questa formula con un filtro su data ? (questa formula
conta ultimo e penultimo ID e non data)

 conta ultimo e penultimo ID e non data)
Agiungi a tutti i filtri un " AND data<=#mm/gg/aaaa#"
esempio:
DMax("id";"movimenti";"Distributore=""Piazza Domenicani"" AND
data<=#09/30/2003#")
Namor
-- 
------------------------------
Siamo tutti nella stessa barca (alcuni incatenati ai remi, altri con la
frusta in mano)!


Namor
scusami , ma sono duretto di testa
questo AND data come funzionerebbe ?
io cercavo di fare :
Dalla data xx/xx/xxxx alla data xx/xx/xxxx
e lui mi diceva che per piazza domenicani e per il prodotto X erano
state vendute X schede
Riportavo questo valore per gli altri prodotti e distributori e avevo
una griglia con tutti i dati

 certo


Il criterio "da... a..." lo imposti così:
data between #mm/gg/aaaa# and #mm/gg/aaaa#
esempio (dal 1 al 30 settembre 2003):
DMax("id";"movimenti";"Distributore=""Piazza Domenicani"" AND
(data between #09/01/2003#" And #09/30/2003#"))
oppure anche:
DMax("id";"movimenti";"Distributore=""Piazza Domenicani"" AND
(data >= #09/01/2003#" And data <= #09/30/2003#"))
Ma nel tuo caso visto che nel calcolo del venduto usi i valori dei record
precedenti forse non puoi applicare questo metodo, e devi calcolarlo per
differenza come venduto al 30/9 meno venduto al 31/8.


Namor
mi dispiace farti perdere del tempo ma credo di non essermi spiegato
abbastanza bene
Ho gia fatto qualcosa del genere per la tabella "incasso"
Ho creato una maschera che esegue una query dove filtra per data e
distributore e somma l'incasso e una sottomaschera mi da' gli importi
per quel determinato periodo di tutti e 3 i distributori
Ho 2 caselle con DATA INIZIALE e DATA FINALE e un comando AGGIORNA
In quel caso non e' difficile perche ho fisicamente il valore
dell'incasso in quanto lo inserisco a mano
Qui e' un po' piu' difficile e infatti mi sono arenato alla grande
Non so se devo trovare una soluzione per scrivere il valore venduto
per ogni distributore e scheda in una tabella e quindi facilmente
sfruttare questi dati come per l'incasso oppure riuscire a calcolare
direttamente dalla mia tabella movimenti questo valore (qui lo vedo
arduo)
ti faccio un esempio
INSERITE 	PRESENTI	VENDUTE
0		10		
2		8		2
5		5		5
0		9		1
10		9		0
per arrivare al venduto sommo inserite + presenti e sottraggo le
presenti al successivo controllo
Se si riuscisse tramite una query o altro a scrivere di volta in volta
il valore VENDUTO nella sua tabella "venduto" non ci sarebbero
problemi di sorta (se la e' diversa scrive il valore senno non fa
nulla)
Altra soluzione e' quello di dire fai
inserite+presenti-presenti_SUCCESSIVE e tieni a mente quel valore ,
fallo per l'intervallo di tempo che ti dico io e poi somma tutto.
Oppure ... forse di soluzioni c'e' ne sono e mi sto impuntando in
quella sbagliata.
Ti ringrazio anticipatamente , e lo ripeto, per il tempo che ti occupo
:)

 >Il criterio "da... a..." lo imposti così:




La soluzione migliore da fare è riprogettare la struttura del database.
Se invece vuoi proseguire con quello che hai già, ormai sai come
funzionano le dlookup() e le dsum(), hai la formula per recuperare il
valore del record precedente e hai la formula per calcolare il venduto ad
una certa data. Combinando questi elementi dovresti riuscire ad ottenere
il totale.
La domanda da porsi è: "come farei se dovessi farlo a mano?" segnandosi
tutti i passaggi (una specie di flowchart) e poi applicando il tutto passo
per passo usando query, funzioni o vba.
Comunque visto che hai la formula per calcolare il venduto ad una certa
data, io rimango dell'idea che un "venduto al 30/09" - "venduto al 31/08"
ti possa dare il risultato cercato.
Se vuoi salvare il progressivo in un'altra tabella puoi fare anche quello,
con un INSERT INTO... e UPDATE... sugli eventi della maschera che manipola
i dati. Però ti stai complicando la vita, e potresti ritrovarti con dati
errati se per un qualsiasi motivo aggiorni un record nella tabella
principale e non in quella del venduto.


Namor
ti dico , in excel impiego tipo 30 secondi a fare questa operazione
	1	2	3	4
A	Inserite	Presenti		Vendute
B
C	5	5
D	2	8		2
E	0	9		1
dove la formula vendute (D4) e'  C1+C2-D2
e cosi via D1+D2-E2 .....
copio incollo la formula e sono a posto :)
in access qualcosa del genere direttamente sulla tabella non e'
possibile ?

 possibile ?
No, non è possibile così semplicemente fare riferimento ai valori dei
campi delle righe precedenti.
Devi usare quella complicata formula fatta di dlookup() e dmax() che hai
già, quindi in "C1+C2-D2" al posto di C1+C2 dovrai mettere tutta quella
Dlookup(.....,"ID=" & Dmax(....,"ID<" & Dmax...))).
Ti conviene aggiungere nella stessa tabella il campo "venduto" da
aggiornare quando modifichi i dati o inserisci nuovi record, in modo da
avere una situazione simile all'esempio excel. Per i record già presenti
dovrai fare una sub vba che scorra il recordset e calcoli i valori
corretti.
Poi puoi usare il nuovo campo per fare i totali del venduto.
