Cálculos con registro anterior

Un lugar dónde compartir funciones, procedimientos y aplicaciones
Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1061
Registrado: Sab Oct 24, 2015 10:12 pm

Cálculos con registro anterior

Mensajepor Sveinbjorn » Vie Dic 11, 2015 9:04 am

El objetivo de esta función es poder realizar fácilmente un cálculo entre un campo (numérico o de fecha) y el mismo campo del registro anterior, en una serie ordenada de registros.

Voy a plantear el ejemplo suponiendo que queremos calcular una diferencia entre el campo de un registro y el anterior, pero entendiendo la mecánica, podréis realizar cualquier tipo de operación que necesitéis. Sólo hay que ajustar los nombres de la tabla el tipo de datos de los parámetros y el que devuelve la función.

Imaginemos que tenemos una tabla TDatos con los siguientes campos: Nombre (texto), Fecha (fecha/hora) y Peso (número), y queremos ir calculando la diferencia de pesos entre registros.


'-------------------------------------------------------------------------------------------------------------
' Procedimiento: fncCalculoEntreRegistros
' Autor: Sveinbjorn
' Fecha: 10/12/2015
' Descripción: Realiza operaciones entre un valor y el mismo valor del registro anterior
'-------------------------------------------------------------------------------------------------------------
Public Function fncCalculoEntreRegistros(elNombre As String, laFecha As Date) As Double
Dim rst As Recordset
Dim miSQL As String
Dim miValor As Double, miValorAnt As Double
fncCalculoEntreRegistros= 0
miSQL = "SELECT * " _
& "FROM [TDatos] " _
& "WHERE Nombre='" & elNombre & "' AND Fecha<=#" & Format(laFecha,"mm/dd/yyyy") & "# " _
& "ORDER BY Fecha ASC"
Set rst = CurrentDb.OpenRecordset(miSQL, dbOpenDynaset)
'Si no devuelve valores
If rst.RecordCount = 0 Then GoTo Salida
'Si es el primer registro
rst.MoveLast
If rst.AbsolutePosition = 0 Then GoTo Salida
'Si no
miValor = rst("Peso")
rst.MovePrevious
miValorAnt = rst("Peso")
'Realizas el cálculo
fncCalculoEntreRegistros= miValor - miValorAnt
Salida:
rst.Close
Set rst = Nothing
End Function


Para aplicarlo, tan sencillo como siempre:

1º/ Si queremos usar la fórmula en una consulta, directamente:

Diferencia: fncCalculoEntreRegistros([Nombre];[Fecha])

2º/ Como origen de un cuadro de texto independiente:

=fncCalculoEntreRegistros([Nombre];[Fecha])

3º/ En VBA, por ejemplo para mostrar el cálculo al rellenar el campo peso:

Private Sub Peso_AfterUpdate()
Me.Diferencia=fncCalculoEntreRegistros(Me.Nombre, Me.Fecha)
End Sub

Espero que os sea de utilidad.

Saludos!
Sveinbjorn El Rojo

juanky_valencia
Nivel 1
Mensajes: 2
Registrado: Dom Ene 13, 2019 11:44 am

Re: Cálculos con registro anterior

Mensajepor juanky_valencia » Dom Ene 13, 2019 11:48 am

Hola Sveinbjorg,
Muchas gracias por la explicación de la función.
La he intentado emular exactamente como está (creando una tabla TDatos con los campos Nombre, Fecha y Peso) y he creado una cpnsulta llamando a esta función pero el resultado que me arroja en la diferencia es siempre cero (aunque los datos del peso varían en cada registro)
¿Estoy haciendo algo mal?
Gracias por tu atención

Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 1061
Registrado: Sab Oct 24, 2015 10:12 pm

Re: Cálculos con registro anterior

Mensajepor Sveinbjorn » Dom Ene 13, 2019 5:00 pm

Pues no sé lo que habrás hecho, pero funcionar, funciona.

Dejo aquí un archivo con la tabla TDatos, dos consultas (una ordenada y otra sin ordenar) con la función realizando el cálculo y un formulario donde se usa la función por medio de VBA: Ejemplo cálculos con registro anterior

Añado un par de puntualizaciones a la aportación inicial:
1º/ Si se va a usar por código en el evento "Después de actualizar" del campo Peso, hay que forzar el guardado del registro para que se actualicen los valores en la tabla y haga el cálculo correcto.
2º/ Si la función se usa directamente en el origen del control de un cuadro de texto del formulario, y el campo en la tabla se llama "Nombre", es posible que el cálculo devuelva siempre 0.... :shock: ¿Por qué? Pues porque Access interpreta el [Nombre] en el primer parámetro de la función, no como el nombre de un campo, sino como el nombre del propio formulario, con lo que la consulta no devuelve resultados... :ugeek:
Sveinbjorn El Rojo

juanky_valencia
Nivel 1
Mensajes: 2
Registrado: Dom Ene 13, 2019 11:44 am

Re: Cálculos con registro anterior

Mensajepor juanky_valencia » Mié Ene 16, 2019 8:33 pm

Muchas gracias, viendo el ejemplo que me has enviado ya lo he visto claro.
La función no se adapta exactamente a lo que yo necesito pera me da una idea de cómo seguir avanzando.
De nuevo muchas gracias :)


Volver a “Almacén Accesiano”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado