Esempio di come vorrei che fosse gestito il saldo:
Data Cliente Dare Avere Saldo MioSaldoSbagliato
---------------------------------------------------------------------
01/02/02 Sig Rossi 50 0 50 50
04/02/02 Sig.Rossi 0 20 30 -20
15/02/02 Sig.Rossi 0 10 20 -10
Grazie a tutti in anticipo.
Ciao
Dai uno sguardo al thread aperto da silvy il 28/2/2002 alle ore 12:48 e che
ha per oggetto "somma incrementale"; in esso è trattato e risolto un
problema come il tuo.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
La query che mi proponi, funziona abbastanza, ma č limitatata alla data di
registrazione, infatti se trova due, tre, date di registrazione uguali, non
le considera nella somma di riga lasciando i totali fin li generato in
sospeso fino a quando la data di registrazione non cambia, e li si
aggiorna. Questo problema non mi fa rendere conto se al saldo viene tolto o
aggiunto l'importo giusto, anzi ho riscontrato che non sottrae affatto.
Ho preso una parte del risultato ottenuto:
DataReg. | CodCliente | ImportoDare | ImportoAvere |
Saldo
----------------------------------------------------------------------------
---
19/01/2001 | 000901 | 0,00 | 361,52
-L. 8.013
21/01/2001 | 001212 | 0,00 | 46,48
-L. 8.255
21/01/2001 | 000474 | 0,00 | 195,22
-L. 8.255
25/01/2001 | 001369 | 350,00 | 0,00
-L. 9.454
25/01/2001 | 000901 | 0,00 | 1549,37
-L. 9.454
26/01/2001 | 000633 | 0,00 | 309,87
-L. 9.764
27/01/2001 | 001180 | 0,00 | 84,96
-L. 9.849
28/01/2001 | 001212 | 0,00 | 20,66
| -L. 10.283
Ti riporto l'SQL:
SELECT Movimenti1.DataReg, Movimenti1.CodCliente, Movimenti1.ImportoDare,
Movimenti1.ImportoAvere, (SELECT SUM(Movimenti2.importoDARE -
Movimenti2.importoAVERE) FROM
[Q OrigineReportMovimenti] AS Movimenti2 WHERE Movimenti2.Datareg
<=Movimenti1.Datareg AND Movimenti2.codCliente=Movimenti1.codCliente;) AS
Saldo
FROM [Q OrigineReportMovimenti] AS Movimenti1
ORDER BY Movimenti1.CodCliente, Movimenti1.DataReg;
Prova allora così.
Se la tabella che contiene i dati si chiama Tabella1 ed ha la seguente
struttura:
IDReg Contatore e chiave primaria
DataReg Data/ora
CodCliente Testo
ImportoDare Valuta
ImportoAvere Valuta
Se vuoi che la query risulti ordinata per CodCliente, DataReg e IDReg.
Se vuoi per ogni cliente un saldo progressivo nel tempo.
Creati una query chiamata Query1 che abbia il seguente codice SQL:
SELECT Tabella1.DataReg, Tabella1.CodCliente, Tabella1.ImportoDare,
Tabella1.ImportoAvere, Format([DataReg],"yyyymmdd") &
Format([IDReg],"0000000") AS A,
DSum("ImportoDare-ImportoAvere","Query1","CodCliente=" & Chr$(34) &
[CodCliente] & Chr$(34) & " And [A]<=" & [A]) AS Saldo
FROM Tabella1
ORDER BY Tabella1.CodCliente, Format([DataReg],"yyyymmdd") &
Format([IDReg],"0000000");
Stai attento, se la query non la chiami Query1 devi modificare il nome del
dominio della funzione DSum: il nome del dominio deve coincidere con il nome
della query.
Resta un fatto: se il risultato della query lo devi stampare con un report,
non è assolutamente necessario che ti precalcoli il saldo progressivo, il
report è capace di ricavarselo da solo mentre stampa (vedi su help la
proprietà Somma parziale di un campo calcolato di un report).
Beh, prima di ringraziare vediamo se riusciamo a risolvere il problema. :-)
<snip>
> Ti riporto l'SQL:
> SELECT Movimenti1.DataReg, Movimenti1.CodCliente, Movimenti1.ImportoDare,
> Movimenti1.ImportoAvere, (SELECT SUM(Movimenti2.importoDARE -
> Movimenti2.importoAVERE) FROM
> [Q OrigineReportMovimenti] AS Movimenti2 WHERE Movimenti2.Datareg
> <=Movimenti1.Datareg AND Movimenti2.codCliente=Movimenti1.codCliente;) AS
> Saldo
> FROM [Q OrigineReportMovimenti] AS Movimenti1
> ORDER BY Movimenti1.CodCliente, Movimenti1.DataReg;
Mi scuso per non averti più risposto, ma non sono ancora riuscito a capire
come si può fare quello che chiedi.
In effetti avendo due movimenti *per lo stesso cliente* con la stessa dat si
ha un comportamento un po' strano:
Data Cliente Dare Avere Saldo
---------------------------------------------
01/02/02 Sig.Rossi 0 20 50
01/02/02 Sig Rossi 50 0 50
15/02/02 Sig.Rossi 0 10 20
Per ottenere il risultato che mi aspettavo
Data Cliente Dare Avere Saldo
---------------------------------------------
01/02/02 Sig.Rossi 0 20 30
01/02/02 Sig Rossi 50 0 30
15/02/02 Sig.Rossi 0 10 20
sono stato costretto ad usare qualcosa tipo:
SELECT M1.DataMov, M1.Cliente, M1.Dare, M1.Avere, (SELECT SUM(M2.DARE) FROM
Movimenti AS M2 WHERE M2.DataMov <=M1.DataMov AND M2.Cliente=M1.Cliente;) as
tdare, (SELECT SUM(M3.AVERE) FROM
Movimenti AS M3 WHERE M3.DataMov <=M1.DataMov AND M3.Cliente=M1.Cliente;) as
tavere, tdare-tavere as saldo
FROM Movimenti AS M1
ORDER BY M1.Cliente, M1.DataMov;
Questo però temo che non sia esattamente quello che tu vuoi, ed ho il
sospetto che non si possa fare a meno che non ci sia un campo chiave (es.
ID_Mov) che ti permetta di identificare univocamente ciascun movimento. In
tal caso potresti fare:
SELECT M1.IDMov, M1.DataMov, M1.Cliente, M1.Dare, M1.Avere, (SELECT
CLng(Nz(SUM(M2.DARE - M2.AVERE))) FROM
Movimenti AS M2 WHERE M2.DataMov <= M1.DataMov AND M2.Cliente = M1.Cliente
AND M2.IDMov < M1.IDMov;) +
M1.Dare - M1.Avere AS Saldo FROM Movimenti AS M1
ORDER BY M1.Cliente, M1.DataMov, M1.IDMov;
HTH, Alessandro.
Funziona ma... mi potresti spiegare cosa fa perchè non l'ho capito bene.
Ovviamente ho la necessità di stampare il risultato della query, ma in base
a come mi hai fatto notare tu, ho impostato una somma parziale del campo
saldo e ho creato nel report un raggruppamento per "Codice cliente".
Purtroppo non funziona, cioè l'elaborazione dura 5 minuti e il risultato è
il non raggruppamento, e la non somma parziale del Saldo cliente ed in
alcuni casi di smanettamenti vari sul formato del campo saldo, ho ottenuto
errore di Overflow. Così per ragioni di tempo ho creato un'altra query
uguale a questa ma dove ho potuto raggruppare e creare un saldo raggruppato
fancendo semplicemente la somma dell'ImportoDare - l'importoAvere. In attesa
di risolvere nella maniera più giusta.
Ti riporto l'SQL della query "SituazioneClienti":
SELECT [Archivio Registrazioni].IDRegistrazione, [Archivio
Registrazioni].CodCliente, [Archivio Registrazioni].DataReg,
Format([DataReg],"yyyymmdd") & Format([IDRegistrazione],"0000000") AS A,
CLng(Format(DSum("ImportoDare-ImportoAvere","Qry_Archivo_Registrazioni","Cod
Cliente=" & Chr$(34) & [CodCliente] & Chr$(34) & " And [A]<=" &
[A]),"0.00")) AS Saldo
FROM [Archivio Registrazioni]
ORDER BY [Archivio Registrazioni].DataReg, Format([DataReg],"yyyymmdd") &
Format([IDRegistrazione],"0000000");
Graziee 1000!!
Per risolvere il problema avevo bisogno di crearmi una chiave univoca per il
recordset rappresentato dalla query: per questo ho creato il campo calcolato
A composto dall'insieme della data di registrazione e della chiave primaria
della tabella.
Quindi per determinare il saldo progressivo, per ogni cliente, è stato
sufficiente sommare algebricamente i movimenti aventi la chiave primaria
(campo A) minore o uguale a quella della riga corrente della query.
> Ovviamente ho la necessità di stampare il risultato della query, ma in
base
> a come mi hai fatto notare tu, ho impostato una somma parziale del campo
> saldo e ho creato nel report un raggruppamento per "Codice cliente".
> Purtroppo non funziona, cioè l'elaborazione dura 5 minuti e il risultato è
> il non raggruppamento, e la non somma parziale del Saldo cliente ed in
> alcuni casi di smanettamenti vari sul formato del campo saldo, ho ottenuto
> errore di Overflow.
Onestamente non riesco a spiegarmi il comportamento del report...
> Così per ragioni di tempo ho creato un'altra query
> uguale a questa ma dove ho potuto raggruppare e creare un saldo
raggruppato
> fancendo semplicemente la somma dell'ImportoDare - l'importoAvere. In
attesa
> di risolvere nella maniera più giusta.
>
> Ti riporto l'SQL della query "SituazioneClienti":
> SELECT [Archivio Registrazioni].IDRegistrazione, [Archivio
> Registrazioni].CodCliente, [Archivio Registrazioni].DataReg,
> Format([DataReg],"yyyymmdd") & Format([IDRegistrazione],"0000000") AS A,
>
CLng(Format(DSum("ImportoDare-ImportoAvere","Qry_Archivo_Registrazioni","Cod
> Cliente=" & Chr$(34) & [CodCliente] & Chr$(34) & " And [A]<=" &
> [A]),"0.00")) AS Saldo
> FROM [Archivio Registrazioni]
> ORDER BY [Archivio Registrazioni].DataReg, Format([DataReg],"yyyymmdd") &
> Format([IDRegistrazione],"0000000");
>
> Graziee 1000!!
--