Procedimiento de evento para tomar datos de un registro anterior y traerlos a un registro nuevo

Tengo un formulario que lee datos de una tabla de Vehículos. Dentro de él, tengo un subformulario asociado a una tabla de Cargas de Combustible. Ambas tablas están relacionadas en base a la patente de cada vehículo.

La tabla CargasdeCombustible tiene entre otros los campos Patente, Fecha, KMAnterior, KmActual y LitrosCargados. Este subformulario se abre ordenando los registros por fecha de más antigua a más reciente.

Para no ingresar los datos de manera repetitiva, necesito crear un procedimiento que, al cargar un registro nuevo (ya sea al salir del campo Fecha o al entrar al campo KMAnterior, vaya al Registro Anterior, se posicione en el campo KMActual, tome ese valor, se mueva al registro siguiente y lo muestre en el campo KMAnterior.

Mis conocimientos de Access no son muy profundos. Hice una macro que funciona bastante bien, pero tiene un problema. Si en el registro asociado a esa patente no hay registros grabados en la tabla CargasdeCombustible, al ejecutarse la macro saliendo del campo fecha, intenta ir al registro anterior y obviamente no lo encuentra. Access reporta un error, y automáticamente sale un cuadro identificando el número de error y la opción de Detener la Macro.

Desde la lógica se me ocurre que, cuando al iniciar la macro le indico que vaya al registro anterior, debe seguir una instrucción que indique que si no encuentra registros se detenga la macro; pero no consigo que funcione adecuadamente.

¿Cómo puedo solucionar esto?

1 Respuesta

Respuesta
1

Aquí resolví una duda similar, usando la función DLast():

Registros con campos del registro anterior

También te valdría, en tu caso, usar DMax(), porque siempre será el que tenga matoy número de kilómetros.

Otra forma sería la que explica Neckkito en este ejemplo:

http://siliconproject.com.ar/neckkito/index.php/component/content/article/95-ejemplos-explicados/ejemplos-de-codigo/309-obtener-datos-del-registro-anterior 

Saludos!


¡Gracias! 

Implementé primero la opción que me indicaste, pero surgía un problema: el código abría la Tabla CargasdeCombustible, iba al último registro, leía el valor del campo KMActual y lo pegaba en el nuevo registro en el campo KManterior. Pero como la tabla principal tiene muchos vehículos, necesitaba una solución que identificara el kilometraje anterior de cada  vehículo en particular. Entonces miré el link y adapté la solución publicada por Neckkito y anda perfecto, desaparecieron los mensajes de error. Como no soy nada avezado en los códigos (sólo me limito a seguir la lógica) me gustaría -si tienes tiempo y ganas- que revises el código para ver si es correcto (creo que hay una opción o sentencia que está demás)

Private Sub FECHA_AfterUpdate()
   Dim regAnterior As Variant 

'Si no se ha escrito ninguna fecha salimos sin hacer nada
If IsNull(Me.FECHA.Value) Then
MsgBox "Debe indicar una FECHA", vbInformation, "SIN DATOS"
Exit Sub
End If
'Si no hay PATENTE avisamos y salimos
If IsNull(Me.PATENTE.Value) Then
MsgBox "Debe indicar una Patente", vbInformation, "SIN DATOS"
Exit Sub
End If

'Buscamos el valor del campo KMactual del registro anterior; esto es, del registro
'que tiene el Id más alto excluyendo el del registro en el que estamos
'Aquí incluimos el efecto de la patente, en la parte del filtro
regAnterior = Nz(DMax("KMActual", "CargasdeCombustible", "PATENTE='" & Me.PATENTE.Value & "' AND Id<" & Me.id.Value), 0)

'Si es el primer registro de esa patente la función Nz() hace que regAnterior tome el
'valor 0. Eso significa que estamos en el primer registro

If regAnterior = 0 Then
'Escribimos el valor en el campo [KManterior]
Me.KManterior.Value = regAnterior
Else 'En caso contrario controlamos que todo sea correcto
If Me.KManterior.Value < regAnterior Then 'El Kilometraje introducido es menor que el del registro anterior
MsgBox "El Kilometraje no es correcto, dado que es inferior al último registrado" _
, vbExclamation, "INCORRECTO"
Me.KManterior.Value = Null
Exit Sub
Else
Me.KManterior.Value = regAnterior
End If
End If
End Sub

La parte que me parece que está demás es:

Else 'En caso contrario controlamos que todo sea correcto
If Me.KManterior.Value < regAnterior Then 'El Kilometraje introducido es menor que el del registro anterior

Ya que difícilmente el kilometraje actual leído del registro anterior y ahora copiado en el registro actual sea menor.

Pero bueno, lo que importa es que funciona.

Mil gracias nuevamente!

Sí, se me olvidó comentarte que en la función DMáx (o DLast) tenías que establecer un criterio para traer los resultados del vehículo que te interese. Disculpa.

Efectivamente, te sobran las dos comprobaciones del final (If regAnterior = 0 e If Me.KManterior.Value < regAnterior) , pero no hay problema en que lo dejes como lo tienes ahora.

Yo lo habría hecho así:

Private Sub FECHA_AfterUpdate()

... 'Aquí tu código tal como lo tienes

regAnterior = Nz(DMax("KMActual", "CargasdeCombustible", "PATENTE='" & Me.PATENTE.Value & "' AND Id<" & Me.id.Value), 0)

'Escribimos el valor en el campo [KManterior]
Me.KManterior.Value = regAnterior

End Sub

Saludos!


Añade tu respuesta

Haz clic para o

Más respuestas relacionadas