Newsgroup: it.comp.appl.access
Titolo: Funzione DSUM e SOMMA

Ho bisogno di calcolare il Saldo dinamico in una maschera basata su una
tabella che, fra gli altri dati, a le classiche due colonne del DARE e
AVERE.
A livello di report non ho problemi. Infatti, per il campo calcolato
contenete il saldo, esiste la preziosa proprietà SOMMA PARZIALE, impostabile
a NO, SU GRUPPO e SU TUTTO.
Il problema è a livello di maschera. Qui non è possibile dare ad un campo
calcolato questa proprietà. Allora ho cercato di risolvere il problema con
un campo calcolato in una query.
La prima query (nome: QUERY1) è:
SELECT [Tabella].Conto, [Tabella].Data, [Tabella].Dare, [Tabella].Avere,
[Tabella].[Causale e Descrizione], [Tabella].Reg AS Idregistrazione FROM
[Tabella] ORDER BY [Tabella].Data
la seconda è basata sulla prima, con in più un campo calcolato dove,
attraverso la funzione DSUM, calcolo il saldo dinamico
 SELECT [Query1].Conto, [Query1].Data, [Query1].Dare, [Query1].Avere,
[Query1].[Causale e Descrizione], [Query1].Reg AS Idregistrazione,
Format(DSum("Dare-Avere","[Query1]","Reg<=" & [[Query1]].[Reg]),"""L.
""#,###") AS Saldo
FROM [Query1]
ORDER BY [Query1].Data
Il problema è che il calcolo della funzione DSUM non tiene conto
dell'ordinamento di dati in QUERY 1, per cui il risultato non è corretto:
faccio un esempio
il calcolo corretto dovrebbe essere come segue
DARE                AVERE            SALDO
L.120.062            0                L.120.062
    0            L. 1.448.241        L. 927.747
    0                   650.600        L.1.578.347
Invece  lo fa così.
DARE                AVERE            SALDO
    0            L. 1.448.241            -L. 10.042.110
L. 297.046        0                        -L. 10.228.680
L. 318.669        0                         -L. 9.910.011
Il primo valore del saldo non va bene. Il problema è che il primo record che
viene estratto dalla funzione DSUM non è quello corrispondende al primo
record della query dove c'è la funzione.
Ho letto la guida riguardo alla funzione DSUM, e mi sembra che la soluzione
sia la seguente: utilizzare la funzione SOMMA, come dice il testo della
guida che segue:
" [...] È possibile utilizzare sia la funzione DSum che la funzione Somma in
un'espressione di campo calcolato di una query Totali. Se si utilizza la
funzione DSum, i valori vengono calcolati prima del raggruppamento dei dati.
Se si utilizza la funzione Somma, i dati vengono raggruppati prima che
vengano valutati i valori contenuti nell'espressione di campo. [...]"
Ma la funzione SOMMA non la posso utilizzare in una query!
A questo punto non so come risolvere il problema. Spero che qualcuno possa
darmi qualche suggerimento.
Grazie
Stefano B.


[CUT]
Scusami, poiché il saldo progressivo è uguale alla sommatoria dei dare meno
la sommatoria degli avere, il risultato giusto dovrebbe essere:
DARE                    AVERE                SALDO
L. 120.062             0                           L. 120.062
0                            L. 1.448.241        -L. 1.328.179
0                            L.    650.600        -L. 1.978.779
Per poter fare con una SOLA query ciò che ti serve, occorre che nella query,
oltre al campo calcolato Saldo, ci sia un altro campo calcolato chiamato
Chiave che rende univoca ogni riga della query; detto campo Chiave lo userai
per ordinare la query e come criteri della funzione DSum.
Nel tuo caso Chiave può essere costituito dall'insieme della data di
registrazione e del numero di registrazione.
Fra l'altro, ti sconsiglio di chiamare Data un campo; Data è un nome
riservato e potresti avere ogni tanto spiacevoli sorprese.
Se il campo Reg è numerico, secondo me la query che ti serve ha il seguente
codice SQL:
SELECT Tabella.Conto, Tabella.DataReg,
10000000000000+Year([DataReg])*1000000000+Month([DataReg])*10000000+Day([Dat
aReg])*100000+[Reg] AS Chiave, Tabella.Dare, Tabella.Avere, Tabella.[Causale
e Descrizione], Tabella.Reg, Format$(DSum("[Dare] -
[Avere]","Query1","Chiave<=" & [Chiave]),"Currency") AS Saldo
FROM Tabella1
ORDER BY
10000000000000+Year([DataReg])*1000000000+Month([DataReg])*10000000+Day([Dat
aReg])*100000+[Reg];
Affinché tutto funzioni, è assolutamente necessario che questa query si
chiami Query1.
A mio parere, il risultato delle due query non è esatto anche perché
probabilmente il campo Reg è di tipo Testo e non numerico, per cui è
sbagliato il modo in cui hai scritto i criteri della Dsum. Ma anche se
correggi il modo di scrivere i criteri l'esito del confronto potrebbe non
essere quello che ti aspetti nel caso in cui Reg non contenga solo cifre e
non sia stato adeguatamente formattato.
Tieni inoltre presente che la Dsum è una funzione di aggregazione sui
domini, pertanto non cambia il suo risultato al variare dell'ordine in cui i
record sono contenuti nel dominio su cui opera (insomma se ne frega
altamente dell'ORDER BY della prima query).
Quanto a quello che tu scrivi perché letto sull'help, non è affatto
pertinente con il tuo caso, visto che non adoperi query Totali (o di
raggruppamento che dir si voglia).
Resta comunque il fatto che se il campo Reg è di tipo Testo, anche la mia
query non funzionerebbe; andrebbe modificata almeno in :
SELECT Tabella.Conto, Tabella.DataReg,
10000000000000+Year([DataReg])*1000000000+Month([DataReg])*10000000+Day([Dat
aReg])*100000+Val([Reg]) AS Chiave, Tabella.Dare, Tabella.Avere,
Tabella.[Causale
e Descrizione], Tabella.Reg, Format$(DSum("[Dare] -
[Avere]","Query1","Chiave<=" & [Chiave]),"Currency") AS Saldo
FROM Tabella1
ORDER BY
10000000000000+Year([DataReg])*1000000000+Month([DataReg])*10000000+Day([Dat
aReg])*100000+Val([Reg]);
e forse non è sufficiente.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------