Flavio mi ha scritto perchè aveva il problema di valorizzare un campo di un record di una tabella a partire dal valore di un altro campo del record immediatamente precedente. La soluzione del problema ha comportato un nutrito scambio di e-mail ma nel seguito riporto solo i passaggi più significativi per comprendere la soluzione del problema.
Ciao Michele as Simplex2, spero tu possa aiutarmi rispondendo ad un quesito che per te sembrerà sciocco ma per un autodidatta come me no.
Access: devo calcolare il consumo di una cisterna di kerosene; l'operatore effettua la lettura prima del prelievo, poi lo rilegge a operazione conclusa. La tabella che ho creato è:
id | data | [read n2] | [read n1] | consumption |
1 | 01/01/08 | 100 | 200 | 100 |
2 | 02/01/08 | |||
Il mio problema è: come faccio nella seconda prova a effettuare la sottrazione tra l'ultima lettura e il [read n2]=200 che era l'ultima lettura registrata. Dovrebbe trattarsi di operazioni tra record l'ultimo record con un nuovo inserito, ma non ci riesco Chiedo il tuo aiuto Spero di non averti "rotto". Rimango a tua disposizione per qualsiasi altra cosa per ricambiare.
A presto Flavio
Ciao, si può anche fare con una sola query ma diventa piuttosto complicato. Meglio usare due query. Nelle condizioni del problema che mi hai illustrato devi:
1) Prelevare prima il valore [read n2] dell'ultimo record inserito. Ti aiuta il campo temporale data (che ti suggerisco di tipo DateTime in modo da avere anche l'orario);
SELECT [read n2] FROM TABELLA WHERE DATA = (SELECT MAX(DATA) FROM TABELLA WHERE [read n2] IS NOT NULL)
2) Memorizzare il valore estratto in una variabile (es. UltimaLettura);
3) Inserire un nuovo record;
INSERT INTO TABELLA(data, [read n2], [read n2], consumption) VALUES(Now(), UltimaLettura, LetturaAttuale, LetturaAttuale-UltimaLettura)
Fatto? Fammi sapere.
Flavio Risponde:
Innanzitutto ti voglio ringraziare tantissimo per la tua disponibilità.
Purtroppo Michele mi hai sopravalutato troppo non sono in grado di
applicare una tale spiegazione.
Se ti offro un caffè virtuale reversibile in reale se vieni da queste
parti (.......), me la creeresti tu la query e da li' io la personalizzo?
Se lo preferisci macchiato fammelo sapere!!!
A presto, spero
Michele dimenticavo, ho ricevuto anche un altro aiuto direttamente da un
compaesano di Mr Putin dagli un'occhiata
Hi,
As I understand - you need to [read n1]
of new record to [read n1] of
previous record,
this you can do using: Dlast("[read
n2]","mytable") and Diff you can calculate
in a query
Sostanzialmente dice la stessa cosa che ti suggerivo io, solo che il nostro amico usa la funzione DLast() invece della query.
ATTENZIONE: Le funzioni DLast() e DFirst() sono abbastanza pericolose perchè potrebbero restituire valori non previsti, specialmente in ambiente concorrente. Il presente articolo della Microsoft, che è un estratto del manuale in linea di Access, è illuminante al riguardo:
http://office.microsoft.com/it-it/access/HA012288231040.aspx
DLast e DFirst, se non stabilisci un ordinamento mediante una query nel parametro 'dominio', restituiscono un record casuale.
Flavio Risponde:
Michele fammi sapere qualcosa che devo realizzare il db.
Grazie, Ciao
Flavio
Prova ad inserire in un modulo questa procedura.
Ciao e fammi Sapere
Michele
Sub aggiornaLettura(LetturaAttuale As Long) Dim MySql As String Dim RecSet As DAO.Recordset '<-- se ti da errore, no problem. Inserire i riferimenti a DAO (vedi figura allegata) Dim UltimaLettura As Long 'Lettura precedente'Imposto la query MySql = "SELECT [read n2] FROM Tabella1 WHERE data = (SELECT MAX(data) FROM Tabella1 WHERE [read n2] IS NOT NULL)" Set RecSet = CurrentDb.OpenRecordset(MySql) ' Se ci sono dati da leggere ..... If RecSet.EOF = False Then ' ... prendo il valore della precedente lettura UltimaLettura = RecSet.Fields(0) RecSet.Close Else ' ... altrimenti non ci sono valori da leggere UltimaLettura = 0 RecSet.Close End If ' A questo punto effettuo l'aggiornamento sulla tabella MySql = "INSERT INTO Tabella1(data, [read n1], [read n2], consumption) VALUES(Now()," & UltimaLettura & ", " & LetturaAttuale & ", " & LetturaAttuale - UltimaLettura & ")" CurrentDb.Execute MySql ' Uscita End Sub
Un esempio completo che si basa sulla procedura sopra riportata è scaricabile
al seguente Link: http://web.tiscali.it/simplex2/Test_Flavio_downoaded.zip
Grazie, grazie, grazie
Mike finalmente ho risolto un problema solo grazie a te.
. . . .
Se si puo' metti in rete quasta tua soluzione poichè credo sia un
problema diffuso avere un tipo di conteggio nel modo da te sviluppato.
. . . .
Rimango a tua disposizione per qualsiasi problema di qualsiasi genere
ovviamente non programmatico poichè tu sei un grande.
Se passi da ....... fatti vivo
A presto
Flavio
Concedetemi un minimo di lusinghe per aver risolto un problema dopo diversi scambi di e-mail con Flavio.
[da 1 a 2 di 2 commenti] | Indietro