Documentos de Académico
Documentos de Profesional
Documentos de Cultura
A través de este ejemplo os voy a explicar cómo conseguir que Access nos calcule la edad en
dos situaciones:
1.- A medida que vamos introduciendo datos en un formulario, al rellenar el campo que nos
informa de la fecha de nacimiento.
2.- Pulsando un botón, de manera que Access nos actualiza la información de TODOS los
registros de la tabla.
Evidentemente la referencia para poder calcular esa edad será la fecha actual, que nos vendrá
dada por la fecha del sistema.
Creo que el objetivo del ejemplo es claro, por lo que no me “enrollaré” más. Vámonos pues a
por la “chicha”...
PREPARANDO MI TABLA
Para desarrollar el ejemplo utilizaré una tabla que llamaré TDatos, y que tendrá la siguiente
estructura (simplificada para centrarnos en el tema de la edad):
Como curiosidad os diré que el campo [Edad] lo he definido como “Entero” (y no “Entero
largo”) porque la “capacidad” de un Entero es más que suficiente para contener los hipotéticos
valores de edad de una persona. Así optimizamos recursos.
PREPARANDO MI FORMULARIO
Vamos a crearnos un formulario basado en la tabla TDatos, y vamos a llamarlo FDatos. El
proceso no tiene mayor secreto.
Voy a crear también un formulario en blanco, al que llamaré FMenu, para tener un lugar donde
introducir un botón de comando para actualizar las edades “en masa”. Evidentemente, en
vuestra aplicación, ese botón podría ir en el formulario que estimarais más oportuno.
1
Visítame en http://neckkito.siliconproject.com.ar
CREANDO MI “MÓDULO CALCULADOR”
Vamos a abrir nuestro editor de VB. Para ello simplemente,
con la BD abierta, debemos pulsar la combinación de teclas
ALT+F11.
Independientemente de que nos salgan una o dos líneas, debajo de ella/s escribimos la
siguiente función (el código está totalmente comentado):
…
Public Function calculaEdad(fNacim As Date) As Integer
'Neckkito - 22/01/13
'Declaramos las variables
Dim vAnyo As Integer, vMes As Integer, vDia As Integer
Dim vAnyoNow As Integer, vMesNow As Integer, vDiaNow As Integer
'Descomponemos las fecha de nacimiento
vAnyo = Year(fNacim)
vMes = Month(fNacim)
vDia = Day(fNacim)
'Descomponemos la fecha actual
vAnyoNow = Year(Date)
vMesNow = Month(Date)
vDiaNow = Day(Date)
'Suponemos inicialmente que la edad es la diferencia en años. Eso implica
'que damos por supuesto que el mes actual es superior al mes de nacimiento
calculaEdad = vAnyoNow - vAnyo
'Analizamos el mes por si se contradice nuestra suposición inicial. Caben
'dos posibilidades. Que sea menor o que sea igual
Select Case vMesNow
Case Is < vMes 'Si es menor...
calculaEdad = calculaEdad - 1 'Restamos una unidad (aún no ha hecho el "cumple")
Case Is = vMes 'Si es el mismo mes...
'Debemos analizar el día. Si el día actual es menor es que aún no ha
'cumplido años...
If vDiaNow < vDia Then
calculaEdad = calculaEdad - 1 '... y debemos restarle una unidad
End If
End Select
End Function
…
Aprovecharemos para poner algunas líneas de control para comprobar si el valor introducido en
2
Visítame en http://neckkito.siliconproject.com.ar
[FNac] es correcto.
…
Private Sub FNac_AfterUpdate()
'Comprobamos que exista una fecha de nacimiento. Si no salimos
If IsNull(Me.FNac.Value) Then Exit Sub
'Comprobamos que la fecha de nacimiento NO sea superior a la fecha
actual
If Me.FNac.Value > Date Then
MsgBox "Fecha de nacimiento errónea", vbCritical, "ERROR"
Exit Sub
End If
'Asignamos el valor que devuelve nuestra función calculaEdad
'a nuestro campo [Edad]
Me.Edad.Value = calculaEdad(Me.FNac.Value)
'Situamos el foco en el campo [Obs]
Me.Obs.SetFocus
End Sub
…
Si somos usuarios de Access 2003 quizá debamos registrar una referencia si no la tenemos ya.
La referencia que debemos registrar es “Microsoft DAO 3.6 Object Library”4.
…
Private Sub cmdActualizaEdad_Click()
'Requiere regristrar referencia "Microsoft DAO 3.6 Object Library" o
'módulo equivalente
'Declaramos las variables
Dim rst As DAO.Recordset
Dim vFN As Variant
Dim vEdad As Integer
'Creamos el recordset sobre la tabla TDatos
Set rst = CurrentDb.OpenRecordset("TDatos", dbOpenTable)
'Si no hubiera registros avisamos y saltamos a salida
If rst.RecordCount = 0 Then
MsgBox "No hay registros para actualizar", vbExclamation, "SIN REGISTROS"
GoTo Salida
End If
'Nos situamos en el primer registro
With rst
.MoveFirst
'Empezamos el recorrido de registros
Do Until .EOF
'Asignamos el valor del campo [FNac] a la variable vFN
vFN = .Fields("FNac").Value
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 click sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.
3 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras →
Nombre. Ahí escribimos el nombre que queramos.
4 Para registrar una referencia debemos irnos, en el editor de VB, a Menú → Herramientas → Referencias... Se nos abrirá una
ventana mostrándonos todas las referencias disponibles. Buscamos la que nos interese, marcamos su check y aceptamos.
3
Visítame en http://neckkito.siliconproject.com.ar
'Si no hubiera fecha saltamos a siguiente
If IsNull(vFN) Then GoTo Siguiente
'Si hay fecha llamamos a la función calculaEdad para saber dicha edad
vEdad = calculaEdad(CDate(vFN))
'Escribimos la edad en el campo correspondiente
.Edit
.Fields("Edad").Value = vEdad
.Update
Siguiente:
'Nos movemos al siguiente registro y repetimos el proceso
.MoveNext
Loop
End With
'Lanzamos un mensaje de confirmación
MsgBox "Actualización realizada correctamente", vbInformation, "OK"
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub
…
Si me permitís haré un pequeño comentario al código, como curiosidad por si no lo hacéis así y
os salen “mensajes raros”.
Nuestra función calculaEdad tiene, como argumento, fNacim, que hemos definido como un
valor de tipo Date.
En nuestro código vemos que la fecha de nacimiento se recoge en una variable que hemos
llamado vFN, y que hemos definido como Variant. La hemos definido como Variant para que
pudiera coger sin problemas valores NULL. De esta manera podíamos examinar vFN y, en caso
de ser NULL, tomábamos la decisión de saltar al registro siguiente ( If IsNull(vFN) Then GoTo
Siguiente).
vEdad = calculaEdad(vFN)
¿qué hubera pasado? Pues que nuestra función esperaba recibir un valor tipo Date, y le
pasamos un valor tipo Variant. Como nuestra función sólo admite valores tipo Date nos avisa
de esta manera (quizá un poco extraña si no estamos acostumbrados):
Es por ello por lo que, para poderle pasar el valor de la variable vFN al argumento antes
debemos convertirlo en un tipo compatible. Y es por ello por lo que utilizamos la función de
conversión CDate(), y de ahí que se haya escrito: vEdad = calculaEdad(CDate(vFN))
4
Visítame en http://neckkito.siliconproject.com.ar