Newsgroup: it.comp.appl.access
Titolo: somma record...

ho una tabella con i seguenti campi:
id
data
valuta
prelevamento
versamento
saldo
il mio problema è che il saldo deve essere aggiornato ogni volta che immetto
un nuovo record; se c'è un versamento al saldo del record precedente devo
aggiungero il valore del versamento, se è un prelevamento ce lo devo
togliere. Come posso fare? Ho provato con una query ma non ci riesco!
grazie x l'attenzione

 ha scritto nel messaggio
news:av2ca3$s7h$1...@lacerta.tiscalinet.it...

Per prima cosa elimina dalla tabella il campo calcolato saldo; è una regola
fondamentale dei database relazionali quella di non registrae mai in una
tabella i campi calcolati che puoi ricavare dagli altri dati contenuti nella
stessa tabella; se non seguirai questa regola ti procurerai degli inutili e
fastidiosi mal di pancia di cui cominci ad avvertire i primi sintomi. ;-)
Se la tabella che contiene i dati si chiama Tabella1 ed ha la seguente
struttura:
id                      contatore e chiave primaria
data                  Data/ora
valuta               Data/ora
prelevamento    Valuta
versamento       Valuta
regitra in un modulo del tuo database la seguente funzione:
Function TotProgrQry(KeyName As String, KeyValue, FieldNameToGet As String,
NomeTabella As String) As Long
Dim RS As DAO.Recordset
On Error GoTo Err_TotProgrQry
TotProgrQry = 0
Set RS = CurrentDb().OpenRecordset(NomeTabella, dbOpenDynaset)
' Trova il record corrente
Select Case RS.Fields(KeyName).Type
    ' La chiave è Numerica?
    Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
        DB_DOUBLE, DB_BYTE
        RS.FindFirst "[" & KeyName & "] = " & KeyValue
    ' La chiave è di tipo Data/ora?
    Case DB_DATE
        RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
    ' La chiave è di tipo Testo?
    Case DB_TEXT
        RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
    Case Else
        MsgBox "ERRORE: Tipo dati della chiave non valido!"
        Exit Function
   End Select
Do Until RS.BOF
    TotProgrQry = TotProgrQry + RS(FieldNameToGet)
    RS.MovePrevious
Loop
Set RS = Nothing
Bye_TotProgrQry:
    Exit Function
Err_TotProgrQry:
    Resume Bye_TotProgrQry
End Function
La query che ti restituirà il tuo estratto conto DEVE chiamarsi Query1 ed
avrà il seguente codice SQL:
SELECT Tabella1.id, Tabella1.data, Tabella1.valuta, Tabella1.prelevamento,
Tabella1.versamento,
CCur(TotProgrQry("id",[id],"versamento","Query1")-TotProgrQry("id",[id],"pre
levamento","Query1")) AS saldo
FROM Tabella1
ORDER BY Tabella1.data, Tabella1.id;
Stai attento la query deve proprio chiamarsi Query1, in caso contrario devi
modificare il suo codice SQL relativamente al richiamo della funzione
TotProgrQry (sostiturai la parola Query1 con il vero nome della query).
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ha scritto nel messaggio
news:9peR9.74927$Ou4.2...@twister2.libero.it...



Quando rispondi scrivi DOPO e non prima del teto dei messaggi precedenti.
L'errore che ricevi da Access può dipendere dal fatto che hai fatto un
brutale copia ed incolla del codice SQL della query, ma Outlook ha tagliato
in due il nome del campo prelevamento (pre ed a capo levamento); prova
riunire i due tronconi della parola e riprova.


 ha scritto nel messaggio
news:o2jR9.76011$Ou4.2...@twister2.libero.it...

riuniti ma mi da' ancora errore (
www.pocketvg.com/query1.gif
); ho provato
con il far andare a capo CCur.. ma stessa cosa

 con il far andare a capo CCur.. ma stessa cosa
Per scrupolo ho provato quanto ti ho suggerito ed a me funziona
perfettamente.
Prova a postare per intero il codice SQL della tua query.


 ha scritto nel messaggio
news:nPkR9.76399$Ou4.2...@twister2.libero.it...

ogni qual volta scrivo sql mi va sempre a capo dove c'è il meno può essere
quello? Come posso evitarlo?
altra cosa, quando creo il modulo posso lasciare "Option Compare Database"?
Una volta copiata la funzione basta salvare il modulo, giusto? O devo fare
altro?
Ultimissima cosa, può essere che io uso access 2002?
Questo è quello che ho scritto nella Query1:
SELECT Tabella1.id, Tabella1.data, Tabella1.valuta, Tabella1.prelevamento,
Tabella1.versamento,
CCur(TotProgrQry("id",[id],"versamento","Query1")-TotProgrQry("id",[id],"pre
levamento","Query1")) AS saldo
FROM Tabella1
ORDER BY Tabella1.data, Tabella1.id;
Grazie per la pazienza

 Grazie per la pazienza



Il modulo l'ho chiamato Modulo1, non so più che fare. Ormai son disperata.
Questo è il database
www.pocketvg.com/depo.mdb
per caso hai ancora la prova che hai fatto?

 per caso hai ancora la prova che hai fatto?
Si: t lo ho inviato al tuo indirizzo e-mail.


 ha scritto nel messaggio
news:i2FR9.79937$Ou4.2...@twister2.libero.it...

l'indirizzo email è 
enr...@interfree.it
 senza SUX, ho convertito il file in
access97 
www.pocketvg.com/deposito97.mdb
 forse ora riesci. Ti ringrazio
ancora x l'aiuto.

 ha scritto nel messaggio
news:av78st$uel$1...@lacerta.tiscalinet.it...

Ho scaricato il tuo database in formato Access97.
Il motivo per cui Access ti dava l'errore da te segnalato era dovuto, come
ipotizzavo, al brutale copia/incolla che avevi fatto non del codice SQL di
Query1 (che era invece OK) ma del codice della funzione TotProgrQry
memorizzata in Modulo1. Se infatti apri la struttura di tale modulo vedrai
che le prime due righe sono evidenziate in rossso (infatti sono errate: il
contenuto delle due righe DEVE essere contenuto in un'unica riga oppure
occorre usare, alla fine della prima riga, il segno di underscore ( _ )
preceduto da uno spazio, per indicare l'andata a capo.
Prova a sostituire queste due righe, che vedi scritte in rosso con queste
tre righe:
Function TotProgrQry(KeyName As String, _
KeyValue, FieldNameToGet As String, _
NomeTabella As String) As Long
Inoltre c'era un altro problema: mi ero dimenticato di dirti che la funzione
TotProgrQry, memorizzata nel Modulo1, fa riferimento alla libreria Microsoft
DAO, e poiché tu usi una versione di Access successiva ad Access 97, DEVI
aggiungere al tuo database i riferimenti a tale libreria, cosa che ho anche
io dovuto fare per far funzionare il tuo database di esempio e che tu,
naturalmente, dovrai fare nel tuo.
Ho infine riaggiunto l'uso della funzione CCur, che, per cautela, ti avevo
detto di togliere.
Ho rispedito al tuo indirizzo e-mail il tuo database riveduto e corretto (e
finalmente funzionante).
Nel frattempo ti avevo reinviato, all'indirizzo di posta elettronica
corretto, anche il mio esempio con il quale avevo provato la soluzione che
ti avevo postato.


 ha scritto nel messaggio
news:cHYR9.82791$TC5.2...@twister1.libero.it...

Grazie mille, funge a perfezione! Mi spiace non aver capito che il problema
stava nella funzione ma purtroppo non avevo mai utilizzato funzioni e sono a
digiuno di VB. Scusa per il tempo che ti ho fatto perdere. Grazie ancora.
Ciao Enrica

 Ciao Enrica


 ha scritto nel messaggio
news:aZZR9.83140$Ou4.2...@twister2.libero.it...

per calcolare la differenza di giorni tra la valuta del record precedente e
la valuta del record corrente come posso modificare l'istruzione
giorni: [valuta]-[valuta] ?

 giorni: [valuta]-[valuta] ?
Se la tabella che contiene i dati si chiama Tabella1 ed ha la struttura che
abbiamo stabilito nei messaggi precedenti.
Se la query si chiama Query1.
Inserisci in un modulo del tuo database questa funzione:
Function PrevRecVal(KeyName As String, KeyValue, _
FieldNameToGet As String, NomeQuery As String)
   Dim RS As Recordset
   Dim db As Database
   On Error GoTo Err_PrevRecVal
   PrevRecVal = 0
   Set db = CurrentDb()
   Set RS = db.OpenRecordset(NomeQuery, dbOpenDynaset)
   Select Case RS.Fields(KeyName).Type
      Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
           DB_DOUBLE, DB_BYTE
         RS.FindFirst "[" & KeyName & "] = " & KeyValue
      Case DB_DATE
         RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
      Case DB_TEXT
         RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
      Case Else
         MsgBox "ERROR: Invalid key field data type!"
         Exit Function
   End Select
   RS.MovePrevious
   PrevRecVal = RS(FieldNameToGet)
   RS.Close
Bye_PrevRecVal:
    Exit Function
Err_PrevRecVal:
    Resume Bye_PrevRecVal
End Function
A questo punto aggiungi a Query1 il seguente campo calcolato:
giorni: IIf(PrevRecVal ("id"; [Id]; "valuta"; "Query1")<>0 ;[valuta] -
PrevRecVal ("id"; [id]; "valuta"; "Query1"); 0)
Naturalmente questa volta sarà necessario che tu ordini Query1 per valuta e
non per data: insomma, alla fine della fiera, Query1 avrà un codice SQL
simile a questo:
SELECT Tabella1.id, Tabella1.data, Tabella1.valuta, Tabella1.prelevamento,
Tabella1.versamento, CCur(TotProgrQry ("id",[id], "versamento", "Query1") -
TotProgrQry("id", [id], "prelevamento", "Query1")) AS saldo, IIf (PrevRecVal
("id", [Id], "valuta", "Query1")<>0, [valuta] - PrevRecVal ("id", [id],
"valuta", "Query1"), 0) AS giorni
FROM Tabella1
ORDER BY Tabella1.valuta, Tabella1.id;


 ha scritto nel messaggio
news:cXdS9.86013$TC5.2...@twister1.libero.it...

mi da' errore nel modulo: impossibile trovare il metodo o il membro dei dati
e mi segna in grigio FindFirst
e in giallo Function PrevRecVal(KeyName As String, KeyValue, _


 ha scritto nel messaggio
news:avbslp$t3o$1...@lacerta.tiscalinet.it...

Dimentico sempre che tu usi Access 2000; nella funzione PrevRecVal
sostituisci queste due righe di codice VBA:
Dim RS As Recordset
Dim db As Database
con queste altre due:
Dim RS As DAO.Recordset
Dim db As DAO.Database
Naturalmente do per scontato che al tuo database hai aggiunto i riferimenti
alla libreria Microsoft DAO.


 ha scritto nel messaggio
news:52iS9.86663$Ou4.2...@twister2.libero.it...
