Recientemente me han hecho una consulta, de cómo se puede validar dos columnas de tipo numéricas en una pantalla tabular en el cual si se ingresa un valor en una columna, ese valor sea menor que otra columna de la pantalla tabular.
Por ejemplo tenemos dos columnas, Valor A y Valor B, necesitamos validar que cuando el usuario ingrese el valor B, dicho valor no sea más grande que el valor A.
Para este ejemplo vamos a crear una tabla desde el Taller de SQL:
CREATE TABLE "DEMO_VALIDACION"
( "CLI_ID" NUMBER(8,0) NOT NULL ENABLE,
"CLI_NOMBRE" VARCHAR2(100) NOT NULL ENABLE,
"CLI_CAMPO_A" NUMBER(8,0) NOT NULL ENABLE,
"CLI_CAMPO_B" NUMBER(8,0) NOT NULL ENABLE,
CONSTRAINT "DEMO_VALIDACION_PK" PRIMARY KEY ("CLI_ID") ENABLE
)
/
CREATE OR REPLACE TRIGGER "BI_DEMO_VALIDACION"
before insert on "DEMO_VALIDACION"
for each row
begin
if :NEW."CLI_ID" is null then
select "DEMO_VALIDACION_SEQ".nextval into :NEW."CLI_ID" from sys.dual;
end if;
end;
/
ALTER TRIGGER "BI_DEMO_VALIDACION" ENABLE
/
Ahora creamos una aplicación de tipo escritorio y luego creamos una página de tipo Pantalla Tabular que muestre los registros de la tabla DEMO_VALIDACION.
Ejecutamos la aplicación y cargamos varios registros, al no tener ninguna validación, salvo que las columnas del Campo A y Campo B deben ser numéricas, podemos ingresar los valores sin restricciones.
En mi ejemplo he cargado los siguientes registros:
Lo primero que necesitamos conocer es el número de la posición de cada columna en la pantalla tabular.
Para ello vamos a utilizar el Inspector de elementos, en mi caso, yo uso el navegador Firefox con el ADD-ONS Web Developer Aquí lo puedes instalar
Nos paramos con el mouse encima de la tercer celda de la columna del Campo A y hacemos clic con el botón derecho del mouse para abrir el inspector de elemento.
Al abrir el inspector podremos encontrar las etiquetas html del input de la columna, si sólo vemos las etiquetas <td> simplemente expandimos cada fila de la tabla hasta encontrar la etiqueta input y en el id podemos ver qué posición tiene en la pantalla tabular.
En este caso el Campo A es f04_000X y el Campo B es f05_000X.
Una vez identificado podemos armar la función de tipo PL/SQL que controlará la validación.
Cuando trabajamos con las pantallas tabulares, Apex crea una colección automáticamente para mantener los valores en memoria hasta que hagamos clic en el botón de Aplicar Cambios y lo guarde en la tabla y libere la colección.
Esta colección guarda los datos de cada columna de la tabla ("apex_application.g_f01", "apex_application.g_f02" etc ...) y la función que vamos a crear recorre los valores en las columnas 4 y 5 y compara dichos valores.
Ingresamos al Diseñador de Páginas de la pantalla tabular.
Hacemos clic en el icono de Procesamiento (tab número 3) en el panel de la izquierda y dentro de Validaciones creamos una nueva validación que la llamaremos: Campo B <= Campo A.
Pasamos al panel de la derecha, en la sección Validación:
- Pantalla Tabular: Validación Numérica (Nombre de nuestra Pantalla Tabular)
- Tipo: Cuerpo de la Función PL/SQL (devuelve un valor booleano)
- Cuerpo de la Función PL/SQL que devuelve un Valor Booleano:
BEGIN
FOR i in 1..apex_application.g_f03.count
LOOP
IF TO_NUMBER(apex_application.g_f05(i)) >
TO_NUMBER(apex_application.g_f04(i))THEN
RETURN false;
END IF;
END LOOP;
END;
- En la sección de Error, Mensaje de Error:
Error. El número del campo B no puede ser mayor al número del campo A.
Por favor, inténtelo de nuevo. Gracias. - En Condición:
- Si Se Hace Clic en el Botón: SUBMIT
- Guardamos los Cambios
Ejecutamos la Aplicación y cargamos un registro incorrecto y veremos cómo funciona la validación:
Si ingresamos correctamente los valores, es decir, que el campo A es menor al campo B, se carga correctamente el registro.
De este modo podemos crear nuestras propias validaciones haciendo referencia a los valores publicados por un formulario HTML mediante la matriz de PL/SQL que va de APEX_APLICATION.G_F01 a G_F50, cada elemento de página que se crea se le da un valor de índice entre 1 y 50 que se corresponde directamente a una matriz G_Fx el cual contiene los valores temporales de los elementos del formulario.
Espero sea de utilidad y será hasta pronto!