Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

HELP: operazioni su record successivi???

791 views
Skip to first unread message

Flavio

unread,
Feb 11, 1999, 3:00:00 AM2/11/99
to
Problema:

Sto predisponendo un semplice database per gestire un conto corrente.
Ho creato una tabella dove si inseriscono le varie operazioni con i
seguenti campi:
0) ID
1) data
2) valuta
3) descrizione operazione
4) importo

Successivamente ho creato una query di selezione dove raggruppo i record
della precedente tabella per valuta in modo che mi venga fuori il saldo
capitali per valuta.

Il problema viene ora: devo calcolare la differenza, in giorni, tra una
valuta e quella immediatamente successiva, e via cosě fino all'ultimo
record. Il mio problema č che non so come far leggere al computer il
campo "valuta" del record successivo per confrontarlo con quello
corrente.

Spero di essere stato abbastanza chiaro, ma soprattutto spero in un vs.
aiuto....io con access sono solo ai primi passi come potete vedere!!

In ogni caso, se la mia spiegazione non č sufficiente per capire il
problema, ben volentieri vi spedisco il "pezzo" di database che ho
creato per darci un'occhiata.

Grazie in anticipo

Flavio

Andrea Sciamanna

unread,
Feb 11, 1999, 3:00:00 AM2/11/99
to
>Il problema viene ora: devo calcolare la differenza, in giorni, tra una
>valuta e quella immediatamente successiva, e via cosě fino all'ultimo
>record. Il mio problema č che non so come far leggere al computer il
>campo "valuta" del record successivo per confrontarlo con quello
>corrente.


Se la query di selezione č corretta, puoi utilizzare del codice (vedi tu
dove mettere questo codice: pressione di un pulsante o roba del genere); il
codice č molto grezzo e va adattato alle tue esigenze (mancano tanti
controlli sul recordset):

dim db as database
dim rs as recordset

dim Data1 as date
dim Data2 as date
dim DiffData as date

set db = currentdb()
set rs = db.openrecordset(nomequery)

Data1 = rs.valuta
rs.movenext
Data2 = rs.valuta

DiffData = DateDiff("d", Data1, Data2)

db.close
set db = nothing

Flavio

unread,
Feb 14, 1999, 3:00:00 AM2/14/99
to
Innanzitutto grazie per la risposta,

ma come devo fare per inserire un campo che mi calcoli i giorni tra una
valuta e l'altra in una query con il codice che mi hai dato??

Forse la mia č una domanda stupida e banale, ma io Access lo so usare
molto poco.

Ancora grazie per la risposta.

Flavio

P.S.: non č che per caso ti posso spedire il db per vedere come si puň
fare??

Andrea Sciamanna

unread,
Feb 14, 1999, 3:00:00 AM2/14/99
to
>ma come devo fare per inserire un campo che mi calcoli i giorni tra una
>valuta e l'altra in una query con il codice che mi hai dato??


Non ho capito.

Se vuoi ottenere la differenza fra due giorni, guarda il codice. ho inserito
una funzione:

DiffData = DateDiff("d", Data1, Data2)

Questa ti da la differenza in giorni. Puoi se vuoi mettere questo dato in
una query, è sufficente richiamare la funzione dalla stessa query.

>P.S.: non è che per caso ti posso spedire il db per vedere come si può
>fare??

Non te la prendere, ma la risposta è no, grazie.

Lbo da casa

unread,
Feb 15, 1999, 3:00:00 AM2/15/99
to
>Il problema viene ora: devo calcolare la differenza, in giorni, tra una
>valuta e quella immediatamente successiva, e via cosė fino all'ultimo

>record. Il mio problema č che non so come far leggere al computer il
>campo "valuta" del record successivo per confrontarlo con quello
>corrente.

dunque, del mio conto in banca se ne occupa un board di commercialisti
svizzeri, quindi non so di preciso come vanno le cose, comunque ho
avuto una necessita' simile, ma "al contrario": dovevo calcolare la
percentuale di incremento di un certo valore dalla rilevazione
precedente a quella corrente.

per fare cio' intanto ho scritto una funzione che dato l'id di un
record ne identificasse l'id quello precedente: e' necessario pero'
che gli id, anche se non "compatti" (1, 2, 3... senza buchi), siano
comunque progressivi (prima ci deve sempre stare un valore piu' basso
che dopo). nel mio caso usavo un campo dataora ma non lo consiglierei
nel tuo caso perche' potresti avere piu' movimenti nello stesso
giorno. inoltre, se dovesse servire relazionare, farlo tramite un
campo dataora mi sembra un po' una porcheria.

nel tuo caso occorre identificare l'id successivo.

a dire il vero, facendo mente locale non e' he servisse scrivere una
funzione apposta, basterebbe questa riga:

dim curr_id as (quel che e')
dim next_id as (quel che e')
[...]
next_id=dmin("campo_id", "nome_tabella", "campo_id > " & curr_id)

pero' dovevo fare altre cose. il terzo argomento di next_id e' un
pezzo di query sql, valgono quindi le solite avvertenze del caso: se
il valore e' una stringa, va messo un apice all'inizio e uno alla fine
del valore, senza spazi, se e' una data vanno messi due # e formattato
all'americana (mm/gg/aa, o meglio dd/mm/yy), se e' un numerico va bene
cosi'.

a questo punto potrebbe anche darsi che curr_id sia l'id dell'ultimo
record. in questo caso il dmin di cui sopra ti restituirebbe un
valore null. dovrai gestirlo nei modi opportuni, dai uno sguardo alle
funzioni isnull e nz sull'help.

per identificare il campo che ti serve del recordo successivo usi una
cosa simile a dmin, dlookup (ci sono tutta una serie di cosiddette
funzioni aggregated-qualcosa, sono interessanti, vedile sull'help,
basta trovarne una e le altre le trovi sul "vedi anche"):

next_campo=dlookup("nome_campo", "nome_tabella", "ID = " & next_id)

a dire il vero in questa riga potresti direttamente scrivere, al posto
di next_id, tutto il dmin, ma magari il codice risulta meno leggibile.

se vuoi ottenere il risultato di queste elaborazioni in un campo di
una query (operazione lodevolissima) ti scrivi in un modulo una
funzione del genere:

function diff_giorni(n_campo_id as string, val_campo_id as variant,
n_tab as string, n_campo as string) as long

dim next_id as (quel che e')
dim next_data as data
dim curr_data as data

next_id=dmin(n_campo_id, n_tab, n_campo_id & " > " & val_campo_id)

curr_data=dlookup("nome_campo_data", "nome_tabella", n_campo_id & " =
" & val_campo_id)

next_data=dlookup("nome_campo_data", "nome_tabella", "ID = " &
next_id)

if isnull(next_data) then
diff_giorni=0 ' siamo all'ultimo record
else
diff_giorni=datediff... ' e qui te l'ha spiegato andrea
end if

end function

a questo punto, in una delle caselle libere in alto della griglia con
cui componi le query ci vai a mettere questa funzione, passandogli gli
argomenti separati da un punto e virgola.

quando visualizzi la query in modo foglio dati vedrai in quella
colonna la differenza in giorni.

vedrai che a farlo e' molto meno un casino che a dirlo.

ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø
non vi offendete se non rispondo ad email di richieste tecniche. piuttosto postatele sul ng!
ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø

my opinions do not necessarily have to be true.

ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø
per rispondermi rimuovere NOSPAM. dall'indirizzo email
to answer me remove NOSPAM. from email address
ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø,ļ_ļ,ø*°`°*ø


Flavio

unread,
Feb 17, 1999, 3:00:00 AM2/17/99
to
No, stai tranquillo non me la prendo.

Ho provato a scrivere il codice che mi hai dato:

Public Function DifferenzaValuta()
Dim db As Database
Dim rs As Recordset
Dim Data1 As Date
Dim Data2 As Date
Dim DifferenzaValuta As Date
Set db = CurrentDb()
Set rs = db.OpenRecordset(ScalarePerValuta)
Data1 = rs.Valuta
rs.MoveNext
Data2 = rs.Valuta
DifferenzaValuta = DateDiff("d", Data1, Data2)
db.Close
Set db = Nothing
End Function

e ad inserire nella query (ScalarePerValuta) un campo di questo tipo:
Giorni: DifferenzaValuta()

Quando lancio la Query mi dà il seguente errore:
Funzione "DifferenzaValuta" non definita nell'espressione.

Dove sto sbagliando??

Ti ringrazio per il tempo che stai dedicandomi...spero un giorno di
poter ricambiare

Flavio

Flavio

unread,
Feb 17, 1999, 3:00:00 AM2/17/99
to
Intanto ti ringrazio della dettagliatissima risposta!!!

Ho un solo problema ad applicare quello che mi dici: non credo di poter
stabilire alcun indice poiché, i dati, in particolare le valute, vengono
presi da una tabella dove vengono inserite le operazioni di c/c andando
a riempire i seguenti campi:
1. Data
2. Valuta
3. Descrizione Operazione
4. Importo

Andando ad inserire un campo per l'indice, cioè un campo ID, non posso
poi comunque garantire che in sede di query, quando raggruppo e riordino
le suddette operazioni per Valuta, gli indici rimangano in ordine
progressivo.

Giusto o mi sbaglio??

Flavio

Andrea Sciamanna

unread,
Feb 18, 1999, 3:00:00 AM2/18/99
to
>Public Function DifferenzaValuta()
Public Function DifferenzaValuta() as integer

[...]


>Quando lancio la Query mi dà il seguente errore:
>Funzione "DifferenzaValuta" non definita nell'espressione.
>
>Dove sto sbagliando??


Beh, come ti ho già scritto, la funzione qui sopra è moltog rezza. Così
com'è fa la differenza dei primi due record del recordset.

Cmq, com puoi vedere, dei specificare il tipo restituito dalla funzione
(almeno, credo che l'errore fosse dovuto a quello).

Federico Luciani

unread,
Feb 18, 1999, 3:00:00 AM2/18/99
to
Flavio wrote:
> No, stai tranquillo non me la prendo.
> Ho provato a scrivere il codice che mi hai dato:
>
> Public Function DifferenzaValuta()
> Dim db As Database
> Dim rs As Recordset
> Dim Data1 As Date
> Dim Data2 As Date

> Dim DifferenzaValuta As Date
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
DifferenzaValuta e' il nome della funzione, non puoi
definirla come variabile!!!
Elimina questa riga. Inoltre DateDiff ritorna un long,
quindi imposta il tipo restituito dalla funzione in questo
modo Public Function DifferenzaValuta() as Long

> Set db = CurrentDb()
> Set rs = db.OpenRecordset(ScalarePerValuta)
> Data1 = rs.Valuta
> rs.MoveNext
> Data2 = rs.Valuta
> DifferenzaValuta = DateDiff("d", Data1, Data2)
> db.Close
> Set db = Nothing
> End Function

--
Federico

--------------------------------------
Rimuovi paperino. per e-mail
--------------------------------------
Sito Comune di it.comp.database.access
http://members.xoom.com/it_db_access
--------------------------------------

Andrea Sciamanna

unread,
Feb 18, 1999, 3:00:00 AM2/18/99
to
>> Dim DifferenzaValuta As Date
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> DifferenzaValuta e' il nome della funzione, non puoi
>definirla come variabile!!!
> Elimina questa riga. Inoltre DateDiff ritorna un long,
>quindi imposta il tipo restituito dalla funzione in questo
>modo Public Function DifferenzaValuta() as Long


Ecco, mi sono accorto di due cavolate che ho fatto :-)

Lbo da casa

unread,
Feb 19, 1999, 3:00:00 AM2/19/99
to
>Andando ad inserire un campo per l'indice, cioè un campo ID, non posso
>poi comunque garantire che in sede di query, quando raggruppo e riordino
>le suddette operazioni per Valuta, gli indici rimangano in ordine
>progressivo.
>
>Giusto o mi sbaglio??

giusto... magari potresti aggregare i movimenti per data?
--------------------------------------------
buona giornata, cosa puoi fare per aiutarmi?
--------------------------------------------

togliere NOSPAM. per mandare email

Flavio

unread,
Feb 19, 1999, 3:00:00 AM2/19/99
to
Purtroppo non posso ordinarli neanche per data.

Mi sai spiegare perché il seguente codice mi segna errore in:
Set rs = db.OpenRecordset(OperazioniPerValuta) ??
^^^^^^^^^^^^^^^^^^^

Public Function Diff() As Variant

Dim db As Database
Dim rs As Recordset
Dim Data1 As Date
Dim Data2 As Date

Set db = CurrentDb()

Set rs = db.OpenRecordset(OperazioniPerValuta)
Data1 = rs!Valuta
rs.movenext
Data2 = rs!Valuta


db.Close
Set db = Nothing

End Function

Dal momento che "ScalarePerValuta" è il nome della mia query di
selezione??

Io di VBA non conosco niente, ma devo cercare di risolvere questo
problmea in qualche modo!!!Mi puoi auitare??

Flavio

unread,
Feb 19, 1999, 3:00:00 AM2/19/99
to

Mi sai spiegare perché il seguente codice mi segna errore in:
Set rs = db.OpenRecordset(OperazioniPerValuta) ??
^^^^^^^^^^^^^^^^^^^

Public Function Diff() As Variant

Dim db As Database
Dim rs As Recordset
Dim Data1 As Date
Dim Data2 As Date

Set db = CurrentDb()

Set rs = db.OpenRecordset(OperazioniPerValuta)
Data1 = rs.Valuta
rs.movenext
Data2 = rs.Valuta
Diff = DateDiff("d", Data1, Data2)

db.Close
Set db = Nothing

End Function

Dal momento che "ScalarePerValuta" è il nome della mia query di
selezione??

Io di VBA non ne capisco niente, ma devo cercare di risolvere questo
problmea in qualche modo!!!Mi puoi auitare??Te ne sarei grato
all'infinito!!

Flavio

Flavio

unread,
Feb 19, 1999, 3:00:00 AM2/19/99
to
Mi sai spiegare perché il seguente codice mi segna errore in:
Set rs = db.OpenRecordset(OperazioniPerValuta) ??
^^^^^^^^^^^^^^^^^^^

Public Function Diff() As Variant

Dim db As Database
Dim rs As Recordset
Dim Data1 As Date
Dim Data2 As Date

Set db = CurrentDb()

Set rs = db.OpenRecordset(OperazioniPerValuta)


Data1 = rs!Valuta
rs.movenext
Data2 = rs!Valuta

db.Close
Set db = Nothing

End Function

Dal momento che "ScalarePerValuta" è il nome della mia query di
selezione??

Io di VBA non capisco niente, ma devo cercare di risolvere questo
problmea in qualche modo!!!Mi puoi auitare??Te ne sarei grato in
eterno!!

Lbo da casa

unread,
Feb 20, 1999, 3:00:00 AM2/20/99
to
>Set rs = db.OpenRecordset(OperazioniPerValuta) ??
> ^^^^^^^^^^^^^^^^^^^

>Set rs = db.OpenRecordset(OperazioniPerValuta)

>Dal momento che "ScalarePerValuta" č il nome della mia query di
>selezione??

allora, intanto tu scrivi una volta Operazioni per valuta e un'altra
ScalarePerValuta.

nella riga di codice come argomento di openrecordset access crede che
debba usare una *variabile*, variabile che si chiama
OperazioniPerValuta. lui crede che OperazioniPerValuta sia una var
perche' non l'hai messo tra virgolette. la riga avrebbe dovuto
essere:

Set rs = db.OpenRecordset("OperazioniPerValuta")

questo pero' se esiste davvero la tabella o query OperazioniPerValuta,
visto che altrove parli di ScalarePerValuta.

un esempio del settaggio di un recordset usando una variabile e' il
seguente:

dim r1 as recordset
dim r2 as recordset
dim r3 as recordset

dim ssql as string
dim nome_tab as string

ssql="SELECT * FROM NomeTabella"
nome_tab="NomeTabella"

set r1=currentdb.openrecordset(ssql)
set r2=currentdb.openrecordset(nome_tab)
set r3=currentdb.openrecordset("NomeTabella")

tutti e tre i recordset sono equivalenti.

Andrea Sciamanna

unread,
Feb 20, 1999, 3:00:00 AM2/20/99
to

>Mi sai spiegare perché il seguente codice mi segna errore in:
>Set rs = db.OpenRecordset(OperazioniPerValuta) ??
> ^^^^^^^^^^^^^^^^^^^


Scrivi

Set rs = db.OpenRecordset("OperazioniPerValuta")

che è meglio.

Flavio

unread,
Feb 21, 1999, 3:00:00 AM2/21/99
to
Grazie mille per la spiegazione……finalmente mi funziona!!!!
O meglio…mi funziona in parte!!

Questa è la funzione che ho scritto (Con il Vs. onnipresente Aiuto!!):

Option Compare Database
Option Explicit
---------------------------------------------------------
Public Function Diff() As Long

Dim db As Database
Dim rs As Recordset

Dim Data1 As Date
Dim Data2 As Date

Set db = CurrentDb()


Set rs = db.OpenRecordset("OperazioniPerValuta")

Data1 = rs![Valuta]

rs.MoveNext

Data2 = rs![Valuta]

Diff = DateDiff("d", Data1, Data2)

End Function

Ora però ho il seguente problema:

la funzione Diff() io l'ho messa nella griglia di struttura della Query
"ScalarePerValuta" che è composta quindi dai seguenti campi:
Valuta --- Importo ---- Giorni: Diff()

La suddetta Query non è altro che una Query di selezione con origine la
Query, sempre di selezione, "OperazioniPerValuta" sulla quale la mia
funzione Diff andava a lavorare.

Il problema è che il calcolo nel campo "Giorni: Diff()" viene eseguito
giusto solo nel primo record. Negli altri record, cioè in quelli
successivi, mi viene restituito sempre lo stesso valore del primo
record, e cioè la differenza tra la Valuta del 1° record e quella del 2°
della Query "OperazioniPerValuta"!!

E' come se la funzione Diff() non tenesse conto in quale record si trovi
e quindi va ad eseguire il calcolo sempre sui primi due record della
Query "OperazioniPerValuta".

Spero di essere stato sufficientemente chiaro….

Ti ringrazio in anticipo per le solite dettagliatissime spiegazioni che
gentilmente mi fornisci!!!

Spero un giorno di poter ricambiare!!

Flavio


Lbo da casa wrote:
> allora, intanto tu scrivi una volta Operazioni per valuta e un'altra
> ScalarePerValuta.
>
> nella riga di codice come argomento di openrecordset access crede che
> debba usare una *variabile*, variabile che si chiama
> OperazioniPerValuta. lui crede che OperazioniPerValuta sia una var
> perche' non l'hai messo tra virgolette. la riga avrebbe dovuto
> essere:
>

> Set rs = db.OpenRecordset("OperazioniPerValuta")
>

Flavio

unread,
Feb 21, 1999, 3:00:00 AM2/21/99
to
Grazie,……finalmente mi funziona!!!!

Data1 = rs![Valuta]

rs.MoveNext

Data2 = rs![Valuta]

End Function

Ti ringrazio in anticipo per le immancabili spiegazioni che gentilmente
mi fornisci!!!

Spero un giorno di poter ricambiare!!

Flavio


Andrea Sciamanna wrote:
>
> >Mi sai spiegare perché il seguente codice mi segna errore in:
> >Set rs = db.OpenRecordset(OperazioniPerValuta) ??
> > ^^^^^^^^^^^^^^^^^^^
>
> Scrivi
>

> Set rs = db.OpenRecordset("OperazioniPerValuta")
>

> che è meglio.

Lbo da casa

unread,
Feb 21, 1999, 3:00:00 AM2/21/99
to
>Public Function Diff() As Long
[...]

>Diff = DateDiff("d", Data1, Data2)
[...]

>Il problema è che il calcolo nel campo "Giorni: Diff()" viene eseguito
>giusto solo nel primo record. Negli altri record, cioè in quelli

ma certo! tu non passi nessun argomento alla funzione diff()! come
fa la funzione diff a sapere su quali valori deve effettuare il
datediff?

tu setti dei recordset, e vabbe'. il recordset una volta settato
punta al primo record. all'interno della funzione non cambia mai
niente, ecco perche' ti da sempre gli stessi valori.

alla funzione devi passare argomenti diversi su cui lavorare.

in realta' non serve che ti crei una funzione apposta, visto che le
fai fare praticamente solo un datediff. scrivi datediff direttamente
nella query passando come argomenti i campi della query stessa.

ah, per favore, elimina le righe di quote non necessarie.

Federico Luciani

unread,
Feb 22, 1999, 3:00:00 AM2/22/99
to
Flavio wrote:
>
> Mi sai spiegare perché il seguente codice mi segna errore in:
> Set rs = db.OpenRecordset(OperazioniPerValuta) ??
> ^^^^^^^^^^^^^^^^^^^
> Dal momento che "ScalarePerValuta" è il nome della mia query di
> selezione??

Spero tu abbia messo le virgolette?

Set rs = db.OpenRecordset("ScalarePerValuta")

0 new messages