Access & C.

Valorizzare un campo di un record a partire dal valore di un altro campo del record immediatamente precedente.

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

Risposta

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.

Inserisci un commento   |   Indietro

[1] Nick Name: luigi71     Data: 26/03/2011 08:56:48   
ciao michele , anche io ho sbattuto un bel po per risolvere questo dilemma e vedo che in qualche modo la soluzione c'è . Solo che io mi ritrovo 18 totalizzatori.Mi daresti qualche dritta???   
[2] Nick Name: andy     Data: 02/08/2010 11:12:49   
Grazie anche da parte mia cercavo da un po la soluzione a questo problema. Andrea   

  [da 1 a 2 di 2 commenti]     |   Indietro

Inserisci un commento

Nick: e-mail:

web:

Commento: