Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Da To S Regis Tro Anterior
Da To S Regis Tro Anterior
En el primer bloque os enseñaré cómo obtener los datos de una introducción llamémosle
“lineal”; esto es, los datos siempre dependen del registro anterior.
En el segundo bloque trataremos una introducción llamémosle “no lineal”; esto es, los datos no
dependen siempre del registro inmediatamente anterior, sino que hay algún elemento que nos
delimita un subgrupo de registros.
Y como creo que ya se tiene una panorámica general de lo que se pretende vamos a ponernos
manos a la obra.
BLOQUE 1
MI TABLA
Vamos a crearnos una tabla muy simple que llamaremos TEntregas, con la siguiente
estructura:
1
Visítame en http://neckkito.siliconproject.com.ar
MI FORMULARIO
Vamos a crearnos un formulario sobre esa tabla, que
llamaremos FEntregas. Este paso no tiene el más mínimo
secreto.
Si queréis que nadie “haga trampas” podéis sacar las propiedades del campo
[DiasTranscurridos] → Pestaña Datos → Bloqueado = Sí.
EL CÓDIGO
Vamos a plantearnos el código antes de escribirlo.
Sin embargo, también debemos plantearnos cómo resolver una situación particular: ¿qué pasa
si es el primer registro que introducimos? Porque, en este caso, no habrá ninguna fecha
anterior.
Ok. Tenemos pues ya “cogidas por el cuello” las dos situaciones posibles. Sigamos con la
siguiente pregunta: ¿cómo decirle a Access que me coja el registro anterior?
Alguien podría pensar: como tengo un autonumérico, pues lo que hago es coger el
autonumérico del registro actual, supongamos 5, y sé automáticamente que el anterior es el 4.
2
Visítame en http://neckkito.siliconproject.com.ar
Veamos, de manera abstracta, las soluciones que adoptaremos:
Si estamos introduciendo el registro 1, ¿cuál será el valor máximo (excluyendo el 1)? Pues no
hay valor máximo, lo que implica que estaremos en un registro inicial.
…
Private Sub FechaEntrega_AfterUpdate()
Dim regAnterior As Variant 'Variant porque le haremos tomar o bien un valor
'numérico o un valor de fecha, según el caso
Como podéis ver el código está comentado y recoge lo que antes hemos expresado “en
abstracto”.
2 Para generar código debemos sacar las propiedades del control → Pestaña Eventos, y nos situamos en la parte “blanca” a la
derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos clic sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.
3
Visítame en http://neckkito.siliconproject.com.ar
BLOQUE 2
Vamos a seguir con nuestra tabla, pero vamos a copiar
FEntregas y lo vamos a pegar como FEntregas2.
Lo que queremos saber es cuántos días ha tardado sólo Seur en entregarnos la mercancía, así
que el resultado sería 14 días (del 01/01 al 15/01, sin tener en cuenta la entrega de DHL).
En realidad el proceso es el mismo que hemos aplicado en la explicación del bloque 1, sólo que
ahora debemos “añadir” ese elemento diferenciador (el repartidor) en el proceso.
Así que en el campo [FechaEntrega] de FEntregas2 vamos a cambiar el código que tenemos
por el que sigue:
…
Private Sub FechaEntrega_AfterUpdate()
Dim regAnterior As Variant 'Variant porque le haremos tomar o bien un valor
'numérico o un valor de fecha, según el caso
'Si es el primer registro de ese repartidor 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 [DiasTranscurridos]
Me.DiasTranscurridos.Value = regAnterior
Else 'En caso contrario restamos fechas
Me.DiasTranscurridos.Value = Me.FechaEntrega.Value - regAnterior
End If
End Sub
…
4
Visítame en http://neckkito.siliconproject.com.ar
Fijaos también que he añadido un control para verificar que
el repartidor existe, porque si no el código nos daría error.
…
Private Sub FechaEntrega_AfterUpdate()
Dim regAnterior As Variant 'Variant porque le haremos tomar o bien un valor
'numérico o un valor de fecha, según el caso
'Si es el primer registro de ese repartidor 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 [DiasTranscurridos]
Me.DiasTranscurridos.Value = regAnterior
Else 'En caso contrario restamos fechas, pero antes controlamos que todo sea correcto
If Me.FechaEntrega.Value < regAnterior Then 'La fecha introducida es menor que la del registro
anterior
MsgBox "La fecha introducida no es correcta, dado que es inferior a la última registrada para" _
& " el repartidor " & Me.Repartidor.Value & ", que es " & regAnterior & vbCrLf & vbCrLf _
& "Debe cambiar la fecha", vbExclamation, "FECHA INCORRECTA"
Me.FechaEntrega.Value = Null
Exit Sub
Else
Me.DiasTranscurridos.Value = Me.FechaEntrega.Value - regAnterior
End If
End If
End Sub
…
Pues la sistemática general sería exactamente la misma que la que os he explicado. Sólo
5
Visítame en http://neckkito.siliconproject.com.ar
tendríamos que ajustar, básicamente:
Un saludo, y…
¡suerte!
6
Visítame en http://neckkito.siliconproject.com.ar