Newsgroup: it.comp.appl.access
Titolo: Help me please

Salve, sono nuovo di qui e avrei una questione da porvi.
Ho la necessità di sommare il valore di un campo con il valore del campo
superiore allo stesso, come posso fare? ho la necessità di usare una
maschera di tipo foglio dati
grazie per le eventuali risposte

 ha scritto nel messaggio
news:IvRLb.67746$VW.28...@news3.tin.it...

Ciao Tiburzi
Ben arrivato, in questo NG ci sono alcune regolette da rispettare. La prima
sarebbe quella di mettere un Oggetto (subject) significativo del problema.
Le altre le trovi nel post di Roberto "Come ci si dovrebbe comportare in un
newsgroup" Istruzioni per l'uso. Spiega meglio cosa vuoi fare, anche,
facendo un esempio pratico.
Ciao Daniele


ok grazie delle esplicazioni, scusa ancora ma vedi è un problema che dovrei
risolvere in brevissimo tempo per un lavoro e sono stato forse un po'
affrettato e poco chiaro
provo a ripetere
Praticamente ho una tabella collegata ad una maschera di inserimento. Questa
maschera ha come layout il foglio di dati. In questa maschera ci sono 5
campi, uno di codice, uno di data, uno di misurazione (numerico) e 2 di
calcolo.
Praticamente ho necessita di associare ai 2 di calcolo delle funzioni (o
espressioni, o formule) ricavando dei valori dal campo di misurazione in
questo modo.
Il campo di misurazione è progressivo, tipo un contatore, io ogni volta ho
la necessità di sottrarre dal valore della misurazione quello della
misurazione precedente e poi moltiplicarlo per determinati valori altri.
Come posso fare??
Spero di essere stato più chiaro
grazie

 ha scritto nel messaggio
news:JOULb.68904$VW.29...@news3.tin.it...

Crea una query di selezione usando due volte la stessa tabella. Unisci con
un join le due tabelle usando il campo contatore.
Modifica la struttura della query tramite sql, in modo che il join avvenga
tra valori del contatore differenti di una unità.
Nel mio caso ho fatto una prova con una tabella che ho chiamato Tabella2 e
nella quale ho inserito un campo di tipo numerico chiamato "progressivo" ed
un altro campo di tipo numerico chiamato campo1. Nella query ho chiamato con
ValorePrecedente il campo1 della "prima" tabella e con ValoreSuccessivo il
campo1della "seconda" tabella. Ho poi fatto il join tra i due campi
"progressivo" ed ho aggiunto una formula di sottrazione (il campo l'ho
chiamato esito) tra i due campi "campo1".
Inizialmente la struttura SQL sarà così:
SELECT Tabella2.campo1 AS ValorePrecedente, Tabella2_1.campo1 AS
ValoreSuccessivo, [ValoreSuccessivo]-[ValorePrecedente] AS Esito
FROM Tabella2 INNER JOIN Tabella2 AS Tabella2_1 ON
Tabella2.progressivo=Tabella2_1.progressivo;
Devi modificarla in questo modo:
SELECT Tabella2.campo1 AS ValorePrecedente, Tabella2_1.campo1 AS
ValoreSuccessivo, [ValoreSuccessivo]-[ValorePrecedente] AS Esito
FROM Tabella2 INNER JOIN Tabella2 AS Tabella2_1 ON
Tabella2.progressivo=Tabella2_1.progressivo-1;
l'unica variazione è che il join non è più tra valori uguali dello stesso
campo, ma tra il valore corrente e quello precedente (cioè diminuito di
uno).
Un accorgimento è legato al campo Progressivo: è sconsigliabile usare un
campo di tipo contatore perchè potresti, eliminando qualche record, non
trovare più la consecutività di valori tra un record ed il successivo.
Un altro accorgimento è quello, una volta modificato il codice SQL di non
aprire la query in modalità struttura, perchè altrimenti il join viene
eliminato e devi ricrearlo e poi modificarlo nuovamente.
Spero di essere stato chiaro.
Ciao
Salvatore

 ha scritto nel messaggio
news:btpl4k$isc$1...@lacerta.tiscalinet.it...

La soluzione pur funzionando è sporca, necessita di troppe attenzioni...!
Perchè invece non hai realizzato una Funzione Public alla quale passi l'ID
del Record
attuale e il Valore, nella Function apri un Recordset in Sola Lettura e
poichè saranno in ordine ID
ti basterà fare un FindFirst ID, poi MovePrevious, ora hai il contenuto del
Record Precedente
Fai tutte le operazioni che vuoi ed associ all'esito della Functionil
Valore.
Nella QRY metti un nuovo Campo chiamato Esito:=NomeFunzione([ID];[Valore]).
E' noto che in una Qry Select la Function viene richiamata ad ogni Row, di
conseguenza
non puoi sbagliare.
Ciao.
@Alex.

 ha scritto nel messaggio
news:btpvpn$peo$1...@lacerta.tiscalinet.it...

Ciao, Alessandro
Ho provato il tuo metodo (in effetti è molto più funzionale, ma volevo
evitare di usare VBA) ed ho sviluppato la funzione in questo modo, seguendo
i tuoi consigli:
Public Function calcolo(ID, misura1)
Dim rst1 As Recordset
Dim valore As Double
Dim criterio As String
Set rst1 = CurrentDb.OpenRecordset("MiaTabella", dbOpenDynaset)
On Error GoTo errore 'serve per gestire l'errore legato al primo record (non
essendoci un record precedente...)
criterio = "ID=" & ID
rst1.FindFirst criterio
rst1.MovePrevious
valore = rst1!misura1 'associa a valore il numero trovato nel campo misura1
del record precedente a quello corrente
calcolo = CDbl(misura1 - valore)
Exit Function
errore:
calcolo = 0
Exit Function
End Function
Volevo chiederti: c'è un modo per gestire l'errore dovuto al primo record,
senza ricorrere ad On Error? In altre parole, come posso far capire alla
funzione che sta operando sul primo record?
Ciao
Salvatore

 ha scritto nel messaggio
news:btrfa0$iqs$1...@lacerta.tiscalinet.it...

Devi solo verificare il Rs.BOF....!
In pratica prima di eseguire il Tutto verifica :
If NOT rss1.BOF then ....!
Ricordati in ogni caso che si può ottimizzare ulteriormente, il
Recordset lo apri solo alla prima entrata nella Function, se dichiari
il Recordset come Public e alla chiamata della Function lo verifichi
eviti il tempo di apri e chiudi, devi però inserire il controllo per
chiuderlo quando ID=LastRecord
Dim flRsOpen as Boolean
Dim Rs as DAO.Recordset
Public Function calcolo(ID, misura1)
Dim valore As Double
Dim criterio As String
Dim flLast as Boolean
 If not flrsOpen then
     Set rs = CurrentDb.OpenRecordset("MiaTabella", dbOpenDynaset)
    rs.movelast
    MaxRs=rs.Recordcount
    rs.movefirst
    flrsOpen=true
 End if
 if Not rs.BOF then
     criterio = "ID=" & ID
     rs.FindFirst criterio
    flLast=rs.EOF
     rs.MovePrevious
     valore = rs!misura1 'associa a valore il numero trovato nel campo
misura1
     del record precedente a quello corrente
     calcolo = CDbl(misura1 - valore)
else
    Calcolo=Misura1
end if
if flLast then rs.Close:set rs=Nothing
End Function
Pensavo ad una cosa del genere, si potrebbero usare le variabili STATIC ma
non ho mai avuto molta confidenza......!
@Alex.

[tagliato]

Ho testato il codice, ma si verifica l'errore del tipo nessun record trovato
(dovuto al MovePrevious). Sarà perché BOF verifica se la posizione del
record corrente precede il primo record del recordset, ma non se la
posizione coincide?
Ciao
Salvatore


Si hai ragione, allora basta mettere un OnError Goto ma devi riconoscere
l'errore If Err.Number=....... allora non fare nulla...!
Per trovare il Numero dell'errore io lo scateno e mi tengo nota, poi lo
iinserisco nella Routine.....!
Non puoi generalizzare l'errore, potresti avere altri errori, spero di no,
ma andrebbero
gestiti come si fa con una gestione errori....!
In ogni caso la cosa va aggiustata, non l'ho provata, ma buttata giù a
logica...!
Ciao.
@Alex.

Grazie dell'aiuto a tutti e due, ma ho un problema, se vado ad
inserire questo codice mi dice sulla stringa
Set rst1 = currentdb.openrecordset("xyz",dbopendynaset)
tipo non corrispondente
come mai?????
Uso questa funzione su una maschera su di una tabella, e se metto il
nome della tabella da richiamare mi fa cosě
se metto la query sql mi dice che non ha trovato nessun valore
che posso fare???
quali riferimenti devo spuntare???

 wrote in message
news:f9b3acc9.04011...@posting.google.com

DAO 3.51 o 3.6, devi andare dalla pagina Codice in STRUMENTI
RIFERIMENTI Togli Microsoft Activex Data Object 2.x e cerca
Microsoft DAO 3.xx, poi eventualmente ti servano ripristina anche
i primi....!
Compila.....!
@Alex.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie ancora, ma posso usare solo l'id per fare findfirst, findprevious
ecc?????
perchè avrei necessità di fare un find con un campo testo
come posso fare???

 ha scritto nel messaggio
news:aJAMb.78636$VW.32...@news3.tin.it...

Il tutto sarebbe più funzionale con un Campo di tipo Numerico,
ma credo che possa funzionare anche con campo testo, solo
devi aggiungere i doppi apici per la Condizione del FindFirst...!
Ciao.
@Alex.


Ho provato a fare una stringa cosě
dim str as string
str = "codice =" & codice.value
e poi faccio findfirst str
ma mi da errore

 ma mi da errore
Ma mi hai ascoltato quando ti dicevo di inserire i doppi APICI...???
str = "codice ='" & codice & "'"
Io preferisco questa sotto:
str = "codice =" & chr(34) & codice & chr(34)   'Value non serve è la
proprietà di Default
Riprova ora...!
@Alex.

 @Alex.
Scusa, avevo capito male, per doppio apice avevo capito questo " e non 2
volte questo '
domani mattina provo
grazie per l'aiuto e la pazienza, ti farņ una statua ;)


Ecco allora spiegato perchè non ne hai messo nemmeno uno...!!!!! ;-)
Usa la 2° ciao.
@Alex.