Newsgroup: it.comp.appl.access
Titolo: Calcolo saldo cliente incrementale.

Ciao uso A97
Uso una query semplice che contiene alcuni campi:
-una Data.
-il nome del cliente.
-un'importo nel campo Dare ed uno in quello Avere la cui differenza tra Dare
ed Avere genera un Saldo di riga, e quindi ottengo quasi un estracco conto
per cliente.
Il mio problema e che questa semplice sottrazione fatta tra Dare ed Avere
genera un elenco con un saldo statico cioè senza tener conto del saldo di
riga precedente ne di quello successivo. Come posso fare a gestire questo
tipo di calcolo nella query?.
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

 ha scritto nel messaggio
news:a5lmgr$1sm$1...@fe2.cs.interbusiness.it...

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
---------------------------------------------

 problema come il tuo.
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;

Ho mancato il:
Grazie per l'aiuto

 La query che mi proponi, funziona abbastanza, ma è limitatata alla data di

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).


 Grazie per l'aiuto
Beh, prima di ringraziare vediamo se riusciamo a risolvere il problema. :-)


 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.

 ha scritto nel messaggio
news:T%Jf8.48914$fa5.1...@twister2.libero.it...

@@@@@@@@@@@@@@@@@
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!!

 Graziee 1000!!
--
