23/8/10

Validar los datos tabular form en APEX

Para validar un Tabular form de APEX según si se quiere analizar sólo los seleccionados o todo el form:




1. Analizar de todo el form
Este ejemplo está pensado para ponerlo en una validación que devuelva una cadena de texto con el error.
DECLARE
   l_error   VARCHAR2 (4000);
BEGIN
   FOR i IN 1 .. apex_application.g_f02.COUNT
   LOOP
      IF     NVL (apex_application.g_f07 (i), 0) > 2000
         AND NVL (apex_application.g_f08 (i), 0) = 20
      THEN
         l_error :=
               l_error
            || '</br>'
            || 'Row '
            || i
            || ': Commission can not be higher '
            || ' than 2000 for department '
            || apex_application.g_f08 (i)
            || ' Employee: '
            || apex_application.g_f03 (i)
            || ' Requested value: '
            || apex_application.g_f07 (i);
      END IF;
   END LOOP;

   RETURN LTRIM (l_error, '</br>');
END;
1.1 Analicemos el código.
Declaramos las variables necesarias:
DECLARE
   l_error   VARCHAR2 (4000);
BEGIN
En este bucle nos fijamos en esto apex_application.g_f02.COUNT esto nos devuelve las filas que tiene el form. Es concreto nos cuenta las filas que tiene la segunda columna.
   FOR i IN 1 .. apex_application.g_f02.COUNT
   LOOP
      ...
      ...
   END LOOP;
En este condicional se comprueba, NVL (apex_application.g_f07 (i), 0) > 2000 que en la columna 7 para la fila i no tenga un valor superior de 2000 y NVL (apex_application.g_f08 (i), 0) = 20 que en la columna 8 para la fila i el valor sea 20. Si se cumplen esas condiciones se pasa a construir el mensaje de error o las acciones que requiramos
IF     NVL (apex_application.g_f07 (i), 0) > 2000
         AND NVL (apex_application.g_f08 (i), 0) = 20
      THEN
         ...
         ...
      END IF;
2. Analizar sólo los marcados
DECLARE
   vRow BINARY_INTEGER;
BEGIN
   :p38_text := NULL;
   FOR i IN 1 .. apex_application.g_f01.COUNT
   LOOP
      vRow := apex_application.g_f01(i);
      :p38_text :=
            :p38_text
         || CHR (10)
         || vRow
         || '. '
         || apex_application.g_f02 (vRow)
         || ' / '
         || apex_application.g_f03 (vRow)
         || ' / '
         || apex_application.g_f04 (vRow)
         || ' / '
         || apex_application.g_f05 (vRow);
   END LOOP;
  IF :p38_text IS NOT NULL THEN
   :p38_text := 'You have selected: '
   ||chr(10)||:p38_text;
  END IF;
END;
3. Diferencias entre los dos casos
Son varias pasamos a analizarlas a continuación
El count del bucle
    ...
    FOR i IN 1 .. apex_application.g_f01.COUNT
    ...

Podemos apreciar que cuenta el g_f01 a diferenciar del anterior que contaba el g_f02, esto se debe a que cuenta los marcados, o sea, que g_f01 son los checkbox.

3.1 ¿Porqué vRow?
   vRow := apex_application.g_f01(i);
Esto se debe a que la casilla marcada no está localizada, con vRow extraemos el id de la fila, por así decirlo, y a partir de ahí extraemos los datos usando vRow como id en los acceso a datos.
Todos las demás secciones son iguales al ejemplo 1.

4. Nota importante
El campo de selector de fila, lo que se suele ver como un checkbox no se cuenta; pero sí se cuentan las columnas que están ocultas.

Este ejemplo ha sido extraido de la web de Denes Kubicek. http://apex.oracle.com/pls/otn/f?p=31517:41:4387440571164486::NO

No hay comentarios:

Publicar un comentario