Newsgroup: it.comp.appl.access
Titolo: fare calcoli su record precedente e successivo in report

ho già postato questo problema tempo fà e come consigliato ho scaricato 
l'esempio dal sito comune che spiega come fare riferimento con codice vba al 
record precedente o al successivo in riferimento al campo data
il codice che ho usato è il seguente ma non funziona correttamente, qualcuno 
di voi ha già affrontato il problema? esiste un modo più semplice?
Codice -----------------------------------------------------------
    saldo = Importo - PrevRecVal("data", [Data], "importo")
Funzione ----------------------------------------------------------
    '*************************************************************
    ' FUNCTION: PrevRecVal()
    ' PURPOSE: Retrieve a value from a field in the previous form
    '          record.
    ' PARAMETERS:
    '    F        - The form from which to get the previous value.
    '    KeyName  - The name of the form's unique key field.
    '    KeyValue - The current record's key value.
    '    FieldNameToGet - The name of the field in the previous
    '                     record from which to retrieve the value.
    ' RETURNS: The value in the field FieldNameToGet from the
    '          previous form record.
    ' EXAMPLE:
    '    =PrevRecVal(Form,"ID",[ID],"OdometerReading")
    '**************************************************************
   Dim RS As DAO.Recordset
   Dim db As DAO.Database
   On Error GoTo Err_PrevRecVal
   ' The default value is zero.
   PrevRecVal = 0
   Set db = CurrentDb()
   ' Get the form recordset.
   Set RS = db.OpenRecordset("CantieriMovimentiQ", dbOpenDynaset)
   ' Find the current record.
   Select Case RS.Fields(KeyName).Type
      ' Find using numeric data type key value?
      Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
           DB_DOUBLE, DB_BYTE
         RS.FindFirst "[" & KeyName & "] = " & KeyValue
      ' Find using date data type key value?
      Case DB_DATE
         RS.FindFirst "[" & KeyName & "] = #" & KeyValue & "#"
      ' Find using text data type key value?
      Case DB_TEXT
         RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
      Case Else
         MsgBox "ERROR: Invalid key field data type!"
         Exit Function
   End Select
   ' Move to the previous record.
   RS.MovePrevious
   ' Return the result.
   PrevRecVal = RS(FieldNameToGet)
   RS.Close
Bye_PrevRecVal:
    Exit Function
Err_PrevRecVal:
    Resume Bye_PrevRecVal
End Function

[cut]
Ciao Nicolas,
la function che hai postato
http://support.microsoft.com/default.aspx?scid=kb;en-us;101081
apre un recordset per ogni record sul quale devi effettuare il calcolo, di
conseguenza potrebbe risultare molto lenta.
Prova a impostare una subQuery all'interno di una query che poi sarà il
recordSource del tuop report :
SELECT ........, [importo]-(select max (importo) from TuaTabella as r2 where
r2.id
=TuaTabella_-1) AS prec
FROM tuaTabella.
ipotizzando che id sia un contatore crescente. Adatta comunque il nome
TuaTabella a quello che stai utilizzando.
Probabilmente si può fare di meglio, ma non mi è venuto nient'altro in mente
;-)
Buona notte,
Sandro

 ha scritto nel messaggio
news:430e4a8a$0$8496$5fc...@news.tiscali.it...

A mio avviso i motivi per cui il tutto non ti funziona possono essere più di
uno, inoltre dovresti dare qualche informazione:
1) Cosa vuoi ottenere?
2) Quale è la struttura dell'oggetto origine record del report?
3) A fronte di quale evento generi la riga di codice che determina il valore
del controllo saldo?
3) Hai "mutilato" e copiato male la funzione: ad esempio manca sicuramente
la prima riga di codice VBA che fra l'altro contiene il nome della funzione.
4) Quella funzione come è esplicitato è nata per essere usata in una
maschera e non in un report.
5) Comunque sia per ottenere un saldo progressivo in una maschera dovresti
usare le funzioni create ad hoc che trovi pubblicate sul Sito Comune e non
una funzione che, se copiata correttamente, dovrebbe far riferimento al
valore di un campo del record precedente.
6) Infine per ottenere il totale progressivo di un campo in un report non è
necessario richiamare alcuna funzione utente, in quanto esiste un metodo
"nativo" per farlo: basta impostare a Su tutto la proprietà Somma parziale
del controllo di cui si vuole ottenere il totale progressivo.
-- 
Roberto
-----------------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
----------------------------------------------------

 del controllo di cui si vuole ottenere il totale progressivo.
questo forse è quello che mi serve, grazie.


 questo forse è quello che mi serve, grazie.
Lo credo anche io.



cerco di spiegarmi meglio
avrei necessità di applicare un interesse come si fà negli estratti conto 
della banca
se saldo progressivo fra importo record precedente e importi precedenti è 
positivo applico un interesse altrimenti ne applico un altro
io apro un report entrate uscite per sempio
tipo             data          importo     saldo        interesse
versamento  01/01/01  10 euro      10 euro   1% su 10 euro
prelievo       02/01/01   15 euro      -5 euro   3% su 5 euro
versamento  03/01/01   5 euro          0 euro  nessun interesse
versamento  04/01/01   18 euro      18 euro  1% su 18 euro
questo è quello che esattamente vorrei ottenere nei record presenti nel 
corpo report
in questo modo riesci a consigliarmi la strada giusta da seguire?
Grazie.

 report, come ti ho già detto stai usando la strada sbagliata.
non si riesce a lavorare sul recordset che in quel momento usa per creare il 
corpo del report
per fare riferimento a prev e next record? grazie. 

 ha scritto nel messaggio
news:43108066$0$8496$5fc...@news.tiscali.it...

Per prima cosa ti ricordo che se dovessi ricalcolare gli interessi su
movimenti bancari non dovresti farlo dul saldo per data (o saldo in linea
capitali), ma sul saldo per valuta (o saldo liquido).
Comunque il mio consiglio è quello di calcolare gli interessi in un campo
calcolato di una query nella quale volendo potrai calcolarti anche il saldo
progressivo a partire dai valori del campo importo.
Per il calcolo del saldo progressivo userei uno dei metodi pubblicati nel
Sito Comune (link qui sotto), nella Sezione Queries nelle seguenti due FAQ:
1) 2.11 Come si può ottenere il totale progressivo di un campo in una query?
2) 2.16 Come si può ottenere il totale progressivo di un campo in una query
e come si può numerare progressivamente le righe di una query?
Invece per il calcolo degli interessi hai bisogno di far riferimento alla
data del record precedente per poter calcolare i giorni e quindi i numeri
che faranno montante al computo degli interessi.
A tale scopo, dal database scaricabile dalla FAQ "2.6 Esempi di utilizzo e
creazione di queries in Access 97" della Sezione Queries del Sito Comune
puoi utilizzare la seguente funzione:
Function PrevRecVal(NomeQuery, KeyName As String, KeyValue, FieldNameToGet
As String)
    '*************************************************************
    ' FUNCTION: PrevRecVal()
    ' PURPOSE: Retrieve a value from a field in the previous form
    '          record.
    ' PARAMETERS:
    '    NomeQuery - Nome della query
    '    KeyName  - The name of the unique key field.
    '    KeyValue - The current record's key value.
    '    FieldNameToGet - The name of the field in the previous
    '                     record from which to retrieve the value.
    ' RETURNS: The value in the field FieldNameToGet from the
    '          previous form record.
    ' EXAMPLE:
    '    =PrevRecVal("ID",[ID],"OdometerReading")
    '**************************************************************
   Dim RS As DAO.Recordset
   Dim db As DAO.DATABASE
   On Error GoTo Err_PrevRecVal
   ' The default value is zero.
   PrevRecVal = 0
   Set db = CurrentDb()
   ' Get the form recordset.
   Set RS = db.OpenRecordset(NomeQuery, dbOpenDynaset)
   ' Find the current record.
   Select Case RS.Fields(KeyName).Type
      ' Find using numeric data type key value?
      Case DB_INTEGER, DB_LONG, DB_CURRENCY, DB_SINGLE, _
           DB_DOUBLE, DB_BYTE
         RS.FindFirst "[" & KeyName & "] = " & KeyValue
      ' Find using date data type key value?
      Case DB_DATE
         RS.FindFirst "[" & KeyName & "] = #" & Format(KeyValue,
"mm/dd/yyyy") & "#"
      ' Find using text data type key value?
      Case DB_TEXT
         RS.FindFirst "[" & KeyName & "] = '" & KeyValue & "'"
      Case Else
         MsgBox "ERROR: Invalid key field data type!"
         Exit Function
   End Select
   ' Move to the previous record.
   RS.MovePrevious
   ' Return the result.
   PrevRecVal = RS(FieldNameToGet)
   RS.Close
Bye_PrevRecVal:
    Exit Function
Err_PrevRecVal:
    Resume Bye_PrevRecVal
End Function
La funzione di cui sopra l'ho ritoccata per renderla funzionante con la
versione italiana di Access e per rendere parametrico il nome della query.
Come avrai potuto notare tale funzione fa riferimento a Microsoft DAO
quindi, se usi una versione di Access successiva ad Access 97, devi
aggiungere al database i riferimenti a tale libreria.
Per fiunzionare la funzione ha bisogno di una che esista una chiave primaria
che nel tuo caso mi sembra sia rappresentata dal campo data.
Un esempio dell'utilizzo di tale funzione lo trovi nell'esempio il cui topic
è Referring to a Field in the Previous or Nex Record e maggiori dettagli in
merito li trovi al link:
http://support.microsoft.com/default.aspx?id=101081
Visto che il computo degli interessi lo farai nella query, nel report ti
limiterai a fare una lista dei dati contenuti nella query.


 ha scritto nel messaggio
news:4310c0fc$0$8487$5fc...@news.tiscali.it...

Ti avevo già anticipato nei miei messaggi precedenti che le soluzioni che si
trovano sul Sito Comune sono applicabili a queries o maschere e non a
report.
Vedi la mia risposta al tuo messaggio precedente.



ti ringrazio moltissimo ora ci provo e ti farò sapere l'esito. 

 Grazie.
Ciao Nicolas,
ipotizzando una tabella costituita cosě (riprendendo i dati che elenchi qui
sopra):
id_versamento    numerico/contatore
causale                testo
data                    data/ora
importo                valuta
prova a vedere se per il saldo progressivo ti puň aiutare questa query:
SELECT versamento.id_versamento, versamento.causale, versamento.data,
versamento.importo, nz((select sum(importo) from versamento as ver where
ver.id_versamento<=versamento.id_versamento and causale<>"prelievo")-(select
sum(importo) from versamento as ver where
ver.id_versamento<=versamento.id_versamento and
causale="prelievo"),[importo]) AS saldo
FROM versamento
Per quanto concerne il discorso degli interessi bisognerebbe avere piů
informazioni su come li devi gestire : se variano piů volte nel corso del
mese le cose si complicano un pochettino ( devi calcolare il tasso del
momento in base alle date).
E poi come dice Roby, manca sicuramente un campo valuta e uno per i giorni e
forse anche qualcos'altro che or ora non mi viene in mente.
Ciao, Sandro.


si esatto, devo considerare le date avrò una tabella interessi in cui andrò 
a prelevare l'interesse
in base alla data, provo la tua query e appena riesco ti faccio sapere, 
grazie.