He usado función para calcular la antigüedad de un trabajador en años y meses. Pero no consigo añadir los días
A la función usada y que funciona estupendamente, no he conseguido añadir las instrucciones necesarias para que además de los años y meses, me calcule también los días.
1 Respuesta
Mª Teresa, puedes utilizar esta función:
'--------------------------------------------------------------------------------------------
'Función para calcular la edad en años y meses, o en días si es menor de un mes
'Por Sveinbjorn
'--------------------------------------------------------------------------------------------
Public Function fncEdadDetalle(FechaNac As Date) As String
Dim vAño As Double
Dim vMes As Double
Dim vDia As Double
If IsNull(FechaNac) Then
fncEdadDetalle = ""
Exit Function
End If
If FechaNac = Date Then
fncEdadDetalle = "0 días"
Exit Function
End If
'Compruebas el mes
If Month(FechaNac) > Month(Date) Then
vAño = DateDiff("yyyy", FechaNac, Date) - 1
Else
vAño = DateDiff("yyyy", FechaNac, Date)
End If
'Compruebas el día
If Day(FechaNac) > Day(Date) Then
vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date) - 1
If vMes < 0 Then
vMes = 12 + vMes
vAño = vAño - 1
End If
Else
vMes = DateDiff("m", DateAdd("yyyy", vAño, FechaNac), Date)
End If
'Si es menor de un mes, calculas la edad en días
If vAño = 0 And vMes = 0 Then vDia = DateDiff("d", FechaNac, Date)
'Construyes la cadena de la edad
If vAño = 1 Then
fncEdadDetalle = vAño & " año"
ElseIf vAño > 1 Then
fncEdadDetalle = vAño & " años"
End If
If vMes = 1 Then
fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " mes"
ElseIf vMes > 1 Then
fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vMes & " meses"
End If
If vDia = 1 Then
fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " día"
ElseIf vDia > 1 Then
fncEdadDetalle = IIf(fncEdadDetalle = "", "", fncEdadDetalle & " y ") & vDia & " días"
End If
End FunctionImagino que ya sabrás cómo va esto: copias la función en un módulo de tu BD, y luego la usas como si fuera una de las que trae el propio Access, ya sea en el código o en una consulta, como origen de un cuadro de texto..., siempre pasándole como parámetro un dato de tipo fecha (la fecha de nacimiento)
Saludos!
Una nueva web y foro de Access, visítanos: http://nksvaccessolutions.com/
Si, he ubicado la función en un módulo y he llamado a éste en el evento de un campo fecha. En mi caso, [fecha de baja laboral], porque necesito saber que si por ejemplo se comienza la baja el 25/02/2016; a fecha de hoy, el período de baja es de 2 meses y 6 días.
Una vez aplicada la función, el resultado que me da es : 2 meses
Perdona, que te pegué una función que no era. La anterior sólo calcula los días si la edad es menor de un mes...
Ésta es la correcta:
'--------------------------------------------------------------------------------------------
' Función para calcular la diferencia entre fechas en años, meses y días
' Por Sveinbjorn
'--------------------------------------------------------------------------------------------
Public Function fncDiferenciaFechas(ByVal laFechaIni As Date) As String
Dim vAño As Double
Dim vMes As Double
Dim vDia As Double
Dim laFechaFin As Date
Dim temp As Date
'Si no se metió la fecha, salimos sin más
If IsNull(laFechaIni) Then
fncDiferenciaFechas = ""
Exit Function
End If
laFechaFin=Date
'Comprobamos que la fecha inicial sea más antigua que la final
If laFechaIni > laFechaFin Then
temp = laFechaIni
laFechaIni = laFechaFin
laFechaFin = temp
ElseIf laFechaIni = laFechaFin Then 'Si las dos fechas son la misma
fncDiferenciaFechas = "0 días"
Exit Function
End If
'Calculas la diferencia en años
If Month(laFechaIni) > Month(laFechaFin) Then
vAño = DateDiff("yyyy", laFechaIni, laFechaFin) - 1
Else
vAño = DateDiff("yyyy", laFechaIni, laFechaFin)
End If
'Calculas la diferencia en meses
If Day(laFechaIni) > Day(laFechaFin) Then
vMes = DateDiff("m", DateAdd("yyyy", vAño, laFechaIni), laFechaFin) - 1
If vMes < 0 Then
vMes = 12 + vMes
vAño = vAño - 1
End If
Else
vMes = DateDiff("m", DateAdd("yyyy", vAño, laFechaIni), laFechaFin)
End If
'Calculas la diferencia en días
vDia = DateDiff("d", DateAdd("m", vAño * 12 + vMes, laFechaIni), laFechaFin) ' Mod 7
'Construyes la expresión
If vAño = 1 Then
fncDiferenciaFechas = vAño & " año"
ElseIf vAño > 1 Then
fncDiferenciaFechas = vAño & " años"
End If
If vMes = 1 Then
fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vMes & " mes"
ElseIf vMes > 1 Then
fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vMes & " meses"
End If
If vDia = 1 Then
fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vDia & " día"
ElseIf vDia > 1 Then
fncDiferenciaFechas = IIf(fncDiferenciaFechas = "", "", fncDiferenciaFechas & " y ") & vDia & " días"
End If
End Function
Hola! Tal y como comenté, la función es perfecta y su resultado lo he dejado en un campo texto.
De forma que puedo tener: 1 año, 6 meses y 5 días; 6 meses y 1 día; 4 meses y 24 días; 1 mes y 3 días,etc....
Por favor:
¿Cómo podría, mediante consulta, obtener todos los registros menores o iguales a 6 meses?
Muchas gracias por vuestra amabilidad
Con esa función no puede hacerlo, porque devuelve un valor de tipo texto.
Necesitas una nueva función que te haga el cálculo de la edad en meses, y usarla en la consulta con el criterio que indicas (este nuevo campo lo puedes ocultar para que no se muestre en el resultado de la consulta).
Prueba esta función, a ver si te sirve:
'--------------------------------------------------------------------------------------------
' Función para calcular la edad en meses
' Por Sveinbjorn
'--------------------------------------------------------------------------------------------
Public Function fncEdadMeses(FechaNac As Date) As Integer
Dim vMes As Integer
If Day(FechaNac) > Day(Date) Then
vMes = DateDiff("m", FechaNac, Date) - 1
Else
vMes = DateDiff("m", FechaNac, Date)
End If
fncEdadMeses = vMes
End FunctionComo te decía, la añades a tu consulta en una nueva columna (oculta o no, como veas) y en criterios le pones el <=6
Saludos!
Una nueva web y foro de Access, pásate: http://nksvaccessolutions.com/
- Compartir respuesta