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:
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.
Interesante. Gracias por el aporte. Lo usare.
ResponderEliminarBuen dia Javier, me podrias enviar el ejemplo?
ResponderEliminarHola Javier, me podrias hacer el favor de compartirme el ejemplo? este es mi email andrspzgz@gmail.com
ResponderEliminarhola Javier, interesante post, me podrías colaborar a mi correo con el ejemplo mi correo es rustia17_1@hotmail.com
ResponderEliminar