Obtener el valor máximo de los campos fecha de un mismo registro

Alguna idea para comparar los campo fecha de un mismo registro y obtener un nuevo campo con el valor máximo de esas fechas.

Mi Tabla:

id_alumno: 1

fecha1: 01/01/2006

fecha2: 01/01/2007

Fecha3: Nulo

Obtener en consulta:

fmáx = 01/01/2007

En excel con la función max(campo1;campo2;campo3...) es muy fácil pero no sé como sacarlo en access.. Quizá es una chorrada pero les estoy dando vueltas y nada :(

1 Respuesta

Respuesta
1

Para hacer esa comparación entre fechas, vas a tener que utilizar una función personalizada, que has de construir en VBA.

Así rápidamente, se me ocurre algo así:

1º/ Inserta un módulo nuevo en tu BD.

2º/ Copias esta función:

Public Function FechaMax(fecha1 As Date, fecha2 As Date, Optional fecha3 As Date) As Date
'Primero comparas fecha 1 y fecha 2, para ver la mayor
If fecha1 > fecha2 Then
    FechaMax = fecha1
Else
    FechaMax = fecha2
End If
'Si hay fecha 3, la comparas con la mayor de arriba
If Not IsMissing(fecha3) Then
    If FechaMax > fecha3 Then
        'Nada, ya tenemos la fecha máxima
    Else
        FechaMax = fecha3
    End If
End If
End Function

3º/ Para obtener el máximo, si lo haces en una consulta, añades una columna nueva, y le pones este campo:

fmax: SiInm([fecha3] Es Nulo;fechamax([fecha1];[fecha2]);FechaMax([fecha1];[fecha2];[fecha3]))

Si lo quieres mostrar en un cuadro de texto de un formulario, añades el cuadro de texto, y en su origen de control, le pones esta expresión:

=SiInm([fecha3] Es Nulo;fechamax([fecha1];[fecha2]);fechamax([fecha1];[fecha2];[fecha3]))

Te dejo aquí un mini-ejemplo para que lo veas en funcionamiento.

Hola, 

Muchas gracias por la respuesta, creo que estoy cerca pero quizá no me he explicado del todo bien. 

* Los campos fecha pueden ser nulos cualquiera de ellos, he intentado modificar el código vb para adaptarlo a mis necesidades pero al final me da un error en el resultado. Copio el código.

Option Compare Database

Public Function FechaMax(fhosp As Date, fucsi As Date, frxucsi As Date, furuc As Date, fquir As Date, factivi As Date, furg As Date, fcitas As Date, fpro As Date) As Date
'Digamos que mi intención era ir guardando el valor máximo en fechaMax
If fhosp > fucsi Then
FechaMax = fhosp
Else
FechaMax = fucsi
End If

If FechaMax > frxucsi Then
Else
FechaMax = frxucsi
End If

If FechaMax > furuc Then
Else
FechaMax = furuc
End If


If FechaMax > fquir Then
Else
FechaMax = fquir
End If

If FechaMax > factivi Then
Else
FechaMax = factivi
End If

If FechaMax > furg Then
Else
FechaMax = furg
End If

If FechaMax > fcitas Then
Else
FechaMax = fcitas
End If

If FechaMax > fpro Then
Else
FechaMax = fpro
End If

End Function

Luego he puesto lo siguiente en el campo fmax de la consulta:

fmax: FechaMax([fhosp];[fucsi];[frxucsi];[furuc];[fquir];[factivi];[furg];[fcitas];[fpro])

No ha colado :P.. el resultado en la consulta del campo fmax = #Error

Muchas gracias de nuevo, 

También lo he intentado así (aunque tampoco funciona). 

(Doy por hecho que si un campo fecha es nulo siempre será más pequeño cuando lo compare con otro.)

Public Function FechaMax1(fhosp As Date, fucsi As Date, frxucsi As Date, furuc As Date, fquir As Date, factivi As Date, furg As Date, fcitas As Date, fpro As Date) As Date
FechaMax = fhosp

If fucsi > FechaMax Then
FechaMax = fucsi
ElseIf frxucsi > FechaMax Then
FechaMax = frxucsi
ElseIf furuc > FechaMax Then
FechaMax = furuc
ElseIf fquir > FechaMax Then
FechaMax = fquir
ElseIf factivi > FechaMax Then
FechaMax = factivi
ElseIf furg > FechaMax Then
FechaMax = furg
ElseIf fcitas > FechaMax Then
FechaMax = fcitas
ElseIf fpro > FechaMax Then
FechaMax = fpro
End If

Consulta: 

fmax: FechaMax1([fhosp];[fucsi];[frxucsi];[furuc];[fquir];[factivi];[furg];[fcitas];[fpro])

Resultado :

#Error

:(

El problema está en que si cualquiera es nulo, te va a dar error, porque no le puedes pasar un valor nulo a una variable de tipo fecha...

Una opción sería usar la función Nz() para convertir los valores nulos a una fecha determinada, que sepas cierto que no vas a tener en tus registros (por ejemplo 01/01/1870). Esto se lo aplicarías al llamar a la función, en la consulta o en el cuadro de texto, por ejemplo:

fmax: FechaMax1(Nz([fhosp];#01/01/1870#);Nz([fucsi];#01/01/1870#);....)

Otra opción sería que en la función definas los parámetros como "Variant" en vez de "date" y antes de comparar las fechas compruebes si son nulos o no con la función IsNull(), algo así:

Public Function FechaMax(fhosp As Variant, fucsi As Variant, frxucsi As Variant, furuc As Variant, fquir As Variant, factivi As Variant, furg As Variant, fcitas As Variant, fpro As Variant) As Date
If Not IsNull(fhosp) then  'Si la primera fecha no es nula

If Not IsNull(fucsi) then  'Si la segunda fecha no es nula, comparas

If CDate(fhosp)>CDate(fucsi) Then

FechaMax=CDate(fhosp)

else

FechaMax=CDate(fhosp)

End If

...

Yo optaría por la opción del Nz(), para no complicar más la función.

Prueba con esta otra función, que simplifica enormemente el proceso:

Public Function FechaMax(ParamArray Fechas()) As Date
Dim i As Integer
For i = 0 To UBound(Fechas)
    If Not IsNull(Fechas(i)) Then
        If CDate(Fechas(i)) > FechaMax Then FechaMax = CDate(Fechas(i))
    End If
Next i
End Function

Para llamarla sólo has de hacer como antes:

fmax: FechaMax1([fhosp];[fucsi];[frxucsi];[furuc];[fquir];[factivi];[furg];[fcitas];[fpro])

fmax: FechaMax([fhosp];[fucsi];[frxucsi];[furuc];[fquir];[factivi];[furg];[fcitas];[fpro])

Sería así, le sobra el 1...

¡Gracias!  

Funcionan las dos opciones! Entiendo que esta ultima queda más simplificada por lo que la dejo así.

(La única que no me funcionaba era la de los Else If (a modo informativo).

Muchas gracias crack!!! Ahora la leo detenidamente para la próxima vez :)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas