Newsgroup: it.comp.appl.access
Titolo: Ancora sulla funzione DSUM

Salve a tutti,
la funzione DSum so che serve a calcolare somme in un dominio predefinito e 
con determinati criteri ma io ho il seguente problema:
Ho una maschera di inserimento spese basata su una tabella tblspese; ora a 
pièdimaschera ho aggiunto un totale 
=dsum("prezzo";"tblspese";"[TipoSpesa]='meccanico'") e ovviamente il 
controllo mi da la somma di tutte le spese fatte dal meccanico.
Ora però io vorrei che questo controllo mi facesse la somma delle spese del 
meccanico, ma solo di quelle visualizzate in quel momento dalla maschera, 
che tra parentesi è ad immissione dati impostata a si! Cioè, io apro la 
maschera inserisco le varie spese, e vorrrei che il controllo in oggetto a 
piè di maschera, si aggiornasse facendo la somma ogni record che inserisco 
con le spese "meccanico"; ma senza calcolare quelle già avvenute in 
precedenza. In effetti quello che mi preme è capire se come dominio della 
funzione Dsum, io possa utilizzare anzichè una tabella/query esterna, un set 
di dati della maschera aperta in quel momento e in continuo aggiornamento e 
se no....cosa posso fare per avere tale risultato.
Grazie, Raf 


Mi pare (spiacente ma adesso non ho tempo per fare prova) esista
qualcosa del tipo
= Somma([NomeTuoControllo]).
F.

Mi pare (spiacente ma adesso non ho tempo per fare prova) esista
qualcosa del tipo
= Somma([NomeTuoControllo]).
Evidentemente allora non mi sono spiegato....
nella maschera io inserisco tutti le spese, cioč quelle che faccio per ogni 
tipo di evento....
Io invece voglio che il controllo mi faccia la somma del prezzo solo per 
quelle spese in cui il campo tipospesa sia "meccanico"!
se faccio =Somma([Prezzo]) ho il totale, se invece faccio =Somma([Prezzo]) 
Dove [Tipo]="Meccanico" ho quello che voglio...ma non posso scriverlo cosě!

 Dove [Tipo]="Meccanico" ho quello che voglio...ma non posso scriverlo così!
Non avevo capito..
Allora mi pare che il nodo sia su cosa intendi per "quelle già
avvenute in precedenza"...
1.quelle anteriori al giorno stesso?
2.quelle fatte poco prima poi con chiusura della maschera?
se1 aggiungi nel dsum criterio su data
se 2 magari puoi mettere un campo boleano per dfinire quali
conteggiare e quali no (e magari aggiornarlo automaticamente alla
chiusura della maschera o che so io (vedi nuovamente cosa intendi per
"già avvenute in precedenza")
Se ho sbagliato Voi mi corrIgerete.
F.

 ha scritto nel messaggio 
news:f7660e39-4223-4d98...@d1g2000hsg.googlegroups.com...




Eheheh Succede...
Dunque..tento di spiegarmi meglio..
La maschera ha un campo Data impostato su Date() un campo Tipo, uno 
Categoria, uno Descrizione e il prezzo.
In teoria la cosa più semplice sarebbe quella di operare sulla data, magari 
impostando dei criteri tipo Date()
ma avendo questa maschera dei controlli calcolati a piedimaschera, e 
inserendo record anche con date diverse, mi ritroverei con questi controlli 
non aggiornati....mi spiego..
Diciamo che apro la maschera e che ho una cassa di 100 euro, quindi il 
controllo calcolato DSum su tabSpese con somma prezzo fino a date=date()-1 
mi da 100 euro
ora inserisco una spesa fatta poniamo dal salumiere di 10 euro ed una fatta 
dal meccanico di 20 euro
appena finisco di inserire i due record, o meglio i singoli record, io 
vorrei che i controlli calcolati a pièdimaschera che dovrebbero sommare le 
singole tipologie di spesa, si aggiornassero a 10 e 20 rispettivamente; 
quando poi riapro la maschera (in modalità immissione dati) e quindi senza 
alcun record visualizzato, tali campi ritornino a 0. Dirò di più: se clicco 
sul pulsante di comando che mi visualizza tutti i campi della tabella, 
vorrei che tali controlli calcolati facessero la somma di tutti i record con 
le rispettive tipologie; insomma, per farla breve, mi serve sapere se è 
possibile fare una somma([Prezzo]) in base però a determinati valori 
presenti nel campo [Tipo].
Spero di aver chiarito meglio il problema.....ma non ne sono sicuro! :(
A presto, Raf 

 ha scritto nel messaggionews:f7660e39-4223-4d98...@d1g2000hsg.googlegroups.com...

Forse sarò un po' cotto, sicuramente un mediocre programmatore-
espertoAccess, ma per rispondere alla prima domanda direi che il mio
consiglio 2. (aggiungi campo boleano si/no, nei criteri del DSUM
aggiungi che vuoi solo i "no", oltre ai "meccanico", alla chiusura
della maschera li fai mettere tutti a si) dovrebbe funzionare.
F.


Non so se ho capito bene.
Dunque, crea una funzione la inserisci in un modulo standard:
=================================================
Function sommaX(vNumDaCalcolare, vDaFiltrare, vFiltro) As Integer
Dim rst As Recordset
Dim vStringa
Set rst = CurrentDb.OpenRecordset("NomeAzienda")
Do While Not rst.EOF
If rst.Fields(vDaFiltrare).Value = vFiltro Then
   vStringa = rst.Fields(vNumDaCalcolare) + vStringa
End If
rst.MoveNext
Loop
sommaX = vStringa
End Function
=================================================
richiami la funzione nell'evento current della form in questo modo:
=sommax("NomeCampoDaSommare";"NomeCampoTipo";[NomeControlloTipo])
ed inserisci anche la stessa cosa nell'origine controllo ove vuoi vedere il 
risultato.
-- 
Ciao
Geppo


Beh..con le funzioni sono proprio a zero...e non saprei neanche da dove
cominciare, per fare quello che dici, ne se il risultato sarebbe quello
sperato...
cmq..tanto per essere chiari, a questo link:
www.persepolis.it/db1.rar
c'č la parte del db che mi da il
problema (tra l'altro vedrai anche l'utilizzo del tuo aiuto precedente)
:)......
In effetti, aprendo la maschera tabspese io vorrei che i controlli a
pičdimaschera chiamati "SpeseReali", "Versamenti", Incassi" e "Prelievi" mi
facessero proprio quello che ora fanno, cioč una divisione del campo prezzo
in base a dei valori specifici di "Tipo" e "Sottotipo", ma non con il filtro
di Date() bensě facendo in automatico la somma di tutti i valori
visualizzati in quel momento nella mschera. Quindi, se sono in apertura di
maschera con nessun record ne inserito ne visualizzato, siano nulli o zero,
ma appena inserisco dei record, anceh se con date diverse da Date(), mi
facciano tale "somma condizionale"; questo miserve per sapere, ad esempio in
una settimana se gli incassi siano stai superiori alle spese, senza perň
contare i prelievi e i versamenti ad esempio bancari, e/o gli acconti o i
resti dei clienti...
inoltre, tale somma, mi serve sia fatta in questo modo, perchč cliccando sul
pulsante "totale", e visualizzando quindi tutti i record, io posso sapere in
totale appunto se sono in attivo o in passivo, e naturalmente questa č una
cosa che posso fare anche applicando filtri per data (Mese ecc.) ma tali
valori si devono aggiornare appena cambia il numero e/o i valori dei record
visualizzati dalla maschera.
Probabilmente esiste un metodo piů semplice per fare tutto ciň..ma non l'ho
mica trovato! :(
spero ora di essere stato piů esauriente e ringrazio tutti dell'aiuto che
state provando a darmi.
Grazie, Raf

Ciao Raffi wrote:
---- cut ---

Non so se sono riuscito a fare quello che hai chiesto pero' ho provato:
http://www.divshare.com/download/4186763-df6
-- 
Ciao
Geppo 

 Geppo
Hai perfettamente capito quello che intendevo....ho però un paio di 
problemi..
innanzitutto portato nel mio db i campi sommax mi danno sempre 0, come se 
non caricassero il modulo creato.
Ho provato a controllare nelle proprietà della maschera tabspese da te 
modificata, ed ho visto che l'unica differenza stava nell'evento corrente 
della form dove hai scritto
Private Sub Form_Current()
'Dim pippo
'pippo = sommaX("Prezzo", "SottoTipo", [SottoTipo], "TabSpese")
Me.Prelievi.Requery
Me.SpeseReali.Requery
Me.Incassi.Requery
Me.Versamenti.Requery
Me.SpeseReali.Requery
End Sub
tra l'altro ti sarei grato se mi spiegassi cosa vuol dire Dim pippo, cioè da 
dove hai preso il nome pippo o meglio..posso mettere un nome che voglio????
inoltre vedo che ahi ripetuto il rigo
me.SpeseReali.requery..è necessario??
Cmq, ho copiato l'evento, controllato che fosse impostata a si la proprietà 
"possiede modulo", ma continua a non fare la somma che invece fa nella tua 
tabella.
Inoltre, ho notato che anche nel db modificato da te, non posso chiamare il 
modulo1 ad esempio Sommax (non importa nulla, sia chiaro, ma mi chiedevo se 
e come sia possibile cambiare il nome ad un modulo e farlo riconoscere dalla 
maschera.
Un'ultima cosa, e credo la più importante, è che il filtro che tu hai creato 
con questo modulo permette solo un parametro, cioè io posso decidere che il 
campo Spese mi faccia la somma delle spese.. ma se io volessi creare un 
doppio o triplo parametro?? cioè se volessi che mi facesse la somma dei 
prezzi dove tipo="spese" e sottotipo<> "Resta"??? è possibile farlo allo 
stesso modo con un modulo??

 ha scritto nel messaggio 
news:47fa1e06$0$10623$4faf...@reader2.news.tin.it...

Mi correggo: la somma nei controlli sono riuscito a farla fare, ma ho notato 
questo: apro la maschera in modalità "inserimento dati", quindi tutti i 
controlli sommax sono 0; inserisco i dati, e i controlli si aggiornano in 
modo corretto.....
se clicco però sul pulsante di comando che mi fa vedere tutti i record, i 
controlli non riescono a fare la somma, ma se alla maschera così 
visualizzata, cioè con tutti i record visualizzati, applico un qualunque 
filtro (es. tutti i record dell'anno 2008), la sommax funziona di nuovo!
ci deve insomma essere qualche problema non nel modulo, ma nell'utilizzo che 
ne fa la maschera...
resta poi il problema del controllo sommax condizionato a più di un 
fattore..... ma questa è un'altra cosa...
p.s. penso che oramai per te io rappresenti un incubo..ma se ti sei 
scocciato di rispondermi..ti capisco!! :)
A presto, Raf 

 A presto, Raf
No Raffi, non ti devi preoccupare, io non faccio il programmatore di 
mestiere, pertanto non sono sempre innanzi al pc e quelle poche cose che ho 
imparato e stato proprio grazie a questo NG.
-- 
Ciao
Geppo 

 End Function
Dimenticavo di dirti che la funzione la richiami cosi:
=sommax("Prezzo";"SottoTipo";[SottoTipo];"TabSpese";"Tipo";[Tipo])
-- 
Ciao
Geppo 

> nell'utilizzo che ne fa la maschera...
Ho scoperto che la sommax smette di funzionare quando il totale dei record 
da sommare supera i 30000 ? o giù di li......come è possibile??
cioè se la maschera visualizza, tramite filtri, un set di record le cui 
somme nei rispettivi settori tipo non supera i 30000 il campo sommax 
funziona, appena lo supera, mi da 0.
E' una cosa strana..no??

"geppo" <c...@tin.it.invalid> ha scritto nel messaggio 
news:cEuKj.284073$%k.40...@twister2.libero.it...

Beh...in effetti sto cominciando a capire come funzionano i moduli, ma mi 
chiedo.....perchč tale funzione va richiamata prima con SottoTipo e poi con 
TIpo? e non viceversa? dato che il filtro si basa prima sul campo Tipo e poi 
sul SottoTipo?
Seconda cosa....credo che per l'utilizzo che vorrei fare di questi campi, 
dovrň studiare una funzione ancora piů complessa......ma il divertimento č 
qui!! ora ci sbatto un po' la testa...poi magari posterň di nuovo una 
richiesta di aiuto!

 E' una cosa strana..no??
Cambia il tipo restituito dalla funzione da Integer a Currency cosi:
function sommaX(.........) as currency
-- 
Ciao
Geppo 

 posterň di nuovo una richiesta di aiuto!
Ok. Buon Lavoro.
-- 
Ciao
Geppo 

 Geppo
Perfetto!!!! :)