Access - #Error en función con fecha vacía

 
Vista:
sin imagen de perfil
Val: 56
Ha disminuido 1 puesto en Access (en relación al último mes)
Gráfica de Access

#Error en función con fecha vacía

Publicado por Leandro (10 intervenciones) el 12/03/2018 00:26:27
Hola, he buscado todas las formas y todas me dan #Error, tengo un formulario con un campo calculado (Edad), el campo calculado es a través de una Función (CalcularEdad(Fecha_Nac)), cuando el campo Fecha_Nac tiene un valor funciona correctamente, pero cuando este campo no tiene ningún valor me devuelve #Error. Existe alguna forma de eliminar esto. el mismo problema me sucede con el campo calculado GenerarCUIT.
Gracias.
La Función es
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Function CalcularEdad(FechaNacimiento As Date) As Variant
 
Dim edad As Integer
 
If IsNull(FechaNacimiento) Then
 edad = 0
Else
 edad = DateDiff("yyyy", FechaNacimiento, Date)
 If Date < DateSerial(Year(Date), Month(FechaNacimiento), Day(FechaNacimiento)) Then
  edad = edad - 1
 End If
 CalcularEdad = edad
End If
End Function
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 756
Plata
Ha mantenido su posición en Access (en relación al último mes)
Gráfica de Access

#Error en función con fecha vacía

Publicado por Jesús Manuel (375 intervenciones) el 12/03/2018 10:26:47
Lo primero es que resulta un poco confuso que el campo calculado se llame Edad y la variable en la función también sea edad, por lo que voy a llamar txtEdad al campo calculado e iEdad a la variable

Lo segundo es ver cuando llamas a la función CalcularEdad? Creo que lo mejor sería en el evento después de actualizar del campo Fecha_Nac y luego hacer una llamada a este evento en el evento Current del formulario.


Por lo que quedaría la función tal que:

1
2
3
4
5
6
7
8
Public Function CalcularEdad(FechaNacimiento As Date) As Variant
Dim iEdad As Integer
iEdad = DateDiff("yyyy", FechaNacimiento, Date)
If Date < DateSerial(Year(Date), Month(FechaNacimiento), Day(FechaNacimiento)) Then
    iEdad = iEdad - 1
End If
CalcularEdad = iEdad
End Function



El evento AfterUpdate del campo Fecha_Nac:

1
2
3
4
5
6
7
Private Sub Fecha_Nac_AfterUpdate()
If IsNull(Me.Fecha_Nac) Or Me.Fecha_Nac = "" Then
    txtEdad = 0
Else
    Me.txtEdad = CalcularEdad(Me.Fecha_Nac)
End If
End Sub



El evento Current del formulario:

1
2
3
Private Sub Form_Current()
Call Fecha_Nac_AfterUpdate
End Sub
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

#Error en función con fecha vacía

Publicado por Anonimo (3314 intervenciones) el 12/03/2018 15:02:49
En principio Access utilizara con preferencia a la variable dimensionada en la función, antes de buscar un simil en el resto de la aplicación, cambiarle el nombre no es una idea desdeñable, pero no es indispensable.

Lo ideal seria utilizar a 'la variable' que esta implícita en la propia función (la función en si misma) con lo que se ahorra memoria.

Un punto a tener en cuenta es que tal como ha sido diseñada la función, exige un dato de tipo fecha y eso es un tanto restrictivo, si no se le especifica tipo, por defecto asumirá que es Variant.

Lo segundo consistiría en evaluar el dato que se le pasa la función y dado que se espera a una fecha ....¿porque no preguntarle si 'el dato' es una fecha? .....

Y si el dato no es una fecha ¿para que continuar?
.... (si la función devolviera un dato de tipo numérico, esa 'salida' seria por defecto un CERO, pero se le indica que sea del tipo Variant
.... (curiosamente el mismo tipo de dato que toma por defecto si no se le indica un tipo especifico).

Teniendo en cuenta esto, otra forma de plantearlo seria esta:

1
2
3
4
5
6
7
Public Function CalcularEdad(FechaNacimiento)
'si no es un 'dato valido' un cero y salimos .... 
IF Not IsDate(FechaNacimiento) Then CalcularEdad = 0 : Exit Function
'aquí se supone que no hemos salido ... la fecha referente es valida
 CalcularEdad= DateDiff("yyyy", FechaNacimiento, Date)
 IF Date < DateSerial(Year(Date), Month(FechaNacimiento), Day(FechaNacimiento)) Then CalcularEdad = CalcularEdad - 1
End Function
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 56
Ha disminuido 1 puesto en Access (en relación al último mes)
Gráfica de Access

#Error en función con fecha vacía

Publicado por Leandro (21 intervenciones) el 13/03/2018 00:49:57
Hola Jesús Manuel y Anónimo sus aportes me fueron de mucha utilidad en otras funciones pero no en esta. Cuando aplico lo que me decís Jesús Manuel la edad del formulario es correcta pero en los registros de la consulta me aparece la edad vacía. Cuando aplico lo que me explicas Anónimo el calculo de la edad me devuelve -1 o 0, tanto en el formulario como en la consulta.
Tengo un formulario dividido en el cual cargo personas, la función la llamo en el campo edad en origen del registro, de esta forma me calcula la edad de la persona que estoy cargando como los que ya cargué y aparecen en la consulta que está debajo.
En la función si cambie el nombre de las variables.
Gracias por los aportes.

ejemplo-pantalla-Error
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

#Error en función con fecha vacía

Publicado por Anonimo (3314 intervenciones) el 13/03/2018 02:41:24
Desconozco la versión que has generado basada en mi aportación
1
2
3
4
5
6
7
Public Function CalcularEdad(FechaNacimiento)
'si no es un 'dato valido' un cero y salimos ....
If Not IsDate(FechaNacimiento) Then CalcularEdad = 0: Exit Function
'aquí se supone que no hemos salido ... la fecha referente es valida
 CalcularEdad = DateDiff("yyyy", FechaNacimiento, Date)
 If Date < DateSerial(Year(Date), Month(FechaNacimiento), Day(FechaNacimiento)) Then CalcularEdad = CalcularEdad - 1
End Function

Pero los resultados que me devuelve Access (en la ventana de inmediato) son estos:

?calcularedad("1/1/2000")
18
?calcularedad("1/5/2000")
17
?calcularedad("")
0
?calcularedad(2000)
0
?calcularedad(#1/1/2000#)
18
?calcularedad(#6/1/2000#)
17

Nacio_el = Cdate("1/1/2000")

?"Nacio el: " & nacio_el & " y tiene: " & calcularedad(nacio_el) & " años"
Nacio el: 01/01/2000 y tiene: 18 años

Nacio_el = Cdate("1/6/2000")

?"Nacio el: " & nacio_el & " y tiene: " & calcularedad(nacio_el) & " años"
Nacio el: 01/06/2000 y tiene: 17 años


Supongo que las demás aportaciones (si han sido correctamente aplicadas) también darán resultados correctos, quizás deberías verificar SIN MODIFICARLAS las respuestas que te ofrecen y para modificarlas ..... hacerlo tras haberlas estudiado bien.

Nota: en la fecha encerrada entre almohadillas, el formato utilizado para la fecha es: el americano (que es lo que espera Access de ese formato) no es un error, es conocer un poco a Access
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 56
Ha disminuido 1 puesto en Access (en relación al último mes)
Gráfica de Access

#Error en función con fecha vacía

Publicado por Leandro (21 intervenciones) el 14/03/2018 16:44:10
Gracias Anónimo por tu aporte, borre todo y comencé desde el inicio, ahora funciona correctamente, tal vez había dejado algo escrito que me generaba el error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar