SlideShare una empresa de Scribd logo
1 de 80
Descargar para leer sin conexión
UN LENGUAJE DE
CUARTA GENERACIÓN
Primera Edición
ORACLE DEVELOPER SUITE 10G
PROGRAMACIÓN BÁSICA EN ORACLE FORMS Y REPORT
Lic.RoyMoralesVenegas
2
UN LENGUAJE DE
CUARTA GENERACIÓN
Primera Edición
ORACLE DEVELOPER SUITE 10G
PROGRAMACIÓN BÁSICA EN ORACLE FORMS Y REPORT
Lic.RoyMoralesVenegas
UniversidadMagister
SanJosé
COSTARICA
3
1............................................................................................................................................................ 4
INSTALACIÓN DE ORACLE ....................................................................................................... 4
Instalación de la Base de datos Oracle 10g Express Edition ....................................................... 4
Conexión con una instancia de base de datos.............................................................................. 4
Instalación del Developer Suite 10G de Oracle........................................................................... 6
Iniciando el contenedor de Oracle para J2EE (OC4J) ................................................................. 9
Configuración básica del servidor de aplicaciones.................................................................... 10
Configuración del servidor de reportes...................................................................................... 16
Comprobando la configuración del ambiente de ejecución....................................................... 22
2.......................................................................................................................................................... 26
PROGRAMACION CON FORMS DEVELOPER DE ORACLE ............................................... 26
Componentes de la herramienta................................................................................................. 26
Componentes en la definición de las formas o pantallas........................................................... 27
Generación de otros objetos aplicativos .................................................................................... 28
Componentes en la definición de menús ................................................................................... 28
Diseño de una pantalla básica.................................................................................................... 29
Objetos de trabajo ...................................................................................................................... 38
Ventanas..................................................................................................................................... 38
Bloques de datos ........................................................................................................................ 38
Tipos de elementos .................................................................................................................... 41
Listas de Valores........................................................................................................................ 45
Alertas........................................................................................................................................ 53
Disparadores .............................................................................................................................. 54
Implementación de Disparadores más comunes........................................................................ 57
Bibliotecas PL/SQL ................................................................................................................... 60
Conectar Bibliotecas.................................................................................................................. 61
Unidades de Programa............................................................................................................... 62
Excepciones, RETURN y EXIT ................................................................................................ 68
Manejo de Errores con ERROR_CODE, ERROR_TEXT ........................................................ 68
Uso de Identificadores ............................................................................................................... 70
Referencia a Objetos de la forma............................................................................................... 70
Referencia indirecta a Objetos con NAME_IN ........................................................................ 71
Código provisto por DEVELOPER........................................................................................... 71
Navegación entre registros......................................................................................................... 73
Como personalizar la barra de herramientas.............................................................................. 74
Uso de Parámetros ..................................................................................................................... 78
Manejo de Sesiones.................................................................................................................... 79
1
INSTALACIÓN DE ORACLE
Instalación de la Base de datos Oracle 10g Express Edition
La base de datos de Oracle es el primer componente que debe ser instalado. Para efectos de éste
curso se utilizará la Base de Datos Oracle 10g Express Edition. Una vez instalado éste producto, podrá
contar con una página web local que permite acceder a algunas herramientas administrativas que permiten
administrar y gestionar aspectos de almacenamiento, memoria, usuarios y control. Si desea contar con la
guía de instalación de la base de datos puede ingresar al siguiente sitio web de documentación de Oracle
www.oracle.com/pls/xe102/homepage.
Cada base de datos instalada en un servidor conforma una instancia de Oracle, la cual
consume recursos de memoria y disco considerables del servidor donde ésta se encuentra
instalada, por lo que es recomendable crear una sola instancia por servidor, para que el
rendimiento del mismo sea óptimo y resuelva cada petición en un tiempo prudencial.
La estructura de una base de datos Oracle está compuesta por archivos de control (Control
File), archivos de datos (Data File) y Archivos de Bitácora (Redo Log Files).
Conexión con una instancia de base de datos
4
Una vez instalada la base de datos Oracle, varios servicios son definidos en el sistema operativo, de
los cuales nos enfocamos básicamente en los siguientes:
El servicio relacionado con la instancia y la base de datos, cuyo nombre tiene la estructura:
OracleServiceXXX, donde XXX representa el nombre de la instancia de base de datos.
Para efectos del curso la instancia instalada tiene por nombre XE, por lo tanto el nombre
del servicio es OracleServiceXE.
El servicio relacionado con la disponibilidad del servidor para permitir el acceso remoto,
recibe el nombre de OracleXETNSListener para la instancia XE instalada en el servidor.
Ambos servicios deben encontrarse en estado iniciado, para poder ingresar a la base de datos a
través de cualquier gestor de bases de datos Oracle, siendo utilizados con mayor frecuencia los siguientes:
SQL Plus de Oracle, TOAD, SQL-DEVELOPER entre otros.
Utilizando el gestor Oracle Database Express Edition, ingresaremos a la base de datos,
autenticándonos mediante el siguiente diálogo de conexión, donde debe ingresar el usuario SYSTEM y la
clave de paso. Una vez autenticado el usuario y clave de paso la base de datos le presentará la página
principal de Oracle Database Express Edition.
Diálogo de conexión Página principal de la base de datos XE
5
Instalación del Developer Suite 10G de Oracle
1. En el servidor de la localidad con el administrador de la red definir la ruta donde se instala el
Developer suite, se sugiere instalar en la carpeta APPSOracle10iDS
2. DISCO 1
3. ABRIR CARPETA DISK1
4. SETUP
5. Seleccionar siguiente:
6
Especificar en el destino:
Nombre: oracle10IDS ó default
DevSuiteHome1
Ruta Acceso: C:APPSoracle10iDS (ruta
definida con el administrador de red)
Debe seleccionar la opción Terminar
1.15GB y seleccionar siguiente: Seleccionar
la opción instalar para dar inicio a la
instalación del producto Oracle Developer
Suite 10g:
1.6 Cambiar y seleccionar el disk2 y aceptar:
7
8
eleccionar y cambiar al disk 1 y aceptar:
inalizada la instalación de Oracle
S
F
Developer Suite 10g, presionar el botón
Salir.
Iniciando el contenedor de Oracle para J2EE (OC4J)
9
Al instalar ORACLE 10 iDS, Ud
encuentra en la carpeta de Forms Developer
un componente adicional OC4J; el cual es el
servicio que permite que el servidor funcione
en ambiente de Aplicaciones Web.
El contenedor de Oracle para Java con
sus siglas en ingles OC4J (Oracle Container for
J2EE), es un componente del Servidor de
Aplicaciones de Oracle corriendo sobre un
standard Java SE distributions, el cual permite
que las aplicaciones desarrolladas en Oracle
Forms y Report sean ejecutadas desde un
explorador de Internet, ofreciendo un
comportamiento excelente y de alta
escalabilidad para ambientes de producción.
Abrir el Contenedor de Oracle para J2EE
Este componente se levanta como un
servicio local en el servidor de aplicaciones,
tal y como se muestra en la siguiente imagen.
Este servicio se debe iniciar a través de la
opción START OC4J Instante, se debe
mantener activa la ventana mientras se
ejecuta la aplicación. Por ninguna razón debe
cerrar la sesión Start OC4J Instance, ya que
ésta representa el servicio que el servidor de
aplicaciones de Oracle requiere para ejecutar
los formularios (pantallas) y reportes que el
programador desarrolla.
Instancia del OC4J Activa
10
Para bajar el servicio utilice la opción
Shutdown OC4J Instante, automáticamente se
cierra la ventana de Start OC4J Instance y se
baja el servicio.
Cuando el servicio se encuentra abajo
(no disponible) le muestra el siguiente error al
ejecutar la aplicación:
Configuración básica del servidor de aplicaciones
Para que la aplicación de “Curso” funcione apropiadamente se debe:
Copiar DEFAULT.ENV como CURSO.ENV y modificar la configuracion ubicados en
<ORACLE_HOME>formsserver
Modificar los archivos FORMSWEB.CFG ubicados en <ORACLE_HOME>formsserver, donde
<ORACLE_HOME> es la ruta de instalación del Developer Suite 10g , Ej: C:oracle10iDSforms
ARCHIVO VARIABLES ACCION
curso.env FORMS_PATH= Incluir los Path de la aplicación de curso
Ejemplo: FORMS_PATH=D:APPSCursolib;
D:APPSCursobin;
Formsweb.cfg Incluir las siguientes líneas al final del archivo
[curso] separateFrame=True lookandfeel=oracle
form=D:APPSCursobinacceso.fmx
userid=USER/PASSWORD@[String de conexion]
envfile=curso.env
useSDI=yes colorScheme=Teal
config=sepwin IE=JInitiator
Creación del String de Conexión:
Ejecutar el asistente de configuración de Red de oracle:
11
Seleccionar Configuración del nombre del
servicio de red local y
Seleccionar Agregar y siguiente para agregar
un nuevo servicio de red
Seleccionar el nombre de la instancia de la
base de datos, el cual corresponde a un
nombre de base de datos global.
12
Seleccionar el tipo de protocolo de
comunicación , en este caso y para efectos de
éste curso utilizaremos: TCP
Introducimos la dirección IP donde se ubica el
servidor de la base de datos: Ej: 127.0.0.1,
dirección que corresponde al LocalHost.
El puerto a utilizar es el 1521 que
corresponde al puerto por defecto.
Probar la conexión, para validar que la
configuración del nuevo servicio de red local
se haya realizado correctamente.
El asistente realiza inmediatamente una
prueba con el usuario system, con una clave
que probablemente no coincide con la que se
definió en la instalación de la base de datos.
Por lo anterior, se debe seleccionar el botón
de Cambiar Conexión para suministrar el
usuario y clave de paso correcta para probar
la conexión.
13
Una vez suministrado el usuario y clave
correcta, la prueba de configuración del nuevo
servicio de red local es exitosa.
El de nombre del servicio de Red local es
ingresado con el mismo nombre de la base de
datos global, sin embargo, el mismo puede
ser nombrado diferente. Teniendo en cuenta
que es con el nuevo nombre que debe
conectarse a la base de datos desde
cualquier herramienta del Developer Suite 10g
de Oracle. (SQL Plus, Forms, Report). Como
recomendación dejar el nombre por defecto.
Si no se desea configurar mas servicios,
seleccionar NO y siguiente.
14
El asistente le indicará que concluyó la
configuración del servicio.
Presione Terminar para salir del asistente de
configuración de Red de Oracle.
15
Configuración del servidor de reportes
Para configurar el servidor de reportes se crea
un icono de acceso directo al archivo
rwserver,exe ubicado en el directorio
<ORACLE_HOME>bin de la siguiente
manera:
Botón derecho del Mouse aparece lo
siguiente: Configurar la ruta de los reportes
del aplicativo “Curso”
Una vez localizado el archivo rwserver.exe
agregamos en la ubicación del elemento
“Server=<nombre_servidor_de_reportes>”
como se muestra en la siguiente imagen.
16
Para finalizar la creación del servidor de
reportes, indicamos el nombre con el que
deseamos se visualice el acceso directo.
Para que todos los objetos del aplicativo
(pantallas, menus, librerías y reportes) puedan
ser ubicados por la aplicación en tiempo de
desarrollo (programación), se configura el
REGEDIT de la siguiente forma:
Al presentarse el editor del registro de Windows se debe localizar la clave
HKEY_LOCAL_MACHINESOFTWAREORACLEKEY_DevSuite10gR2 y modificar los valores
FORMS_PATH, REPORT_PATH y UI_ICON, adicionando al inicio de la cadena del valor la ruta donde se
encuentran almacenados los archivos del aplicativo, para nuestro efecto “D:appsCursoBin”(Formas,
reportes y menús), “D:appsCursoLib”(Librerías) y “D:appsCursoIco”(Imágenes).
17
18
Subir los servicios: START
OC4J Instante Servicio de
reportes:
Una vez que se haya establecido el servicio
OC4J puede iniciar el servidor de reportes
configurado anteriormente.
Inicialmente el Reports Server es un archivo
bloqueado por el Firewall de Windows, debe
desbloquearse para que pueda establecerse el
servicio de reportes.
El servicio de reportes está preparado y listo
para ser utilizado.
19
De acuerdo a la ruta señalada, abrir con Wordpad el archivo Orion_web.xml y adicionar las siguientes
líneas, como recomendación copiar cualquier línea en el archivo en una nueva y sustituir los valores
correspondientes.
<virtual-directory virtual-path="/Icons" Real-path="D:APPSCurso/Ico" />
SALVAR Y SALIR
20
Abrir archivo Registy.dat y adicionar al final de las variables los valores del directorio virtual y la extensión de
los íconos utilizados en la aplicación.
Ejemplo:
default.icons.iconpath= icons/
default.icons.iconextension=gif
21
Comprobando la configuración del ambiente de ejecución
Después de modificados los archivos de configuración del ambiente de ejecución de las aplicaciones que
serán desarrolladas durante éste curso, procedemos a ingresar al Forms Builder de Oracle para comprobar
la conexión y el ingreso a la pantalla de prueba.
Durante el desarrollo de éste curso utilizaremos el usuario HR, el cual corresponde a un pequeño esquema
que consta de ocho entidades (tablas) que comprenden la lógica de un sistema de nómina.
Conectarse a la base de datos de la siguiente forma:
ctrl. + j (tecla j) o ir a la siguiente opción de menú de
{Archivo}{Conectar}.
22
Si ésta es la primera vez que nos
conectamos a la base de datos con el
usuario HR es posible que el usuario
se encuentre bloqueado. Para
desbloquear el usuario debe ingresar
a una sesión de SQL con el usuario
SYSTEM y digitar las siguientes
instrucciones, que desbloquearán el usuario HR para lograr conectarse.
Alter User hr Account Unlock;
Alter User hr Identified By hr;
Una vez ejecutadas las instrucciones anteriores intente conectarse nuevamente con el Forms Builder, éste
paso debería de ejecutarse sin ningún problema.
23
Vaya a la siguiente opción de menú del Forms Builder,
al ingresar se le presenta la siguiente pantalla:
Presione le botón Restablecer y copie el texto ubicado
en el campo URL de Servidor de Aplicación. Abra
una sesión de Explorador de Internet y pegue el texto
anterior en el espacio de dirección. Antes asegúrese
que el componente OC4J se encuentra activo.
Si es la primera vez que ejecuta el servicio de forms, se
instalará el componente JINITIATOR en el sistema
operativo en forma automática. La versión de
JINITIATOR depende de la versión del servicio de
forms utilizado. Para efectos de éste cursos se utilizará
la versión 1.3.1.22 ya que estamos utilizando
Developer Suite 10g Forms Builder 10.1.2.02.
Permita la instalación del complemento Oracle JInitiator de Oracle Corporation, posicionándose en la barra
amarilla y haciendo Clic, esta acción le presentará el menú que se observa en la siguiente figura, en el cual
usted deberá seleccionar Instalar control ActiveX…
Finalmente instale el componente JINITIATOR
presionando el botón Instalar y en la siguiente
pantalla presine el botón Next para indicar la
carpeta donde se desea instar éste componente.
Recomendación permitir que se instale en la ruta que se
presenta por defecto.
Una vez concluida la instalación del componente JINITIATOR se le solicitará que reinicie su ordenador,
ejecute ésta acción y al ingresar nuevamente compruebe que el componente haya sido instalado
correctamente, ingresando a la opción Agregar y quitar programas ubicada en el Panel de Control.
24
Ingrese nuevamente el texto http://127.0.0.1:8889/forms/frmservlet en una nueva sesión de explorador de
Internet, esta acción le presentará la aplicación test.fmb, que está creada desde la instalación del Developer
Suite y configurada como aplicación inicial en el archivo de configuración Formsweb.cfg para el ambiente
default.
25
Si ésta aplicación se presenta, significa
que la configuración del servidor de
aplicaciones para el servicio de forms
está funcionando correctamente.
Ahora contamos con el ambiente de
desarrollo y de ejecución listos para ser
utilizados, si recordamos que tanto el
Registro de Windows y los archivos de
configuración del Servidor de
Aplicaciones
2
PROGRAMACION CON FORMS DEVELOPER DE ORACLE
Componentes de la herramienta
NAVEGADOR DE OBJETOS Es el navegador de Objetos, aparece con la misma estructura en
todas las herramientas ORACLE DEVELOPER y permite movilizarse entre las otras 3 interfaces y
se pueden arrastrar los objetos entre diferentes formas. Este componente es el primero en
aparecer después de ingresar al ORACLE Forms Builder.
EDITOR DE DISEÑO Es el editor de diseño, aquí se diseña el aspecto de los lienzos (Canvas), se
colocan los distintos objetos para el desarrollo de la aplicación. Para crear un lienzo se selecciona
Lienzos en el Navegador de Objetos, luego se pulsa CREAR (paleta de herramientas) y aparece
el Lienzos, luego seleccione el Lienzos que desee crear y pulse F2.
PALETA DE PROPIEDADES Es la paleta de propiedades, aquí se configuran todas las
propiedades y características de los diferentes objetos, por ejemplo: tamaño de letra, fuentes,
visibilidad, etc. Existen 2 maneras de mostrar la paleta, la primera pulsando F4 y la segunda es
dar un clic derecho sobre el objeto al cual se desea configurar sus características.
26
27
EDITOR PL/SQL: El editor del PL/SQL permite añadir, modificar, eliminar y compilar código
PL/SQL, aquí se modifican las estructuras y procedimientos de la base de datos. Para abrir el
editor, simplemente pulse doble-clic sobre el procedimiento que desee modificar, trigger a
programar.
BIBLIOTECAS DE OBJETOS La librería de Objetos se definen los estándares para el desarrollo
de aplicaciones y los objetos a reutilizar.
PAQUETES INCORPORTADOS Paquetería que Oracle incorpora como parte del producto Forms
Developer que ofrece diversas utilidades como lectura y escritura sobre archivos texto,
operaciones con árboles jerárquicos, funciones de uso estándar, etc..
OBJETOS DE BASE DE DATOS Permite la visualización y definición de componentes de base
de datos como unidades de programa almacenadas PL/SQL, tales como procedimientos,
funciones, paquetes y disparadores (Triggers) Update, Delete e Insert de tablas.
Componentes en la definición de las formas o pantallas
DISPARADORES Los Disparadores son bloques de código PL/SQL escrito para realizar tareas
cuando un evento especifico ocurre dentro de la aplicación.
ALERTAS Una alerta es una ventana modal que despliega un mensaje el cual notifica al operador
sobre alguna condición de la aplicación. Existen 3 tipos de alertas: Parar, Atención y Nota.
BIBLIOTECAS CONECTADAS Son vínculos a las librerías de los archivos de sistema, las cuales
tienen procedimientos, paquetes y funciones que realizan ciertas operaciones al momento de
ejecutar la aplicación.
BLOQUES DE DATOS Se refiere a los bloques que agrupan cierta información, ya sea ítems de
trabajo, o bloques de datos que representan a campos de una tabla.
LIENZOS Es el lienzo donde se diseña la forma que verá el usuario final, aquí se insertan los
ítems que contendrá la misma.
EDITORES Se refiere a los editores personalizados que ORACLE FORMS permite definir.
LISTA DE VALORES (LOV`S) Es un objeto que tiene una ventana desplegable que representa
una estructura de datos lógica. Básicamente realiza una sola consulta por cada lista de valores.
GRUPOS DE OBJETOS Es un contenedor para un grupo de objetos los cuales permiten trabajar
con herencias entre formularios a través de atributos y componentes.
PARÁMETROS Son variables del tipo CHAR, NUMBER o DATE que se definen en tiempo de
diseño y capaces de almacenar valores por defecto y ser alterados en tiempo de ejecución.
MENUS EMERGENTES Son menús anexados a los elementos de la forma y lienzos, permiten a
los usuarios finales rápidamente acceder a funciones y comandos comunes.
28
UNIDADES DE PROGRAMA Se almacenan los procedimientos y funciones programadas dentro
de la misma forma. También se tienen los procedimientos que utilizan los disparadores (si es que
se programara adicionalmente).
CLASES DE PROPIEDAD Un clase de propiedad es un objeto nombrado que contiene una lista
de propiedades y sus configuraciones para los elementos y componentes de la aplicación.
GRUPOS DE REGISTRO Son objetos que representan una estructura de datos con el marco
fila/columna de la base de datos.
INFORMES Permite la vinculación de informes que han sido diseñados con el Reports Builder de
Oracle. Corresponde al nombre del vínculo para ejecutar un informe almacenado físicamente en
el servidor de aplicaciones.
ATRIBUTOS VISUALES Representa un atributo visual que es aplicado a un objeto en tiempo de
ejecución. Los atributos definen color, fuente, patrones y la apariencia de un objeto.
VENTANAS Es un contenedor para todos los objetos visuales que hacen la aplicación de FORMS
BUILDER, puede incluir varios Lienzos. Así mismo, una forma puede contener varias Ventanas.
Generación de otros objetos aplicativos
MENÚES Son listas de items que los usuarios utilizan para seleccionar funciones específicas u
operaciones.
LIBRERÍAS Es una colección de subprogramas, incluyendo procedimientos, funciones y
paquetes, los cuales pueden compartirse entre distintas aplicaciones. Esto ayuda a la
estandarización del desarrollo.
Componentes en la definición de menús
BIBLIOTECAS CONECTADAS Las librerías son archivos que contienen un conjunto de
procedimientos, funciones o paquetes que pueden ser utilizados por cualquier objeto aplicativo de
ORACLE Forms, Reports y Menús.
Una vez creadas las librerías, estas se relacionan(Atachan) al menú; y posteriormente su código
PL/SQL puede ser invocado desde triggers, otro código PL/SQL de ítem del menú y rutinas
predefinidas.
MENÚS Los Menúes son listas de ítems que los usuarios utilizan para seleccionar funciones
específicas u operaciones. Forms soporta tres tipos de Menúes: menú de formas, menú de barra
de herramientas y menú popup (desplegables).
GRUPOS DE OBJETOS Un Objeto de Grupo es un contenedor para un grupo de objetos (ítems,
propiedades, atributos, alertas, disparadores). Se lo define cuando se quiere empaquetar objetos
relacionados, los cuales pueden ser copiados o heredados en otro módulo. (Menú Template)
UNIDADES DE PROGRAMA Se almacenan los procedimientos o funciones a nivel del menú, se
los utiliza comúnmente para definir programáticamente las propiedades del menú, inicialización de
variables, definición de seguridades para los menús y estados para trabajar con los menús, etc.
CLASES DE PROPIEDAD Una clase de propiedad es un objeto nombrado que contiene una lista
de propiedades y sus configuraciones para los ítems de la aplicación.
Luego de crear la clase de propiedad puede poner otros objetos en él. Un objeto basado en una
clase de propiedad puede heredar las características de cualquier propiedad. Pueden existir
varias propiedades en una clase de propiedad y las propiedades en una clase. Las propiedades
pueden ser controladas y localmente pueden ser descartadas para ese ítem, es decir que la
herencia puede romperse.
ATRIBUTOS VISUALES Son las fuentes, colores y propiedades patrón que se configuran para
los objetos del menú. Cada objeto de la interfaz tiene un grupo de atributos visuales que
determinan su configuración.
Diseño de una pantalla básica
29
P ionando para
pan
na vez creado el módulo de la nueva
Para definir una pantalla debe crear un nuevo
módulo de pantalla, posicionándose en el
componente antallas y pres
crear un nuevo módulo de talla.
U
pantalla, ubicarse en el componente Bloques
de Datos y hacer clic derecho sobre éste
componente, al presentarse el menú de
opciones seleccione Asistente de Bloques de
Datos.
30
l presentarse la pantalla de bienvenida al
eleccione Tabla o Vista para definir el tipo
eleccione la tabla y las columnas que se desean utilizar y presentar en el bloque de datos. No
A
asistente de bloques de datos presione el
botón Siguiente para definir el bloque de
datos.
S
bloque de datos que se desea crear.
S
necesariamente todos las columnas de una tabla deben seleccionarse, solo aquellas que se desean utilizar
y en el caso de bloques utilizados para registro deben presentarse las que corresponden a datos necesarios
(requeridos).
eleccione la tabla Departments para crear el
eleccione todas las columnas disponibles
S
bloque de datos y presione Aceptar.
S
mediante el botón con doble signo mayor
para elegir todas las columnas como
ntos de base de datos que conformarán
el bloque de datos.
eleme
tilice el mismo nombre de la tabla paraU
definir el nombre del bloque de datos y
presione el botón Siguiente. Esto finalizará la
creación del bloque de datos.
31
32
a concluido el diseño del bloque de datos,
el ejemplo seleccione el primer
l presentarse la pantalla de bienvenida al
iseño del Lienzo Son los lienzos de trabajo para realizar el diseño gráfico de las formas. Los elementos
Contenido: Lienzo contenedor, en este se depositarán los objetos del diseño, incluyendo otros
Apilado: es un lienzo que se coloca sobre el lienzo de contenido, se lo utiliza cuando se requieren
Separador: Es la implementación en Forms de lo que en otras herramientas se conoce como
Barra de Herramienta Horizontal: es un lienzo utilizado para diseñar barra de herramientas con
Barra de Herramienta Vertical: es un lienzo utilizado para diseñar barra de herramientas con
H
seleccione uno de los botones de radio para
indicar al Asistente de Bloques de Datos la
operación que desea realizar. Si selecciona
Crear el bloque de datos y, a continuación,
llamar al Asistente de Diseño,
automáticamente se abrirá el Asistente de
Diseño de Lienzos. Si elige Crear solo el
bloque de datos el volverá al navegador de
objetos donde podrá observar el bloque de
datos creado.
Para efectos d
botón.
A
asistente de diseño de lienzos presione el
botón Siguiente para definir el bloque de
datos.
D
que lo conforman son los Gráficos (Graphics). Existen varios tipos de LienzosCanvas.
lienzos de tipo apilados.
lienzos sobrepuestos para continuar cierto ingreso / presentación de la información (opcional).
Carpetas, los lienzos Separadores, pueden tener 1 o más Páginas, los cuales son independientes
para contener los objetos de las formas.
orientación horizontal.
orientación vertical.
eleccione Nuevo Lienzo para crear el lienzo
i selecciona un lienzo de tipo separador, debe
eleccione el bloque de datos y los elementos de
grese el nombre de la etiqueta que desea que
S
donde desee diseñar los elementos del bloque de
datos. Si el lienzo ya existe selecciónelo. Si crea
un nuevo lienzo asegúrese de seleccionar el tipo
de lienzo apropiado.
S
seleccionar las páginas donde desea diseñar los
elementos del bloque de datos.
S
éste que desea presentar en el lienzo.
33
In
presente cada campo en el lienzo, puede
modificar el ancho y el alto de elemento, ésta
medida está dada en puntos.
34
eleccione el estilo de diseño que desea para la
i se desea registrar información muy completa
grese el título que desea para el marco que
esea mostrar
a ver la barra de desplazamiento,
l asistente diseño ha finalizado el diseño del
l asistente de diseño mostrará el marco nuevo
S
pantalla, el cual debe ser elegido según la
presentación que se quiera dar a los datos.
S
en un solo registro es conveniente seleccionar
Pantalla, si la información a ingresar es masiva o
es agrupada por otro elemento se debe
seleccionar Tabular.
In
encierra los elementos en el lienzo.
Indique el número de registros que d
en el lienzo. Usualmente si seleccionó el estilo
del lienzo de tipo Pantalla se mostrará un solo
registro, si es tabular indique la cantidad de
registros que desea visualizar y la distancia entre
cada registro.
Indique si dese
la cual puede ser vertical u horizontal según el
sentido de orientación de los datos el bloque.
E
lienzo. Para crear el marco y diseñar los
elementos seleccionados presione el botón
Terminar.
E
en el Editor de Diseño. Puede ajustar el diseño en
el futuro utilizando nuevamente el asistente de
diseño, o utilizando la paleta de propiedades
para modificar propiedades específicas del marco,
lienzo o de cualquier elemento dentro de éste.
sta es la pantalla resultante del diseño
sta aplicación esta preparada para
i el servicio del contenedor OC4J está
a pantalla que se presenta inicialmente
E
anterior. El diseño es básico, sin embargo
puede ajustarse a medida que se identifican
los elementos de ajuste necesarios.
E
ejecutarse. Puede presionar el botón
Ejecutar Pantalla para ejecutarla, éste
paso abrirá en forma automática el
explorador de Internet y presentará en modo
de ejecución la aplicación diseñada.
35
S
levantado puede ejecutarse la aplicación
diseñada, sino levante el servicio tal y como
se explicó anteriormente.
L
está en modo de inserción de datos, si se
desea consultar la información debe
presionar los botones de Introducir
consulta y Ejecutar consulta.
36
na vez consultados los datos, éstosU
pueden modificarse y almacenarse
presionando el botón Guardar .
Modifique el nombre del departamento, luego nos pasamos a otro registro presionando el botón o la tecla
gde dirección con la flecha ↓ sin guardar el cambio, modificamos otra descripción y luego uardamos
presionando el botón guardar , observe como se despliega en la barra de estado el mensaje transacción
terminada: dos registros aplicados y
guardados, esto se puede realizar
entre registros, pero no entre bloques
de registros. Es decir, si contamos con
dos bloques Maestro – Detalle, y
modificamos un registro del bloque
detalle, si intentamos navegar hacia otro
registro del bloque maestro, Oracle
solicitará que se almacene o se
descarte los cambios realizados en el
bloque detalle del registro que
deseamos abandonar, debido a que no
mantiene en memoria los cambios
realizados entre registros de nivel de
detalle para múltiples registros
maestros, sino únicamente del registro
maestro actual.
Si modificamos datos que afecten la integridad referencial entre uno o mas datos, se produce un error
durante el evento de almacenamiento en base de datos (Grabar), el error puede ser visualizado en el menú
{Ayuda}{Mostrar Error} de la pantalla en
ejecución.
37
Como puede observar, se presenta una
ventana que describe el error en forma de
la sentencia en lenguaje DML que
ocasionó el fallo, y el error de validación
por violación a la integridad de la base de
datos, al tratar del almacenar un dato que
no existe en una entidad, a la cual existe
una llave foránea.
Objetos de trabajo
Ventanas
Es un contenedor para todos los objetos visuales que hacen
la aplicación de Form Builder, incluyendo los lienzos. Una sola
forma puede tener varias ventanas.
38
Cuando se crea una ventana, se especifica su tipo
configurando la propiedad Window Style, existen 2 estilos :
Document: Son ventanas que típicamente despliegan el
canvas principal y áreas de trabajo de la aplicación donde
se realiza la mayor parte de interacción entrada / salida
con el usuario final.
Dialog: Son ventanas flotantes, contenedores usados para
diálogos modales que esperan respuesta inmediata.
Ventana que muestra la consola de Forms Builder
Esta ventana despliega la consola para la forma actual activa
en la aplicación. Esta manera de trabajar es opcional, aunque es muy utilizada en aplicaciones de
formas múltiples, la ventaja es que siempre muestra la consola de la forma actual.
Bloques de datos
Son estructuras que agrupan a un conjunto de ítems de diferente tipo, que podría por ejemplo representar a
los campos de una tabla o conformar un bloque de trabajo.
Si se utiliza un bloque para relacionarlo a la información de la base de datos, existen 2 formas: Relación
Directa, donde se específica directamente con que tabla(solo una) trabajará el bloque. Relación Indirecta, en
este caso el bloque trabajará con información de la base datos a través de procedimientos. La programación
en estos procedimientos tiene ciertas restricciones pero en general tiene ventajas como la mejora del
performance y que permite enlazar un bloque con un conjunto de tablas.
Los bloques de datos estas conformados con los siguientes elementos: Disparadores, elementos (columnas
de tabla o elementos temporales) y relaciones, estas ultimas se forman cuando se crean bloques maestro-
detalle.
39
En la siguiente imagen
observamos las diferentes
secciones que contiene
un bloque de datos, y las
propiedades que
corresponden a cada
sección.
Propiedades básicas de un bloque de datos
General
Nombre: Nombre interno del objeto.
Comentarios: Información general que usted desea especificar acerca del bloque de datos creado.
Navegación
Estilo de navegación: Como procesar el elemento siguiente o anterior cuando el foco es el primer o
último elemento navegable dentro del bloque de datos.
Registros
Consultar todos los registros: Especifica si
desea recupera todos los registros que
coinciden con los criterios de consulta en el
bloque de datos. Esta propiedad tiene por
defecto el valor NO, para utilizar elementos
calculados de tipo resumen en un bloque, se
debe definir ésta propiedad en SI.
Grupo de atributos visuales del registro actual:
Permite definir atributos visuales a nivel de
forma, bloque de datos y elementos de un
bloque de datos, o bien, para formas con
varios niveles de bloques de datos, permite la
combinación de atributos visuales para cada
bloque o elemento de un bloque, otorgando
una apariencia visual independiente.
Base de Datos
Bloque de datos de base de datos: Indica si
40
el bloque de datos se basa en un objeto de base de datos (SI), o si se utiliza como un bloque de trabajo
temporal (NO).
Consulta permitida: Define si las aplicaciones pueden ejecutar una consulta en el bloque de datos.
Inserción permitida: Define si las aplicaciones pueden insertar registros en el bloque de datos.
Actualización permitida: Define si las aplicaciones pueden actualizar registros en el bloque de datos.
Supresión permitida: Define si las aplicaciones pueden suprimir registros en el bloque de datos.
Alias: Nombre del Alias asociado al Origen/Destino de datos.
Cláusula WHERE: Cláusula estándar asociada por defecto al bloque de datos, en la cual se define
específicamente las sentencias de condición que limita la consulta de registros en el bloque.
Clásula ORDER BY: Cláusula estandar asociada por defecto al bloque de datos, en la cual se define el
orden de visualización de los registros recuperados en una consulta. Puede utilizar orden
ascendente(ASC) o descendente(DESC) después de cada columna.
Ejemplo Location_Id Desc, Department_Name Asc
Barra de desplazamiento
Mostrar barra de desplazamiento: Desea visualizar la barra de desplazamiento en el lienzo.
Lienzo de barra de desplazamiento: Especifica el lienzo donde será visualizada la barra de
desplazamiento.
Página de separador de la barra de desplazamiento: Especifica la página donde será visualizada la
barra de desplazamiento en caso de que se utilicen lienzos de tipo separador.
Tipos de bloques de datos
De acuerdo a la necesidad de la aplicación y para optimizar el desarrollo de la misma se tienen diferentes
tipo de bloques.
Bloque de barra de herramientas
Es un bloque donde se añaden los objetos que pertenecerán al toolbar (barra de herramientas) de la
aplicación, regularmente son botones típicos de edición, impresión, grabar, hacia delante, hacia atrás, los
cuales son programados para que realicen las funciones que les corresponde.
Este bloque no pertenece a la base de datos, por lo tanto no se deben parametrizar las propiedades de
base de datos y registros en el property palette.
Bloques de trabajo
Es un bloque utilizado por los programadores, donde se manejan valores necesarios para la aplicación pero
que no necesitan ser vistos por el usuario final, se los esconde al no definir en que lienzo debe mostrase.
Regularmente tenemos datos de consultas generadas por PL/SQL cargadas en estos elementos del bloque
de trabajo.
Este tipo de bloque puede estar enlazado con alguna columna de la base de datos de la cual se recoja
información, otras veces simplemente los elementos del bloque de trabajo son repositorio transitorio hasta
realizar algún proceso.
Bloques de información
Son los bloques presentados al usuario final, aquí se permiten realizar consultas, ingresar, actualizar o
eliminar datos. Dependiendo de la funcionalidad pueden estar enlazados a tablas o procedimientos
almacenados, estos últimos trabajan con columnas de las tablas del módulo.
Cuando se desea crear un bloque con el botón Create de la paleta de herramientas, aparece el Asistente de
ayuda y allí se puede indicar que vinculo tendrá ese bloque, con una tabla o con un procedimiento, si se
hace de esa manera es más fácil.
Si se prefiere la creación manual deben especificarse ciertas propiedades en la paleta de propiedades para
ese bloque de datos en particular.
En la propiedad Elemento de Base de Datos indique SI
Si se trabaja con claves primarias, seleccione SI en la propiedad Clave Primaria
Continúe parametrizando las propiedades restantes, dependiendo de las necesidades de la aplicación.
Generalmente las aplicaciones se realizan enlazando los bloques de datos con la base de datos, debido a
las transacciones que se manejan, además existen métodos que optimizan el tiempo de consulta a la base
de datos.
Elementos gráficos
Los elementos gráficos aparecen como una paleta en el editor de diseño del lienzo, esta situado al lado
izquierdo de la pantalla.
Marcos
Son objetos gráficos que aparecen en un lienzo. Se los usa para acomodar varios objetos dentro de un
bloque. Esto ayuda porque varias propiedades pueden configurarse para ese marco y permite la
estandarización.
Texto Fijo
Son etiquetas de texto las cuales son editadas en modo de diseño.
Texto
Elemento texto
Tipos de elementos
Elemento mostrado
Son ítems que únicamente despliegan valores asignados al mismo. No son navegables y comúnmente
se utilizan para mostrar valores referenciales.
Elemento de texto
Es un recuadro o campo que permite desplegar y además editar texto. Son utilizados para permitir al
usuario ingresar información que será posteriormente procesada. Como todos los objetos tienen
propiedades que pueden ser configuradas en modo de diseño, o con programación.
Botón
Son ítems de interfaz que permite a los usuarios finales ejecutar comandos o iniciar acciones. Se los
utiliza para iniciar navegación, desplegar listas de valores, invocar un editor o ventana; y son
programados con pl/sql. En Forms se soportan 2 estilos: de texto e icónicos, estos últimos pueden
contener un gráfico visible al usuario. Este gráfico tiene que ser un archivo de tipo .ICO.
Grupo de botones de radio
Es desplegado como un indicador visual (circulo) y aparece lleno o vacío para indicar el status actual de
cada sub-opción. Un radio button debe pertenecer a un radio group menú de dos o mas ítems
relacionados.
41
42
Casilla de control
Son casilleros de selección múltiple, los cuales pueden ser configurados en tiempo de diseño o por
programación.
Elemento de lista
Es una lista de elementos de texto que pueden ser desplegados de alguna forma: poplist, tlist o combo
box.
Estas listas muestran números fijos de elementos, estos son cadenas de texto de hasta 30 caracteres.
En tiempo de ejecución, programáticamente pueden ser evaluados o eliminados.
Creación de elementos de trabajo
Creando el bloque de datos
Employees relacionado con el
bloque Departments, agregar en el
los siguientes elementos en el
bloque Employees luego de que
éste es diseñado:
L_Total_Linea
L_Total_Salario
L_Total_General
Asignar a la propiedad Elemento de Base
de Datos el valor SI. Ya que éste es un
valor de cálculo temporal el cual no es
almacenado en base de datos, sino que
únicamente se muestra para efectos de
resumir o totalizar datos.
Existen 2 métodos de cálculo del valor de un elemento calculado:
43
Fórmula: Se especifican los elementos que se desean operar entre sí, formando una operación
aritmética simple o combinada.
Formula= :employees.salary*(1+NVL(:employees.commission_pct))
Resumen: Suma o resume los valores de un elemento. Esto es muy útil cuando se requiera sumar
los valores que presenta un elemento específico en un bloque de varios registros (Tabular).
Resumen= function resumen (suma)
Bloque resumido: employees
Elemento resumido:salary
El elemento debe residir en un bloque
de datos donde la propiedad
Consultar todos los registros=SI, o
Pre-Calcular=SI.
44
Como una buena práctica y para
indicar que es un elemento que no
puede ser modificado, debe definir
éste elemento como un tipo de
elemento mostrado, utilizado para
aquellos elementos que no deben ser
manipulados o alterado su valor en
tiempo de ejecución.
Al ejecutar la aplicación
una vez concluida la
especificación de las
propiedades necesarias
para los elementos de
fórmula y resumen, ésta
debe presentar como
sigue a continuación
Listas de Valores
El constructor Forms de Oracle ofrece muchas ventajas al contar con asistentes para diseñar y definir
ciertos objetos como Listas de Valores y Grupos de Registros, los cuales trabajan conjuntamente.
Uso del Asistente
A continuación se detalla el uso del Asistente para la creación de listas de valores y grupos de registro.
Durante su definición se crea primero el grupo de registros, ya que los valores o registros que obtenga la
consulta serán mostrados en la lista de valores.
Como ejemplo se elabora una lista de valor basada en la consulta de la tabla Employees, de la cual se
consultarán todos los empleados que tengan una jefatura. Para esto se implementará el uso de la siguiente
consulta:
select a.employee_id, a.first_name||' '||a.last_name nombre_empleado
from employees a
where a.employee_id in (select b.manager_id
from employees b
where a.employee_id = b.manager_id
)
O bien, la siguiente creada automáticamente por Query Builder de Oracle Developer.
SELECT DISTINCT A.MANAGER_ID, B.FIRST_NAME, B.LAST_NAME
FROM EMPLOYEES A, EMPLOYEES B
WHERE (A.MANAGER_ID = B.EMPLOYEE_ID)
ORDER BY A.MANAGER_ID ASC
Los elementos marcados MANAGER_ID y L_MANAGER_NAME presentan los valores del código de un
empleado jefe (Elemento de base de datos = ‘SI’) y el nombre de empleado jefe (Elemento de base de datos=NO)
respectivamente, lo cuales serán utilizados para desplegar la lista de valores y retornar los valores
seleccionados de la lista.
45
Creando la lista de valores con el asistente de diseño
Seleccione el componente Listas de Valores en el navegador de
objetos, presione clic derecho sobre el componente y elija Asistente
de Listas de Valores para iniciar la creación de la lista de valores.
La lista de valores obtiene los datos de los
grupos de registros, éstos últimos se pueden
definir con consultas SQL o introduciendo una
lista de valores estáticos.
Si el grupo de registros existe, selecciónelo de la
lista de Grupo de Registros Existente, si la lista
de valor es completamente nueva, seleccione
Nuevo Grupo de Registros Basado en una
Consulta y presione el botón Siguiente.
Los grupos de registros pueden basarse en
consultas SQL. Si desea introducir o modificar
una consulta que es utilizada por un
grupo de registros de la lista de valores,
puede hacerlo a partir de la creación de
una nueva consulta o su importación
desde un archivo del tipo SQL
almacenado.
Si desea obtener ayuda al crear la
consulta seleccione Crear Consulta
SQL , Oracle le permite utilizar Query
Builder de Oracle Developer, donde
podrá seleccionar las tablas y columnas
que desee presentar y relacionar.
46
47
Debe seleccionar las tablas que
conformarán la consulta, una vez
seleccionadas cierre éste diálogo de
selección y establezca las relaciones
entre las tablas incluidas, de modo que
la consulta se defina debidamente
normalizada.
Para efectos de éste ejemplo, se ha
seleccionado la tabla EMPLOYEES dos
veces, relacionando la columna
Manager_Id de la entidad con alias
EMPLOYEES y la columna
Employee_Id de la tabla con alias
EMPLOYEES_A1.
Ordenar datos
por columnas
Una vez establecida la consulta básica,
ésta se presentaría de la manera en
que lo muestra ésta figura.
Sin embargo, puede mejorarse su
estructura, utilizando ordenamientos de
columnas y asignando un nombre de
diferente a los alias de las tablas
incluidas en la consulta.
Ordenamiento de datos
Mediante el ícono puede establecer el orden de
los datos en la consulta. Seleccione de la lista de
Columnas Disponibles, la columna por la cual desea
ordenar la información, presione doble-clic o presione
el botón para establecer el grupo de
columnas ordenadas.
Cambiar Nombre de Tablas
Query Builder asigna automáticamente el alias de las tablas incluidas en la consulta, sin embargo, el
nombre de éstas puede ser cambiado mediante el botón (Cambiar nombre de tablas). Seleccione la
tabla a modificar y asigne en el campo Nombre Nuevo el nuevo alias de la tabla.
EMPLOYEES A
EMPLOYEES_A1 B
48
De la forma en que se presenta en la figura Consulta A, es creada la consulta con el asistente de Query
Builder, en cuyo caso se presentarían tantos registros de un mismo jefe como éste se encuentre asignado a
diferentes empleados. De manera que para presentar únicamente un registro de cada jefe y el nombre
respectivo, se sustituye la cláusula ALL por DISTINCT.
Consulta A Consulta B
Los datos de presentarían en cada caso como se muestra a continuación:
Para una mejor presentación del nombre del empleado, realice la siguiente modificación a la consulta
generada:
SELECT DISTINCT A.MANAGER_ID, (B.FIRST_NAME||’ ’||B.LAST_NAME) NOMBRE
FROM EMPLOYEES A, EMPLOYEES B
WHERE (A.MANAGER_ID = B.EMPLOYEE_ID)
ORDER BY A.MANAGER_ID ASC
Los datos serán presentados como se muestra en ésta figura. Este ajuste es
necesario debido a que según el diseño de la aplicación, en la cual tenemos
únicamente dos campos para retornar los valores de la lista, los cuales son
Manager_Id y L_Manager_Name, donde en éste último se debe mostrar el
nombre completo del empleado jefe.
49
Una vez que la consulta es definida
puede incluir algunas o todas las
columnas del grupo de registros en la lista
de valores.
Seleccione de la lista de Columnas del
Grupo de Registros la columna(s) que
desea visualizar en la lista de valores y
presione el botón para pasar
dichas columnas como parte de la lista de
Columnas de la Lista de Valores.
Presione el botón para
pasar a la siguiente pantalla.
Nuevamente otra ventana le indica
que etiquetas llevaran las columnas o
si desea usar el default.
50
En la parte inferior de la ventana hay
un botón Consultar elemento de
retorno, el cual le permite definir
cuales serán los elementos que
recibirán a cada columna de la
consulta. Estos objetos pueden ser
elementos de texto o elementos
mostrados.
Seleccione el elemento del bloque de datos que recibirá el valor de la
columna que el usuario elige de la lista de valores en tiempo de
ejecución.
Avance a la siguiente pantalla presionando Siguiente >
En ésta pantalla debe definir algunos
valores a ciertas atributos de la lista.
Para éste ejemplo asigne el título
Lista de Jefes, modifique los valores
por defecto del ancho y la altura de la
ventana de la lista de valores,
asignando 300 y 350
respectivamente. Forms colocará la
lista de valores automáticamente.
51
Avance a la siguiente pantalla
presionando Siguiente >
Si desea modificar las propiedades
avanzadas puede hacerlo.
Recuperar # de filas cada vez
permite limitar la cantidad de filas que
muestra la lista de valores.
Refrescar los datos del grupo de
registros antes de mostrar la lista
de valores permite actualizar datos
que hayan sido incluidos durante el
tiempo en que se ha interactuado con
una aplicación sin salir de ella,
presentando en la lista de valores
cualquier cambio en las tablas que la
conforman.
Permitir al usuario filtrar los
registros antes de mostrarlos es
una funcionalidad que en tiempo de
ejecución permitirá al usuario final
filtrar información antes de que los
valores de la lista sean mostrados en
pantalla.
Avance a la siguiente pantalla presionando Siguiente >
De los elementos que se
seleccionaron como valores de
retorno, se han seleccionado el
Manager_Id y L_Manager_Name
donde se asignarán el código y el
nombre del empleado jefe.
52
Asigne a alguno de éstos elementos o
a todos la lista de valores, con el fin
de que el usuario presionando la
combinación de teclas CTRL+L pueda
levantar la lista de valores.
Importante: los elementos deben ser
de tipo Elemento de Texto, en éste
caso Manager_Id es elemento de
texto y L_Manager_Name es
elemento mostrado por lo tanto éste
último al ser un elemento que nunca
podrá tener el foco de edición, no
tendrá sentido asignarle la lista de
valores.
Una vez asignada la lista de valores al elemento
presione el botón Siguiente >
El asistente ha completado la definición de la lista
de valores, presione el botón para
crear el grupo de registros y la lista de valores. El
navegador de objetos mostrará y asignará un
nombre y un consecutivo de grupo de registros y
lista de valores, el cual podrá modificar editándolos.
Si desea modificar la lista de valores en un futuro,
vuelva a llamar al asistente de diseño de listas de
valores y modifique los atributos que considere
necesarios.
Creando listas de valores manualmente
Creación de Grupo de Registros
Se abre la forma a la cual se le añadirá el Grupo de Registros.
Luego se da clic en el componente de Grupo de Registros en el navegador de objetos y en la
paleta de herramientas escoja Crear (+)
Aparece una ventana para la creación de la consulta o indicar que se trabajara con valores
estáticos. Escoja la opción que necesite.
Clic en aceptar.
Aparecerá el nuevo objeto Record Group.
Creación de la Lista de Valores
Previamente creado el grupo de registros se da clic en el componente Lista de Valores del
navegador de objetos y en la paleta de herramientas escoja Crear (+)
Aparece una ventana la cual indica el modo de creación (manual o Asistente). Escoja Manual.
Presione Aceptar.
Luego diríjase a la paleta de propiedades de la nueva lista de valores.
Defina cual Grupo de Registros se utilizará en la propiedad Grupo de Registros.
Luego en la propiedad Propiedades de Correspondencia de Columnas, indique cuales columnas
serán retornadas a los elementos del bloque de datos.
Finalizado esto debe indicar al botón que disparara la lista de valores, cual lista de valores debe
ejecutarse (Ver código en la parte superior). Si fuera un text item quien dispara la lista de valores, se
define en la propiedad Lista de Valores del elemento de texto cual Lista de Valores se invocará.
Alertas
Una alerta es una ventana modal que despliega un mensaje el cual notifica al operador sobre alguna
condición de la aplicación.
Existen 3 estilos de alertas: Parar,
Atención y Nota.
53
Cada estilo de alerta mostrará una
figura diferente.
La cantidad de botones en una alerta
será definida por la cantidad de
Etiquetas de Botón con contenido.
Es decir, si se necesita una alerta que
presente un mensaje, ésta deberá
tener el texto Aceptar en la Etiqueta
del Botón 1, y las etiquetas del botón
1 y 2 deben de dejarse sin contenido.
54
Disparadores
Los disparadores responden a eventos que se ejecutan en una aplicación en tiempo de ejecución, con el
objetivo de ejecutar ciertas rutinas, dependiendo del procedimiento invocado.
Explicación principales disparadores definidos
Existe división de categorías funcionales para los disparadores:
° Disparadores para procesamiento de bloques
° Disparadores para eventos de interfaz
° Disparadores para maestro-detalle
° Disparadores para el manejo de mensajes de error
° Disparadores de navegación
° Disparadores para tiempo de consulta
° Disparadores transaccionales
° Disparadores de validación
Disparadores para procesamiento de bloques .- Estos triggers se disparan en respuesta a eventos
relacionados en la administración de un registro en un bloque.
When-Create-Record Realiza una acción cuando se intenta crear un nuevo registro en un
bloque.
When-Clear-Block Realiza una acción cuando se elimina el registro actual. Remueve
todos los registros del bloque.
When-Database-Record Realiza una acción cuando cambia el estado del registro para
insertar, actualizar, así se indica que el registro será procesado por
la siguiente operación COMMIT_FORM.
When-Remove-Record Realiza una acción cuando un registro es limpiado o eliminado.
Disparadores para eventos de interfaz.- Son disparados en los eventos que ocurren en la interfaz de la
forma.
When-Button-Pressed Inicia una acción cuando un operador selecciona un botón
(mouse/tecla).
Key-Commit Se ejecuta cuando se realiza la acción COMMIT, con la tecla F10.
Key-Entqry Inicia acción cuando se entra el modo de consulta (tecla F7).
Key-Exeqry Inicia acción cuando se ejecuta la consulta (tecla F8).
When-Timer-Expired Inicia una acción cuando expira el timer programático.
When-Window-Activated Inicia una acción cuando un operador o aplicación activa una
ventana.
55
When-Window-Closed Inicia una acción cuando un operador cierra una ventana con el
comando Close del administrador de ventana.
Disparadores Maestro-Detalle .- Son generados automáticamente al definirse una relación maestro-
detalle entre bloques. Estos obligan la coordinación entre registros en un bloque detalle y en el registro
maestro del bloque maestro.
On-Check-Delete-Master Se dispara cuando se intenta eliminar un registro en un bloque que es un
bloque maestro en una relación maestro-detalle.
On-Clear-Details Se dispara cuando se necesitan limpiar registros en un bloque que es un bloque
detalle en una relación maestro-detalle.
Disparadores para el manejo de mensajes de error.- Form Builder envía mensajes de información y error
en respuesta a eventos en tiempo de ejecución.
On-Error Reemplaza un mensaje de error default con un mensaje de error personalizado.
Disparadores de navegación.- Responden a eventos de navegación. Por ejemplo cuando el usuario da un
clic en un ítem de texto en otro bloque, un disparador de navegación se dispara y Forms mueve el foco de
ingreso desde el ítem actual al ítem objetivo. Pueden dispararse en respuesta a eventos internos de
navegación que ocurren durante el procesamiento de la forma. Se subdividen en 2 categorías: Pre-trigger y
Post-trigger.
Listado de Disparadores de Navegación:
Pre-Block, Pre-Record, Pre-Text-Item, Post-Text-Item, Post-Record, Post-Block.
Pre-Form Se dispara durante el evento de Entrar a la forma, al inicio de la forma.
Post-Form Realiza una acción cuando Forms sale de la forma.
Además, existen los disparadores When-New-Instance-Triggers que se disparan al final de la secuencia de
navegación que ubica el foco en un ítem diferente. Estos son: When-New-Block-Instance, When-New-
Record-Instance, When-New-Item-Instance.
When-New-Form-Instance Realiza una acción al iniciar la forma. Se ejecuta después del
disparador Pre-Form.
Disparadores para tiempo de consulta.- Son disparados antes y justo después que el usuario o la
aplicación ejecuta una consulta en un bloque. Estos disparadores son :
Pre-Query Valida el criterio de consulta actual o provee programáticamente criterio adicional.
Post-Query Realiza una acción después de recuperar un registro. Se dispara una vez para cada
registro dentro del bloque.
Disparadores transaccionales.- Se disparan en respuesta a varios eventos que ocurren cuando la forma
interactúa con la fuente de datos. Los triggers son: On-Delete, On-Insert, On-Lock, On-Logout, On-Update,
56
Post-Database-Commit, Post-Delete, Post-Forms-Commit, Post-Insert, Post-Update, Pre-Commit, Pre-
Delete, Pre-Insert, Pre-Update.
On-Logon Se dispara para cada logon a la base de datos.
Disparadores de validación.- Se disparan cuando Form Builder valida datos en un ítem o registro. La
validación la chequea durante la navegación que ocurre por control de programación, procesamiento, etc.
When-Validate-Item Se dispara en la ultima parte de la validación del ítem para los
ítems con el estado de validación Nuevo o Modificado.
When-Validate-Record Se dispara durante el proceso de validación de registros, en la
ultima parte de la validación del registro para los registros con
estado Nuevo o Modificado.
Otros Disparadores
When-Button-Pressed Se dispara cuando se selecciona un botón al dar un clic o usar el
teclado. Es definido a nivel de forma, bloque o ítem.
When-Mouse-Click Se dispara después de hacer click con el ratón, si ocurren estos
eventos: click en lienzos o elementos de la forma.
When-Mouse-Enter Se dispara cuando el mouse entra a un ítem o canvas.
When-Mouse-Leave Se dispara cuando el mouse sale de un ítem o canvas.
Implementación de Disparadores más comunes
POST-QUERY
Se implementó el disparador PORT-
QUERY mediante un cursor el cual
obtiene el nombre del jefe, consultando el
código del empleado en la tabla
EMPLOYEES y que corresponda al
código de jefe del registro actual en el
bloque de departamentos.
Recordemos que éste disparador se
ejecuta luego de realizada la consulta a
la base de datos y presentados lo datos
en el bloque.
Este disparador se ejecuta para todos los
registros recuperados y visualizados en
el bloque de datos.
WHEN-VALIDATE-ITEM
57
El When-Validate-Item es un disparador
que podría implementarse igual que el
POST-QUERY para la recuperación y
validación del dato, incorporando el
comando Raise Form_Trigger_Failure
dentro de la validación de localización del
registro. Sin embargo, para implementar
un ejemplo diferente, se realiza la
validación haciendo una consulta directa
y utilizando el manejo de excepciones
para identificar si se logró o no encontrar
el registro.
En éste caso si el registro es encontrado
lo asigna directamente al elemento
L_Manager_Name, el registro no es
encontrado, el proceso se va a la sección
de excepciones inmediantamente, ejecutando el código dentro de la excepción WHEN NO_DATA_FOUND,
asignando el código no existe al elemento L_Manager_Name.
En caso de presentarse cualquier otro error se ejecuta la excepción WHEN OTHERS, la cual mostraría el
mensaje de error de SQL, el cual no permitiría identificar con precisión el error presentado.
Recordemos que éste disparador se ejecuta luego de realizada cualquier modificación de información en un
elemento, cuando el bloque de datos se encuentra en estado NEW.
58
PRE-FORM
El Pre_Form es un disparador que se
ejecuta inmediatamente que se ingresa a
una pantalla, en éste se puede cargar
valores iniciales de trabajo que definen el
entorno de operación en una aplicación.
Para una mejor ilustración tome como
ejemplo el código fuente que se presenta
en el disparador Pre-Form de ésta figura,
donde se implementa la carga de un
elemento de tipo lista a partir de los
valores de la tabla Departements del
esquema HR.
Para esto utilizamos el procedimiento
Gen_Carga_ListItem contenido en la
Biblioteca Pl/Sql llamada General.pll.
Esta unidad de programa consiste en
llenar un elemento de tipo lista a partir de
la construcción de una consulta a la base
de datos, recibiendo los parámetros necesarios para conformar la estructura de dicha consulta.
Bliblioteca:General.pll
PROCEDURE GEN_CARGA_LISTITEM(Campo In Varchar2, -- campo tipo lista de manera: bloque.campo
Codigo In Varchar2, -- Valor del campo a guardar en la lista
Des In Varchar2, -- Descripción del campo a guardar en la lista.
Tabla In Varchar2, -- Nombre de Tabla de la cual se cargan valores
Where_ In Varchar2 Default Null, -- Condiciones de la consulta.
Order_ In Varchar2 Default Null, -- Ordenamiento de los valores a mostrar en la lista.
GloDef In Varchar2 Default Null -- Global para utilización de valor inicial del campo.
) IS
RG RecordGroup;
Status Number;
NomRG varchar2(20);
Consulta varchar2(2000);
Inicial varchar2(500);
BEGIN
-- Se crea la consulta para cargar los valores de la lista.
Consulta := 'Select '||Des||' DES, '||Codigo||' COD From '||Tabla;
IF Where_ is not null then
Consulta := Consulta ||' Where '||Where_;
End If;
IF Order_ is not null then
Consulta := Consulta ||' Order by '||Order_;
end if;
-- Si el RG ya existe, lo elimina para crear la nueva consulta.
RG := Find_Group('GRUPO_LISTA');
IF Not Id_Null(Rg) Then
Delete_Group (RG);
End IF;
-- Crea Record group.
NomRG := 'GRUPO_LISTA';
RG := Create_Group_From_Query (NomRG,Consulta);
Status := Populate_Group (RG);
Clear_List (Campo);
Populate_List (Campo,RG);
-- Asignar a la global el primer valor
if (GloDef is not null) and (Get_Group_Row_Count(RG) > 0) then
Inicial := Get_Group_Char_Cell (NomRG||'.COD',1);
Copy (Inicial,GloDef);
end if;
Delete_Group (RG);
EXCEPTION
When Others Then
Gen_Mensaje('<Gen_Carga_ListItem>..Error interno en rutina de carga de campo lista.. '||SqlErrM);
Raise Form_Trigger_Failure;
END;
Continuando con la implementación del elemento de lista dinámico, es necesario definir la propiedad Tipo
de Elemento en la paleta de propiedades como Elemento de Lista.
Una vez definido el tipo de elemento y debido a que el elemento de lista se llena a partir de los datos en una
tabla, no deben existir valores en la propiedad Elementos en Lista, los cuales son creados por defecto y
deben eliminarse, tanto el Elemento de Lista como el Valor de Elemento de Lista.
Asegúrese de conectar la biblioteca
General.pll para poder utilizar la unidad
de programa Gen_Carga_ListItem
contenida en ella.
Al ejecutar la aplicación ésta deberá
presentarse como se observa en la
siguiente figura.
59
Bibliotecas PL/SQL
Es una colección de subprogramas, incluyendo procedimientos, funciones y paquetes, los cuales pueden
compartirse entre distintas aplicaciones. Esto ayuda a la estandarización del desarrollo.
Crear una librería nueva
Para crear una Biblioteca, debe ubicarse en el componente
Bibliotecas PL/SQL, y presionar el botón crear en el panel
vertical, seguidamente Forms creará el objeto en ésta
sección de componentes con un nombre lógico temporal, el
cual será almacenado con el nombre que se le defina.
Una vez almacenada la biblioteca en disco, podemos
incorporarle funciones, procedimientos y paquetes, tal y
como se muestra en la siguiente figura.
60
61
Como se puede apreciar, esta biblioteca llamada,
General.pll, contiene una serie de procedimientos y
funciones que se convierten en código flexible y
estándar, el cual puede ser utilizado por cualquier
aplicación que conecte ésta biblioteca.
Una vez creada la biblioteca, ésta puede ser
recuperada para adicionarle o modificarle cualquier
de las unidades de programa que la componen.
Luego de realizar cualquier cambio en la biblioteca,
ésta debe ser compilada completamente utilizando
la combinación de teclas CTRL+SHIFT+K.
Posteriormente con CTRL+T debe generar el
módulo compilado, para su utilización en ambiente
de ejecución.
Conectar Bibliotecas
Son vínculos a las librerías del sistema de archivos, las cuales tienen procedimientos, paquetes y funciones
que realizan ciertas operaciones al momento de ejecutar la aplicación.
Para conectar una biblioteca PL/SQL, debe
ubicarse en el componente Bibliotecas
Conectadas, y presionar el botón crear en el
panel vertical, seguidamente Forms abrirá un
diálogo de conexión, donde deberá buscar el
archivo con extensión PLL y seleccionarlo para
conectarlo a la aplicación.
Al conectar la biblioteca Forms le solicitará que indique si
desea eliminar la ruta de acceso, si la elimina deberá definir
la ruta en la variable FORMS_PATH en el Regedit y en el
archivo ambiente *.env del ambiente de ejecución. Si no
elimina la ruta se debe tener en cuenta que la aplicación
buscará tanto en ambiente de desarrollo como de ejecución la biblioteca en la ubicación donde
originalmente se encontraba almacenada en el momento de conectarla a la aplicación.
Unidades de Programa
Son procedimientos o funciones a nivel de la forma, las cuales tiene la lógica de programación con la que
interactúan los objetos de la forma.
Para ilustrar mejor éste concepto, confeccionará un elemento de tipo Árbol Jerárquico a partir de la tabla
de Employees del esquema HR, el cual será cargado utilizando una unidad de programa local a la forma de
Empleados.fmb.
Como primer paso se debe crear el componente Grupo de Registro al cual le asignaremos el nombre
Gr_Tree_Empleados, incorporando la consulta que se presenta en la siguiente figura.
Implementación de un árbol jerárquico
62
ree el bloque de datos manualmente con el nombre
Para la construcción de un árbol jerárquico a partir de
una tabla se debe respetar la siguiente estructura:
1. Valores numéricos 0 y 1 que indican si el árbol
se presenta con todos sus nodos colapsados o
expandidos respectivamente.
2. Nivel de jerárquía del nodo en el árbol.
3. Descripción que será mostrada en el árbol.
4. Ícono con que se desea visualizar un nivel o
jerarquía de nodos.
5. Valor al que responde o que encapsula el nodo.
C
B_Tree_Empleados no basado en tablas y agregue en este un
nuevo elemento de tipo Árbol Jerárquico con el nombre TREE, vaya
a la sección funcional de la paleta de propiedades y asóciele el
Grupo de Registros Gr_Tree_Empleados y finalmente vincúlelo al
lienzo donde se desea visualizar.
Tome el siguiente procedimiento e inclúyalo como una unidad de programa local a la forma Empledos.fmb,
con el nombre Tree_Carga_Rg.
PROCEDURE TREE_CARGA_RG (p_Campo In Varchar2, -- Item tipo árbol
p_NomRG In Varchar2 -- Nombre del Record Group asociado
) IS
v_Status Number := 0; -- Almacena resultado de ejecución de RG.
RG RecordGroup; -- Record group de cuentas contables definidas.
BEGIN
-- Asigna el Record Group al campo determinado
FTree.Set_Tree_Property(p_Campo,FTree.Record_Group,p_NomRG);
-- Asigna el cursor como ocupado
Set_Application_Property(Cursor_Style,'Busy');
-- Ejecuta el record group con el cual se cargará el árbol
v_Status := Populate_Group(p_NomRG);
:Parameter.Par_TotNodos := Get_Group_Row_Count(p_NomRG);
-- Carga elementos en el árbol
FTree.Populate_Tree(p_Campo);
-- Restaura el estilo del mouse para indica que ya finalizó el proceso
Set_Application_Property(Cursor_Style,'Default');
-- Establece el primer elemento del árbol como Seleccionado
FTree.Set_Tree_Selection(p_Campo, 1, FTree.Select_On);
END;
Una vez incluido el procedimiento en la forma, incluya en el
disparador When-New-Form-Instance el llamado al
procedimiento Tree_Carga_Rg para que sea cargado el
elemento de tipo Árbol Jerárquico del bloque
B_Tree_Empleados y puedan ser visualizados los registros
de la tabla Employees según la jerarquía de jefatura
asignada a cada empleado, según la consulta implementada
en el grupo de registros GR_TREE_EMPLEADOS.
El procedimiento Tree_Carga_Rg
cargará los registros recuperados
en el grupo de registros
GR_TREE_EMPLEADOS en el
elemento de tipo árbol
B_Tree_Empleados.Tree,
presentándolo como se muestra
en la ésta figura.
63
64
Como ejercicio adicional y explotando la funcionalidad que permite el elemento de tipo árbol, cree el
siguiente procedimiento en como una unidad de programa local a la forma Empleados.fmb, con el nombre
Tree_Nodos_Seleccianados, la cual recorrerá cada uno de los nodos seleccionados en el árbol y
utilizaremos para que realice una consulta al bloque Employees y presente la información de cada
empleado seleccionado en el árbol, simulando una relación entre bloques de datos.
La selección de registros puede ser múltiple, presentando los mismos registros en el bloque empleados que
fueron seleccionados en el árbol.
PROCEDURE tree_nodos_seleccionados (
p_campoarbol IN VARCHAR2, -- Campo tipo árbol por controlar
p_rgelementos OUT recordgroup, -- Rg donde almacena elem seleccionados
p_colcodigo OUT groupcolumn, -- Columna a consultar posteriormente
p_totelementos OUT NUMBER, -- # Elementos seleccionados
p_selecpadres IN BOOLEAN DEFAULT FALSE -- Indica si se desean seleccionar los padres
)
IS
htree item := FIND_ITEM (p_campoarbol);
v_nodoactual ftree.node; -- Almacena c/nodo seleccionado
v_nodotmp ftree.node; -- Nodo padre temporal
v_idtmp_rg recordgroup;
v_valor_nodo VARCHAR2 (100); -- Almacena el valor del nodo
v_tipo_nivel VARCHAR2 (2);
-- Almacena el tipo de nivel que se extrae del árbol (1:Uen, 2:Proceso, 3:Funcionario)
v_primera_vez BOOLEAN := TRUE;
v_error VARCHAR2 (2000) := NULL;
BEGIN
IF ID_NULL (htree)
THEN
gen_error ( 'El campo tipo árbol: '
|| p_campoarbol
|| ' no existe en la forma actual.'
);
RAISE form_trigger_failure;
END IF;
-- Si no existen elementos seleccionados, solamente sale
p_totelementos := ftree.GET_TREE_PROPERTY (htree, ftree.selection_count);
IF p_totelementos = 0
THEN
RETURN;
END IF;
-- Si el grupo por crear existe, lo borra
v_idtmp_rg := FIND_GROUP ('Grupo_Elementos');
IF NOT ID_NULL (v_idtmp_rg)
THEN
DELETE_GROUP (v_idtmp_rg);
END IF;
-- Crea el record group y lo devuelve para luego permitir obtener los
-- elementos seleccionados
p_rgelementos := CREATE_GROUP ('Grupo_Elementos');
-- Crea la columna que almacena el valor de cada nodo seleccionado
p_colcodigo := ADD_GROUP_COLUMN (p_rgelementos, 'COD', char_column, 100);
-- Se recorren todos los nodos del árbol seleccionados, y si tiene padre, marca
-- selecciona el padre.
IF p_selecpadres
THEN
FOR nodopadre IN 1 .. p_totelementos
LOOP
-- Obtiene el nodo seleccionado
v_nodoactual := ftree.GET_TREE_SELECTION (htree, nodopadre);
-- Obtiene el padre (si es que tiene)
v_nodotmp := NULL;
v_nodotmp := ftree.GET_TREE_NODE_PARENT (htree, v_nodoactual);
IF v_nodotmp <> 0
THEN
ftree.SET_TREE_SELECTION (htree, v_nodotmp, ftree.select_on);
END IF;
END LOOP;
END IF;
-- Obtiene de nuevo los elementos seleccionados
p_totelementos := ftree.GET_TREE_PROPERTY (htree, ftree.selection_count);
IF p_totelementos = 0
THEN
RETURN;
END IF;
:parameter.estatuto_sql := 'Where employee_id In ( ';
-- En realidad, al seleccionarse nodos en un árbol, éste les asigna un índice, por lo que
-- solamente debe recorrese cada elemento y obtener dicha selección
FOR elemento IN 1 .. p_totelementos
LOOP
v_nodoactual := ftree.GET_TREE_SELECTION (htree, elemento);
v_valor_nodo := UPPER (ftree.GET_TREE_NODE_PROPERTY (htree,
v_nodoactual,
ftree.node_value
)
);
-- Incluye nueva línea y Asigna el valor al Recor group de elementos
ADD_GROUP_ROW (p_rgelementos, end_of_group);
SET_GROUP_CHAR_CELL (p_colcodigo, elemento, v_valor_nodo);
IF NOT v_primera_vez
THEN
:parameter.estatuto_sql := :parameter.estatuto_sql || ', ' || v_valor_nodo;
ELSE
:parameter.estatuto_sql := :parameter.estatuto_sql || v_valor_nodo;
v_primera_vez := FALSE;
END IF;
END LOOP;
:parameter.estatuto_sql := :parameter.estatuto_sql || ') ';
-- Ejecuta el estatuto sql para visualizar el registro en el bloque de mantenimiento
-- que corresponde al valor del dato seleccionado en el arbol
IF NOT gen_ejecutaqueryconwhere
(:parameter.estatuto_sql, -- Estatuto SQL
'Employees' -- Bloque donde se ejecutará la consulta
)
THEN
NULL;
END IF;
RETURN;
END;
Seguidamente incluya en el elemento B_Tree_Empleados.Tree el disparador When-Tree-Node_Selected e
ingrese el siguiente código, el cual será ejecutado cada vez que se seleccione uno o más nodos del árbol.
Disparador When-Tree-Node_Selected
Declare
v_RGElementos RecordGroup; -- Rg donde almacena elem seleccionados
v_ColCodigo GroupColumn; -- Columna a consultar posteriormente
v_TotElementos Number;
v_BloqueActual Varchar2(50);
Begin
Tree_Nodos_Seleccionados ('B_TREE_EMPLEADOS.TREE', -- Elemento de tipo arbol
v_RGElementos, -- Grupo de registro donde almacena elem seleccionados
v_ColCodigo, -- Columna a consultar posteriormente
v_TotElementos);
End;
65
66
Posteriormente a la implementación correcta del disparador When-Tree-Node_Selected compile y ejecute
la aplicación. Seleccione uno o varios registros del árbol y observe como simultáneamente son consultados
los registros en el bloque de datos Employees.
Para lograr esta funcionalidad se incluye el siguiente código en la unidad de programa
Tree_Nodos_Seleccionados, el cual incrusta en la cláusula Where del bloque, la condición de búsqueda
dinámicamente, donde el parámetro Estatuto_Sql contiene la condición Employee_Id In (valor1, valorN…).
La función Gen_EjecutaQueryConWhere se encuentra en la biblioteca General.pll, la cual se encarga de
armar la cláusula de condición.
-- Ejecuta el estatuto sql para visualizar el registro en el bloque de mantenimiento
-- que corresponde al valor del dato seleccionado en el arbol
IF NOT gen_ejecutaqueryconwhere
(:parameter.estatuto_sql, -- Estatuto SQL
'Employees' -- Bloque donde se ejecutará la consulta
)
THEN
NULL;
END IF;
Función Gen_EjecutaQueryConWhere integrado a la biblioteca General.pll.
FUNCTION gen_ejecutaqueryconwhere (
p_estatutosql IN VARCHAR2, -- Estatuto SQL
p_bloque IN VARCHAR2, -- Bloque donde se ejecutará la consulta
p_num_registro NUMBER
DEFAULT 1
-- Registro en el que se debe posicionarse posterior a la consulta
)
RETURN BOOLEAN
IS
/*
OBJETIVO.........: Ejecutar un query para un bloque dado, utilizando la cláusula WHERE dada en el
estatuto SQL en P_EstatutoSQL
REQUIERE.........: Que existe la palabra WHERE, sino retorna FALSE
RESTRICCIONES....: Si el valor de la consulta no corresponde al bloque en el parámetro P_Bloque se
ocurrirá un error de consulta en tiempo de ejecución.
EFECT SECUNDARIOS: Mueve el cursor al bloque pasado en P_Bloque
CONSIDERACIONES..: Si se utiliza el valor de la variable de sistema :System.Last_Query para asignarlo
al Estatuto Sql que se recibe en el parámetro P_EstatutoSql, dicho valor debe ser
asignado a un parámetro o item local caracter con una presición de 2000 y ejecutado
desde el Trigger Post-Query del Bloque para el cual se ejecutará la consulta.
Para que no se refresque el valor en el parámetro o varible local se puede condicionar
a que dicho valor sea nulo para ser asignado, limpiándose en el trigger Key-ExeQry
del mismo bloque.
*/
v_whereanterior VARCHAR2 (5000);
v_wherenuevo VARCHAR2 (5000);
v_orderbyanterior VARCHAR2 (5000);
v_poswhere NUMBER;
v_posorderby NUMBER;
v_ret BOOLEAN := FALSE;
BEGIN
IF p_estatutosql IS NOT NULL
THEN
-- Guarda el valor anterior
v_whereanterior := GET_BLOCK_PROPERTY (p_bloque, default_where);
-- Obtiene la posicion del WHERE en el estatuto
v_poswhere := INSTR (UPPER (p_estatutosql), 'WHERE');
IF v_poswhere != 0
THEN
-- Determina si hay un order by
v_posorderby := INSTR (UPPER (p_estatutosql), 'ORDER BY');
-- Obtiene el estatuto WHERE
IF v_posorderby = 0
THEN
v_wherenuevo := SUBSTR (UPPER (p_estatutosql), v_poswhere);
ELSE
v_wherenuevo :=
SUBSTR (UPPER (p_estatutosql),
v_poswhere,
v_posorderby - v_poswhere
);
END IF;
-- Cambia el estatuto WHERE, respaldando el anterior
SET_BLOCK_PROPERTY (p_bloque, default_where, v_wherenuevo);
END IF;
GO_BLOCK (p_bloque);
EXECUTE_QUERY; -- ejecuta la consulta
-- Determina si el registro en el cual se va a posicionar es mayor que el número
-- de registros traido por la consulta, si lo es se queda en el último registro
LAST_RECORD;
IF p_num_registro <= GET_BLOCK_PROPERTY (p_bloque, current_record)
THEN
GO_RECORD (p_num_registro);
END IF;
-- restaura el where anterior
SET_BLOCK_PROPERTY (p_bloque, default_where, v_whereanterior);
v_ret := TRUE;
ELSE
GO_BLOCK (p_bloque);
EXECUTE_QUERY;
END IF;
RETURN v_ret;
END;
67
68
Excepciones, RETURN y EXIT
En Developer Forms se manejan las excepciones que son situaciones las cuales generan error y no son
manejadas por Oracle, entonces la aplicación le indica al usuario la anomalía y el programa muestra un
mensaje de error o precaución.
Las excepciones se definen en la parte final del procedimiento o función, dentro de ella no se escribe begin
o end para que realice la tarea que se especificará.
EXCEPTION
Nombre de la excepción THEN
/* indicaciones a realizar cuando se dispare la excepción */
Ejemplo:
Function Gen_EjecutarSql ( Instrucción in varchar2, Err out varchar2 ) Return boolean IS
BEGIN
if Form_Success then
Return (true);
else
Err := DBMS_Error_Text;
Return (false);
end if;
EXCEPTION
when OTHERS then
Err := DBMS_Error_Text||' / '||SqlErrM;
Return (false);
END;
Manejo de Errores con ERROR_CODE, ERROR_TEXT
Error Code: retorna el número del error que genero Form Builder.
Error_Text : retorna el mensaje de error que generó Form Builder.
Trigger: On-Error
DECLARE
errnum NUMBER := ERROR_CODE;
errtxt VARCHAR2(80) := ERROR_TEXT;
BEGIN
IF errnum = 40301 THEN
Message('Criterio de búsqueda erróneo);
END IF;
END;
Diferencias con SQLCODE
SQLCODE captura los errores Oracle, si se desea usarlo en Forms, debe estar especificado dentro de las
excepciones. Su uso es popular con la excepción WHEN OTHERS.
69
DECLARE
lv_sqlcode NUMBER;
lv_sqlerrm VARCHAR2(240);
lv_constr VARCHAR2(41);
BEGIN
UPDATE empleados
SET dept = 5
WHERE PRIMARY_KEY_FIELD = :BLOCK.PK;
EXCEPTION
WHEN OTHERS THEN
lv_sqlcode := SQLCODE;
lv_sqlerrm := SQLERRM;
IF (lv_sqlcode = -2290) THEN
lv_constr := strip_constraint_name(lv_sqlerrm);
END IF;
END;
Errores FRM
Cuando se programa en Forms Builder, puede aparecer errores a nivel de la forma, estos errores se
denotan con las siglas FRM seguidas de números.
70
Uso de Identificadores
Identificadores Locales
Son las variables locales o aquellas que están en el ámbito del procedimiento/función. Son utilizadas por el
procedimiento y pueden recibir valores externos por medio de parámetros.
Identificadores del Sistema
Es una variable de Form Builder que mantiene rastro de un estado interno de Form Builder. Los valores de
estas variables se aplican solamente a la forma actual. A continuación una lista de las variables del sistema
más utilizadas:
:system.BLOCK_STATUS: Representa el estado del bloque de datos donde el cursor está localizado.
:system.CURRENT_BLOCK: Retorna el valor del bloque actual si el foco esta en ítem, registro o bloque
(Pre-Item, Post-Item, triggers de registro y bloque) , de lo contrario retorna NULL, si el foco esta en un a
forma (Triggers Pre–Form, Post-Form).
:system.CURRENT_ITEM: Representa el nombre del bloque e ítem (bloque.ítem) donde el foco esta
localizado. Es un cadena de caracteres.
:system.CURRENT_VALUE: Representa el valor del ítem donde el cursor esta localizado.
Identificadores Globales
- De Paquete: Son variables globales definidas por el usuario en un paquete, el cual puede estar en el
filesystem o base de datos.
- GLOBAL: Estas variables tienen declaración implícita, es decir que no necesitan ser declaradas,
simplemente cuando se necesita se las crea. Son tipo varchar.
Referencia a Objetos de la forma
Al desarrollar en Form Builder, se pueden referenciar objetos de la forma, dentro de los procedimientos,
funciones y triggers, pueden ser utilizados para realizar validaciones y consultas. Estos objetos tienen
valores que pueden ingresar como parámetros.
Se los referencia de la siguiente manera: Situando : (dos puntos) delante del objeto.
: nombre_objeto (podría ser un ítem)
: nombre_bloque.nombre_objeto (formato bloque.item)
71
Referencia indirecta a Objetos con NAME_IN
Se utiliza la función NAME_IN para retornar el valor de una variable enviada como parámetro a esta
función.
Declare
v_tm Varchar2(20);
Begin
Default_Value( '0', v_tm );
If name_in(v_tm) is null then
v_tm := ‘1’;
Else
Procesar(v_tm);
End if;
End
Código provisto por DEVELOPER
- Regedit : Cuando se necesitan especificar ciertos valores que dependen de variables de entorno, ya
sean propias de Oracle o definidas por el usuario, existe un procedimiento que nos permite capturar
esos valores y manipular el resultado para procesos de validación. El procedimiento se llama
tool_env.getvar (variable_de_ambiente, variable);
tool_env.getvar (‘EV_COMPANY’, Lv_Compania);
- Esta sentencia esta almacenando el valor de EV_COMPANY en Lv_Compania.
- Propiedades de Items: A los ítems se les puede modificar las propiedades en tiempo de ejecución.
Existe la función GET_ITEM_PROPERTY que recupera la propiedad especifica del ítem también existe
el procedimiento SET_ITEM_PROPERTY, que modifica la propiedad en cierto ítem.
La sintáxis de GET_ITEM_PROPERTY:
GET_ITEM_PROPERTY (item_id, ITEM, property NUMBER);
GET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER);
Se debe tomar en cuenta que existen ciertas propiedades que no están especificadas para todos los
ítems, por esto si se desea setear o recuperar la propiedad de cierto ítem y en él no aplica la propiedad,
generará error.
Cuando se utiliza set_item_property, solo se puede modificar la propiedad a un solo ítem. La sintaxis de
este procedimiento es amplia, a continuación se detalla la parametrización comúnmente usada.
SET_ITEM_PROPERTY (item_id ITEM, property NUMBER, value VARCHAR2);
SET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER, value VARCHAR2);
72
- Navegación entre Objetos: Cuando se tienen módulo de consultas o ingresos en los que se requiere
llenar rápidamente los parámetros, es necesario manejar una buena navegación entre objetos. Así
también en el aspecto de programación, el desarrollador debe indicarle a los procedimientos en que
campos depositar los datos, por cual registro iniciar la navegación.
Algunas ocasiones se nos presentan errores en la consulta de datos y se debe a que no se ha
especificado directamente a cual bloque se llevarán los datos.
- GO_BLOCK: Indica a que bloque se debe fijar el foco para el ingreso / consulta de datos. La sintaxis
es la siguiente: GO_BLOCK (‘NOMBRE_DEL_BLOQUE’)
- GO_ITEM: Indica a que objeto debe fijarse el foco de ingreso . La sintaxis es así:
- GO_ITEM (item_id Item); Antes de definir el tipo ITEM se debe hacer FIND_ITEM para retornar un
valor tipo ITEM y ejecutar el procedimiento GO_ITEM con esta parametrización.
- GO_ITEM (‘:nombre_bloque.nombre_item);
NEXT_ITEM: Navega al siguiente ítem, regularmente se programa en el trigger KEY-NEXT-ITEM. Este
procedimiento no recibe parámetros. La sintaxis es: NEXT_ITEM;
PREVIOUS_ITEM: Navega al ítem anterior navegable. La sintaxis es: PREVIOUS_ITEM;
/* Trigger: Key-Previous-Item */
DECLARE
cur_itm VARCHAR2(80) := :System.Cursor_Item;
cur_blk VARCHAR2(80) := :System.Cursor_Block;
frs_itm VARCHAR2(80);
BEGIN
frs_itm := cur_blk||'.'||Get_Block_Property(cur_blk,FIRST_ITEM);
IF cur_itm = frs_itm THEN
Previous_Block;
ELSE
Previous_Item;
END IF;
END;
- Menú: Dentro de las formas se pueden manejar los menúes para indicar cual debe aparecer o
esconderse. Para esto existe el procedimiento REPLACE_MENU.
Este procedimiento reemplaza el menú actual con el menú que se especifica, pero no lo hace activo al
nuevo menú. La sintaxis común es REPLACE_MENU;
Pero dependiendo de la necesidad existen mas parámetros para definir en la programación.
Por ejemplo: REPLACE_MENU (‘nombre_menu’);
73
Navegación entre registros
Forms trabaja con formularios multiregistros, es decir es un arreglo de registros para el ingreso/consulta de
datos. Se utilizan los siguientes procedimientos para trabajar con estos : FIRST_RECORD,
NEXT_RECORD, LAST_RECORD, GO_RECORD, INSERT_RECORD, DELETE_RECORD.
FIRST_RECORD: Navega al primer registro del bloque de datos.
** Trigger: When-Button-Pressed
*/
BEGIN
/*
Si no esta en el último registro entonces vaya al último, de lo contrario vaya al primer registro. */
IF :System.Last_Record <> 'TRUE' THEN
Last_Record;
ELSE
First_Record;
END IF;
END;
NEXT_RECORD: Navega al siguiente ítem habilitado y secuencial en el registro con el número de
secuencia mas alto que del registro actual. Si no existe un registro, Forms creará un registro.
** Trigger: Key-Next-Item
/* lst_itm recibe el nombre del ultimo ítem del registro. Luego compara al ítem actual con lst_item.
Si son iguales avanza al primer ítem del siguiente registro, avanza un registro, no regresa al primer ítem del
registro actual, de lo contrario, avanza al siguiente ítem del registro actual.
*/
DECLARE
cur_itm VARCHAR2(80) := :System.Cursor_Item;
cur_blk VARCHAR2(80) := :System.Cursor_Block;
lst_itm VARCHAR2(80);
BEGIN
lst_itm := cur_blk||'.'||Get_Block_Property(cur_blk,LAST_ITEM);
IF cur_itm = lst_itm THEN
Next_Record;
ELSE
Next_Item;
END IF;
END;
LAST_RECORD: Navega al último registro en la lista de registros del bloque. Si una consulta esta abierta,
Forms recoge los datos restantes del bloque y cierra la consulta.
-- Trigger: When-Button-Pressed
BEGIN
/*
Si es diferente del ultimo registro, entonces que vaya al último registro */
IF :System.Last_Record <> 'TRUE' THEN
Last_Record;
END IF;
END;
GO_RECORD: Navega al registro con el número de registro especificado en el parámetro.
BEGIN
Go_Record( :nombre_bloque.ultimo_numero_registro );
END;
ultimo_numero_registro: es el numero del ultimo registro, puede ser un valor estático o un número
retornado de una variable de sistema.
INSERT_RECORD: Al llamarse desde un disparador KEY-CREREC, se inserta el registro actual en la base
de datos durante el proceso de transacciones Commit y Post.
-- Trigger: On-Insert
BEGIN
/*
Chequea la bandera para iniciar la insercion */
IF flag = 'TRUE' THEN
Insert_Record;
END IF;
END;
DELETE_RECORD: Al usar el disparador KEY-DELREC remueve el registro actual y marca al registro
como eliminado. Estos registros no se borran instantáneamente, sino que son procesados en el siguiente
proceso COMMIT.
Como personalizar la barra de herramientas
Oracle Forms provee a las aplicaciones con una barra de herramientas horizontal estándar para la
operación y navegación entre registros. Sin embargo, se puede personalizar la barra de herramientas
utilizando las mismas técnicas y operabilidad contenida en la estándar.
Construya un bloque de datos con el nombre TOOLBAR, éste
nombre es opcional puede darle el nombre que crea conveniente.
El bloque de datos debe contener una serie de botones con el
mismo nombre que corresponde a la función o comando que
estaría ejecutando cuando éste sea presionado por el usuario.
Como puede observar los nombres de los elementos que que
inician desde ENTER-QURY hasta EXIT-FORM, corresponden a
el comando de ejecución que cada botón debería realizar si fuese
presionado. Los demás elementos permiten mostrar información
de interés en tiempo de ejecución, la cual se describe a
continuación:
ELEMENTO DESCRIPCION DEL ELEMENTO
IMAGEN Imagen que desea ser presentada
USUARIO Código del usuario que conectado
PROGRAMA Nombre físico del programa ejecutado
FECHA Fecha de la base de datos
EMPRESA Nombre de empresa
SISTEMA Nombre del sistema de la aplicación
DES_APLICACION Nombre descriptivo de la aplicación
74
DISEÑO DEL LIENZO DE LA BARRA DE HERRAMIENTAS
Cada elemento de tipo botón de la barra de herramientas diseñada en el bloque TOOLBAR, debe tener un
ícono que represente la función que éste ejecutaría al ser presionado por el usuario.
La funcionalidad de cada botón se centraliza en una sola unidad de programa, ésta se realiza mediante la
ejecución del disparador WHEN-BUTTON-PRESS definido a nivel del bloque de datos y no por cada
elemento botón, esto para aprovechar los niveles de definición de algunos disparadores comunes que
pueden manejarse en un nivel superior.
75
76
Procedimiento Ejecuta_Boton
Lee el nombre del botón y ejecuta un DO_KEY(item_name),respetando la operación de QUERY:
Si hay botones llamados EXECUTE_QUERY y CANCEL_QUERY, esta función los muestra, cuando
el botón Enter_query es presionado y los oculta, cuando EXECUTE_QUERY ó CANCEL_QUERY
es presionado. Ningún error será retornado, si estos botones no existen.
EXIT, QUIT and EXIT_FORM ejecutan un exit_form, aún si la forma se encuentra en modo ENTER_QUERY !!!!!
El boton CANCEL_QUERY cancela algún query en estado "open".
PROCEDURE ejecuta_botón
IS
action VARCHAR (80);
PROCEDURE oculta_boton (item_name VARCHAR2)
IS
BEGIN
IF NOT ID_NULL (FIND_ITEM (item_name))
THEN
SET_ITEM_PROPERTY (item_name, displayed, property_false);
END IF;
END;
FUNCTION muestra_boton (item_name VARCHAR2)
RETURN BOOLEAN
IS
BEGIN
IF NOT ID_NULL (FIND_ITEM (item_name))
THEN
SET_ITEM_PROPERTY (item_name, displayed, property_true);
SET_ITEM_PROPERTY (item_name, enabled, property_true);
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
RETURN NULL;
END;
BEGIN
--Obtiene nombre del trigger
action := GET_ITEM_PROPERTY (NAME_IN ('SYSTEM.TRIGGER_ITEM'), item_name);
IF action = 'ENTER_QUERY'
THEN
-- Garantiza que si se han realizado cambios en la forma se guarden u omitan
-- dichos cambios antes de ingresar a modo enter-query, de este modo se omite
-- el mensaje que sale al usuario indicando que existen cambios sin guardar
-- en inglés.
IF :SYSTEM.form_status = 'CHANGED'
THEN
gen_mensaje
( 'Ha realizado cambios en la información, debe guardar o eliminar '
|| 'los cambios realizados para poder consultar información.'
);
RAISE form_trigger_failure;
END IF;
IF muestra_boton ('EXECUTE_QUERY') AND muestra_boton ('CANCEL_QUERY')
THEN
oculta_boton ('ENTER_QUERY');
END IF;
END IF;
-- Si la acción fue disparada por el botón de salida ejecuta
-- el comando EXIT-FORM dos veces, si una vez aplicado el primero
-- la aplicación queda en modo ENTER-QUERY, lo cual significa que
-- el usuario luego de presionar ENTER-QUERY quiso salir de la pantalla
IF action IN ('EXIT_FORM', 'EXIT', 'QUIT')
THEN
action := 'EXIT_FORM';
IF NAME_IN ('SYSTEM.MODE') = 'ENTER-QUERY'
THEN
DO_KEY ('EXIT_FORM');
END IF;
END IF;
IF action = 'CANCEL_QUERY'
THEN
action := 'EXIT_FORM';
END IF;
-- Ejecuta KEY-TRIGGER asociado al nombre del botón
-- Si la operación es de impresión, valida la rutina que debe
-- ejecutarse, dependiendo del sistema activo.
IF action = 'PRINT'
THEN
NULL;
-- Corre_Report;
ELSE -- Cualquier otra acción.
-- Si la acción es eliminar un registro se pregunta antes de efectuar operación
IF action IN ('DELETE_RECORD')
THEN
IF gen_confirma_sino ('Está seguro de eliminar la información ?') =
2
THEN
RETURN;
END IF;
END IF;
DO_KEY (action);
END IF;
-- Si la operación es "Eliminar", debe actualizar la información realizando el commit_Form,
-- adicionalmente, si se ejecutaron procesos que afectaron la base de datos no relacionada
-- con los datos del form, debe realizar la operación commit en la BD.
IF action IN ('DELETE_RECORD')
THEN
-- Se determina si hubo error en triggers que se ejecutan según el flujo normal de FORMS
-- para la operación DELETE_RECORD, de modo que no se ejecute la operación de borrado
-- si la última operación que FORMS haya ejecutado falla( ej con un raise form_trigger_failure)
-- De este modo, es posible segmentar las operaciones y dejar el resto de la operación al toolbar
-- se incluye este control pues si se intenta borrar y forms encuentra por ej un Key-Delrec y en
-- este se hace fallar la aplicación, Forms seguirá ejecutando el código asociado al botón de
-- borrado por lo cual ejecutará este código y si no se controla si hubo o no fallo, se intentará
-- eliminar la información, el Form_Failure, determina el resultado de la última operación ejecutada
-- en este caso, si el Key-Delrec falla, no se realiza la operación de eliminar originalmente llamada.
IF FORM_FAILURE
THEN
RAISE form_trigger_failure;
END IF;
:GLOBAL.operacion_borrando := 'S';
END IF;
--Muestra botón ENTER_QUERY, oculta EXECUTE_QUERY y CANCEL_QUERY
IF NAME_IN ('SYSTEM.MODE') != 'ENTER-QUERY'
THEN
IF muestra_boton ('ENTER_QUERY')
THEN
oculta_boton ('EXECUTE_QUERY');
oculta_boton ('CANCEL_QUERY');
END IF;
END IF;
END;
De ésta forma se observaría la
aplicación en tiempo de ejecución.
Como puede apreciarse, no
necesariamente se visualizan las
mismas figuras de la barra de
herramientas, en diseño y ejecución,
ya que corresponden a archivos
diferentes, los cuales para efectos de
éste ejemplo se tratan de archivos ICO
y GIF respectivamente.
77
78
Uso de Parámetros
Los parámetros son utilizados para inicializar algún valor en el momento de ejecución de la forma.
Para trabajar con parámetros desde Forms, se deben añadir objetos en la rama de Parameter en el
Navegador de objetos, luego dependiendo de la funcionalidad pueden ser utilizados para trabajar con
valores iniciales en cualquier procedimiento o función de la forma.
Podemos pasar valores desde un disparador de forma o desde cualquier unidad de programa, de la manera
en que se muestra en el siguiente ejemplo, asumiendo que se encuentran definidas las variables globales
Global.Par_Num_Empresa, Global.Par_Num_Sucursal y Global.Par_Fec_Sistema.
PROCEDURE GEN_LLAMAFORMA (Forma In Varchar2, -- Nombre de la forma a cargar
Ocultar In Boolean Default True, -- Oculta forma que ejecuta llamado
Lis_Par In Varchar2 Default Null -- Lista de parámetros
) IS
/*
GENERAL: Esta rutina carga la forma determinada por el parámetro Forma con una posible lista
de parámetros a pasar a la forma convocada.
*/
v_parametro Paramlist; -- Identificador único de la lista de parámetros.
BEGIN
-- Se Identifica si existe lista de parametros asociada al llamado o no
v_parametro := get_parameter_list('Lis_Par');
IF (NOT id_null(v_parametro)) THEN
destroy_parameter_list(v_parametro);
END IF;
v_parametro := create_parameter_list('Lis_Par');
add_parameter(v_parametro, 'par_num_empresa', TEXT_PARAMETER, Name_In('Global.par_num_empresa'));
add_parameter(v_parametro, 'par_num_sucursal', TEXT_PARAMETER, Name_In('Global.par_num_sucursal'));
add_parameter(v_parametro, 'par_fec_sistema', TEXT_PARAMETER, Name_In('Global.par_fec_sistema'));
IF Id_Null(v_parametro) Then
IF Ocultar Then
Call_Form (Forma, HIDE, DO_REPLACE, NO_QUERY_ONLY , FORMS40_NULL_PARAMLIST);
Else
Call_Form (Forma, NO_HIDE, DO_REPLACE, NO_QUERY_ONLY , FORMS40_NULL_PARAMLIST);
End IF;
IF Not Form_Success then
Gen_Mensaje('Error cargando la forma '||Forma);
End IF;
Elsif Not Id_Null(v_parametro) Then
IF Ocultar Then
Call_Form (Forma, HIDE, DO_REPLACE, NO_QUERY_ONLY ,'Lis_Par');
Else
Call_Form (Forma, NO_HIDE, DO_REPLACE, NO_QUERY_ONLY ,'Lis_Par');
End IF;
IF Not Form_Success then
Gen_Mensaje('Error cargando la forma '||Forma);
End IF;
End IF;
END;
Parámetros de la instrucción CALL_FORM
formmodule_name El nombre de la forma debe ser encerrado entre comillas simples.
Tipo de dato: VARCHAR2.
79
display HIDE (The default.) Oracle Forms esconderá la forma desde donde se realiza la llamada antes de
presentar la forma que está siendo invocada. NO_HIDE Oracle Forms presentará la forma invocada sin
ocultar la forma que realiza la llamada.
switch_menu NO_REPLACE (The default.) Oracle Forms mantendrá el menu por defecto de Oracle en la
forma invocada. DO_REPLACE Oracle Forms sustituirá el menú del modulo asociado a la forma llamada
por el CALL_FORM, remplazando el menu por defecto por el que se encuentre definido en la forma.
query_mode NO_QUERY_ONLY (El valor por defecto.) las Formas de Oracle ejecutarán la forma indicada
en modo normal, permitiéndole al usuario final realizar inserciones, actualizaciones, y supresiones de
registros de dentro de la forma llamada. QUERY_ONLY Oracle Forms ejecutará la forma indicada en modo
de solo consulta, permitiéndole al usuario final consultar registros, pero si la capacidad de insertar,
actualizar o suprimir registros.
paramlist_id El identificador de parámetros que asigna cuando crea la lista de parámetros, puede incluir
una lista de parámetros adicionales como entrada inicial a la forma llamada. El tipo de datos es
PARAMLIST. paramlist_name El nombre que usted dio al objeto de lista de parámetro cuando usted lo
definió. Tipo de datos VARCHAR2.
Mas sobre Formas
CLEAR_FORM: Es un procedimiento que limpia los registros de la forma actual y lleva el punto de entrada
de datos al primer ítem del primer bloque. Este procedimiento puede o no recibir parámetros.
BEGIN
Clear_Form(No_Validate);
END;
Fecha del sistema operativo $$DATETIME$$
La variable del sistema $$DATETIME$$ recupera la fecha y hora del sistema operativo. Se lo puede utilizar
para asignar valores por default. Este valor ($$DATETIME$$) es inicializado en el campo Initial Value del
Property Palette para el ítem que llevara la fecha/hora del sistema. Luego puede ser asignado a alguna
variable tipo DATE dentro de algún procedimiento o función.
Manejo de Sesiones
Forms permite al desarrollador personalizar la ventana de logon a la base de datos desde la aplicación.
LOGON: Procedimiento LOGON, es utilizado desde el trigger ON-LOGON. Permite la conexión a la base de
datos.
DECLARE
username VARCHAR2(80);
password VARCHAR2(80);
cn_string VARCHAR2(80);
BEGIN
/* Recoje la información de la conexión */
Get_Connect_Info(un,pw,cn);
80
/*
**Si no es base de datos Oracle, salir del intento de conexión */
IF :Global.Non_Oracle_Datasource = 'TRUE' THEN
User_Exit('my_logon username='||un||' password='||pw);
ELSE
IF un IS NULL THEN
un:='/';
END IF
IF cn IS NOT NULL THEN
LOGON(un,pw||'@'||cn);
ELSE
LOGON(un,pw);
END IF;
END IF;
END;
LOGOUT: Desconecta al usuario de la base de datos. Se lo programa en el trigger ON-LOGOUT
BEGIN
/* Si no es base de datos Oracle , sale de la conexion */
IF :Global.Non_Oracle_Datasource = 'TRUE' THEN
User_Exit('my_logout');
ELSE
Logout;
END IF;
END;
SYNCHRONIZE: Sincroniza la pantalla con el estado de la forma.
Begin
Synchronize;
Message(‘Hola’);
End;

Más contenido relacionado

La actualidad más candente

Installing and Configuring NGINX Open Source
Installing and Configuring NGINX Open SourceInstalling and Configuring NGINX Open Source
Installing and Configuring NGINX Open SourceNGINX, Inc.
 
Introduction to Parameters in Foreman
Introduction to Parameters in ForemanIntroduction to Parameters in Foreman
Introduction to Parameters in ForemanTomer Brisker
 
Domain Driven Design and Hexagonal Architecture with Rails
Domain Driven Design and Hexagonal Architecture with RailsDomain Driven Design and Hexagonal Architecture with Rails
Domain Driven Design and Hexagonal Architecture with RailsDeclan Whelan
 
Docker Overview - Rise of the Containers
Docker Overview - Rise of the ContainersDocker Overview - Rise of the Containers
Docker Overview - Rise of the ContainersRyan Hodgin
 
Google jib: Building Java containers without Docker
Google jib: Building Java containers without DockerGoogle jib: Building Java containers without Docker
Google jib: Building Java containers without DockerMaarten Smeets
 
libinjection: new technique in detecting SQLi attacks, iSEC Partners Open Forum
libinjection: new technique in detecting SQLi attacks, iSEC Partners Open Forumlibinjection: new technique in detecting SQLi attacks, iSEC Partners Open Forum
libinjection: new technique in detecting SQLi attacks, iSEC Partners Open ForumNick Galbreath
 
How to Get Started With NGINX
How to Get Started With NGINXHow to Get Started With NGINX
How to Get Started With NGINXNGINX, Inc.
 
Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...
Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...
Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...NGINX, Inc.
 
Intro to containerization
Intro to containerizationIntro to containerization
Intro to containerizationBalint Pato
 
Designing microservices platforms with nats
Designing microservices platforms with natsDesigning microservices platforms with nats
Designing microservices platforms with natsChanaka Fernando
 
VMware Cloud Foundation - PnP presentation 8_6_18 EN.pptx
VMware Cloud Foundation - PnP presentation 8_6_18 EN.pptxVMware Cloud Foundation - PnP presentation 8_6_18 EN.pptx
VMware Cloud Foundation - PnP presentation 8_6_18 EN.pptxBradLai3
 
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Edureka!
 
Lesson n5 tasting_tecnique_english
Lesson n5 tasting_tecnique_englishLesson n5 tasting_tecnique_english
Lesson n5 tasting_tecnique_englishFedericaZanghirella
 
Learning Docker from Square One
Learning Docker from Square OneLearning Docker from Square One
Learning Docker from Square OneDocker, Inc.
 
HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien
HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien
HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien DNUG e.V.
 
VMware HCI solutions - 2020-01-16
VMware HCI solutions - 2020-01-16VMware HCI solutions - 2020-01-16
VMware HCI solutions - 2020-01-16David Pasek
 
Networking in Docker
Networking in DockerNetworking in Docker
Networking in DockerKnoldus Inc.
 

La actualidad más candente (20)

Installing and Configuring NGINX Open Source
Installing and Configuring NGINX Open SourceInstalling and Configuring NGINX Open Source
Installing and Configuring NGINX Open Source
 
Introduction to Parameters in Foreman
Introduction to Parameters in ForemanIntroduction to Parameters in Foreman
Introduction to Parameters in Foreman
 
Domain Driven Design and Hexagonal Architecture with Rails
Domain Driven Design and Hexagonal Architecture with RailsDomain Driven Design and Hexagonal Architecture with Rails
Domain Driven Design and Hexagonal Architecture with Rails
 
Docker Overview - Rise of the Containers
Docker Overview - Rise of the ContainersDocker Overview - Rise of the Containers
Docker Overview - Rise of the Containers
 
Google jib: Building Java containers without Docker
Google jib: Building Java containers without DockerGoogle jib: Building Java containers without Docker
Google jib: Building Java containers without Docker
 
libinjection: new technique in detecting SQLi attacks, iSEC Partners Open Forum
libinjection: new technique in detecting SQLi attacks, iSEC Partners Open Forumlibinjection: new technique in detecting SQLi attacks, iSEC Partners Open Forum
libinjection: new technique in detecting SQLi attacks, iSEC Partners Open Forum
 
How to Get Started With NGINX
How to Get Started With NGINXHow to Get Started With NGINX
How to Get Started With NGINX
 
Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...
Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...
Install and Configure NGINX Unit, the Universal Application, Web, and Proxy S...
 
Intro to containerization
Intro to containerizationIntro to containerization
Intro to containerization
 
Wines of portugal
Wines of portugalWines of portugal
Wines of portugal
 
Designing microservices platforms with nats
Designing microservices platforms with natsDesigning microservices platforms with nats
Designing microservices platforms with nats
 
VMware Cloud Foundation - PnP presentation 8_6_18 EN.pptx
VMware Cloud Foundation - PnP presentation 8_6_18 EN.pptxVMware Cloud Foundation - PnP presentation 8_6_18 EN.pptx
VMware Cloud Foundation - PnP presentation 8_6_18 EN.pptx
 
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
Docker Explained | What Is A Docker Container? | Docker Simplified | Docker T...
 
Aromatised wines
Aromatised winesAromatised wines
Aromatised wines
 
Lesson n5 tasting_tecnique_english
Lesson n5 tasting_tecnique_englishLesson n5 tasting_tecnique_english
Lesson n5 tasting_tecnique_english
 
Bordeaux IFBC 2014
Bordeaux IFBC 2014Bordeaux IFBC 2014
Bordeaux IFBC 2014
 
Learning Docker from Square One
Learning Docker from Square OneLearning Docker from Square One
Learning Docker from Square One
 
HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien
HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien
HCL Domino 14 - Leap 1.1.2 - DNUG Stammtisch Wien
 
VMware HCI solutions - 2020-01-16
VMware HCI solutions - 2020-01-16VMware HCI solutions - 2020-01-16
VMware HCI solutions - 2020-01-16
 
Networking in Docker
Networking in DockerNetworking in Docker
Networking in Docker
 

Destacado

20110409 quantum algorithms_vyali_lecture06
20110409 quantum algorithms_vyali_lecture0620110409 quantum algorithms_vyali_lecture06
20110409 quantum algorithms_vyali_lecture06Computer Science Club
 
Ten Ways to turn your Board from Bobblehead to Brilliant
Ten Ways to turn your Board from Bobblehead to BrilliantTen Ways to turn your Board from Bobblehead to Brilliant
Ten Ways to turn your Board from Bobblehead to BrilliantAnne Yurasek
 
Marketing Music on Twitter
Marketing Music on TwitterMarketing Music on Twitter
Marketing Music on Twittermidem
 
The Congressional PROMESA to put the uppity Commonwealth in its place
The Congressional PROMESA to put the uppity Commonwealth in its placeThe Congressional PROMESA to put the uppity Commonwealth in its place
The Congressional PROMESA to put the uppity Commonwealth in its placeMaria de los Angeles TRIGO
 
C 17 globemaster iii, usa - tactical transport aircraft
C 17 globemaster iii, usa - tactical transport aircraftC 17 globemaster iii, usa - tactical transport aircraft
C 17 globemaster iii, usa - tactical transport aircrafthindujudaic
 
Postal final grupal _curso ingles I _ 284
Postal final grupal _curso ingles I _ 284 Postal final grupal _curso ingles I _ 284
Postal final grupal _curso ingles I _ 284 TECNOLOGO Olaya
 
Aras PLM Software Digital Natives
Aras PLM Software Digital NativesAras PLM Software Digital Natives
Aras PLM Software Digital NativesAras
 
Electron beam micromachining
Electron beam micromachiningElectron beam micromachining
Electron beam micromachiningAnurag Chaudhary
 
Lead - Leader and Leaderership
Lead - Leader and LeaderershipLead - Leader and Leaderership
Lead - Leader and LeaderershipArshad.M Bhutta
 

Destacado (20)

B2 l 2014
B2 l 2014B2 l 2014
B2 l 2014
 
Fanshawe upload
Fanshawe uploadFanshawe upload
Fanshawe upload
 
Tendani CV
Tendani CVTendani CV
Tendani CV
 
2016 Music Business
2016 Music Business2016 Music Business
2016 Music Business
 
20110409 quantum algorithms_vyali_lecture06
20110409 quantum algorithms_vyali_lecture0620110409 quantum algorithms_vyali_lecture06
20110409 quantum algorithms_vyali_lecture06
 
Ten Ways to turn your Board from Bobblehead to Brilliant
Ten Ways to turn your Board from Bobblehead to BrilliantTen Ways to turn your Board from Bobblehead to Brilliant
Ten Ways to turn your Board from Bobblehead to Brilliant
 
Charles Chaplin
Charles ChaplinCharles Chaplin
Charles Chaplin
 
Marketing Music on Twitter
Marketing Music on TwitterMarketing Music on Twitter
Marketing Music on Twitter
 
Tamizaje 3
Tamizaje 3Tamizaje 3
Tamizaje 3
 
Social Sciences
Social SciencesSocial Sciences
Social Sciences
 
The Congressional PROMESA to put the uppity Commonwealth in its place
The Congressional PROMESA to put the uppity Commonwealth in its placeThe Congressional PROMESA to put the uppity Commonwealth in its place
The Congressional PROMESA to put the uppity Commonwealth in its place
 
C 17 globemaster iii, usa - tactical transport aircraft
C 17 globemaster iii, usa - tactical transport aircraftC 17 globemaster iii, usa - tactical transport aircraft
C 17 globemaster iii, usa - tactical transport aircraft
 
Postal final grupal _curso ingles I _ 284
Postal final grupal _curso ingles I _ 284 Postal final grupal _curso ingles I _ 284
Postal final grupal _curso ingles I _ 284
 
Aras PLM Software Digital Natives
Aras PLM Software Digital NativesAras PLM Software Digital Natives
Aras PLM Software Digital Natives
 
Electron beam micromachining
Electron beam micromachiningElectron beam micromachining
Electron beam micromachining
 
Nevera AEG S63420CTX2
Nevera AEG S63420CTX2Nevera AEG S63420CTX2
Nevera AEG S63420CTX2
 
Robotics
RoboticsRobotics
Robotics
 
Content marketing
Content marketingContent marketing
Content marketing
 
Lead - Leader and Leaderership
Lead - Leader and LeaderershipLead - Leader and Leaderership
Lead - Leader and Leaderership
 
Antiprotozoarios
AntiprotozoariosAntiprotozoarios
Antiprotozoarios
 

Similar a Un lenguaje de_cuarta_generacion_oracle

Abf leccion 02
Abf leccion 02Abf leccion 02
Abf leccion 02victdiazm
 
Reinicio automático de Oracle Database (Oracle Restart)
Reinicio automático de Oracle Database (Oracle Restart)Reinicio automático de Oracle Database (Oracle Restart)
Reinicio automático de Oracle Database (Oracle Restart)Angel Freire Ramirez
 
Entornos apex onpremise
Entornos apex onpremiseEntornos apex onpremise
Entornos apex onpremiseDaniel Bozzolo
 
Instalación de oracle bpa suite 11g
Instalación de oracle bpa suite 11gInstalación de oracle bpa suite 11g
Instalación de oracle bpa suite 11gCROSSNET S.A.C.
 
Bd eq.#3 actividad 3 unidadad2 reporte instalacion de oracle
Bd eq.#3 actividad 3 unidadad2 reporte instalacion de oracleBd eq.#3 actividad 3 unidadad2 reporte instalacion de oracle
Bd eq.#3 actividad 3 unidadad2 reporte instalacion de oracleKARY
 
Bd eq.#3 actividad 2 unidadad2 manual oracle
Bd eq.#3 actividad 2 unidadad2 manual oracleBd eq.#3 actividad 2 unidadad2 manual oracle
Bd eq.#3 actividad 2 unidadad2 manual oracleKARY
 
Tarea1 dba ezamora
Tarea1 dba ezamoraTarea1 dba ezamora
Tarea1 dba ezamoraedzamo13
 
Provisionamiento de un RAC de 2 nodos en la nube de Oracle.
Provisionamiento de un RAC de 2 nodos en la nube de Oracle.Provisionamiento de un RAC de 2 nodos en la nube de Oracle.
Provisionamiento de un RAC de 2 nodos en la nube de Oracle.Lorenzo Jose Mota Garcia
 
Introduccion a ORACLE
Introduccion a ORACLEIntroduccion a ORACLE
Introduccion a ORACLEpp guanuchi
 
Manual completo-oracle-español-spanish-by-silex
Manual completo-oracle-español-spanish-by-silexManual completo-oracle-español-spanish-by-silex
Manual completo-oracle-español-spanish-by-silexAngel Lucas
 
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11GENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G1712223955
 
Abf leccion 04
Abf leccion 04Abf leccion 04
Abf leccion 04victdiazm
 
Oracle 11g galo saquinaula
Oracle 11g galo saquinaulaOracle 11g galo saquinaula
Oracle 11g galo saquinaulaGalo Saquinaula
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracletriana25
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracletriana25
 

Similar a Un lenguaje de_cuarta_generacion_oracle (20)

Abf leccion 02
Abf leccion 02Abf leccion 02
Abf leccion 02
 
Deploy
DeployDeploy
Deploy
 
Reinicio automático de Oracle Database (Oracle Restart)
Reinicio automático de Oracle Database (Oracle Restart)Reinicio automático de Oracle Database (Oracle Restart)
Reinicio automático de Oracle Database (Oracle Restart)
 
Instalacion oracle forms
Instalacion oracle formsInstalacion oracle forms
Instalacion oracle forms
 
Entornos apex onpremise
Entornos apex onpremiseEntornos apex onpremise
Entornos apex onpremise
 
Instalación de oracle bpa suite 11g
Instalación de oracle bpa suite 11gInstalación de oracle bpa suite 11g
Instalación de oracle bpa suite 11g
 
Bd eq.#3 actividad 3 unidadad2 reporte instalacion de oracle
Bd eq.#3 actividad 3 unidadad2 reporte instalacion de oracleBd eq.#3 actividad 3 unidadad2 reporte instalacion de oracle
Bd eq.#3 actividad 3 unidadad2 reporte instalacion de oracle
 
Bd eq.#3 actividad 2 unidadad2 manual oracle
Bd eq.#3 actividad 2 unidadad2 manual oracleBd eq.#3 actividad 2 unidadad2 manual oracle
Bd eq.#3 actividad 2 unidadad2 manual oracle
 
Exposicion oracle
Exposicion oracleExposicion oracle
Exposicion oracle
 
Tarea1 dba ezamora
Tarea1 dba ezamoraTarea1 dba ezamora
Tarea1 dba ezamora
 
Provisionamiento de un RAC de 2 nodos en la nube de Oracle.
Provisionamiento de un RAC de 2 nodos en la nube de Oracle.Provisionamiento de un RAC de 2 nodos en la nube de Oracle.
Provisionamiento de un RAC de 2 nodos en la nube de Oracle.
 
Introduccion a ORACLE
Introduccion a ORACLEIntroduccion a ORACLE
Introduccion a ORACLE
 
Manual completo-oracle-español-spanish-by-silex
Manual completo-oracle-español-spanish-by-silexManual completo-oracle-español-spanish-by-silex
Manual completo-oracle-español-spanish-by-silex
 
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11GENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
ENTERPRISE MANAGER DE LA BASE DE DATOS ORACLE VERSIÓN 11G
 
Abf leccion 04
Abf leccion 04Abf leccion 04
Abf leccion 04
 
LENGUAJE DE PROGRAMACION SQL
LENGUAJE DE PROGRAMACION SQLLENGUAJE DE PROGRAMACION SQL
LENGUAJE DE PROGRAMACION SQL
 
Oracle 11g galo saquinaula
Oracle 11g galo saquinaulaOracle 11g galo saquinaula
Oracle 11g galo saquinaula
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
 
ORACLE
ORACLEORACLE
ORACLE
 
Motor De Bases De Datos Oracle
Motor De Bases De Datos OracleMotor De Bases De Datos Oracle
Motor De Bases De Datos Oracle
 

Último

SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersIván López Martín
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...JaquelineJuarez15
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxaylincamaho
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafiosFundación YOD YOD
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024GiovanniJavierHidalg
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxJOSEMANUELHERNANDEZH11
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...AlanCedillo9
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfSergioMendoza354770
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...FacuMeza2
 
ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofJuancarlosHuertasNio1
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadMiguelAngelVillanuev48
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxpabonheidy28
 

Último (20)

SalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 TestcontainersSalmorejoTech 2024 - Spring Boot <3 Testcontainers
SalmorejoTech 2024 - Spring Boot <3 Testcontainers
 
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
El gusano informático Morris (1988) - Julio Ardita (1995) - Citizenfour (2014...
 
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptxMedidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
Medidas de formas, coeficiente de asimetría y coeficiente de curtosis.pptx
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
La era de la educación digital y sus desafios
La era de la educación digital y sus desafiosLa era de la educación digital y sus desafios
La era de la educación digital y sus desafios
 
Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024Cortes-24-de-abril-Tungurahua-3 año 2024
Cortes-24-de-abril-Tungurahua-3 año 2024
 
Hernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptxHernandez_Hernandez_Practica web de la sesion 12.pptx
Hernandez_Hernandez_Practica web de la sesion 12.pptx
 
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
Instrumentación Hoy_ INTERPRETAR EL DIAGRAMA UNIFILAR GENERAL DE UNA PLANTA I...
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdfPARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
PARTES DE UN OSCILOSCOPIO ANALOGICO .pdf
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
ATAJOS DE WINDOWS. Los diferentes atajos para utilizar en windows y ser más e...
 
ejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sofejercicios pseint para aprogramacion sof
ejercicios pseint para aprogramacion sof
 
Presentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidadPresentación inteligencia artificial en la actualidad
Presentación inteligencia artificial en la actualidad
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
Plan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docxPlan de aula informatica segundo periodo.docx
Plan de aula informatica segundo periodo.docx
 

Un lenguaje de_cuarta_generacion_oracle

  • 1. UN LENGUAJE DE CUARTA GENERACIÓN Primera Edición ORACLE DEVELOPER SUITE 10G PROGRAMACIÓN BÁSICA EN ORACLE FORMS Y REPORT Lic.RoyMoralesVenegas
  • 2. 2 UN LENGUAJE DE CUARTA GENERACIÓN Primera Edición ORACLE DEVELOPER SUITE 10G PROGRAMACIÓN BÁSICA EN ORACLE FORMS Y REPORT Lic.RoyMoralesVenegas UniversidadMagister SanJosé COSTARICA
  • 3. 3 1............................................................................................................................................................ 4 INSTALACIÓN DE ORACLE ....................................................................................................... 4 Instalación de la Base de datos Oracle 10g Express Edition ....................................................... 4 Conexión con una instancia de base de datos.............................................................................. 4 Instalación del Developer Suite 10G de Oracle........................................................................... 6 Iniciando el contenedor de Oracle para J2EE (OC4J) ................................................................. 9 Configuración básica del servidor de aplicaciones.................................................................... 10 Configuración del servidor de reportes...................................................................................... 16 Comprobando la configuración del ambiente de ejecución....................................................... 22 2.......................................................................................................................................................... 26 PROGRAMACION CON FORMS DEVELOPER DE ORACLE ............................................... 26 Componentes de la herramienta................................................................................................. 26 Componentes en la definición de las formas o pantallas........................................................... 27 Generación de otros objetos aplicativos .................................................................................... 28 Componentes en la definición de menús ................................................................................... 28 Diseño de una pantalla básica.................................................................................................... 29 Objetos de trabajo ...................................................................................................................... 38 Ventanas..................................................................................................................................... 38 Bloques de datos ........................................................................................................................ 38 Tipos de elementos .................................................................................................................... 41 Listas de Valores........................................................................................................................ 45 Alertas........................................................................................................................................ 53 Disparadores .............................................................................................................................. 54 Implementación de Disparadores más comunes........................................................................ 57 Bibliotecas PL/SQL ................................................................................................................... 60 Conectar Bibliotecas.................................................................................................................. 61 Unidades de Programa............................................................................................................... 62 Excepciones, RETURN y EXIT ................................................................................................ 68 Manejo de Errores con ERROR_CODE, ERROR_TEXT ........................................................ 68 Uso de Identificadores ............................................................................................................... 70 Referencia a Objetos de la forma............................................................................................... 70 Referencia indirecta a Objetos con NAME_IN ........................................................................ 71 Código provisto por DEVELOPER........................................................................................... 71 Navegación entre registros......................................................................................................... 73 Como personalizar la barra de herramientas.............................................................................. 74 Uso de Parámetros ..................................................................................................................... 78 Manejo de Sesiones.................................................................................................................... 79
  • 4. 1 INSTALACIÓN DE ORACLE Instalación de la Base de datos Oracle 10g Express Edition La base de datos de Oracle es el primer componente que debe ser instalado. Para efectos de éste curso se utilizará la Base de Datos Oracle 10g Express Edition. Una vez instalado éste producto, podrá contar con una página web local que permite acceder a algunas herramientas administrativas que permiten administrar y gestionar aspectos de almacenamiento, memoria, usuarios y control. Si desea contar con la guía de instalación de la base de datos puede ingresar al siguiente sitio web de documentación de Oracle www.oracle.com/pls/xe102/homepage. Cada base de datos instalada en un servidor conforma una instancia de Oracle, la cual consume recursos de memoria y disco considerables del servidor donde ésta se encuentra instalada, por lo que es recomendable crear una sola instancia por servidor, para que el rendimiento del mismo sea óptimo y resuelva cada petición en un tiempo prudencial. La estructura de una base de datos Oracle está compuesta por archivos de control (Control File), archivos de datos (Data File) y Archivos de Bitácora (Redo Log Files). Conexión con una instancia de base de datos 4
  • 5. Una vez instalada la base de datos Oracle, varios servicios son definidos en el sistema operativo, de los cuales nos enfocamos básicamente en los siguientes: El servicio relacionado con la instancia y la base de datos, cuyo nombre tiene la estructura: OracleServiceXXX, donde XXX representa el nombre de la instancia de base de datos. Para efectos del curso la instancia instalada tiene por nombre XE, por lo tanto el nombre del servicio es OracleServiceXE. El servicio relacionado con la disponibilidad del servidor para permitir el acceso remoto, recibe el nombre de OracleXETNSListener para la instancia XE instalada en el servidor. Ambos servicios deben encontrarse en estado iniciado, para poder ingresar a la base de datos a través de cualquier gestor de bases de datos Oracle, siendo utilizados con mayor frecuencia los siguientes: SQL Plus de Oracle, TOAD, SQL-DEVELOPER entre otros. Utilizando el gestor Oracle Database Express Edition, ingresaremos a la base de datos, autenticándonos mediante el siguiente diálogo de conexión, donde debe ingresar el usuario SYSTEM y la clave de paso. Una vez autenticado el usuario y clave de paso la base de datos le presentará la página principal de Oracle Database Express Edition. Diálogo de conexión Página principal de la base de datos XE 5
  • 6. Instalación del Developer Suite 10G de Oracle 1. En el servidor de la localidad con el administrador de la red definir la ruta donde se instala el Developer suite, se sugiere instalar en la carpeta APPSOracle10iDS 2. DISCO 1 3. ABRIR CARPETA DISK1 4. SETUP 5. Seleccionar siguiente: 6 Especificar en el destino: Nombre: oracle10IDS ó default DevSuiteHome1 Ruta Acceso: C:APPSoracle10iDS (ruta definida con el administrador de red)
  • 7. Debe seleccionar la opción Terminar 1.15GB y seleccionar siguiente: Seleccionar la opción instalar para dar inicio a la instalación del producto Oracle Developer Suite 10g: 1.6 Cambiar y seleccionar el disk2 y aceptar: 7
  • 8. 8 eleccionar y cambiar al disk 1 y aceptar: inalizada la instalación de Oracle S F Developer Suite 10g, presionar el botón Salir.
  • 9. Iniciando el contenedor de Oracle para J2EE (OC4J) 9 Al instalar ORACLE 10 iDS, Ud encuentra en la carpeta de Forms Developer un componente adicional OC4J; el cual es el servicio que permite que el servidor funcione en ambiente de Aplicaciones Web. El contenedor de Oracle para Java con sus siglas en ingles OC4J (Oracle Container for J2EE), es un componente del Servidor de Aplicaciones de Oracle corriendo sobre un standard Java SE distributions, el cual permite que las aplicaciones desarrolladas en Oracle Forms y Report sean ejecutadas desde un explorador de Internet, ofreciendo un comportamiento excelente y de alta escalabilidad para ambientes de producción. Abrir el Contenedor de Oracle para J2EE Este componente se levanta como un servicio local en el servidor de aplicaciones, tal y como se muestra en la siguiente imagen. Este servicio se debe iniciar a través de la opción START OC4J Instante, se debe mantener activa la ventana mientras se ejecuta la aplicación. Por ninguna razón debe cerrar la sesión Start OC4J Instance, ya que ésta representa el servicio que el servidor de aplicaciones de Oracle requiere para ejecutar los formularios (pantallas) y reportes que el programador desarrolla. Instancia del OC4J Activa
  • 10. 10 Para bajar el servicio utilice la opción Shutdown OC4J Instante, automáticamente se cierra la ventana de Start OC4J Instance y se baja el servicio. Cuando el servicio se encuentra abajo (no disponible) le muestra el siguiente error al ejecutar la aplicación: Configuración básica del servidor de aplicaciones Para que la aplicación de “Curso” funcione apropiadamente se debe: Copiar DEFAULT.ENV como CURSO.ENV y modificar la configuracion ubicados en <ORACLE_HOME>formsserver Modificar los archivos FORMSWEB.CFG ubicados en <ORACLE_HOME>formsserver, donde <ORACLE_HOME> es la ruta de instalación del Developer Suite 10g , Ej: C:oracle10iDSforms ARCHIVO VARIABLES ACCION curso.env FORMS_PATH= Incluir los Path de la aplicación de curso Ejemplo: FORMS_PATH=D:APPSCursolib; D:APPSCursobin; Formsweb.cfg Incluir las siguientes líneas al final del archivo [curso] separateFrame=True lookandfeel=oracle
  • 11. form=D:APPSCursobinacceso.fmx userid=USER/PASSWORD@[String de conexion] envfile=curso.env useSDI=yes colorScheme=Teal config=sepwin IE=JInitiator Creación del String de Conexión: Ejecutar el asistente de configuración de Red de oracle: 11 Seleccionar Configuración del nombre del servicio de red local y Seleccionar Agregar y siguiente para agregar un nuevo servicio de red
  • 12. Seleccionar el nombre de la instancia de la base de datos, el cual corresponde a un nombre de base de datos global. 12 Seleccionar el tipo de protocolo de comunicación , en este caso y para efectos de éste curso utilizaremos: TCP Introducimos la dirección IP donde se ubica el servidor de la base de datos: Ej: 127.0.0.1, dirección que corresponde al LocalHost. El puerto a utilizar es el 1521 que corresponde al puerto por defecto.
  • 13. Probar la conexión, para validar que la configuración del nuevo servicio de red local se haya realizado correctamente. El asistente realiza inmediatamente una prueba con el usuario system, con una clave que probablemente no coincide con la que se definió en la instalación de la base de datos. Por lo anterior, se debe seleccionar el botón de Cambiar Conexión para suministrar el usuario y clave de paso correcta para probar la conexión. 13
  • 14. Una vez suministrado el usuario y clave correcta, la prueba de configuración del nuevo servicio de red local es exitosa. El de nombre del servicio de Red local es ingresado con el mismo nombre de la base de datos global, sin embargo, el mismo puede ser nombrado diferente. Teniendo en cuenta que es con el nuevo nombre que debe conectarse a la base de datos desde cualquier herramienta del Developer Suite 10g de Oracle. (SQL Plus, Forms, Report). Como recomendación dejar el nombre por defecto. Si no se desea configurar mas servicios, seleccionar NO y siguiente. 14
  • 15. El asistente le indicará que concluyó la configuración del servicio. Presione Terminar para salir del asistente de configuración de Red de Oracle. 15
  • 16. Configuración del servidor de reportes Para configurar el servidor de reportes se crea un icono de acceso directo al archivo rwserver,exe ubicado en el directorio <ORACLE_HOME>bin de la siguiente manera: Botón derecho del Mouse aparece lo siguiente: Configurar la ruta de los reportes del aplicativo “Curso” Una vez localizado el archivo rwserver.exe agregamos en la ubicación del elemento “Server=<nombre_servidor_de_reportes>” como se muestra en la siguiente imagen. 16
  • 17. Para finalizar la creación del servidor de reportes, indicamos el nombre con el que deseamos se visualice el acceso directo. Para que todos los objetos del aplicativo (pantallas, menus, librerías y reportes) puedan ser ubicados por la aplicación en tiempo de desarrollo (programación), se configura el REGEDIT de la siguiente forma: Al presentarse el editor del registro de Windows se debe localizar la clave HKEY_LOCAL_MACHINESOFTWAREORACLEKEY_DevSuite10gR2 y modificar los valores FORMS_PATH, REPORT_PATH y UI_ICON, adicionando al inicio de la cadena del valor la ruta donde se encuentran almacenados los archivos del aplicativo, para nuestro efecto “D:appsCursoBin”(Formas, reportes y menús), “D:appsCursoLib”(Librerías) y “D:appsCursoIco”(Imágenes). 17
  • 18. 18
  • 19. Subir los servicios: START OC4J Instante Servicio de reportes: Una vez que se haya establecido el servicio OC4J puede iniciar el servidor de reportes configurado anteriormente. Inicialmente el Reports Server es un archivo bloqueado por el Firewall de Windows, debe desbloquearse para que pueda establecerse el servicio de reportes. El servicio de reportes está preparado y listo para ser utilizado. 19
  • 20. De acuerdo a la ruta señalada, abrir con Wordpad el archivo Orion_web.xml y adicionar las siguientes líneas, como recomendación copiar cualquier línea en el archivo en una nueva y sustituir los valores correspondientes. <virtual-directory virtual-path="/Icons" Real-path="D:APPSCurso/Ico" /> SALVAR Y SALIR 20
  • 21. Abrir archivo Registy.dat y adicionar al final de las variables los valores del directorio virtual y la extensión de los íconos utilizados en la aplicación. Ejemplo: default.icons.iconpath= icons/ default.icons.iconextension=gif 21
  • 22. Comprobando la configuración del ambiente de ejecución Después de modificados los archivos de configuración del ambiente de ejecución de las aplicaciones que serán desarrolladas durante éste curso, procedemos a ingresar al Forms Builder de Oracle para comprobar la conexión y el ingreso a la pantalla de prueba. Durante el desarrollo de éste curso utilizaremos el usuario HR, el cual corresponde a un pequeño esquema que consta de ocho entidades (tablas) que comprenden la lógica de un sistema de nómina. Conectarse a la base de datos de la siguiente forma: ctrl. + j (tecla j) o ir a la siguiente opción de menú de {Archivo}{Conectar}. 22 Si ésta es la primera vez que nos conectamos a la base de datos con el usuario HR es posible que el usuario se encuentre bloqueado. Para desbloquear el usuario debe ingresar a una sesión de SQL con el usuario SYSTEM y digitar las siguientes instrucciones, que desbloquearán el usuario HR para lograr conectarse. Alter User hr Account Unlock; Alter User hr Identified By hr; Una vez ejecutadas las instrucciones anteriores intente conectarse nuevamente con el Forms Builder, éste paso debería de ejecutarse sin ningún problema.
  • 23. 23 Vaya a la siguiente opción de menú del Forms Builder, al ingresar se le presenta la siguiente pantalla: Presione le botón Restablecer y copie el texto ubicado en el campo URL de Servidor de Aplicación. Abra una sesión de Explorador de Internet y pegue el texto anterior en el espacio de dirección. Antes asegúrese que el componente OC4J se encuentra activo. Si es la primera vez que ejecuta el servicio de forms, se instalará el componente JINITIATOR en el sistema operativo en forma automática. La versión de JINITIATOR depende de la versión del servicio de forms utilizado. Para efectos de éste cursos se utilizará la versión 1.3.1.22 ya que estamos utilizando Developer Suite 10g Forms Builder 10.1.2.02. Permita la instalación del complemento Oracle JInitiator de Oracle Corporation, posicionándose en la barra amarilla y haciendo Clic, esta acción le presentará el menú que se observa en la siguiente figura, en el cual usted deberá seleccionar Instalar control ActiveX…
  • 24. Finalmente instale el componente JINITIATOR presionando el botón Instalar y en la siguiente pantalla presine el botón Next para indicar la carpeta donde se desea instar éste componente. Recomendación permitir que se instale en la ruta que se presenta por defecto. Una vez concluida la instalación del componente JINITIATOR se le solicitará que reinicie su ordenador, ejecute ésta acción y al ingresar nuevamente compruebe que el componente haya sido instalado correctamente, ingresando a la opción Agregar y quitar programas ubicada en el Panel de Control. 24
  • 25. Ingrese nuevamente el texto http://127.0.0.1:8889/forms/frmservlet en una nueva sesión de explorador de Internet, esta acción le presentará la aplicación test.fmb, que está creada desde la instalación del Developer Suite y configurada como aplicación inicial en el archivo de configuración Formsweb.cfg para el ambiente default. 25 Si ésta aplicación se presenta, significa que la configuración del servidor de aplicaciones para el servicio de forms está funcionando correctamente. Ahora contamos con el ambiente de desarrollo y de ejecución listos para ser utilizados, si recordamos que tanto el Registro de Windows y los archivos de configuración del Servidor de Aplicaciones
  • 26. 2 PROGRAMACION CON FORMS DEVELOPER DE ORACLE Componentes de la herramienta NAVEGADOR DE OBJETOS Es el navegador de Objetos, aparece con la misma estructura en todas las herramientas ORACLE DEVELOPER y permite movilizarse entre las otras 3 interfaces y se pueden arrastrar los objetos entre diferentes formas. Este componente es el primero en aparecer después de ingresar al ORACLE Forms Builder. EDITOR DE DISEÑO Es el editor de diseño, aquí se diseña el aspecto de los lienzos (Canvas), se colocan los distintos objetos para el desarrollo de la aplicación. Para crear un lienzo se selecciona Lienzos en el Navegador de Objetos, luego se pulsa CREAR (paleta de herramientas) y aparece el Lienzos, luego seleccione el Lienzos que desee crear y pulse F2. PALETA DE PROPIEDADES Es la paleta de propiedades, aquí se configuran todas las propiedades y características de los diferentes objetos, por ejemplo: tamaño de letra, fuentes, visibilidad, etc. Existen 2 maneras de mostrar la paleta, la primera pulsando F4 y la segunda es dar un clic derecho sobre el objeto al cual se desea configurar sus características. 26
  • 27. 27 EDITOR PL/SQL: El editor del PL/SQL permite añadir, modificar, eliminar y compilar código PL/SQL, aquí se modifican las estructuras y procedimientos de la base de datos. Para abrir el editor, simplemente pulse doble-clic sobre el procedimiento que desee modificar, trigger a programar. BIBLIOTECAS DE OBJETOS La librería de Objetos se definen los estándares para el desarrollo de aplicaciones y los objetos a reutilizar. PAQUETES INCORPORTADOS Paquetería que Oracle incorpora como parte del producto Forms Developer que ofrece diversas utilidades como lectura y escritura sobre archivos texto, operaciones con árboles jerárquicos, funciones de uso estándar, etc.. OBJETOS DE BASE DE DATOS Permite la visualización y definición de componentes de base de datos como unidades de programa almacenadas PL/SQL, tales como procedimientos, funciones, paquetes y disparadores (Triggers) Update, Delete e Insert de tablas. Componentes en la definición de las formas o pantallas DISPARADORES Los Disparadores son bloques de código PL/SQL escrito para realizar tareas cuando un evento especifico ocurre dentro de la aplicación. ALERTAS Una alerta es una ventana modal que despliega un mensaje el cual notifica al operador sobre alguna condición de la aplicación. Existen 3 tipos de alertas: Parar, Atención y Nota. BIBLIOTECAS CONECTADAS Son vínculos a las librerías de los archivos de sistema, las cuales tienen procedimientos, paquetes y funciones que realizan ciertas operaciones al momento de ejecutar la aplicación. BLOQUES DE DATOS Se refiere a los bloques que agrupan cierta información, ya sea ítems de trabajo, o bloques de datos que representan a campos de una tabla. LIENZOS Es el lienzo donde se diseña la forma que verá el usuario final, aquí se insertan los ítems que contendrá la misma. EDITORES Se refiere a los editores personalizados que ORACLE FORMS permite definir. LISTA DE VALORES (LOV`S) Es un objeto que tiene una ventana desplegable que representa una estructura de datos lógica. Básicamente realiza una sola consulta por cada lista de valores. GRUPOS DE OBJETOS Es un contenedor para un grupo de objetos los cuales permiten trabajar con herencias entre formularios a través de atributos y componentes. PARÁMETROS Son variables del tipo CHAR, NUMBER o DATE que se definen en tiempo de diseño y capaces de almacenar valores por defecto y ser alterados en tiempo de ejecución. MENUS EMERGENTES Son menús anexados a los elementos de la forma y lienzos, permiten a los usuarios finales rápidamente acceder a funciones y comandos comunes.
  • 28. 28 UNIDADES DE PROGRAMA Se almacenan los procedimientos y funciones programadas dentro de la misma forma. También se tienen los procedimientos que utilizan los disparadores (si es que se programara adicionalmente). CLASES DE PROPIEDAD Un clase de propiedad es un objeto nombrado que contiene una lista de propiedades y sus configuraciones para los elementos y componentes de la aplicación. GRUPOS DE REGISTRO Son objetos que representan una estructura de datos con el marco fila/columna de la base de datos. INFORMES Permite la vinculación de informes que han sido diseñados con el Reports Builder de Oracle. Corresponde al nombre del vínculo para ejecutar un informe almacenado físicamente en el servidor de aplicaciones. ATRIBUTOS VISUALES Representa un atributo visual que es aplicado a un objeto en tiempo de ejecución. Los atributos definen color, fuente, patrones y la apariencia de un objeto. VENTANAS Es un contenedor para todos los objetos visuales que hacen la aplicación de FORMS BUILDER, puede incluir varios Lienzos. Así mismo, una forma puede contener varias Ventanas. Generación de otros objetos aplicativos MENÚES Son listas de items que los usuarios utilizan para seleccionar funciones específicas u operaciones. LIBRERÍAS Es una colección de subprogramas, incluyendo procedimientos, funciones y paquetes, los cuales pueden compartirse entre distintas aplicaciones. Esto ayuda a la estandarización del desarrollo. Componentes en la definición de menús BIBLIOTECAS CONECTADAS Las librerías son archivos que contienen un conjunto de procedimientos, funciones o paquetes que pueden ser utilizados por cualquier objeto aplicativo de ORACLE Forms, Reports y Menús. Una vez creadas las librerías, estas se relacionan(Atachan) al menú; y posteriormente su código PL/SQL puede ser invocado desde triggers, otro código PL/SQL de ítem del menú y rutinas predefinidas. MENÚS Los Menúes son listas de ítems que los usuarios utilizan para seleccionar funciones específicas u operaciones. Forms soporta tres tipos de Menúes: menú de formas, menú de barra de herramientas y menú popup (desplegables). GRUPOS DE OBJETOS Un Objeto de Grupo es un contenedor para un grupo de objetos (ítems, propiedades, atributos, alertas, disparadores). Se lo define cuando se quiere empaquetar objetos relacionados, los cuales pueden ser copiados o heredados en otro módulo. (Menú Template)
  • 29. UNIDADES DE PROGRAMA Se almacenan los procedimientos o funciones a nivel del menú, se los utiliza comúnmente para definir programáticamente las propiedades del menú, inicialización de variables, definición de seguridades para los menús y estados para trabajar con los menús, etc. CLASES DE PROPIEDAD Una clase de propiedad es un objeto nombrado que contiene una lista de propiedades y sus configuraciones para los ítems de la aplicación. Luego de crear la clase de propiedad puede poner otros objetos en él. Un objeto basado en una clase de propiedad puede heredar las características de cualquier propiedad. Pueden existir varias propiedades en una clase de propiedad y las propiedades en una clase. Las propiedades pueden ser controladas y localmente pueden ser descartadas para ese ítem, es decir que la herencia puede romperse. ATRIBUTOS VISUALES Son las fuentes, colores y propiedades patrón que se configuran para los objetos del menú. Cada objeto de la interfaz tiene un grupo de atributos visuales que determinan su configuración. Diseño de una pantalla básica 29 P ionando para pan na vez creado el módulo de la nueva Para definir una pantalla debe crear un nuevo módulo de pantalla, posicionándose en el componente antallas y pres crear un nuevo módulo de talla. U pantalla, ubicarse en el componente Bloques de Datos y hacer clic derecho sobre éste componente, al presentarse el menú de opciones seleccione Asistente de Bloques de Datos.
  • 30. 30 l presentarse la pantalla de bienvenida al eleccione Tabla o Vista para definir el tipo eleccione la tabla y las columnas que se desean utilizar y presentar en el bloque de datos. No A asistente de bloques de datos presione el botón Siguiente para definir el bloque de datos. S bloque de datos que se desea crear. S necesariamente todos las columnas de una tabla deben seleccionarse, solo aquellas que se desean utilizar y en el caso de bloques utilizados para registro deben presentarse las que corresponden a datos necesarios (requeridos).
  • 31. eleccione la tabla Departments para crear el eleccione todas las columnas disponibles S bloque de datos y presione Aceptar. S mediante el botón con doble signo mayor para elegir todas las columnas como ntos de base de datos que conformarán el bloque de datos. eleme tilice el mismo nombre de la tabla paraU definir el nombre del bloque de datos y presione el botón Siguiente. Esto finalizará la creación del bloque de datos. 31
  • 32. 32 a concluido el diseño del bloque de datos, el ejemplo seleccione el primer l presentarse la pantalla de bienvenida al iseño del Lienzo Son los lienzos de trabajo para realizar el diseño gráfico de las formas. Los elementos Contenido: Lienzo contenedor, en este se depositarán los objetos del diseño, incluyendo otros Apilado: es un lienzo que se coloca sobre el lienzo de contenido, se lo utiliza cuando se requieren Separador: Es la implementación en Forms de lo que en otras herramientas se conoce como Barra de Herramienta Horizontal: es un lienzo utilizado para diseñar barra de herramientas con Barra de Herramienta Vertical: es un lienzo utilizado para diseñar barra de herramientas con H seleccione uno de los botones de radio para indicar al Asistente de Bloques de Datos la operación que desea realizar. Si selecciona Crear el bloque de datos y, a continuación, llamar al Asistente de Diseño, automáticamente se abrirá el Asistente de Diseño de Lienzos. Si elige Crear solo el bloque de datos el volverá al navegador de objetos donde podrá observar el bloque de datos creado. Para efectos d botón. A asistente de diseño de lienzos presione el botón Siguiente para definir el bloque de datos. D que lo conforman son los Gráficos (Graphics). Existen varios tipos de LienzosCanvas. lienzos de tipo apilados. lienzos sobrepuestos para continuar cierto ingreso / presentación de la información (opcional). Carpetas, los lienzos Separadores, pueden tener 1 o más Páginas, los cuales son independientes para contener los objetos de las formas. orientación horizontal. orientación vertical.
  • 33. eleccione Nuevo Lienzo para crear el lienzo i selecciona un lienzo de tipo separador, debe eleccione el bloque de datos y los elementos de grese el nombre de la etiqueta que desea que S donde desee diseñar los elementos del bloque de datos. Si el lienzo ya existe selecciónelo. Si crea un nuevo lienzo asegúrese de seleccionar el tipo de lienzo apropiado. S seleccionar las páginas donde desea diseñar los elementos del bloque de datos. S éste que desea presentar en el lienzo. 33 In presente cada campo en el lienzo, puede modificar el ancho y el alto de elemento, ésta medida está dada en puntos.
  • 34. 34 eleccione el estilo de diseño que desea para la i se desea registrar información muy completa grese el título que desea para el marco que esea mostrar a ver la barra de desplazamiento, l asistente diseño ha finalizado el diseño del l asistente de diseño mostrará el marco nuevo S pantalla, el cual debe ser elegido según la presentación que se quiera dar a los datos. S en un solo registro es conveniente seleccionar Pantalla, si la información a ingresar es masiva o es agrupada por otro elemento se debe seleccionar Tabular. In encierra los elementos en el lienzo. Indique el número de registros que d en el lienzo. Usualmente si seleccionó el estilo del lienzo de tipo Pantalla se mostrará un solo registro, si es tabular indique la cantidad de registros que desea visualizar y la distancia entre cada registro. Indique si dese la cual puede ser vertical u horizontal según el sentido de orientación de los datos el bloque. E lienzo. Para crear el marco y diseñar los elementos seleccionados presione el botón Terminar. E en el Editor de Diseño. Puede ajustar el diseño en el futuro utilizando nuevamente el asistente de diseño, o utilizando la paleta de propiedades para modificar propiedades específicas del marco, lienzo o de cualquier elemento dentro de éste.
  • 35. sta es la pantalla resultante del diseño sta aplicación esta preparada para i el servicio del contenedor OC4J está a pantalla que se presenta inicialmente E anterior. El diseño es básico, sin embargo puede ajustarse a medida que se identifican los elementos de ajuste necesarios. E ejecutarse. Puede presionar el botón Ejecutar Pantalla para ejecutarla, éste paso abrirá en forma automática el explorador de Internet y presentará en modo de ejecución la aplicación diseñada. 35 S levantado puede ejecutarse la aplicación diseñada, sino levante el servicio tal y como se explicó anteriormente. L está en modo de inserción de datos, si se desea consultar la información debe presionar los botones de Introducir consulta y Ejecutar consulta.
  • 36. 36 na vez consultados los datos, éstosU pueden modificarse y almacenarse presionando el botón Guardar . Modifique el nombre del departamento, luego nos pasamos a otro registro presionando el botón o la tecla gde dirección con la flecha ↓ sin guardar el cambio, modificamos otra descripción y luego uardamos presionando el botón guardar , observe como se despliega en la barra de estado el mensaje transacción terminada: dos registros aplicados y guardados, esto se puede realizar entre registros, pero no entre bloques de registros. Es decir, si contamos con dos bloques Maestro – Detalle, y modificamos un registro del bloque detalle, si intentamos navegar hacia otro registro del bloque maestro, Oracle solicitará que se almacene o se descarte los cambios realizados en el bloque detalle del registro que deseamos abandonar, debido a que no mantiene en memoria los cambios realizados entre registros de nivel de detalle para múltiples registros maestros, sino únicamente del registro maestro actual.
  • 37. Si modificamos datos que afecten la integridad referencial entre uno o mas datos, se produce un error durante el evento de almacenamiento en base de datos (Grabar), el error puede ser visualizado en el menú {Ayuda}{Mostrar Error} de la pantalla en ejecución. 37 Como puede observar, se presenta una ventana que describe el error en forma de la sentencia en lenguaje DML que ocasionó el fallo, y el error de validación por violación a la integridad de la base de datos, al tratar del almacenar un dato que no existe en una entidad, a la cual existe una llave foránea.
  • 38. Objetos de trabajo Ventanas Es un contenedor para todos los objetos visuales que hacen la aplicación de Form Builder, incluyendo los lienzos. Una sola forma puede tener varias ventanas. 38 Cuando se crea una ventana, se especifica su tipo configurando la propiedad Window Style, existen 2 estilos : Document: Son ventanas que típicamente despliegan el canvas principal y áreas de trabajo de la aplicación donde se realiza la mayor parte de interacción entrada / salida con el usuario final. Dialog: Son ventanas flotantes, contenedores usados para diálogos modales que esperan respuesta inmediata. Ventana que muestra la consola de Forms Builder Esta ventana despliega la consola para la forma actual activa en la aplicación. Esta manera de trabajar es opcional, aunque es muy utilizada en aplicaciones de formas múltiples, la ventaja es que siempre muestra la consola de la forma actual. Bloques de datos Son estructuras que agrupan a un conjunto de ítems de diferente tipo, que podría por ejemplo representar a los campos de una tabla o conformar un bloque de trabajo. Si se utiliza un bloque para relacionarlo a la información de la base de datos, existen 2 formas: Relación Directa, donde se específica directamente con que tabla(solo una) trabajará el bloque. Relación Indirecta, en este caso el bloque trabajará con información de la base datos a través de procedimientos. La programación en estos procedimientos tiene ciertas restricciones pero en general tiene ventajas como la mejora del performance y que permite enlazar un bloque con un conjunto de tablas. Los bloques de datos estas conformados con los siguientes elementos: Disparadores, elementos (columnas de tabla o elementos temporales) y relaciones, estas ultimas se forman cuando se crean bloques maestro- detalle.
  • 39. 39 En la siguiente imagen observamos las diferentes secciones que contiene un bloque de datos, y las propiedades que corresponden a cada sección. Propiedades básicas de un bloque de datos General Nombre: Nombre interno del objeto. Comentarios: Información general que usted desea especificar acerca del bloque de datos creado. Navegación Estilo de navegación: Como procesar el elemento siguiente o anterior cuando el foco es el primer o último elemento navegable dentro del bloque de datos. Registros Consultar todos los registros: Especifica si desea recupera todos los registros que coinciden con los criterios de consulta en el bloque de datos. Esta propiedad tiene por defecto el valor NO, para utilizar elementos calculados de tipo resumen en un bloque, se debe definir ésta propiedad en SI. Grupo de atributos visuales del registro actual: Permite definir atributos visuales a nivel de forma, bloque de datos y elementos de un bloque de datos, o bien, para formas con varios niveles de bloques de datos, permite la combinación de atributos visuales para cada bloque o elemento de un bloque, otorgando una apariencia visual independiente. Base de Datos Bloque de datos de base de datos: Indica si
  • 40. 40 el bloque de datos se basa en un objeto de base de datos (SI), o si se utiliza como un bloque de trabajo temporal (NO). Consulta permitida: Define si las aplicaciones pueden ejecutar una consulta en el bloque de datos. Inserción permitida: Define si las aplicaciones pueden insertar registros en el bloque de datos. Actualización permitida: Define si las aplicaciones pueden actualizar registros en el bloque de datos. Supresión permitida: Define si las aplicaciones pueden suprimir registros en el bloque de datos. Alias: Nombre del Alias asociado al Origen/Destino de datos. Cláusula WHERE: Cláusula estándar asociada por defecto al bloque de datos, en la cual se define específicamente las sentencias de condición que limita la consulta de registros en el bloque. Clásula ORDER BY: Cláusula estandar asociada por defecto al bloque de datos, en la cual se define el orden de visualización de los registros recuperados en una consulta. Puede utilizar orden ascendente(ASC) o descendente(DESC) después de cada columna. Ejemplo Location_Id Desc, Department_Name Asc Barra de desplazamiento Mostrar barra de desplazamiento: Desea visualizar la barra de desplazamiento en el lienzo. Lienzo de barra de desplazamiento: Especifica el lienzo donde será visualizada la barra de desplazamiento. Página de separador de la barra de desplazamiento: Especifica la página donde será visualizada la barra de desplazamiento en caso de que se utilicen lienzos de tipo separador. Tipos de bloques de datos De acuerdo a la necesidad de la aplicación y para optimizar el desarrollo de la misma se tienen diferentes tipo de bloques. Bloque de barra de herramientas Es un bloque donde se añaden los objetos que pertenecerán al toolbar (barra de herramientas) de la aplicación, regularmente son botones típicos de edición, impresión, grabar, hacia delante, hacia atrás, los cuales son programados para que realicen las funciones que les corresponde. Este bloque no pertenece a la base de datos, por lo tanto no se deben parametrizar las propiedades de base de datos y registros en el property palette. Bloques de trabajo Es un bloque utilizado por los programadores, donde se manejan valores necesarios para la aplicación pero que no necesitan ser vistos por el usuario final, se los esconde al no definir en que lienzo debe mostrase. Regularmente tenemos datos de consultas generadas por PL/SQL cargadas en estos elementos del bloque de trabajo. Este tipo de bloque puede estar enlazado con alguna columna de la base de datos de la cual se recoja información, otras veces simplemente los elementos del bloque de trabajo son repositorio transitorio hasta realizar algún proceso. Bloques de información Son los bloques presentados al usuario final, aquí se permiten realizar consultas, ingresar, actualizar o eliminar datos. Dependiendo de la funcionalidad pueden estar enlazados a tablas o procedimientos almacenados, estos últimos trabajan con columnas de las tablas del módulo.
  • 41. Cuando se desea crear un bloque con el botón Create de la paleta de herramientas, aparece el Asistente de ayuda y allí se puede indicar que vinculo tendrá ese bloque, con una tabla o con un procedimiento, si se hace de esa manera es más fácil. Si se prefiere la creación manual deben especificarse ciertas propiedades en la paleta de propiedades para ese bloque de datos en particular. En la propiedad Elemento de Base de Datos indique SI Si se trabaja con claves primarias, seleccione SI en la propiedad Clave Primaria Continúe parametrizando las propiedades restantes, dependiendo de las necesidades de la aplicación. Generalmente las aplicaciones se realizan enlazando los bloques de datos con la base de datos, debido a las transacciones que se manejan, además existen métodos que optimizan el tiempo de consulta a la base de datos. Elementos gráficos Los elementos gráficos aparecen como una paleta en el editor de diseño del lienzo, esta situado al lado izquierdo de la pantalla. Marcos Son objetos gráficos que aparecen en un lienzo. Se los usa para acomodar varios objetos dentro de un bloque. Esto ayuda porque varias propiedades pueden configurarse para ese marco y permite la estandarización. Texto Fijo Son etiquetas de texto las cuales son editadas en modo de diseño. Texto Elemento texto Tipos de elementos Elemento mostrado Son ítems que únicamente despliegan valores asignados al mismo. No son navegables y comúnmente se utilizan para mostrar valores referenciales. Elemento de texto Es un recuadro o campo que permite desplegar y además editar texto. Son utilizados para permitir al usuario ingresar información que será posteriormente procesada. Como todos los objetos tienen propiedades que pueden ser configuradas en modo de diseño, o con programación. Botón Son ítems de interfaz que permite a los usuarios finales ejecutar comandos o iniciar acciones. Se los utiliza para iniciar navegación, desplegar listas de valores, invocar un editor o ventana; y son programados con pl/sql. En Forms se soportan 2 estilos: de texto e icónicos, estos últimos pueden contener un gráfico visible al usuario. Este gráfico tiene que ser un archivo de tipo .ICO. Grupo de botones de radio Es desplegado como un indicador visual (circulo) y aparece lleno o vacío para indicar el status actual de cada sub-opción. Un radio button debe pertenecer a un radio group menú de dos o mas ítems relacionados. 41
  • 42. 42 Casilla de control Son casilleros de selección múltiple, los cuales pueden ser configurados en tiempo de diseño o por programación. Elemento de lista Es una lista de elementos de texto que pueden ser desplegados de alguna forma: poplist, tlist o combo box. Estas listas muestran números fijos de elementos, estos son cadenas de texto de hasta 30 caracteres. En tiempo de ejecución, programáticamente pueden ser evaluados o eliminados. Creación de elementos de trabajo Creando el bloque de datos Employees relacionado con el bloque Departments, agregar en el los siguientes elementos en el bloque Employees luego de que éste es diseñado: L_Total_Linea L_Total_Salario L_Total_General Asignar a la propiedad Elemento de Base de Datos el valor SI. Ya que éste es un valor de cálculo temporal el cual no es almacenado en base de datos, sino que únicamente se muestra para efectos de resumir o totalizar datos.
  • 43. Existen 2 métodos de cálculo del valor de un elemento calculado: 43 Fórmula: Se especifican los elementos que se desean operar entre sí, formando una operación aritmética simple o combinada. Formula= :employees.salary*(1+NVL(:employees.commission_pct)) Resumen: Suma o resume los valores de un elemento. Esto es muy útil cuando se requiera sumar los valores que presenta un elemento específico en un bloque de varios registros (Tabular). Resumen= function resumen (suma) Bloque resumido: employees Elemento resumido:salary El elemento debe residir en un bloque de datos donde la propiedad Consultar todos los registros=SI, o Pre-Calcular=SI.
  • 44. 44 Como una buena práctica y para indicar que es un elemento que no puede ser modificado, debe definir éste elemento como un tipo de elemento mostrado, utilizado para aquellos elementos que no deben ser manipulados o alterado su valor en tiempo de ejecución. Al ejecutar la aplicación una vez concluida la especificación de las propiedades necesarias para los elementos de fórmula y resumen, ésta debe presentar como sigue a continuación
  • 45. Listas de Valores El constructor Forms de Oracle ofrece muchas ventajas al contar con asistentes para diseñar y definir ciertos objetos como Listas de Valores y Grupos de Registros, los cuales trabajan conjuntamente. Uso del Asistente A continuación se detalla el uso del Asistente para la creación de listas de valores y grupos de registro. Durante su definición se crea primero el grupo de registros, ya que los valores o registros que obtenga la consulta serán mostrados en la lista de valores. Como ejemplo se elabora una lista de valor basada en la consulta de la tabla Employees, de la cual se consultarán todos los empleados que tengan una jefatura. Para esto se implementará el uso de la siguiente consulta: select a.employee_id, a.first_name||' '||a.last_name nombre_empleado from employees a where a.employee_id in (select b.manager_id from employees b where a.employee_id = b.manager_id ) O bien, la siguiente creada automáticamente por Query Builder de Oracle Developer. SELECT DISTINCT A.MANAGER_ID, B.FIRST_NAME, B.LAST_NAME FROM EMPLOYEES A, EMPLOYEES B WHERE (A.MANAGER_ID = B.EMPLOYEE_ID) ORDER BY A.MANAGER_ID ASC Los elementos marcados MANAGER_ID y L_MANAGER_NAME presentan los valores del código de un empleado jefe (Elemento de base de datos = ‘SI’) y el nombre de empleado jefe (Elemento de base de datos=NO) respectivamente, lo cuales serán utilizados para desplegar la lista de valores y retornar los valores seleccionados de la lista. 45
  • 46. Creando la lista de valores con el asistente de diseño Seleccione el componente Listas de Valores en el navegador de objetos, presione clic derecho sobre el componente y elija Asistente de Listas de Valores para iniciar la creación de la lista de valores. La lista de valores obtiene los datos de los grupos de registros, éstos últimos se pueden definir con consultas SQL o introduciendo una lista de valores estáticos. Si el grupo de registros existe, selecciónelo de la lista de Grupo de Registros Existente, si la lista de valor es completamente nueva, seleccione Nuevo Grupo de Registros Basado en una Consulta y presione el botón Siguiente. Los grupos de registros pueden basarse en consultas SQL. Si desea introducir o modificar una consulta que es utilizada por un grupo de registros de la lista de valores, puede hacerlo a partir de la creación de una nueva consulta o su importación desde un archivo del tipo SQL almacenado. Si desea obtener ayuda al crear la consulta seleccione Crear Consulta SQL , Oracle le permite utilizar Query Builder de Oracle Developer, donde podrá seleccionar las tablas y columnas que desee presentar y relacionar. 46
  • 47. 47 Debe seleccionar las tablas que conformarán la consulta, una vez seleccionadas cierre éste diálogo de selección y establezca las relaciones entre las tablas incluidas, de modo que la consulta se defina debidamente normalizada. Para efectos de éste ejemplo, se ha seleccionado la tabla EMPLOYEES dos veces, relacionando la columna Manager_Id de la entidad con alias EMPLOYEES y la columna Employee_Id de la tabla con alias EMPLOYEES_A1. Ordenar datos por columnas Una vez establecida la consulta básica, ésta se presentaría de la manera en que lo muestra ésta figura. Sin embargo, puede mejorarse su estructura, utilizando ordenamientos de columnas y asignando un nombre de diferente a los alias de las tablas incluidas en la consulta.
  • 48. Ordenamiento de datos Mediante el ícono puede establecer el orden de los datos en la consulta. Seleccione de la lista de Columnas Disponibles, la columna por la cual desea ordenar la información, presione doble-clic o presione el botón para establecer el grupo de columnas ordenadas. Cambiar Nombre de Tablas Query Builder asigna automáticamente el alias de las tablas incluidas en la consulta, sin embargo, el nombre de éstas puede ser cambiado mediante el botón (Cambiar nombre de tablas). Seleccione la tabla a modificar y asigne en el campo Nombre Nuevo el nuevo alias de la tabla. EMPLOYEES A EMPLOYEES_A1 B 48
  • 49. De la forma en que se presenta en la figura Consulta A, es creada la consulta con el asistente de Query Builder, en cuyo caso se presentarían tantos registros de un mismo jefe como éste se encuentre asignado a diferentes empleados. De manera que para presentar únicamente un registro de cada jefe y el nombre respectivo, se sustituye la cláusula ALL por DISTINCT. Consulta A Consulta B Los datos de presentarían en cada caso como se muestra a continuación: Para una mejor presentación del nombre del empleado, realice la siguiente modificación a la consulta generada: SELECT DISTINCT A.MANAGER_ID, (B.FIRST_NAME||’ ’||B.LAST_NAME) NOMBRE FROM EMPLOYEES A, EMPLOYEES B WHERE (A.MANAGER_ID = B.EMPLOYEE_ID) ORDER BY A.MANAGER_ID ASC Los datos serán presentados como se muestra en ésta figura. Este ajuste es necesario debido a que según el diseño de la aplicación, en la cual tenemos únicamente dos campos para retornar los valores de la lista, los cuales son Manager_Id y L_Manager_Name, donde en éste último se debe mostrar el nombre completo del empleado jefe. 49
  • 50. Una vez que la consulta es definida puede incluir algunas o todas las columnas del grupo de registros en la lista de valores. Seleccione de la lista de Columnas del Grupo de Registros la columna(s) que desea visualizar en la lista de valores y presione el botón para pasar dichas columnas como parte de la lista de Columnas de la Lista de Valores. Presione el botón para pasar a la siguiente pantalla. Nuevamente otra ventana le indica que etiquetas llevaran las columnas o si desea usar el default. 50 En la parte inferior de la ventana hay un botón Consultar elemento de retorno, el cual le permite definir cuales serán los elementos que recibirán a cada columna de la consulta. Estos objetos pueden ser elementos de texto o elementos mostrados. Seleccione el elemento del bloque de datos que recibirá el valor de la columna que el usuario elige de la lista de valores en tiempo de ejecución. Avance a la siguiente pantalla presionando Siguiente >
  • 51. En ésta pantalla debe definir algunos valores a ciertas atributos de la lista. Para éste ejemplo asigne el título Lista de Jefes, modifique los valores por defecto del ancho y la altura de la ventana de la lista de valores, asignando 300 y 350 respectivamente. Forms colocará la lista de valores automáticamente. 51 Avance a la siguiente pantalla presionando Siguiente > Si desea modificar las propiedades avanzadas puede hacerlo. Recuperar # de filas cada vez permite limitar la cantidad de filas que muestra la lista de valores. Refrescar los datos del grupo de registros antes de mostrar la lista de valores permite actualizar datos que hayan sido incluidos durante el tiempo en que se ha interactuado con una aplicación sin salir de ella, presentando en la lista de valores cualquier cambio en las tablas que la conforman. Permitir al usuario filtrar los registros antes de mostrarlos es una funcionalidad que en tiempo de ejecución permitirá al usuario final filtrar información antes de que los valores de la lista sean mostrados en pantalla. Avance a la siguiente pantalla presionando Siguiente >
  • 52. De los elementos que se seleccionaron como valores de retorno, se han seleccionado el Manager_Id y L_Manager_Name donde se asignarán el código y el nombre del empleado jefe. 52 Asigne a alguno de éstos elementos o a todos la lista de valores, con el fin de que el usuario presionando la combinación de teclas CTRL+L pueda levantar la lista de valores. Importante: los elementos deben ser de tipo Elemento de Texto, en éste caso Manager_Id es elemento de texto y L_Manager_Name es elemento mostrado por lo tanto éste último al ser un elemento que nunca podrá tener el foco de edición, no tendrá sentido asignarle la lista de valores. Una vez asignada la lista de valores al elemento presione el botón Siguiente > El asistente ha completado la definición de la lista de valores, presione el botón para crear el grupo de registros y la lista de valores. El navegador de objetos mostrará y asignará un nombre y un consecutivo de grupo de registros y lista de valores, el cual podrá modificar editándolos. Si desea modificar la lista de valores en un futuro, vuelva a llamar al asistente de diseño de listas de valores y modifique los atributos que considere necesarios.
  • 53. Creando listas de valores manualmente Creación de Grupo de Registros Se abre la forma a la cual se le añadirá el Grupo de Registros. Luego se da clic en el componente de Grupo de Registros en el navegador de objetos y en la paleta de herramientas escoja Crear (+) Aparece una ventana para la creación de la consulta o indicar que se trabajara con valores estáticos. Escoja la opción que necesite. Clic en aceptar. Aparecerá el nuevo objeto Record Group. Creación de la Lista de Valores Previamente creado el grupo de registros se da clic en el componente Lista de Valores del navegador de objetos y en la paleta de herramientas escoja Crear (+) Aparece una ventana la cual indica el modo de creación (manual o Asistente). Escoja Manual. Presione Aceptar. Luego diríjase a la paleta de propiedades de la nueva lista de valores. Defina cual Grupo de Registros se utilizará en la propiedad Grupo de Registros. Luego en la propiedad Propiedades de Correspondencia de Columnas, indique cuales columnas serán retornadas a los elementos del bloque de datos. Finalizado esto debe indicar al botón que disparara la lista de valores, cual lista de valores debe ejecutarse (Ver código en la parte superior). Si fuera un text item quien dispara la lista de valores, se define en la propiedad Lista de Valores del elemento de texto cual Lista de Valores se invocará. Alertas Una alerta es una ventana modal que despliega un mensaje el cual notifica al operador sobre alguna condición de la aplicación. Existen 3 estilos de alertas: Parar, Atención y Nota. 53 Cada estilo de alerta mostrará una figura diferente. La cantidad de botones en una alerta será definida por la cantidad de Etiquetas de Botón con contenido. Es decir, si se necesita una alerta que presente un mensaje, ésta deberá tener el texto Aceptar en la Etiqueta del Botón 1, y las etiquetas del botón 1 y 2 deben de dejarse sin contenido.
  • 54. 54 Disparadores Los disparadores responden a eventos que se ejecutan en una aplicación en tiempo de ejecución, con el objetivo de ejecutar ciertas rutinas, dependiendo del procedimiento invocado. Explicación principales disparadores definidos Existe división de categorías funcionales para los disparadores: ° Disparadores para procesamiento de bloques ° Disparadores para eventos de interfaz ° Disparadores para maestro-detalle ° Disparadores para el manejo de mensajes de error ° Disparadores de navegación ° Disparadores para tiempo de consulta ° Disparadores transaccionales ° Disparadores de validación Disparadores para procesamiento de bloques .- Estos triggers se disparan en respuesta a eventos relacionados en la administración de un registro en un bloque. When-Create-Record Realiza una acción cuando se intenta crear un nuevo registro en un bloque. When-Clear-Block Realiza una acción cuando se elimina el registro actual. Remueve todos los registros del bloque. When-Database-Record Realiza una acción cuando cambia el estado del registro para insertar, actualizar, así se indica que el registro será procesado por la siguiente operación COMMIT_FORM. When-Remove-Record Realiza una acción cuando un registro es limpiado o eliminado. Disparadores para eventos de interfaz.- Son disparados en los eventos que ocurren en la interfaz de la forma. When-Button-Pressed Inicia una acción cuando un operador selecciona un botón (mouse/tecla). Key-Commit Se ejecuta cuando se realiza la acción COMMIT, con la tecla F10. Key-Entqry Inicia acción cuando se entra el modo de consulta (tecla F7). Key-Exeqry Inicia acción cuando se ejecuta la consulta (tecla F8). When-Timer-Expired Inicia una acción cuando expira el timer programático. When-Window-Activated Inicia una acción cuando un operador o aplicación activa una ventana.
  • 55. 55 When-Window-Closed Inicia una acción cuando un operador cierra una ventana con el comando Close del administrador de ventana. Disparadores Maestro-Detalle .- Son generados automáticamente al definirse una relación maestro- detalle entre bloques. Estos obligan la coordinación entre registros en un bloque detalle y en el registro maestro del bloque maestro. On-Check-Delete-Master Se dispara cuando se intenta eliminar un registro en un bloque que es un bloque maestro en una relación maestro-detalle. On-Clear-Details Se dispara cuando se necesitan limpiar registros en un bloque que es un bloque detalle en una relación maestro-detalle. Disparadores para el manejo de mensajes de error.- Form Builder envía mensajes de información y error en respuesta a eventos en tiempo de ejecución. On-Error Reemplaza un mensaje de error default con un mensaje de error personalizado. Disparadores de navegación.- Responden a eventos de navegación. Por ejemplo cuando el usuario da un clic en un ítem de texto en otro bloque, un disparador de navegación se dispara y Forms mueve el foco de ingreso desde el ítem actual al ítem objetivo. Pueden dispararse en respuesta a eventos internos de navegación que ocurren durante el procesamiento de la forma. Se subdividen en 2 categorías: Pre-trigger y Post-trigger. Listado de Disparadores de Navegación: Pre-Block, Pre-Record, Pre-Text-Item, Post-Text-Item, Post-Record, Post-Block. Pre-Form Se dispara durante el evento de Entrar a la forma, al inicio de la forma. Post-Form Realiza una acción cuando Forms sale de la forma. Además, existen los disparadores When-New-Instance-Triggers que se disparan al final de la secuencia de navegación que ubica el foco en un ítem diferente. Estos son: When-New-Block-Instance, When-New- Record-Instance, When-New-Item-Instance. When-New-Form-Instance Realiza una acción al iniciar la forma. Se ejecuta después del disparador Pre-Form. Disparadores para tiempo de consulta.- Son disparados antes y justo después que el usuario o la aplicación ejecuta una consulta en un bloque. Estos disparadores son : Pre-Query Valida el criterio de consulta actual o provee programáticamente criterio adicional. Post-Query Realiza una acción después de recuperar un registro. Se dispara una vez para cada registro dentro del bloque. Disparadores transaccionales.- Se disparan en respuesta a varios eventos que ocurren cuando la forma interactúa con la fuente de datos. Los triggers son: On-Delete, On-Insert, On-Lock, On-Logout, On-Update,
  • 56. 56 Post-Database-Commit, Post-Delete, Post-Forms-Commit, Post-Insert, Post-Update, Pre-Commit, Pre- Delete, Pre-Insert, Pre-Update. On-Logon Se dispara para cada logon a la base de datos. Disparadores de validación.- Se disparan cuando Form Builder valida datos en un ítem o registro. La validación la chequea durante la navegación que ocurre por control de programación, procesamiento, etc. When-Validate-Item Se dispara en la ultima parte de la validación del ítem para los ítems con el estado de validación Nuevo o Modificado. When-Validate-Record Se dispara durante el proceso de validación de registros, en la ultima parte de la validación del registro para los registros con estado Nuevo o Modificado. Otros Disparadores When-Button-Pressed Se dispara cuando se selecciona un botón al dar un clic o usar el teclado. Es definido a nivel de forma, bloque o ítem. When-Mouse-Click Se dispara después de hacer click con el ratón, si ocurren estos eventos: click en lienzos o elementos de la forma. When-Mouse-Enter Se dispara cuando el mouse entra a un ítem o canvas. When-Mouse-Leave Se dispara cuando el mouse sale de un ítem o canvas.
  • 57. Implementación de Disparadores más comunes POST-QUERY Se implementó el disparador PORT- QUERY mediante un cursor el cual obtiene el nombre del jefe, consultando el código del empleado en la tabla EMPLOYEES y que corresponda al código de jefe del registro actual en el bloque de departamentos. Recordemos que éste disparador se ejecuta luego de realizada la consulta a la base de datos y presentados lo datos en el bloque. Este disparador se ejecuta para todos los registros recuperados y visualizados en el bloque de datos. WHEN-VALIDATE-ITEM 57 El When-Validate-Item es un disparador que podría implementarse igual que el POST-QUERY para la recuperación y validación del dato, incorporando el comando Raise Form_Trigger_Failure dentro de la validación de localización del registro. Sin embargo, para implementar un ejemplo diferente, se realiza la validación haciendo una consulta directa y utilizando el manejo de excepciones para identificar si se logró o no encontrar el registro. En éste caso si el registro es encontrado lo asigna directamente al elemento L_Manager_Name, el registro no es encontrado, el proceso se va a la sección de excepciones inmediantamente, ejecutando el código dentro de la excepción WHEN NO_DATA_FOUND, asignando el código no existe al elemento L_Manager_Name. En caso de presentarse cualquier otro error se ejecuta la excepción WHEN OTHERS, la cual mostraría el mensaje de error de SQL, el cual no permitiría identificar con precisión el error presentado. Recordemos que éste disparador se ejecuta luego de realizada cualquier modificación de información en un elemento, cuando el bloque de datos se encuentra en estado NEW.
  • 58. 58 PRE-FORM El Pre_Form es un disparador que se ejecuta inmediatamente que se ingresa a una pantalla, en éste se puede cargar valores iniciales de trabajo que definen el entorno de operación en una aplicación. Para una mejor ilustración tome como ejemplo el código fuente que se presenta en el disparador Pre-Form de ésta figura, donde se implementa la carga de un elemento de tipo lista a partir de los valores de la tabla Departements del esquema HR. Para esto utilizamos el procedimiento Gen_Carga_ListItem contenido en la Biblioteca Pl/Sql llamada General.pll. Esta unidad de programa consiste en llenar un elemento de tipo lista a partir de la construcción de una consulta a la base de datos, recibiendo los parámetros necesarios para conformar la estructura de dicha consulta. Bliblioteca:General.pll PROCEDURE GEN_CARGA_LISTITEM(Campo In Varchar2, -- campo tipo lista de manera: bloque.campo Codigo In Varchar2, -- Valor del campo a guardar en la lista Des In Varchar2, -- Descripción del campo a guardar en la lista. Tabla In Varchar2, -- Nombre de Tabla de la cual se cargan valores Where_ In Varchar2 Default Null, -- Condiciones de la consulta. Order_ In Varchar2 Default Null, -- Ordenamiento de los valores a mostrar en la lista. GloDef In Varchar2 Default Null -- Global para utilización de valor inicial del campo. ) IS RG RecordGroup; Status Number; NomRG varchar2(20); Consulta varchar2(2000); Inicial varchar2(500); BEGIN -- Se crea la consulta para cargar los valores de la lista. Consulta := 'Select '||Des||' DES, '||Codigo||' COD From '||Tabla; IF Where_ is not null then Consulta := Consulta ||' Where '||Where_; End If; IF Order_ is not null then Consulta := Consulta ||' Order by '||Order_; end if; -- Si el RG ya existe, lo elimina para crear la nueva consulta. RG := Find_Group('GRUPO_LISTA'); IF Not Id_Null(Rg) Then Delete_Group (RG); End IF; -- Crea Record group. NomRG := 'GRUPO_LISTA'; RG := Create_Group_From_Query (NomRG,Consulta); Status := Populate_Group (RG); Clear_List (Campo); Populate_List (Campo,RG); -- Asignar a la global el primer valor if (GloDef is not null) and (Get_Group_Row_Count(RG) > 0) then Inicial := Get_Group_Char_Cell (NomRG||'.COD',1); Copy (Inicial,GloDef); end if; Delete_Group (RG); EXCEPTION When Others Then Gen_Mensaje('<Gen_Carga_ListItem>..Error interno en rutina de carga de campo lista.. '||SqlErrM); Raise Form_Trigger_Failure; END;
  • 59. Continuando con la implementación del elemento de lista dinámico, es necesario definir la propiedad Tipo de Elemento en la paleta de propiedades como Elemento de Lista. Una vez definido el tipo de elemento y debido a que el elemento de lista se llena a partir de los datos en una tabla, no deben existir valores en la propiedad Elementos en Lista, los cuales son creados por defecto y deben eliminarse, tanto el Elemento de Lista como el Valor de Elemento de Lista. Asegúrese de conectar la biblioteca General.pll para poder utilizar la unidad de programa Gen_Carga_ListItem contenida en ella. Al ejecutar la aplicación ésta deberá presentarse como se observa en la siguiente figura. 59
  • 60. Bibliotecas PL/SQL Es una colección de subprogramas, incluyendo procedimientos, funciones y paquetes, los cuales pueden compartirse entre distintas aplicaciones. Esto ayuda a la estandarización del desarrollo. Crear una librería nueva Para crear una Biblioteca, debe ubicarse en el componente Bibliotecas PL/SQL, y presionar el botón crear en el panel vertical, seguidamente Forms creará el objeto en ésta sección de componentes con un nombre lógico temporal, el cual será almacenado con el nombre que se le defina. Una vez almacenada la biblioteca en disco, podemos incorporarle funciones, procedimientos y paquetes, tal y como se muestra en la siguiente figura. 60
  • 61. 61 Como se puede apreciar, esta biblioteca llamada, General.pll, contiene una serie de procedimientos y funciones que se convierten en código flexible y estándar, el cual puede ser utilizado por cualquier aplicación que conecte ésta biblioteca. Una vez creada la biblioteca, ésta puede ser recuperada para adicionarle o modificarle cualquier de las unidades de programa que la componen. Luego de realizar cualquier cambio en la biblioteca, ésta debe ser compilada completamente utilizando la combinación de teclas CTRL+SHIFT+K. Posteriormente con CTRL+T debe generar el módulo compilado, para su utilización en ambiente de ejecución. Conectar Bibliotecas Son vínculos a las librerías del sistema de archivos, las cuales tienen procedimientos, paquetes y funciones que realizan ciertas operaciones al momento de ejecutar la aplicación. Para conectar una biblioteca PL/SQL, debe ubicarse en el componente Bibliotecas Conectadas, y presionar el botón crear en el panel vertical, seguidamente Forms abrirá un diálogo de conexión, donde deberá buscar el archivo con extensión PLL y seleccionarlo para conectarlo a la aplicación. Al conectar la biblioteca Forms le solicitará que indique si desea eliminar la ruta de acceso, si la elimina deberá definir la ruta en la variable FORMS_PATH en el Regedit y en el archivo ambiente *.env del ambiente de ejecución. Si no elimina la ruta se debe tener en cuenta que la aplicación buscará tanto en ambiente de desarrollo como de ejecución la biblioteca en la ubicación donde originalmente se encontraba almacenada en el momento de conectarla a la aplicación.
  • 62. Unidades de Programa Son procedimientos o funciones a nivel de la forma, las cuales tiene la lógica de programación con la que interactúan los objetos de la forma. Para ilustrar mejor éste concepto, confeccionará un elemento de tipo Árbol Jerárquico a partir de la tabla de Employees del esquema HR, el cual será cargado utilizando una unidad de programa local a la forma de Empleados.fmb. Como primer paso se debe crear el componente Grupo de Registro al cual le asignaremos el nombre Gr_Tree_Empleados, incorporando la consulta que se presenta en la siguiente figura. Implementación de un árbol jerárquico 62 ree el bloque de datos manualmente con el nombre Para la construcción de un árbol jerárquico a partir de una tabla se debe respetar la siguiente estructura: 1. Valores numéricos 0 y 1 que indican si el árbol se presenta con todos sus nodos colapsados o expandidos respectivamente. 2. Nivel de jerárquía del nodo en el árbol. 3. Descripción que será mostrada en el árbol. 4. Ícono con que se desea visualizar un nivel o jerarquía de nodos. 5. Valor al que responde o que encapsula el nodo. C B_Tree_Empleados no basado en tablas y agregue en este un nuevo elemento de tipo Árbol Jerárquico con el nombre TREE, vaya a la sección funcional de la paleta de propiedades y asóciele el Grupo de Registros Gr_Tree_Empleados y finalmente vincúlelo al lienzo donde se desea visualizar.
  • 63. Tome el siguiente procedimiento e inclúyalo como una unidad de programa local a la forma Empledos.fmb, con el nombre Tree_Carga_Rg. PROCEDURE TREE_CARGA_RG (p_Campo In Varchar2, -- Item tipo árbol p_NomRG In Varchar2 -- Nombre del Record Group asociado ) IS v_Status Number := 0; -- Almacena resultado de ejecución de RG. RG RecordGroup; -- Record group de cuentas contables definidas. BEGIN -- Asigna el Record Group al campo determinado FTree.Set_Tree_Property(p_Campo,FTree.Record_Group,p_NomRG); -- Asigna el cursor como ocupado Set_Application_Property(Cursor_Style,'Busy'); -- Ejecuta el record group con el cual se cargará el árbol v_Status := Populate_Group(p_NomRG); :Parameter.Par_TotNodos := Get_Group_Row_Count(p_NomRG); -- Carga elementos en el árbol FTree.Populate_Tree(p_Campo); -- Restaura el estilo del mouse para indica que ya finalizó el proceso Set_Application_Property(Cursor_Style,'Default'); -- Establece el primer elemento del árbol como Seleccionado FTree.Set_Tree_Selection(p_Campo, 1, FTree.Select_On); END; Una vez incluido el procedimiento en la forma, incluya en el disparador When-New-Form-Instance el llamado al procedimiento Tree_Carga_Rg para que sea cargado el elemento de tipo Árbol Jerárquico del bloque B_Tree_Empleados y puedan ser visualizados los registros de la tabla Employees según la jerarquía de jefatura asignada a cada empleado, según la consulta implementada en el grupo de registros GR_TREE_EMPLEADOS. El procedimiento Tree_Carga_Rg cargará los registros recuperados en el grupo de registros GR_TREE_EMPLEADOS en el elemento de tipo árbol B_Tree_Empleados.Tree, presentándolo como se muestra en la ésta figura. 63
  • 64. 64 Como ejercicio adicional y explotando la funcionalidad que permite el elemento de tipo árbol, cree el siguiente procedimiento en como una unidad de programa local a la forma Empleados.fmb, con el nombre Tree_Nodos_Seleccianados, la cual recorrerá cada uno de los nodos seleccionados en el árbol y utilizaremos para que realice una consulta al bloque Employees y presente la información de cada empleado seleccionado en el árbol, simulando una relación entre bloques de datos. La selección de registros puede ser múltiple, presentando los mismos registros en el bloque empleados que fueron seleccionados en el árbol. PROCEDURE tree_nodos_seleccionados ( p_campoarbol IN VARCHAR2, -- Campo tipo árbol por controlar p_rgelementos OUT recordgroup, -- Rg donde almacena elem seleccionados p_colcodigo OUT groupcolumn, -- Columna a consultar posteriormente p_totelementos OUT NUMBER, -- # Elementos seleccionados p_selecpadres IN BOOLEAN DEFAULT FALSE -- Indica si se desean seleccionar los padres ) IS htree item := FIND_ITEM (p_campoarbol); v_nodoactual ftree.node; -- Almacena c/nodo seleccionado v_nodotmp ftree.node; -- Nodo padre temporal v_idtmp_rg recordgroup; v_valor_nodo VARCHAR2 (100); -- Almacena el valor del nodo v_tipo_nivel VARCHAR2 (2); -- Almacena el tipo de nivel que se extrae del árbol (1:Uen, 2:Proceso, 3:Funcionario) v_primera_vez BOOLEAN := TRUE; v_error VARCHAR2 (2000) := NULL; BEGIN IF ID_NULL (htree) THEN gen_error ( 'El campo tipo árbol: ' || p_campoarbol || ' no existe en la forma actual.' ); RAISE form_trigger_failure; END IF; -- Si no existen elementos seleccionados, solamente sale p_totelementos := ftree.GET_TREE_PROPERTY (htree, ftree.selection_count); IF p_totelementos = 0 THEN RETURN; END IF; -- Si el grupo por crear existe, lo borra v_idtmp_rg := FIND_GROUP ('Grupo_Elementos'); IF NOT ID_NULL (v_idtmp_rg) THEN DELETE_GROUP (v_idtmp_rg); END IF; -- Crea el record group y lo devuelve para luego permitir obtener los -- elementos seleccionados p_rgelementos := CREATE_GROUP ('Grupo_Elementos'); -- Crea la columna que almacena el valor de cada nodo seleccionado p_colcodigo := ADD_GROUP_COLUMN (p_rgelementos, 'COD', char_column, 100); -- Se recorren todos los nodos del árbol seleccionados, y si tiene padre, marca -- selecciona el padre. IF p_selecpadres THEN FOR nodopadre IN 1 .. p_totelementos LOOP -- Obtiene el nodo seleccionado v_nodoactual := ftree.GET_TREE_SELECTION (htree, nodopadre); -- Obtiene el padre (si es que tiene) v_nodotmp := NULL; v_nodotmp := ftree.GET_TREE_NODE_PARENT (htree, v_nodoactual); IF v_nodotmp <> 0 THEN ftree.SET_TREE_SELECTION (htree, v_nodotmp, ftree.select_on); END IF; END LOOP; END IF; -- Obtiene de nuevo los elementos seleccionados p_totelementos := ftree.GET_TREE_PROPERTY (htree, ftree.selection_count); IF p_totelementos = 0 THEN RETURN; END IF; :parameter.estatuto_sql := 'Where employee_id In ( '; -- En realidad, al seleccionarse nodos en un árbol, éste les asigna un índice, por lo que -- solamente debe recorrese cada elemento y obtener dicha selección FOR elemento IN 1 .. p_totelementos
  • 65. LOOP v_nodoactual := ftree.GET_TREE_SELECTION (htree, elemento); v_valor_nodo := UPPER (ftree.GET_TREE_NODE_PROPERTY (htree, v_nodoactual, ftree.node_value ) ); -- Incluye nueva línea y Asigna el valor al Recor group de elementos ADD_GROUP_ROW (p_rgelementos, end_of_group); SET_GROUP_CHAR_CELL (p_colcodigo, elemento, v_valor_nodo); IF NOT v_primera_vez THEN :parameter.estatuto_sql := :parameter.estatuto_sql || ', ' || v_valor_nodo; ELSE :parameter.estatuto_sql := :parameter.estatuto_sql || v_valor_nodo; v_primera_vez := FALSE; END IF; END LOOP; :parameter.estatuto_sql := :parameter.estatuto_sql || ') '; -- Ejecuta el estatuto sql para visualizar el registro en el bloque de mantenimiento -- que corresponde al valor del dato seleccionado en el arbol IF NOT gen_ejecutaqueryconwhere (:parameter.estatuto_sql, -- Estatuto SQL 'Employees' -- Bloque donde se ejecutará la consulta ) THEN NULL; END IF; RETURN; END; Seguidamente incluya en el elemento B_Tree_Empleados.Tree el disparador When-Tree-Node_Selected e ingrese el siguiente código, el cual será ejecutado cada vez que se seleccione uno o más nodos del árbol. Disparador When-Tree-Node_Selected Declare v_RGElementos RecordGroup; -- Rg donde almacena elem seleccionados v_ColCodigo GroupColumn; -- Columna a consultar posteriormente v_TotElementos Number; v_BloqueActual Varchar2(50); Begin Tree_Nodos_Seleccionados ('B_TREE_EMPLEADOS.TREE', -- Elemento de tipo arbol v_RGElementos, -- Grupo de registro donde almacena elem seleccionados v_ColCodigo, -- Columna a consultar posteriormente v_TotElementos); End; 65
  • 66. 66 Posteriormente a la implementación correcta del disparador When-Tree-Node_Selected compile y ejecute la aplicación. Seleccione uno o varios registros del árbol y observe como simultáneamente son consultados los registros en el bloque de datos Employees. Para lograr esta funcionalidad se incluye el siguiente código en la unidad de programa Tree_Nodos_Seleccionados, el cual incrusta en la cláusula Where del bloque, la condición de búsqueda dinámicamente, donde el parámetro Estatuto_Sql contiene la condición Employee_Id In (valor1, valorN…). La función Gen_EjecutaQueryConWhere se encuentra en la biblioteca General.pll, la cual se encarga de armar la cláusula de condición. -- Ejecuta el estatuto sql para visualizar el registro en el bloque de mantenimiento -- que corresponde al valor del dato seleccionado en el arbol IF NOT gen_ejecutaqueryconwhere (:parameter.estatuto_sql, -- Estatuto SQL 'Employees' -- Bloque donde se ejecutará la consulta ) THEN NULL; END IF; Función Gen_EjecutaQueryConWhere integrado a la biblioteca General.pll. FUNCTION gen_ejecutaqueryconwhere ( p_estatutosql IN VARCHAR2, -- Estatuto SQL p_bloque IN VARCHAR2, -- Bloque donde se ejecutará la consulta p_num_registro NUMBER DEFAULT 1 -- Registro en el que se debe posicionarse posterior a la consulta ) RETURN BOOLEAN IS /* OBJETIVO.........: Ejecutar un query para un bloque dado, utilizando la cláusula WHERE dada en el estatuto SQL en P_EstatutoSQL REQUIERE.........: Que existe la palabra WHERE, sino retorna FALSE RESTRICCIONES....: Si el valor de la consulta no corresponde al bloque en el parámetro P_Bloque se ocurrirá un error de consulta en tiempo de ejecución. EFECT SECUNDARIOS: Mueve el cursor al bloque pasado en P_Bloque CONSIDERACIONES..: Si se utiliza el valor de la variable de sistema :System.Last_Query para asignarlo al Estatuto Sql que se recibe en el parámetro P_EstatutoSql, dicho valor debe ser asignado a un parámetro o item local caracter con una presición de 2000 y ejecutado desde el Trigger Post-Query del Bloque para el cual se ejecutará la consulta. Para que no se refresque el valor en el parámetro o varible local se puede condicionar a que dicho valor sea nulo para ser asignado, limpiándose en el trigger Key-ExeQry del mismo bloque. */ v_whereanterior VARCHAR2 (5000); v_wherenuevo VARCHAR2 (5000); v_orderbyanterior VARCHAR2 (5000); v_poswhere NUMBER; v_posorderby NUMBER; v_ret BOOLEAN := FALSE; BEGIN IF p_estatutosql IS NOT NULL THEN -- Guarda el valor anterior v_whereanterior := GET_BLOCK_PROPERTY (p_bloque, default_where); -- Obtiene la posicion del WHERE en el estatuto v_poswhere := INSTR (UPPER (p_estatutosql), 'WHERE'); IF v_poswhere != 0 THEN -- Determina si hay un order by v_posorderby := INSTR (UPPER (p_estatutosql), 'ORDER BY'); -- Obtiene el estatuto WHERE IF v_posorderby = 0 THEN v_wherenuevo := SUBSTR (UPPER (p_estatutosql), v_poswhere); ELSE v_wherenuevo := SUBSTR (UPPER (p_estatutosql), v_poswhere, v_posorderby - v_poswhere ); END IF; -- Cambia el estatuto WHERE, respaldando el anterior SET_BLOCK_PROPERTY (p_bloque, default_where, v_wherenuevo); END IF; GO_BLOCK (p_bloque); EXECUTE_QUERY; -- ejecuta la consulta
  • 67. -- Determina si el registro en el cual se va a posicionar es mayor que el número -- de registros traido por la consulta, si lo es se queda en el último registro LAST_RECORD; IF p_num_registro <= GET_BLOCK_PROPERTY (p_bloque, current_record) THEN GO_RECORD (p_num_registro); END IF; -- restaura el where anterior SET_BLOCK_PROPERTY (p_bloque, default_where, v_whereanterior); v_ret := TRUE; ELSE GO_BLOCK (p_bloque); EXECUTE_QUERY; END IF; RETURN v_ret; END; 67
  • 68. 68 Excepciones, RETURN y EXIT En Developer Forms se manejan las excepciones que son situaciones las cuales generan error y no son manejadas por Oracle, entonces la aplicación le indica al usuario la anomalía y el programa muestra un mensaje de error o precaución. Las excepciones se definen en la parte final del procedimiento o función, dentro de ella no se escribe begin o end para que realice la tarea que se especificará. EXCEPTION Nombre de la excepción THEN /* indicaciones a realizar cuando se dispare la excepción */ Ejemplo: Function Gen_EjecutarSql ( Instrucción in varchar2, Err out varchar2 ) Return boolean IS BEGIN if Form_Success then Return (true); else Err := DBMS_Error_Text; Return (false); end if; EXCEPTION when OTHERS then Err := DBMS_Error_Text||' / '||SqlErrM; Return (false); END; Manejo de Errores con ERROR_CODE, ERROR_TEXT Error Code: retorna el número del error que genero Form Builder. Error_Text : retorna el mensaje de error que generó Form Builder. Trigger: On-Error DECLARE errnum NUMBER := ERROR_CODE; errtxt VARCHAR2(80) := ERROR_TEXT; BEGIN IF errnum = 40301 THEN Message('Criterio de búsqueda erróneo); END IF; END; Diferencias con SQLCODE SQLCODE captura los errores Oracle, si se desea usarlo en Forms, debe estar especificado dentro de las excepciones. Su uso es popular con la excepción WHEN OTHERS.
  • 69. 69 DECLARE lv_sqlcode NUMBER; lv_sqlerrm VARCHAR2(240); lv_constr VARCHAR2(41); BEGIN UPDATE empleados SET dept = 5 WHERE PRIMARY_KEY_FIELD = :BLOCK.PK; EXCEPTION WHEN OTHERS THEN lv_sqlcode := SQLCODE; lv_sqlerrm := SQLERRM; IF (lv_sqlcode = -2290) THEN lv_constr := strip_constraint_name(lv_sqlerrm); END IF; END; Errores FRM Cuando se programa en Forms Builder, puede aparecer errores a nivel de la forma, estos errores se denotan con las siglas FRM seguidas de números.
  • 70. 70 Uso de Identificadores Identificadores Locales Son las variables locales o aquellas que están en el ámbito del procedimiento/función. Son utilizadas por el procedimiento y pueden recibir valores externos por medio de parámetros. Identificadores del Sistema Es una variable de Form Builder que mantiene rastro de un estado interno de Form Builder. Los valores de estas variables se aplican solamente a la forma actual. A continuación una lista de las variables del sistema más utilizadas: :system.BLOCK_STATUS: Representa el estado del bloque de datos donde el cursor está localizado. :system.CURRENT_BLOCK: Retorna el valor del bloque actual si el foco esta en ítem, registro o bloque (Pre-Item, Post-Item, triggers de registro y bloque) , de lo contrario retorna NULL, si el foco esta en un a forma (Triggers Pre–Form, Post-Form). :system.CURRENT_ITEM: Representa el nombre del bloque e ítem (bloque.ítem) donde el foco esta localizado. Es un cadena de caracteres. :system.CURRENT_VALUE: Representa el valor del ítem donde el cursor esta localizado. Identificadores Globales - De Paquete: Son variables globales definidas por el usuario en un paquete, el cual puede estar en el filesystem o base de datos. - GLOBAL: Estas variables tienen declaración implícita, es decir que no necesitan ser declaradas, simplemente cuando se necesita se las crea. Son tipo varchar. Referencia a Objetos de la forma Al desarrollar en Form Builder, se pueden referenciar objetos de la forma, dentro de los procedimientos, funciones y triggers, pueden ser utilizados para realizar validaciones y consultas. Estos objetos tienen valores que pueden ingresar como parámetros. Se los referencia de la siguiente manera: Situando : (dos puntos) delante del objeto. : nombre_objeto (podría ser un ítem) : nombre_bloque.nombre_objeto (formato bloque.item)
  • 71. 71 Referencia indirecta a Objetos con NAME_IN Se utiliza la función NAME_IN para retornar el valor de una variable enviada como parámetro a esta función. Declare v_tm Varchar2(20); Begin Default_Value( '0', v_tm ); If name_in(v_tm) is null then v_tm := ‘1’; Else Procesar(v_tm); End if; End Código provisto por DEVELOPER - Regedit : Cuando se necesitan especificar ciertos valores que dependen de variables de entorno, ya sean propias de Oracle o definidas por el usuario, existe un procedimiento que nos permite capturar esos valores y manipular el resultado para procesos de validación. El procedimiento se llama tool_env.getvar (variable_de_ambiente, variable); tool_env.getvar (‘EV_COMPANY’, Lv_Compania); - Esta sentencia esta almacenando el valor de EV_COMPANY en Lv_Compania. - Propiedades de Items: A los ítems se les puede modificar las propiedades en tiempo de ejecución. Existe la función GET_ITEM_PROPERTY que recupera la propiedad especifica del ítem también existe el procedimiento SET_ITEM_PROPERTY, que modifica la propiedad en cierto ítem. La sintáxis de GET_ITEM_PROPERTY: GET_ITEM_PROPERTY (item_id, ITEM, property NUMBER); GET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER); Se debe tomar en cuenta que existen ciertas propiedades que no están especificadas para todos los ítems, por esto si se desea setear o recuperar la propiedad de cierto ítem y en él no aplica la propiedad, generará error. Cuando se utiliza set_item_property, solo se puede modificar la propiedad a un solo ítem. La sintaxis de este procedimiento es amplia, a continuación se detalla la parametrización comúnmente usada. SET_ITEM_PROPERTY (item_id ITEM, property NUMBER, value VARCHAR2); SET_ITEM_PROPERTY (item_name VARCHAR2, property NUMBER, value VARCHAR2);
  • 72. 72 - Navegación entre Objetos: Cuando se tienen módulo de consultas o ingresos en los que se requiere llenar rápidamente los parámetros, es necesario manejar una buena navegación entre objetos. Así también en el aspecto de programación, el desarrollador debe indicarle a los procedimientos en que campos depositar los datos, por cual registro iniciar la navegación. Algunas ocasiones se nos presentan errores en la consulta de datos y se debe a que no se ha especificado directamente a cual bloque se llevarán los datos. - GO_BLOCK: Indica a que bloque se debe fijar el foco para el ingreso / consulta de datos. La sintaxis es la siguiente: GO_BLOCK (‘NOMBRE_DEL_BLOQUE’) - GO_ITEM: Indica a que objeto debe fijarse el foco de ingreso . La sintaxis es así: - GO_ITEM (item_id Item); Antes de definir el tipo ITEM se debe hacer FIND_ITEM para retornar un valor tipo ITEM y ejecutar el procedimiento GO_ITEM con esta parametrización. - GO_ITEM (‘:nombre_bloque.nombre_item); NEXT_ITEM: Navega al siguiente ítem, regularmente se programa en el trigger KEY-NEXT-ITEM. Este procedimiento no recibe parámetros. La sintaxis es: NEXT_ITEM; PREVIOUS_ITEM: Navega al ítem anterior navegable. La sintaxis es: PREVIOUS_ITEM; /* Trigger: Key-Previous-Item */ DECLARE cur_itm VARCHAR2(80) := :System.Cursor_Item; cur_blk VARCHAR2(80) := :System.Cursor_Block; frs_itm VARCHAR2(80); BEGIN frs_itm := cur_blk||'.'||Get_Block_Property(cur_blk,FIRST_ITEM); IF cur_itm = frs_itm THEN Previous_Block; ELSE Previous_Item; END IF; END; - Menú: Dentro de las formas se pueden manejar los menúes para indicar cual debe aparecer o esconderse. Para esto existe el procedimiento REPLACE_MENU. Este procedimiento reemplaza el menú actual con el menú que se especifica, pero no lo hace activo al nuevo menú. La sintaxis común es REPLACE_MENU; Pero dependiendo de la necesidad existen mas parámetros para definir en la programación. Por ejemplo: REPLACE_MENU (‘nombre_menu’);
  • 73. 73 Navegación entre registros Forms trabaja con formularios multiregistros, es decir es un arreglo de registros para el ingreso/consulta de datos. Se utilizan los siguientes procedimientos para trabajar con estos : FIRST_RECORD, NEXT_RECORD, LAST_RECORD, GO_RECORD, INSERT_RECORD, DELETE_RECORD. FIRST_RECORD: Navega al primer registro del bloque de datos. ** Trigger: When-Button-Pressed */ BEGIN /* Si no esta en el último registro entonces vaya al último, de lo contrario vaya al primer registro. */ IF :System.Last_Record <> 'TRUE' THEN Last_Record; ELSE First_Record; END IF; END; NEXT_RECORD: Navega al siguiente ítem habilitado y secuencial en el registro con el número de secuencia mas alto que del registro actual. Si no existe un registro, Forms creará un registro. ** Trigger: Key-Next-Item /* lst_itm recibe el nombre del ultimo ítem del registro. Luego compara al ítem actual con lst_item. Si son iguales avanza al primer ítem del siguiente registro, avanza un registro, no regresa al primer ítem del registro actual, de lo contrario, avanza al siguiente ítem del registro actual. */ DECLARE cur_itm VARCHAR2(80) := :System.Cursor_Item; cur_blk VARCHAR2(80) := :System.Cursor_Block; lst_itm VARCHAR2(80); BEGIN lst_itm := cur_blk||'.'||Get_Block_Property(cur_blk,LAST_ITEM); IF cur_itm = lst_itm THEN Next_Record; ELSE Next_Item; END IF; END; LAST_RECORD: Navega al último registro en la lista de registros del bloque. Si una consulta esta abierta, Forms recoge los datos restantes del bloque y cierra la consulta. -- Trigger: When-Button-Pressed BEGIN /* Si es diferente del ultimo registro, entonces que vaya al último registro */ IF :System.Last_Record <> 'TRUE' THEN Last_Record; END IF; END; GO_RECORD: Navega al registro con el número de registro especificado en el parámetro.
  • 74. BEGIN Go_Record( :nombre_bloque.ultimo_numero_registro ); END; ultimo_numero_registro: es el numero del ultimo registro, puede ser un valor estático o un número retornado de una variable de sistema. INSERT_RECORD: Al llamarse desde un disparador KEY-CREREC, se inserta el registro actual en la base de datos durante el proceso de transacciones Commit y Post. -- Trigger: On-Insert BEGIN /* Chequea la bandera para iniciar la insercion */ IF flag = 'TRUE' THEN Insert_Record; END IF; END; DELETE_RECORD: Al usar el disparador KEY-DELREC remueve el registro actual y marca al registro como eliminado. Estos registros no se borran instantáneamente, sino que son procesados en el siguiente proceso COMMIT. Como personalizar la barra de herramientas Oracle Forms provee a las aplicaciones con una barra de herramientas horizontal estándar para la operación y navegación entre registros. Sin embargo, se puede personalizar la barra de herramientas utilizando las mismas técnicas y operabilidad contenida en la estándar. Construya un bloque de datos con el nombre TOOLBAR, éste nombre es opcional puede darle el nombre que crea conveniente. El bloque de datos debe contener una serie de botones con el mismo nombre que corresponde a la función o comando que estaría ejecutando cuando éste sea presionado por el usuario. Como puede observar los nombres de los elementos que que inician desde ENTER-QURY hasta EXIT-FORM, corresponden a el comando de ejecución que cada botón debería realizar si fuese presionado. Los demás elementos permiten mostrar información de interés en tiempo de ejecución, la cual se describe a continuación: ELEMENTO DESCRIPCION DEL ELEMENTO IMAGEN Imagen que desea ser presentada USUARIO Código del usuario que conectado PROGRAMA Nombre físico del programa ejecutado FECHA Fecha de la base de datos EMPRESA Nombre de empresa SISTEMA Nombre del sistema de la aplicación DES_APLICACION Nombre descriptivo de la aplicación 74
  • 75. DISEÑO DEL LIENZO DE LA BARRA DE HERRAMIENTAS Cada elemento de tipo botón de la barra de herramientas diseñada en el bloque TOOLBAR, debe tener un ícono que represente la función que éste ejecutaría al ser presionado por el usuario. La funcionalidad de cada botón se centraliza en una sola unidad de programa, ésta se realiza mediante la ejecución del disparador WHEN-BUTTON-PRESS definido a nivel del bloque de datos y no por cada elemento botón, esto para aprovechar los niveles de definición de algunos disparadores comunes que pueden manejarse en un nivel superior. 75
  • 76. 76 Procedimiento Ejecuta_Boton Lee el nombre del botón y ejecuta un DO_KEY(item_name),respetando la operación de QUERY: Si hay botones llamados EXECUTE_QUERY y CANCEL_QUERY, esta función los muestra, cuando el botón Enter_query es presionado y los oculta, cuando EXECUTE_QUERY ó CANCEL_QUERY es presionado. Ningún error será retornado, si estos botones no existen. EXIT, QUIT and EXIT_FORM ejecutan un exit_form, aún si la forma se encuentra en modo ENTER_QUERY !!!!! El boton CANCEL_QUERY cancela algún query en estado "open". PROCEDURE ejecuta_botón IS action VARCHAR (80); PROCEDURE oculta_boton (item_name VARCHAR2) IS BEGIN IF NOT ID_NULL (FIND_ITEM (item_name)) THEN SET_ITEM_PROPERTY (item_name, displayed, property_false); END IF; END; FUNCTION muestra_boton (item_name VARCHAR2) RETURN BOOLEAN IS BEGIN IF NOT ID_NULL (FIND_ITEM (item_name)) THEN SET_ITEM_PROPERTY (item_name, displayed, property_true); SET_ITEM_PROPERTY (item_name, enabled, property_true); RETURN TRUE; ELSE RETURN FALSE; END IF; RETURN NULL; END; BEGIN --Obtiene nombre del trigger action := GET_ITEM_PROPERTY (NAME_IN ('SYSTEM.TRIGGER_ITEM'), item_name); IF action = 'ENTER_QUERY' THEN -- Garantiza que si se han realizado cambios en la forma se guarden u omitan -- dichos cambios antes de ingresar a modo enter-query, de este modo se omite -- el mensaje que sale al usuario indicando que existen cambios sin guardar -- en inglés. IF :SYSTEM.form_status = 'CHANGED' THEN gen_mensaje ( 'Ha realizado cambios en la información, debe guardar o eliminar ' || 'los cambios realizados para poder consultar información.' ); RAISE form_trigger_failure; END IF; IF muestra_boton ('EXECUTE_QUERY') AND muestra_boton ('CANCEL_QUERY') THEN oculta_boton ('ENTER_QUERY'); END IF; END IF; -- Si la acción fue disparada por el botón de salida ejecuta -- el comando EXIT-FORM dos veces, si una vez aplicado el primero -- la aplicación queda en modo ENTER-QUERY, lo cual significa que -- el usuario luego de presionar ENTER-QUERY quiso salir de la pantalla IF action IN ('EXIT_FORM', 'EXIT', 'QUIT') THEN action := 'EXIT_FORM'; IF NAME_IN ('SYSTEM.MODE') = 'ENTER-QUERY' THEN DO_KEY ('EXIT_FORM'); END IF; END IF; IF action = 'CANCEL_QUERY' THEN action := 'EXIT_FORM'; END IF; -- Ejecuta KEY-TRIGGER asociado al nombre del botón -- Si la operación es de impresión, valida la rutina que debe -- ejecutarse, dependiendo del sistema activo. IF action = 'PRINT' THEN NULL; -- Corre_Report; ELSE -- Cualquier otra acción. -- Si la acción es eliminar un registro se pregunta antes de efectuar operación IF action IN ('DELETE_RECORD')
  • 77. THEN IF gen_confirma_sino ('Está seguro de eliminar la información ?') = 2 THEN RETURN; END IF; END IF; DO_KEY (action); END IF; -- Si la operación es "Eliminar", debe actualizar la información realizando el commit_Form, -- adicionalmente, si se ejecutaron procesos que afectaron la base de datos no relacionada -- con los datos del form, debe realizar la operación commit en la BD. IF action IN ('DELETE_RECORD') THEN -- Se determina si hubo error en triggers que se ejecutan según el flujo normal de FORMS -- para la operación DELETE_RECORD, de modo que no se ejecute la operación de borrado -- si la última operación que FORMS haya ejecutado falla( ej con un raise form_trigger_failure) -- De este modo, es posible segmentar las operaciones y dejar el resto de la operación al toolbar -- se incluye este control pues si se intenta borrar y forms encuentra por ej un Key-Delrec y en -- este se hace fallar la aplicación, Forms seguirá ejecutando el código asociado al botón de -- borrado por lo cual ejecutará este código y si no se controla si hubo o no fallo, se intentará -- eliminar la información, el Form_Failure, determina el resultado de la última operación ejecutada -- en este caso, si el Key-Delrec falla, no se realiza la operación de eliminar originalmente llamada. IF FORM_FAILURE THEN RAISE form_trigger_failure; END IF; :GLOBAL.operacion_borrando := 'S'; END IF; --Muestra botón ENTER_QUERY, oculta EXECUTE_QUERY y CANCEL_QUERY IF NAME_IN ('SYSTEM.MODE') != 'ENTER-QUERY' THEN IF muestra_boton ('ENTER_QUERY') THEN oculta_boton ('EXECUTE_QUERY'); oculta_boton ('CANCEL_QUERY'); END IF; END IF; END; De ésta forma se observaría la aplicación en tiempo de ejecución. Como puede apreciarse, no necesariamente se visualizan las mismas figuras de la barra de herramientas, en diseño y ejecución, ya que corresponden a archivos diferentes, los cuales para efectos de éste ejemplo se tratan de archivos ICO y GIF respectivamente. 77
  • 78. 78 Uso de Parámetros Los parámetros son utilizados para inicializar algún valor en el momento de ejecución de la forma. Para trabajar con parámetros desde Forms, se deben añadir objetos en la rama de Parameter en el Navegador de objetos, luego dependiendo de la funcionalidad pueden ser utilizados para trabajar con valores iniciales en cualquier procedimiento o función de la forma. Podemos pasar valores desde un disparador de forma o desde cualquier unidad de programa, de la manera en que se muestra en el siguiente ejemplo, asumiendo que se encuentran definidas las variables globales Global.Par_Num_Empresa, Global.Par_Num_Sucursal y Global.Par_Fec_Sistema. PROCEDURE GEN_LLAMAFORMA (Forma In Varchar2, -- Nombre de la forma a cargar Ocultar In Boolean Default True, -- Oculta forma que ejecuta llamado Lis_Par In Varchar2 Default Null -- Lista de parámetros ) IS /* GENERAL: Esta rutina carga la forma determinada por el parámetro Forma con una posible lista de parámetros a pasar a la forma convocada. */ v_parametro Paramlist; -- Identificador único de la lista de parámetros. BEGIN -- Se Identifica si existe lista de parametros asociada al llamado o no v_parametro := get_parameter_list('Lis_Par'); IF (NOT id_null(v_parametro)) THEN destroy_parameter_list(v_parametro); END IF; v_parametro := create_parameter_list('Lis_Par'); add_parameter(v_parametro, 'par_num_empresa', TEXT_PARAMETER, Name_In('Global.par_num_empresa')); add_parameter(v_parametro, 'par_num_sucursal', TEXT_PARAMETER, Name_In('Global.par_num_sucursal')); add_parameter(v_parametro, 'par_fec_sistema', TEXT_PARAMETER, Name_In('Global.par_fec_sistema')); IF Id_Null(v_parametro) Then IF Ocultar Then Call_Form (Forma, HIDE, DO_REPLACE, NO_QUERY_ONLY , FORMS40_NULL_PARAMLIST); Else Call_Form (Forma, NO_HIDE, DO_REPLACE, NO_QUERY_ONLY , FORMS40_NULL_PARAMLIST); End IF; IF Not Form_Success then Gen_Mensaje('Error cargando la forma '||Forma); End IF; Elsif Not Id_Null(v_parametro) Then IF Ocultar Then Call_Form (Forma, HIDE, DO_REPLACE, NO_QUERY_ONLY ,'Lis_Par'); Else Call_Form (Forma, NO_HIDE, DO_REPLACE, NO_QUERY_ONLY ,'Lis_Par'); End IF; IF Not Form_Success then Gen_Mensaje('Error cargando la forma '||Forma); End IF; End IF; END; Parámetros de la instrucción CALL_FORM formmodule_name El nombre de la forma debe ser encerrado entre comillas simples. Tipo de dato: VARCHAR2.
  • 79. 79 display HIDE (The default.) Oracle Forms esconderá la forma desde donde se realiza la llamada antes de presentar la forma que está siendo invocada. NO_HIDE Oracle Forms presentará la forma invocada sin ocultar la forma que realiza la llamada. switch_menu NO_REPLACE (The default.) Oracle Forms mantendrá el menu por defecto de Oracle en la forma invocada. DO_REPLACE Oracle Forms sustituirá el menú del modulo asociado a la forma llamada por el CALL_FORM, remplazando el menu por defecto por el que se encuentre definido en la forma. query_mode NO_QUERY_ONLY (El valor por defecto.) las Formas de Oracle ejecutarán la forma indicada en modo normal, permitiéndole al usuario final realizar inserciones, actualizaciones, y supresiones de registros de dentro de la forma llamada. QUERY_ONLY Oracle Forms ejecutará la forma indicada en modo de solo consulta, permitiéndole al usuario final consultar registros, pero si la capacidad de insertar, actualizar o suprimir registros. paramlist_id El identificador de parámetros que asigna cuando crea la lista de parámetros, puede incluir una lista de parámetros adicionales como entrada inicial a la forma llamada. El tipo de datos es PARAMLIST. paramlist_name El nombre que usted dio al objeto de lista de parámetro cuando usted lo definió. Tipo de datos VARCHAR2. Mas sobre Formas CLEAR_FORM: Es un procedimiento que limpia los registros de la forma actual y lleva el punto de entrada de datos al primer ítem del primer bloque. Este procedimiento puede o no recibir parámetros. BEGIN Clear_Form(No_Validate); END; Fecha del sistema operativo $$DATETIME$$ La variable del sistema $$DATETIME$$ recupera la fecha y hora del sistema operativo. Se lo puede utilizar para asignar valores por default. Este valor ($$DATETIME$$) es inicializado en el campo Initial Value del Property Palette para el ítem que llevara la fecha/hora del sistema. Luego puede ser asignado a alguna variable tipo DATE dentro de algún procedimiento o función. Manejo de Sesiones Forms permite al desarrollador personalizar la ventana de logon a la base de datos desde la aplicación. LOGON: Procedimiento LOGON, es utilizado desde el trigger ON-LOGON. Permite la conexión a la base de datos. DECLARE username VARCHAR2(80); password VARCHAR2(80); cn_string VARCHAR2(80); BEGIN /* Recoje la información de la conexión */ Get_Connect_Info(un,pw,cn);
  • 80. 80 /* **Si no es base de datos Oracle, salir del intento de conexión */ IF :Global.Non_Oracle_Datasource = 'TRUE' THEN User_Exit('my_logon username='||un||' password='||pw); ELSE IF un IS NULL THEN un:='/'; END IF IF cn IS NOT NULL THEN LOGON(un,pw||'@'||cn); ELSE LOGON(un,pw); END IF; END IF; END; LOGOUT: Desconecta al usuario de la base de datos. Se lo programa en el trigger ON-LOGOUT BEGIN /* Si no es base de datos Oracle , sale de la conexion */ IF :Global.Non_Oracle_Datasource = 'TRUE' THEN User_Exit('my_logout'); ELSE Logout; END IF; END; SYNCHRONIZE: Sincroniza la pantalla con el estado de la forma. Begin Synchronize; Message(‘Hola’); End;