jueves, 22 de diciembre de 2011

Alertas de más de 255 caracteres

A veces he tenido la necesidad de presentar mensajes más largos que los 255 caracteres que nos permiten las alertas de Oracle Forms. Por ello hoy os voy a presentar una función, que con la ayuda de un formulario, podréis visualizar alertas con mensajes de hasta 4000 caracteres.


La función es la siguiente:

FUNCTION msg_box(
    -- Parámetros
    ptitulo        IN VARCHAR2,
    pmensaje       IN VARCHAR2,
    ptxt_boton1    IN VARCHAR2 DEFAULT 'OK',
    ptxt_boton2    IN VARCHAR2 DEFAULT NULL,
    ptxt_boton3    IN VARCHAR2 DEFAULT NULL) RETURN NUMBER IS -- Botón pulsado

    id_paramList   PARAMLIST;
    vnumbotones    NUMBER := 0;

    v_itemact      VARCHAR2(255);
    v_canvasact    VARCHAR2(255);
    v_windowact    VARCHAR2(255);

    v_x_pos NUMBER;
    v_y_pos NUMBER;

    v_width        NUMBER;
    v_height       NUMBER;

    vbotonret      NUMBER;

BEGIN
    id_paramlist := get_parameter_list('param$msg');

    IF NOT id_null(id_paramlist) THEN
          destroy_parameter_list(id_paramlist);
    END IF;

    id_paramlist := create_parameter_list('param$msg');

    IF ptxt_boton1 IS NOT NULL THEN
        vnumbotones := vnumbotones + 1;
        add_parameter(id_paramList, 'texto1', TEXT_PARAMETER, ptxt_boton1);

        IF ptxt_boton2 IS NOT NULL THEN
            vnumbotones := vnumbotones + 1;
            add_parameter(id_paramList, 'texto2', TEXT_PARAMETER, ptxt_boton2);

            IF ptxt_boton3 IS NOT NULL THEN
                vnumbotones := vnumbotones + 1;
                add_parameter(id_paramList,'texto3',TEXT_PARAMETER, ptxt_boton3);
            END IF;
        END IF;
    END IF;

    add_parameter(id_paramList, 'titulo', TEXT_PARAMETER, ptitulo);
    add_parameter(id_paramList, 'mensaje', TEXT_PARAMETER, pmensaje);
    add_parameter(id_paramList, 'nbotones', TEXT_PARAMETER, vnumbotones);

    v_itemact        := name_in('system.cursor_item');

    IF v_itemact IS NULL THEN
        v_x_pos := 0;
        v_y_pos := 0;
        v_width := 8.2;
        v_height := 5;

    ELSE
        v_canvasact    := get_item_property(v_itemact,item_canvas);
        IF v_canvasact IS NULL THEN
            v_x_pos := 0;
            v_y_pos := 0;
            v_width := 8.2;
            v_height := 5;

        ELSE
            v_windowact := get_view_property(v_canvasact,window_name);
            IF v_windowact IS NULL THEN
                v_x_pos := 0;
                v_y_pos := 0;
                v_width := 8.2;
                v_height := 5;

            ELSE
                v_x_pos  := get_window_property(v_windowact,x_pos);
                v_y_pos  := get_window_property(v_windowact,y_pos);
                v_width  := get_window_property(v_windowact,width);
                v_height := get_window_property(v_windowact,height);
            END IF;
        END IF;
    END IF;

    add_parameter(id_paramList, 'parent_width', TEXT_PARAMETER, v_width);
    add_parameter(id_paramList, 'parent_height', TEXT_PARAMETER, v_height);
    add_parameter(id_paramList, 'parent_x', TEXT_PARAMETER, v_x_pos);
    add_parameter(id_paramList, 'parent_y', TEXT_PARAMETER, v_y_pos);

    copy('NULO','global.boton');
    call_form('W_ALERT', NO_HIDE, NO_REPLACE, QUERY_ONLY, id_paramList);
 

    destroy_parameter_list(id_paramlist);
    vbotonret := TO_NUMBER(name_in('global.boton'));
    erase('global.boton');

    RETURN vbotonret;
END msg_box;


La función necesita al menos dos parámetros: título y mensaje. También es posible especificar las etiquetas de los botones a mostrar, de manera que según  el nº de etiquetas indicadas se mostrarán un nº de botones con esas etiquetas. El valor devuelto se corresponde con el código del botón pulsado por el usuario (1, 2 o 3 según el botón o 0 si el usuario cierra la alerta). Hay que tener en cuenta que esta implementación utiliza las pulgadas como unidad de medida para indicar el alto, ancho y posición por defecto de la ventana padre, por lo que habrá que adaptarlo si utilizáis otras medidas diferentes.

Como vemos, utiliza un formulario llamado W_ALERT que es el que realmente se encarga de mostrar una ventana modal con el título y mensaje que hayamos indicado así como con los botones cuyas etiquetas hayamos indicado en los parámetros de entrada. La ventana se muestra en posición centrada respecto de la ventana desde la cual se ha lanzado. Esto se podría modificar para adptarlo a nuestras necesidades, como por ejemplo posicionarla justo a la altura del ítem actual en pantalla cuando se invocó la función.

Un último detalle a tener en cuenta: si queréis utilizar múltiples líneas en el mensaje hay concatenar chr(10) al final de cada una de ellas. Ejemplo:

DECLARE
    titulo VARCHAR2(255);
    mensaje VARCHAR2(255);

BEGIN
    titulo := 'Oracle Forms Developer Blog';
    mensaje := 'Primera línea' || chr(10) || 'Segunda línea';

    IF msg_box(titulo, mensaje,'OK') THEN
        NULL;
    END IF;
END;


El resultado sería algo como esto:


Aquí dejo una captura del diseño del fomulario en Forms:


Creo que con lo dicho es suficiente para que os diseñéis el formulario W_ALERT. No obstante, si lo queréis podéis contactarme y con mucho gusto os lo envío.

4 comentarios:

  1. Interesante. Gracias por el aporte. Lo usare.

    ResponderEliminar
  2. Buen dia Javier, me podrias enviar el ejemplo?

    ResponderEliminar
  3. Hola Javier, me podrias hacer el favor de compartirme el ejemplo? este es mi email andrspzgz@gmail.com

    ResponderEliminar
  4. hola Javier, interesante post, me podrías colaborar a mi correo con el ejemplo mi correo es rustia17_1@hotmail.com

    ResponderEliminar