Cómo Prevenir la Selección de Fechas Inválidas en Oracle APEX
El otro día estaba haciendo unos trámites y noté un detalle pequeño pero importante que fácilmente puede pasarse por alto en las aplicaciones: permitir que los usuarios elijan fechas que no tienen ningún sentido.
Por ejemplo, imagina un campo de fecha de nacimiento donde un usuario selecciona una fecha futura, o un sistema de reservas donde se elige una fecha pasada. Esto puede generar problemas de calidad de datos y bugs que no son inmediatamente obvios.
La buena noticia es que Oracle APEX tiene una forma muy limpia de manejar esto directamente a nivel del Date Picker, sin JavaScript personalizado ni lógica de validación innecesaria. Siempre me sorprende lo fácil que es pasar por alto esta pequeña mejora. ¡Pero eso se acaba hoy!
En este post te explico cómo evito que los usuarios seleccionen fechas futuras o pasadas inválidas usando los atributos integrados del Date Picker.
El escenario
Supongamos que tienes un campo de fecha con los siguientes requisitos:
Los usuarios no deben poder seleccionar fechas futuras en los campos Fecha de Nacimiento y Fecha de Transacción.
Los usuarios no deben poder seleccionar una fecha pasada en el campo Fecha de Cita.
Ahora, puede que estés pensando ¿no puedo simplemente agregar una validación en la página? Claro que sí. Pero hay algo muy satisfactorio en que el propio calendario se niegue a dejar que el usuario haga clic en una fecha incorrecta. Sin envío del formulario, sin mensaje de error, sin idas y vueltas. Solo una fecha en gris que simplemente no se puede seleccionar. Es una experiencia mucho más limpia y, sinceramente, es uno de esos pequeños detalles que hacen que una aplicación se sienta bien pensada.
Cómo configurarlo
Navega a tu elemento Date Picker, baja hasta la sección Settings en el editor de propiedades, y encontrarás dos atributos clave: Minimum Date y Maximum Date. Cada uno puede configurarse como:
None: sin restricción (el valor predeterminado)
Static: un desplazamiento fijo relativo a la fecha de hoy
Item: el valor proviene de otro elemento de la página
Para los campos Fecha de Nacimiento y Fecha de Transacción, donde queremos bloquear fechas futuras, establece Maximum Date en Static y luego Maximum Static en +0d. Ese +0d es el que hace todo el trabajo, significa hoy, más cero días, así que hoy es la fecha más lejana que un usuario puede seleccionar. Sin mañana, sin la próxima semana. Listo.
Si quisieras permitir solo hasta ayer, usarías -1d. ¿Necesitas limitar al fin del mes pasado? También hay un formato para eso.
Para la Fecha de Cita, lo invertimos: establece Minimum Date en Static y Minimum Static en +0d. Ahora los usuarios solo pueden elegir hoy o una fecha futura. ¡Las citas pasadas quedan descartadas!
¿Y la opción Item?
Aquí es donde las cosas se ponen aún más interesantes. Supongamos que tienes un selector de fecha de inicio y uno de fecha de fin en la misma página. Puedes establecer el Minimum Date de la fecha de fin como Item, apuntarlo al elemento de fecha de inicio, y APEX automáticamente evitará que los usuarios seleccionen una fecha de fin anterior a la de inicio. Sin pasos adicionales, sin Dynamic Actions. Solo dos configuraciones y listo.
Es algo pequeño, realmente unos pocos clics en el editor de propiedades. Pero estos son los detalles que silenciosamente separan una aplicación pulida de una que simplemente funciona técnicamente. Tu lógica de validación también se mantiene más limpia, porque no estás corrigiendo errores después del hecho. Los estás haciendo imposibles desde el principio.