Access - calcular diferencia con registro anterior access

 
Vista:
sin imagen de perfil

calcular diferencia con registro anterior access

Publicado por manuel (9 intervenciones) el 01/06/2013 11:10:29
Hola, estoy haciendo un control de contador de agua y necesito saber como se calcula un campo.
Estoy en un formulario en el que tengo que rellenar un campo "contador" y calcular la diferencia con el último registro para ponerlo en un campo "consumo", agradecería cualquier info. La tabla es:

nombre: partes

id autonumeracion
fecha fecha/hora
horas numero
trabajo texto
contador numero
consumo numero
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

calcular diferencia con registro anterior access

Publicado por Neckkito (1157 intervenciones) el 01/06/2013 12:53:56
Hola!

Si los vas a meter "uno detrás de otro" y por orden un sistema sencillo podría ser:

- Sacas las propiedades del campo "contador" y te vas a Pestaña Eventos -> Después de actualizar, y generas el siguiente código:

...
Private Sub contador_AfterUpdate()
'Declaramos las variables
Dim ultimaLectura As Long, lecturaActual As Long
Dim diferencia As Long
'Cogemos la lectura introducida
lecturaActual = Nz(Me.contador.Value, -1)
'Si no hay valor salimos
If lecturaActual = -1 Then Exit Sub
'Cogemos la lectura anterior
ultimaLectura = Nz(DLast("contador", "partes"), -1)
'Si el valor es -1 es que no había lectura anterior. Lo igualamos a cero
If ultimaLectura = -1 Then ultimaLectura = 0
'Realizamos la resta
diferencia = lecturaActual - ultimaLectura
'Escribimos el valor en el campo <consumo>
Me.consumo.Value = diferencia
End Sub
...

Un saludo,


http://neckkito.siliconproject.com.ar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

calcular diferencia con registro anterior access

Publicado por manuel (9 intervenciones) el 03/06/2013 17:41:10
Perfectttttttttttttttoooooooooooooooooooo, por fin, muchas gracias, funciona al 100%.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

calcular diferencia con registro anterior access

Publicado por manuel (9 intervenciones) el 03/06/2013 18:07:59
Vaya, veo que no es 100% perfecto, me da cifras erroneas, no hace la resta como debería, ¿porque puede ser?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

calcular diferencia con registro anterior access

Publicado por Neckkito (1157 intervenciones) el 03/06/2013 19:45:17
Hola, Manuel:

Como te comentaba, el requisito para que funcione bien es que metas los datos "en chorrera", ya sea al momento como al día siguiente.

Cuando estás dando de alta un registro este todavía no está grabado en la tabla. Cuando busca el último valor lo hace buscando el último de la tabla.

Si por lo que sea el registro que estás manipulando se guarda en la tabla automáticamente se convierte en el último, y por eso, por ejemplo, te devolvería el valor del registro que estás actualmente manipulando, que es el último, con lo cual la diferencia ya daría un valor erróneo.

En conclusión, que si no se cumplen las premisas el sistema no funciona y habría que buscar otra solución.

Por ejemplo, y siempre suponiendo que los metes ordenadamente (es decir, que no metes el día 3 antes que el 1, por ejemplo), podrías modificar el código de la siguiente manera:

...
Private Sub contador_AfterUpdate()
'Declaramos las variables
Dim ultimaLectura As Long, lecturaActual As Long
Dim vID As Long
Dim diferencia As Long
'Cogemos el identificador
vID = Me.Id.Value
'Cogemos la lectura introducida
lecturaActual = Nz(Me.contador.Value, -1)
'Si no hay valor salimos
If lecturaActual = -1 Then Exit Sub
'Cogemos la lectura anterior
ultimaLectura = Nz(DLast("contador", "partes", "Id<>" & vID), -1)
'Si el valor es -1 es que no había lectura anterior. Lo igualamos a cero
If ultimaLectura = -1 Then ultimaLectura = 0
'Realizamos la resta
diferencia = lecturaActual - ultimaLectura
'Escribimos el valor en el campo <consumo>
Me.consumo.Value = diferencia
End Sub
...

Lo anterior implica que el campo [Id] tiene que estar en el formulario. Si lo tienes, pues perfecto; si no lo tienes y no lo quieres ver haz lo siguiente:

- Añádelo al formulario
- Quítale la etiqueta
- Sitúalo en un rincón donde no moleste
- Saca sus propiedades -> Pestaña Formato -> Visible, y le sitúas esa propiedad en NO

A ver si así te funciona sin errores.

Un saludo,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

calcular diferencia con registro anterior access

Publicado por manuel (9 intervenciones) el 03/06/2013 21:59:13
Gracias, ahora lo entiendo perfectamente, cometí el error de actualizar datos mediante el formulario y claro me cogia simpre el ultimo registro para hacer la resta, por eso salia mal, con este código que me mandas se puede actualizar sin que coga el ultimo no?
Muchas gracias por tu ayuda, un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

calcular diferencia con registro anterior access

Publicado por Ricardo (3 intervenciones) el 19/03/2014 15:12:55
Hola Neckkito.
Lo primero es agradecer tus aportaciones y tu tiempo en darnos luz a los que empezamos en Access.
Yo también estoy intentando realizar una tabla con los consumos de cuatro contadores y he copiado tu código en el formulario para introducir los consumos.
El problema que estoy teniendo es que me está sumando el consumo del registro anterior con el consumo acumulado de los registros anteriores, y así sucesivamente.

Te lo pongo a modo de ejemplo:

idAguas conta1 gasto1 ...
15 100 5
16 110 15
17 125 30
18 128 33
19 131 36
...

Cuando debería de dar:
idAguas conta1 gasto1 ...
15 100 5
16 110 10
17 125 15
18 128 3
19 131 3
...


Te pongo los datos de la tabla.

Nombre de la tabla: AguaDiarias

idAguas, Autonumerico
conta1, Número
gasto1, Número
conta2, Número
gasto2, Número
conta3, Número
gasto3, Número
conta4, Número
gasto4, Número

La entrada de datos de los cuatro contadores, están puestos en el mismo formulario. Este es el código que he puesto, sacado del tuyo:

Private Sub conta1_AfterUpdate()
Dim Anterior1 As Long, Actual1 As Long
Dim WID1 As Long
Dim resta1 As Long
gasto1 = 0
Anterior1 = 0
Actual1 = 0
WID1 = 0
resta1 = 0
WID1 = Me.idAguas.Value
Actual1 = Nz(Me.conta1.Value, -1)
If Actual1 = -1 Then Exit Sub
Anterior1 = Nz(DLast("conta1", "AguaDiarias", "idAguas<>" & WID1), -1)
If Anterior1 = -1 Then Anterior1 = 0
resta1 = Actual1 - Anterior1
Me.gasto1.Value = resta1
End Sub

Private Sub conta2_AfterUpdate()
Dim Anterior2 As Long, Actual2 As Long
Dim WID2 As Long
Dim resta2 As Long
Anterior2 = 0
Actual2 = 0
WID2 = 0
resta2 = 0
WID2 = Me.idAguas.Value
Actual2 = Nz(Me.conta2.Value, -1)
If Actual2 = -1 Then Exit Sub
Anterior2 = Nz(DLast("conta2", "AguaDiarias", "idAguas<>" & WID2), -1)
If Anterior2 = -1 Then Anterior2 = 0
resta2 = Actual2 - Anterior2
Me.gasto2.Value = resta2
End Sub

Private Sub conta3_AfterUpdate()
Dim Anterior3 As Long, Actual3 As Long
Dim WID3 As Long
Dim resta3 As Long
Anterior3 = 0
Actual3 = 0
WID3 = 0
resta3 = 0
WID3 = Me.idAguas.Value
Actual3 = Nz(Me.conta3.Value, -1)
If Actual3 = -1 Then Exit Sub
Anterior3 = Nz(DLast("conta3", "AguaDiarias", "idAguas<>" & WID3), -1)
If Anterior3 = -1 Then Anterior3 = 0
resta3 = Actual3 - Anterior3
Me.gasto3.Value = resta3
End Sub

Private Sub conta4_AfterUpdate()
Dim Anterior4 As Long, Actual4 As Long
Dim WID4 As Long
Dim resta4 As Long
Anterior4 = 0
Actual4 = 0
WID4 = 0
resta4 = 0
WID4 = Me.idAguas.Value
Actual4 = Nz(Me.conta4.Value, -1)
If Actual4 = -1 Then Exit Sub
Anterior4 = Nz(DLast("conta4", "AguaDiarias", "idAguas<>" & WID4), -1)
If Anterior4 = -1 Then Anterior4 = 0
resta4 = Actual4 - Anterior4
Me.gasto4.Value = resta4
End Sub


Muchas gracias de antemano.
Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

calcular diferencia con registro anterior access

Publicado por Neckkito (1157 intervenciones) el 24/03/2014 16:52:22
Hola!

En primera instancia el código es correcto. Lo que veo que hace es:

Cojo el valor del registro actual: 110
Cojo el valor del registro anterior: 100
Saco la resta: 10
La verdad es que esos 15 que comentas no sé de dónde salen, pero del código seguro que no.

Como me extrañaba he hecho una recreación de tus datos con sólo dos contadores. El código simplemente es un copy-paste del que tu escribes. Y, efectivamente, los valores que devuelve son los que se esperan, es decir, la diferencia entre el registro actual y el anterior. Te adjunto aquí la recreación.

Repasa bien tu BD a ver si pillas qué es lo que te está dando esa diferencia. Yo, sin otra información, no puedo decirte nada más.

Un saludo,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

calcular diferencia con registro anterior access

Publicado por Ricardo (3 intervenciones) el 24/03/2014 19:12:44
Hola Neckkito.
Muchas gracias por tu aportación.
He revisado cien veces y no soy capaz de encontrar el error que existe. Es cierto que mi BD en un primer momento funcionaba a las mil maravillas, pero después de haber estado trasteando para dejar mas elegante el formulario y varios informes, el resultado de los consumos no es el correcto, ya que va acumulando el consumo de los registros anteriores.

Te explico como es el error que está dando:
1º Valor registro actual: 110
2º Valor registro anterior: 100
3º Resta: 10
4º Valor nuevo registro: 125
5º Valor registro anterior: 110
6º Resta: 25 (es la suma de los 15 de su consumo actual, mas el consumo anterior que tiene guardado 10)
7º Valor nuevo registro: 128
8º Valor registro anterior: 125
9º Resta: 28 (es la suma de los 3 de su consumo actual, mas el consumo anterior que tiene guardado 25 (15+10))
10º ...

Espero haberme explicado correctamente.
De nuevo, muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Neckkito
Val: 529
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

calcular diferencia con registro anterior access

Publicado por Neckkito (1157 intervenciones) el 24/03/2014 20:27:27
Hola:

Ya te he comentado que sin ver cómo lo tienes estructurado no puedo decirte nada. Si quieres pásame la BD comprimida en zip o rar por mail y le echo un vistazo a neckkito(ARROBA)gmail(PUNTO)com. En el mail indícame el nombre del formulario donde están esos códigos.

De todas maneras me voy a inventar dónde podría estar el error: por intuición parece que en vez de cogerte el último registro te está cogiendo el primero, y por eso te va acumulando el consumo (o eso es la impresión que está dando). Para saber si te está cogiendo correctamente el registro anterior modifica tu código, por ejemplo, del primer afterupdate y escríbelo así (te marco en negrita la línea que debes añadir):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub conta1_AfterUpdate()
Dim Anterior1 As Long, Actual1 As Long
Dim WID1 As Long
Dim resta1 As Long
gasto1 = 0
Anterior1 = 0
Actual1 = 0
WID1 = 0
resta1 = 0
WID1 = Me.idAguas.Value
Actual1 = Nz(Me.conta1.Value, -1)
If Actual1 = -1 Then Exit Sub
Anterior1 = Nz(DLast("conta1", "AguaDiarias", "idAguas<>" & WID1), -1)
If Anterior1 = -1 Then Anterior1 = 0
msgbox "Registro actual: " & Actual1 & " - Registro anterior: " & Anterior1
resta1 = Actual1 - Anterior1
Me.gasto1.Value = resta1
End Sub

Así sabrías si lo que está fallando es el DLast, que no te está devolviendo el valor correcto. Ahora bien, el por qué de esto no lo puedo saber si no veo tu BD.

Saludos,

Neckkito
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

calcular diferencia con registro anterior access

Publicado por Ricardo (3 intervenciones) el 28/03/2014 12:54:25
Hola Neckkito.
Muchas gracias por darme la solución a mi BD.
Gracias a tus aportaciones, he podido arreglar el formulario.
Se nota que tienes muchos conocimientos de Access y siempre estás dispuesto a ayudar a los que estamos empezando.
Mil gracias por tus aportaciones a este foro, me han ayudado muchísimo. ;-))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

calcular diferencia de saldos de Dia Actual vs el Dia anterior

Publicado por Julio (1 intervención) el 03/07/2014 23:30:24
Buenas tardes amigos,

Tengo un inconveniente yo necesito obtener las variaciones de saldos entre una fecha y otra, sin embargo, el campo de fecha es común para todos los saldos, es decir tengo los saldos en una columna y las fechas de dichos saldos en otra columna pero necesito que access me calcule la variación entre los saldos del día actual vs el cierre del mes anterior o el cierre del mismo día y mes pero del año anterior. Esto es posible en access?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar