domingo, 12 de febrero de 2012

Oracle Forms Developer 6i - Apuntes # 2

Buen el primer apunte fue corto, pero se que a más de algún programador amateur como yo le servirá. Ahora vamos con algo más fumado, y es que mandaremos a llamar una función almacenada en la base de datos.


Llamada a una función en la base de Datos desde Forms.
El trabajo con la base de datos es una de las tareas más simples si estamos desarrrollando con Forms Developer, ya que el lenguaje es nativo y se entiende muy bien por la misma razón.

Si por ejemplo queremos mandar a llamar una función desde la base de datos que me valide el ingreso de una dirección de correo que contenga el formato usuariodecorre@domino.com, pensamos que la función ya esta hecha y se ve como la siguiente:



CREATE OR REPLACE FUNCTION pa.valida_formato_mail (l_user_name IN VARCHAR2)
  RETURN VARCHAR2
IS
  l_dot_pos   NUMBER;
  l_at_pos    NUMBER;
  l_str_length   NUMBER;
BEGIN
  l_dot_pos := INSTR (l_user_name, '.');
  l_at_pos := INSTR (l_user_name, '@');
  l_str_length := LENGTH (l_user_name);

  IF (   (l_dot_pos = 0)
   OR (l_at_pos = 0)
   OR (l_dot_pos = l_at_pos + 1)
   OR (l_at_pos = 1)
   OR (l_at_pos = l_str_length)
   OR (l_dot_pos = l_str_length)
  )
  THEN
  RETURN 'FAILURE';
  END IF;

  IF INSTR (SUBSTR (l_user_name, l_at_pos), '.') = 0
  THEN
  RETURN 'FAILURE';
  END IF;

  RETURN 'SUCCESS';
END valida_formato_mail;
/

Entonces si nos fijamos bien en el encabezado de la función solamente esta pidiendo un parámetro que sería la cuenta de correo, y la función valida si el formato es correcto o no.

Entonces para hacer la llamada desde el Forms Developer será necesario crear un nuevo Program Unit que bien podría ser un procedure o una función, que será invocada desde el Forms o simplemente llamarlo desde un trigger a nivel de la forma. En esta ocasión lo he hecho a través de un procedure, ya que estoy evaluando otras cosas, no solo el correo.

El proceso:

  1. Imaginemos que nuestra base de datos tiene una tabla email y que esta contiene las columnas persona y email_persona y que nuestra forma tendrá los mismos campos.
  2. Nos vamos al apartado de Program Units y le damos al botón Create.
  3. Nos aparecerá un cuadro de diálogo pidiendonos el nombre y el tipo de Program Unit que vamos a  crear, en mi caos le puse de nombre UPDATE_EMAIL, ya que alli hago las actualizaciones del Email y el tipo le puse Procedure. Al presionar aceptar el crea el cuerpo de un procedimiento con el Begin vacío.
  4. En la declaración de variables, la parte antes del begin, podemos crear una variable llamada email de la siguiente forma:
    1. email VARCHAR2 (50) := :principal.email;
  5. Además crearemos una variable para manejar el resultado de la función.
    1. error VARCHAR2 (15);


De una vez la estoy inicializando con el valor que reciba en el campo email del bloque principal.
  1. Siempre en la parte de declaración de variables vamos a crear un Cursor, el cual traerá el valor de retorno de la función. Usaremos la tabla Dual de Oracle para poder llamara a la función.
    1. SELECT valida_formato_mail (email)

    FROM DUAL;
  1. Ahora dentro del begin, llamaremos al resultado de la función y lo meteremos dentro de nuestra variable email.
    1. OPEN cvemail;

FETCH cvemail
INTO error;
  1. Teniendo el resultado de la función en una variable será fácil manejar una excepción que nos diga que si el correo esta con un formato correcto haga algo y si no que mande un mensaje de error diciendo que no esta correcto el formato.


 IF error = 'SUCCESS'
  THEN
   UPDATE email
     SET email_persona = email
   WHERE cod_persona= :principal.cod_persona;
  ELSE
  MESSAGE ('Revise la dirección de correo, no cumple con el formato de cuenta de correo');
  MESSAGE (' ');
  RAISE form_trigger_failure;
  END IF;

Nota: Imaginaremos que hemos creado un campo en la forma que se llame cod_persona y que esté dentro del bloque principal.
  1. Cerramos el Cursor:
    1. CLOSE cvemail;
  2. El resultado del Procedure quedaría algo así:

PROCEDURE update_email
IS
  email VARCHAR2 (50) := :principal.email;
  empresa   NUMBER (5) := 1;
  error VARCHAR2 (15);

  CURSOR cvemail
  IS
  SELECT valida_formato_mail (email)
    FROM DUAL;
BEGIN
  OPEN cvemail;
  FETCH cvemail
INTO error;

  IF error = 'SUCCESS'
  THEN
   UPDATE email
     SET email_persona = email
   WHERE cod_persona= :principal.cod_persona;
  ELSE
  MESSAGE ('Revise la dirección de correo, no cumple con el formato de cuenta de correo');
  MESSAGE (' ');
  RAISE form_trigger_failure;
  END IF;   
  CLOSE cvemail;
END;
  1. Y bueno para guardar la actualización o la inserción, dependiendo lo que quieran hacer habrá que agregar un commit, ya se en el trigger KEY_COMMIT o en el botón que tengan configurado para guardar.

No hay comentarios:

Publicar un comentario