Cálculos con registro anterior

Un lugar dónde compartir funciones, procedimientos y aplicaciones
Avatar de Usuario
Sveinbjorn
Moderador
Mensajes: 989
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 e 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

Volver a “Almacén Accesiano”

¿Quién está conectado?

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