Deferencia entre registros Access

Resulta que estoy trabajando en una base de datos y de una consulta obtengo los valores de un contador con distintas fechas para distintos autos y quiero crear otro campo el cual me diga la diferencia entre el nuevo contador y el anterior... Aquí va un ejemplo:
Auto                     FMed             Vmed       Dif
Peugeot          11-09-2014         1000         0
Peugeot          01-08-2014          900        100
Peugeot          30-06-2014          790        110
Peugeot          01-06-2014          710         80
Citroen            11-09-2014         1200         0
Citroen           02-08-2014          1110        90
Citroen 01-07-2014 1010 100
Y así con los otros modelos, se me había ocurrido que sería más fácil si ordenaba por equipo(Auto) y por fecha(FMed) los registros, así poder comparar 1° por equipo y 2° por el Vmed (kilometraje), le doy valor 0 al primero de cada equipo, ya que no existe un registro más reciente, se me hace más fácil darle 0 al primero que al ultimo.
mi algoritmo en visual era el siguiente: 

Public Function KilometrajeAcumulado() As Double
Dim rst As DAO.Recordset
Dim DIF, VAL, VAL1 As Double
Dim EQ, EQ1 As String
Set rst = CurrentDb.OpenRecordset("SemaforoS2")
rst.MoveFirst

EQ = Trim(rst.Fields(0))
VAL = Trim(rst.Fields(3))

Do Until rst.EOF
EQ1 = Trim(rst.Fields(0))
VAL1 = Trim(rst.Fields(3))
If EQ=EQ1 Then
DIF = VAL - VAL1
else

DIF=0

End If

KilometrajeAcumulado = DIF
EQ = EQ1
VAL = VAL1
rst.MoveNext
Loop

rst.Close

Set rst = Nothing
End Function
Donde EQ y EQ1 es para manejar el nombre del equipo, VAL y VAL1 el valor del hodometro, DIF la diferencia de kilometraje, En la consulta "Semaforo2" se obtiene una tabla de registro similar a la anterior pero sin el campo DIF, de esta tabla obtiene los equipos, fechas y valores de contadores.
Resulta que cuando en la nueva consulta pongo en el campo
DIF: KilometrajeAcumulado()
Me entrega para todos los registros el mismo valor, que es la resta entre los dos primeros registros, y debería mostrarme distintos valores y 0 a los primeros de cada equipo...
Quien me puede ayudar a solucionar esto.

1 respuesta

Respuesta
1

Viendo el ejemplo que planteas y el código que usas, he montado un mini-ejemplo que creo te servirá, aunque en este ejemplo, la Diferencia 0 la da en la fecha más antigua y no la más reciente (que creo que tiene más sentido).

Además, el problema de que tu función siempre te dé el mismo resultado, es porque no le estás pasando ningún parámetro a la misma que actúe como filtro, y al tener un bucle siempre te muestra la diferencia de los dos últimos registros.

La función modificada es esta:

Public Function KilometrajeAcumulado(elEquipo As String, laFecha As Date) As Double
Dim rst As DAO.Recordset
Dim DIF As Double, VAL As Double, VAL1 As Double
Dim EQ As String
Dim miSQL As String
miSQL = "SELECT * FROM Tabla WHERE Auto='" & elEquipo & "' AND FMed<=#" & Format(laFecha, "mm/dd/yyyy") & "# ORDER BY FMed DESC"
Set rst = CurrentDb.OpenRecordset(miSQL)
If Not rst.EOF Then rst.MoveLast
If rst.RecordCount <= 1 Then
DIF = 0
GoTo Salida
End If
rst.MoveFirst
VAL = Trim(rst("Vmed"))
If Not rst.EOF Then
rst.MoveNext
VAL1 = Trim(rst("Vmed"))
DIF = VAL - VAL1
Else
DIF = 0
End If
Salida:
KilometrajeAcumulado = DIF
rst.Close
Set rst = Nothing
End Function

Como ves, le paso como argumentos a la función el equipo (Auto) y la fecha, y luego abro el recordset sobre los datos de la tabla que corresponden a ese equipo y con una fecha menor o igual a la que le pasamos.

Aquí te dejo el ejemplo. Para adaptarlo a tu caso, sólo tendrás que modificar los nombres de las tablas/consultas y campos que tu tengas.

¡Gracias! Como siempre Sveinbjorn, lo de que la diferencia sea 0 al principio o al final me va igual, solo que había pensado que era más fácil con el valor 0 al inicio.
Saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas