Knowledge Base

¿Qué es esto?

Oracle: APEX: Validación de campos en Tabular forms SIN collections

18/11/2011 - 18/03/2019 -  Comentarios - Oracle APEX Validaciones

Mi problema particular era que tenía que validar que varios campos de un tabular form estuvieren rellenados. Había botones, además, para aumentar las filas del tabular form así que el procedimiento debía comprobar dinámicamente todos los campos de todos los registros a actualizar.

Esto se puede hacer con un procedimiento sencillo del tipo "Función que devuelve el texto de error".  Se van recorriendo todos los elementos del formulario y cuando se encuentra uno que no está relleno se devuelve el error. El problema aquí, es que no guarda los cambios hechos y por lo tanto, toda la información que haya metido el usuario que no esté guardada en la base de datos se pierde.

Para que eso no pase lo que se hace es:

1) Crear un procedimiento en la página que busca si hay algún campo no rellenado. Si lo hay, guarda en un item de aplicación el texto de error a mostrar y sigue el proceso, los datos se guardan, se ejecuta el branch y nos aparecerán los datos introducidos. Este procedimiento no nos mostrará ningún error por pantalla. Al no mostrar ningún error ejecutará el branch que nos cargará de nuevo la página y allí hay que crear el procedimiento indicado en el punto número 2:

BEGIN
    :P24_ERRORMULTIROW := NULL;
    -- Comprobamos que todos los DNIs se han introducido en el formulario
    FOR i in 1..apex_application.g_f04.count LOOP
        IF TRIM(apex_application.g_f04(i)) IS NULL THEN
                :P24_ERRORMULTIROW := 'Es obligatorio introducir el DNI para todo el personal';
        END IF;
    END LOOP;
    -- Comprobamos que todos los nombres y apellidos se han introducido en el formulario
    FOR i in 1..apex_application.g_f05.count LOOP
        IF :P24_ERRORMULTIROW IS NULL AND TRIM(apex_application.g_f05(i)) IS NULL THEN
           :P24_ERRORMULTIROW := 'Es obligatorio introducir nombre y apelllidos';
        END IF;
    END LOOP;
    -- Comprobamos que todas las funciones están completadas
    FOR i in 1..apex_application.g_f07.count LOOP
        IF :P24_ERRORMULTIROW IS NULL AND TRIM(apex_application.g_f07(i)) IS NULL THEN
           :P24_ERRORMULTIROW := 'Es obligatorio introducir la función';
        END IF;
    END LOOP;
    -- Comprobamos que el campo Horas semanales de dedicación está completado
    FOR i in 1..apex_application.g_f09.count LOOP
        IF :P24_ERRORMULTIROW IS NULL AND TRIM(apex_application.g_f09(i)) IS NULL THEN
           :P24_ERRORMULTIROW := 'Es obligatorio introducir las horas semanales de dedicación';
        END IF;
    END LOOP;
END;

2) Crear un procedimiento al cargar la página (secuencia 1 y indicando "En Carga: antes de cabecera" en el apartado Punto de proceso) con el siguiente código:

BEGIN
    IF :P24_ERRORMULTIROW IS NOT NULL THEN
        apex_application.g_notification := '<ul class=''htmldbUlErr''><li>' || :P24_ERRORMULTIROW || '</li></ul>';
       :P24_ERRORMULTIROW := NULL;
    END IF;
END;

Este procedimiento comprobará si ha generado error y si es así lo mostrará por pantalla, el código html es importante para que muestre el mensaje con el formato correcto.