Está en la página 1de 89

ORACLE DEVELOPER

Instalación

Forms

Reports

1
INDICE

Inicio …………………………………. Pag 3

Instalación ……………………………. Pag 5

Forms Developer ……………………... Pag 23

Reports Developer …………………… Pag 65

Preguntas Frecuente …………………. Pag 77

2
INICIO

En este tutorial se explicará la utilización de Oracle Developer para la realización de las


prácticas de Bases de Datos 2. Oracle Developer es una herramienta visual para la
creación fácil de aplicaciones que trabajen sobre la base de datos Oracle.

Dentro de Oracle Developer, distinguiremos dos partes fundamentalmente:

1. Forms Developer: Nos va a permitir construir formularios con los que


podremos acceder a la Base de Datos. En dichos formularios podremos hacer
consultas, modificaciones, inserciones y borrados sobre elementos de la base de
datos.
2. Reports Developer: Nos va a permitir construir informes con los que podremos
presentar e imprimir los datos de una forma ordenada y con un formato
visualmente agradable.

Dentro de este tutorial se distinguen los siguientes apartados:

• Instalación: En esta sección veremos como instalar la base de datos Oracle y/o
la herramienta Oracle Developer en nuestro ordenador personal. Eso no es
necesario ya que las prácticas se pueden realizar dentro las prácticas utilizando
la partición orag, pero puede ser útil para un mayor conocimiento de las
herramientas o para organizarse de forma personalizada.
• Tutorial Forms Developer: En este tutorial veremos como crear distintos tipos
de formularios y con distintas opciones
• Tutorial Reports Developer: En este tutorial veremos como crear distintos
tipos de informes y como conectarlos con los formularios creados con Forms
Developer.
• Preguntas frecuentes: Conjunto de preguntas con sus respectivas respuestas de
dudas que suelen aparecer frecuentemente en el uso de Oracle Developer.

Si se quiere ampliar conocimientos sobre el uso de Oracle Developer se puede consultar


el tutorial de la Granja El Cerdito Valiente, que se ha utilizado en años anteriores y
la sección de preguntas frecuentes.

Base de Datos

En este tutorial seguiremos con el ejemplo de la Facultad de Estudios Avanzados


centrándonos en una parte del mismo. Del diagrama Entidad/Relación nos quedaremos
con el siguiente trozo para ilustrar el uso de Oracle Developer:

3
De donde obtenemos las siguientes tablas:

• Persona: PID, nombre, apellido1, apellido2, direccion, cp, localidad, provincia,


telefono, email, lugarNacimiento, fechaNacimiento, NIF, sexo, nacionalidad
• Alumno: PID, login, password, familiaNumerosa, centroProcedencia, acceso,
notaAcceso
• Profesor: PID, login, password, categoria, fechaAlta, departamento, despacho,
telefonoDpcho
• Matricula: IDMatricula, IDAlumno, tipo, numeroPlazos, fechaExpedicion,
curso, PID
• Pago: IDPago, cantidad, abonado, fechaPago, IDMatricula
• Asignatura: nombre, creditosTeoricos, creditosPracticos, tipo, cuatrimestre
• DetalleMatricula: IDMatricula, nombre

Para el diseño físico de la base de datos tenemos tres ficheros:

• CreaBD.sql: Fichero que contiene el conjunto de sentencias SQL necesario para


crear la base de datos.
• DatosBD.sql: Fichero que contiene el conjunto de sentencias SQL que
inicializan la base de datos con unas cuantas tuplas de ejemplo.
• BorraBD.sql: Fichero que contiene el conjunto de sentencias SQL que borra la
base de datos.

4
INSTALACION

Introducción

En esta parte del tutorial se explicará como instalar Oracle 9i Personal Edition y Oracle
Developer 6i (Forms Developer y Reports Developer) para poder tener disponibles
dichas herramientas en nuestro ordenador personal.

En principio no hará falta instalar ningún software en el ordenador personal, ya que las
prácticas se han configurado y temporizado para su realización en las instalaciones de la
E.T.S.I.I. Sin embargo, aquellos alumnos que deseen profundizar en el conocimiento de
estas herramientas u organizar su trabajo de forma personalizada, pueden acceder de
forma gratuita a las mismas, para uso docente.

1 Opciones de Instalación

Primero tenemos que decidir que tipo de instalación queremos hacer, para ello tenemos
distintas posibilidades:

1. Instalar sólo Oracle Developer y acceder al servidor Oracle de la E.T.S.I.I. Para


ello nos hará falta una conexión a Internet. Esta es la opción recomendada para
ordenadores con poca potencia/memoria pero que dispongan de una conexión
Internet
2. Instalar Oracle 9i Personal Edition y Oracle Developer 6i, de esta forma no nos
hará falta una conexión y la realización de las prácticas no dependerá de posibles
caídas de red o del servidor. Tengamos en cuenta que sería conveniente tener
una máquina con al menos 256MB o 512MB de memoria RAM, 1Ghz de
velocidad del microprocesador y unos 8GB de espacio libre en el disco duro.
3. Si tenemos un ordenador poco potente (menos de 1Ghz) o con poca memoria
(menos de 256Mb) y sin conexión a Internet, podemos optar por la instalación
de otras versiones de Oracle, para ello consultaremos la Guía de instalación de
Oracle usada en años anteriores.

De esta forma si queremos instalar la base de datos Oracle y Oracle Developer


tendremos que seguir todos los pasos de este tutorial a excepción, quizás del último (7)
que nos sirve para utilizar la base de datos del servidor de la escuela (si se dispone de
conexión a Internet sería interesante que se probaran tanto la base de datos local como
la del servidor de la escuela).

Si tenemos una conexión a Internet y sólo queremos instalarnos Oracle Developer y


usar la base de datos de la escuela tendremos que realizar los pasos 3,4 y 7.

2 Instalación de Oracle Database 9i Personal Edition

Las instrucciones que se dan se han probado usando como sistema operativo Windows
XP SP2 versión de 32 bits.

Primero tendremos que comprobar en el Panel de Control (subapartado conexiones de


red) que tenemos instalado el protocolo TCP/IP (si accedemos a Internet ya lo
tendremos instalado)

5
Para no tener problemas se aconseja seguir uno a uno los pasos de forma escrupulosa,
dichos pasos son:

• Descargarnos Oracle9i Database Release 2 Enterprise/Standard/Personal Edition


for Windows NT/2000/XP desde la página web de Oracle. Téngase en cuenta
que para ello tendremos que aceptar las condiciones de la licencia y estar dados
de alta previamente en la página web de Oracle .
• Creamos tres directorios llamados Disk1, Disk2 y Disk3y descargamos los tres
ficheros que hay en la página web:
o 92010NT_Disk1.zip (612,802,971 bytes)
o 92010NT_Disk2.zip (537,604,934 bytes)
o 92010NT_Disk3.zip (254,458,106 bytes)

cada fichero lo guardamos en su directorio correspondiente.

• Descomprimimos cada fichero descargado en cada uno de los directorios.


Dentro de Disk1, ejecutar Setup.exe. Nos aparecerá la pantalla de bienvenida,
pulsamos el botón Siguiente

6
• Nos aparecerá la pantalla de Ubicación de Ficheros de origen y destino, no se
aconseja cambiar nada, quedándonos con el valor por defecto (c:\oracle\ora92\)
y si lo cambiáramos por cualquier motivo (p.e. motivos de espacio) lo tendremos
en cuenta a la hora de interpretar el tutorial. Pulsamos el botón Siguiente

• Posteriormente se nos muestra la pantalla de selección de tipo de instalación,


escogemos Personal Edition y pulsamos el botón Siguiente

7
• Nos preguntará el tipo de configuración de la Base de Datos según el uso que le
demos, escogemos Uso General y pulsamos el botón Siguiente

• Nos preguntará por el puerto a usar por Oracle MTS Recovery Service, dejamos
el valor por defecto (2030) y pulsamos el botón Siguiente

8
• Posteriormente nos pedirá el nombre de la base de datos global y el SID
(Identificador de Sistema de Oracle), utilizamos los valores que se muestran en
la imagen (progBD2.localhost y progBD2) y pulsamos el botón Siguiente.

9
• Nos pregunta por la Ubicación de los archivos de datos, dejamos el valor por
defecto y pulsamos el botón Siguiente

• Nos permite cambiar el juego de caracteres, dejaremos que utilice el juego de


caracteres por defecto y pulsamos el botón Siguiente

• Finalmente nos aparece un pequeño resumen con distintas opciones de la


instalación, pulsamos el botón Instalar

10
• Después de un rato instalándose y configurándose nos pedirá las contraseñas
para los superusuarios de la base de datos (SYS y SYSTEM). Ten en cuenta que
estas contraseñas no debemos olvidarlas. Podemos usar la misma para ambos
superusuarios.

• Si no ha habido ningún problema nos aparecerá la pantalla de Fin de la


instalación, pulsamos el botón Salir

11
3 Instalación de Oracle Forms Developer

Nos descargarnos Oracle Forms Developer desde la página web de Oracle. Nos
bajaremos la versión 6i release 2 para Windows XP. Téngase en cuenta que para ello
tendremos que aceptar las condiciones del contrato y estar dados de alta previamente en
la página web de Oracle

Una vez descargado, tendremos un fichero comprimido llamado 6i_rel2_xp.zip (si no


le hemos cambiado el nombre al descargarlo). Lo descomprimimos y ejecutamos
Setup.exe. Seguimos los siguientes pasos:

• Lo primero que nos aparece es una ventana para que introduzcamos algunas
definiciones de instalación, cogemos los mismos valores que en la imagen y le
damos a Ok.

• Nos pregunta que herramienta instalar, seleccionamos Oracle Forms Developer


y le damos la botón Aceptar/OK.

12
• Cuando nos pregunta por el tipo de instalación seleccionamos Typical

• Cuando nos pregunta si queremos instalar Forms Server, seleccionamos No

• Le damos a Aceptar un par de veces y ya hemos instalado Oracle Forms


Developer.

4 Instalación de Oracle Reports Developer

Usando el mismo fichero Setup.exe obtenido a partir de descomprimir el fichero


6i_rel2_xp.zip también podremos instalar Oracle Reports Developer

• Lo primero que nos aparece es una ventana para que introduzcamos algunas
definiciones de Instalación de Oracle, cogemos los mismos valores que en la
imagen y le damos a Ok.

13
• Nos pregunta que herramienta instalar, seleccionamos "Oracle Reports
Developer" y le damos la botón Aceptar.

• Cuando nos pregunta por el tipo de instalación seleccionamos Typical

• Cuando nos pregunta si queremos instalar Reports Server, seleccionamos No

14
• Le damos a Aceptar un par de veces y ya hemos instalado Oracle Reports
Developer.

5 Creación de Usuarios

Vamos a crear un usuario sin privilegios para poder trabajar sin complicaciones en
nuestra base de datos, para ello utilizaremos la herramienta SQL Plus, que la podremos
encontrar en el grupo de programas Oracle-OraHome92 en Application Development-
>SQL Plus

Nos pedirá que nos identifiquemos, entramos como el superusuario system y con la
contraseña que dimos durante la configuración. Pulsamos el botón Aceptar.

Una vez identificados en SQL Plus vamos a crear un usuario, se recomienda que la
cuenta de usuario tenga el mismo nombre que la que tenéis en la BD de la Escuela y
trabajar sobre ella. Esto se puede hacer, con las siguientes sentencias:

create user <ALUMNO> identified by <password> default


tablespace users temporary tablespace temp quota 4M on
users quota 1M on temp;
grant connect, resource to <x9999999>;

15
Por ejemplo:

Si todo sale bien nos dirá primero que el usuario ha sido creado y que la concesión ha
terminado correctamente.

6 Conexión de Oracle Developer con la Base de Datos instalada en nuestro


ordenador

Para acceder al servidor Oracle lo vamos a hacer añadiendo un nombre de servicio (o


alias), usando para ello la aplicación Oracle Net8 Easy Config, que la podremos
encontrar en el grupo de programas Oracle para Windows NT-developer

Los pasos que hay que dar son:

• Añadir un nuevo servicio, por ejemplo, lo puedes llamar casa y pulsas siguiente

16
• El protocolo que va a usar es TCP/IP (Protocolo Internet).

• El nombre del host será localhost y el número de puerto es 1521(el valor por
defecto, no cambiar)

17
• El identificador del sistema (SID de la Base de datos) es el que hemos
introducido en la instalación, esto es, PROGBD2

• Ya sólo nos hace falta probar que la conexión funciona perfectamente, para ello
usaremos el usuario creado recientemente

De esta forma para conectarse a la base de datos (con las distintas herramientas de
Developer), te hará falta el usuario que has creado, el password y en la cadena de
conexión pones el alias creado (en este ejemplo, casa). Por ejemplo, si utilizamos la
versión de SQL Plus que viene con developer y que podrás encontrar el grupo de
programas Oracle para Windows NT-developer tendrás que poner dicha cadena de
conexión, por ejemplo:

18
Puede que algún cortafuegos (firewall) nos de problemas al usar el puerto 1521, si ese
es el caso se debe permitir la utilización de ese puerto en el cortafuegos.

7 Conexión de Oracle Developer con la Base de Datos de la ETSII

Para acceder al servidor Oracle lo vamos a hacer añadiendo un nombre de servicio (o


alias), usando para ello la aplicación Oracle Net8 Easy Config, que la podremos
encontrar en el grupo de programas Oracle para Windows NT-developer

Los pasos que hay que dar son:

• Añadir un nuevo servicio, por ejemplo, lo puedes llamar UGR y pulsas siguiente

19
• El protocolo que va a usar es TCP/IP (Protocolo Internet).

• El nombre del host será oracle0.ugr.es. Sería conveniente comprobar antes que
podéis acceder a dicho servidor, para ello desde MS-Dos (símbolo del sistema)
poned "ping oracle0.ugr.es", si no responde es probable que se haya caído el
servidor.
El número de puerto es 1521(el valor por defecto, no cambiar)

20
• El identificador del sistema (SID de la Base de datos) es PRACTBD

• Ya sólo nos hace falta probar que la conexión funciona perfectamente, para ello
usaremos nuestro usuario y contraseña que tenemos en la base de datos de la
ETSII

De esta forma para conectarse a la base de datos (con las distintas herramientas de
Developer), te hará falta el usuario de la escuela, su password y en la cadena de
conexión pones el alias creado (en este ejemplo, UGR). Por ejemplo, si utilizamos la
versión de SQL Plus que viene con developer y que podrás encontrar el grupo de

21
programas Oracle para Windows NT-developer tendrás que poner dicha cadena de
conexión, por ejemplo:

Puede que algún cortafuegos (firewall) nos de problemas al usar el puerto 1521, si ese
es el caso se debe permitir la utilización de ese puerto en el cortafuegos.

22
FORMS DEVELOPER

1 Formulario Personas-Alumnos

Vamos a hacer un primer formulario que nos va a permitir introducir nuevos alumnos
en la base de datos, además de poder consultar, modificar y borrar los que ya existen.
Para ello realizaremos una serie de pasos:

1. Crear el bloque de datos Persona que muestra una única persona


2. Crear el bloque detalle Alumno asociado a cada persona

1.1 Bloque Maestro Persona

Ejecutar Form Builder, que es la herramienta para construir formularios

Lo primero que nos saldrá será una pantalla de bienvenida con diversas opciones,
nosotros escogeremos Utilizar el Asistente de Bloques de Datos y le damos al botón
Aceptar.

Nos sale otra bienvenida, la ignoramos y pulsamos el botón Siguiente, donde nos
preguntará el tipo de nuestro bloque de datos, nosotros utilizaremos siempre Tabla o
Vista, pulsamos Siguiente

23
Ahora nos pedirá la tabla o vista que queremos utilizar, para seleccionarla le damos al
botón examinar, en este momento nos pedirá que nos conectemos a la base de datos,

para ello metemos nuestro usuario, contraseña y en Base de Datos el alias que hemos
creado en la fase de instalación (casa para la base de datos local, ugr para la base de
datos de la escuela y si estamos en las aulas de prácticas la dejamos en blanco). Por
ejemplo:

Si nos hemos identificado correctamente nos saldrá una lista con las tablas y vistas del
usuario con el que nos hemos conectado, seleccionamos la tabla Persona y pulsamos
Aceptar. En la columna de la izquierda tenemos los atributos de la tabla seleccionada y
en la de la derecha los atributos que queremos utiliza. Inicialmente la columna de la
derecha está vacía, así que nos llevamos todos los atributos a la columna de la derecha y
le damos al botón Terminar.

24
Ya hemos terminado de usar el Asistente de Bloques de Datos y comenzamos el
Asistente de Diseño que nos dará la bienvenida, le damos al botón Siguiente. Nos
preguntará por el Lienzo y tipo de Lienzo, lo ignoramos y le damos al botón Siguiente.
Nos aparecerá una ventana don dos columnas para seleccionar los atributos que
deseamos visualizar. En principio, los vamos a visualizar todos, así que nos los
llevamos todos a la columna de la derecha.

Ahora nos preguntará el Prompt (que es la cadena que sale en el formulario), el ancho y
el alto para cada atributo. Dejamos los valores de ancho y alto que nos salen excepto
para PID que le ponemos un ancho de 20 y en la parte del Prompt, cambiamos
"Lugarnacimiento" por "Lugar de Nacimiento" y "Fechanacimiento" por "Fecha de
Nacimiento" y le damos al botón Terminar.

25
Como resultado ya tenemos nuestro primer bloque de datos.

Una vez terminado los asistentes de datos y diseño, nos aparecen dos subventanas
dentro de Forms Builder, el Navegador de Objetos que es una ventana con estructura
de árbol que nos muestra todos los elementos de nuestro formulario y el Editor de
Diseño que nos permite ver el aspecto de nuestro formulario y lo que es más
importante, modificarlo.

26
Si no nos aparecen en algún momento, tanto el Navegador de Objetos como el Editor de
Diseño, siempre los podemos llamar desde el menú Herramientas. Dentro del editor de
diseño vamos a cambiar el prompt de "Apellido1" por "Primer Apellido" y "Apellido2"
por "Segundo Apellido". También cambiaremos el tamaño de la entrada del PID, que es
demasiado grande para almacenar tan sólo un número. Podemos hacer todos los
cambios que consideremos necesarios en el diseño para que se quede a nuestro gusto.
(Ten en cuenta que para deshacer se usan las teclas CTRL+Z)

27
Podemos observar que cuando seleccionamos algo en el editor de diseño cambia la
posición en el Navegador de objetos, de forma que se va al elemento seleccionado. Si en
el editor de diseño hacemos doble click sobre cualquier elemento nos saldrá la Paleta
de Propiedades de dicho elemento. La paleta de propiedades de un elemento es, como
su nombre indica, las distintas propiedades que puede tener un elemento y que ya
iremos viendo poco a poco.

Ahora vamos a ejecutar nuestro formulario, para ello pulsamos el icono del semáforo
verde (aparece tanto en el editor de diseño como en el navegador de objetos o en el
menú, Programa->Ejecutar Pantalla->Cliente/Servidor). Lo que hace es llamar al Oracle
Forms Runtime que se encarga de ejecutar el formulario.

28
Los distintos botones de Oracle Forms Runtime que queremos destacar son:

• Guardar: Este botón nos permite almacenar las modificaciones hechas en un


registro, las nuevas tuplas creadas y las entradas eliminadas. Es como un commit
en la base de datos.
• Salir: Con este botón nos salimos de la ejecución del formulario.
• Ejecutar consulta: Con este botón ejecutamos una consulta sobre la base de
datos en función del contenido del formulario, si no tienen ningún valor, nos
permite consultar todos los registros.
• Introducir consulta: Nos permite introducir una consulta para traernos
aquellas tuplas de la base de datos que cumplan una determinada condición.
• Bloque anterior: Sirve para irnos al anterior bloque de datos, cuando hay
más de uno.
• Registro anterior: Nos permite irnos al anterior registro, cuando hay más
de uno.
• Registro siguiente: Sirve para irnos al siguiente registro, cuando hay más de
uno.
• Bloque siguiente: Nos permite irnos al siguiente bloque de datos, cuando
hay más de uno.
• Insertar registro: Este botón sirve para añadir un nuevo registro a la tabla.
• Suprimir registro: Con este botón podemos borrar el registro que se
muestra.

Prueba a darle al botón de Ejecutar Consulta, muévete por los registros, crea uno nuevo,
modifica alguno de los anteriormente creados y borra el último que hayas creado. Para

29
ver que los cambios se producen en la base de datos, haz consultas sobre la tabla
personas desde SQL Plus

Ya sólo nos hace falta guardar el formulario para poder utilizarlo en un futuro, para ello
le damos a la opción del menú Fichero->Guardar y le damos de nombre, por ejemplo,
persona.fmb. Ten en cuenta que si lo guardas en la unidad C en el aula de prácticas no
podrás reutilizar este formulario.

Si modificas el valor del atributo Sexo de cualquier registro poniendo, por ejemplo, una
X y le damos al botón de guardar. En la barra de estado (abajo) de Oracle Forms
Runtime nos saldrá un error diciendo que Oracle no puede actualizar el registro, eso es
debido a que es campo sólo puede tomar dos valores H o M, pues al crear la base de
datos forzamos mediante la cláusula CHECK IN que así fuera. Para evitar problemas, ya
que puede que el usuario no sepa quw valores son los permitidos, vamos a utilizar una
lista desplegable para este atributo.

Para ello, en el navegador de objetos nos vamos al bloque de datos Persona y de ahí al
elemento Sexo, lo seleccionamos con el ratón y le damos al botón derecho, del menú
contextual que nos aparece seleccionamos Paleta de Propiedades (Otra forma de acceder
a la Paleta de Propiedades del elemento Sexo, es pulsándolo dos veces en el Editor de
Diseño como ya sabes). Cambiaremos el atributo Tipo de Elemento a Elemento de
Lista y el atributo Correspondencia con otros valores lo ponemos a M(sería el valor
por defecto).

Ahora cambiamos la propiedad Elementos de la lista donde nos saldrá una subventana
con dos partes, en la primera será cada uno de los valores de la lista que se muestran, y
el campo de abajo para cada uno de esos valores que se muestran los valores que se
almacenan en la base de datos, de esta forma, en la lista de valores que se muestran
pondremos Hombre y Mujer y los valores correspondientes que se guardarán serán,
lógicamente, H y M

EJERCICIO: Hacer un formulario que nos permita consultar, introducir, borrar y


modificar las asignaturas

1.2 Bloque detalle Alumno

30
Seguimos con el formulario persona con el que hemos estado trabajando anteriormente.
Seleccionamos, en el navegador de objetos, el bloque de datos Persona y pulsamos en el
navegador de objetos el botón de crear . De esta forma crearemos un nuevo bloque
de datos (detalle) asociado al bloque de datos seleccionado (Persona - Maestro)

Nos preguntará que cómo queremos crear el nuevo bloque de datos, le decimos que
queremos utilizar el asistente de bloques de datos

Escogeremos la tabla Alumno y nos quedaremos con todos sus atributos, después de
pulsar Siguiente nos aparecerá una ventana donde crear la relación maestro-detalle. Le
daremos al botón Crear Relación (el tipo de la relación será basada en una condición de
unión), escogeremos la tabla Persona (la única que nos parece en la lista) y le damos a
Aceptar. Como elemento detalle y como elemento maestro escogeremos el atributo PID.
Marcamos la casilla de Unir Automáticamente bloques de datos.

31
Le damos a Terminar para iniciar el asistente de diseño. Los atributos que se mostrarán
serán todos menos el PID, puesto que éste ya se nos muestra en la tabla de persona. En
el tamaño de cada campo, modificamos el de la nota de acceso, le ponemos un tamaño
de 20. Le daremos al botón Terminar.

Una vez terminado el asistente de diseño, desde el editor de diseño adecuaremos el


aspecto visual del formulario a nuestro gusto. Cuando lo ejecutemos nos daremos
cuenta que los campos de los alumnos sólo se nos rellenarán cuando estemos
moviéndonos por una persona que sea un alumno. Esto tiene el inconveniente de que
nos muestra también aquellas personas que no son alumnos (o sea, los profesores).

32
Nota: Para que nos muestre tan sólo a los alumnos, vamos a restringir los elementos que
nos traemos en el bloque de datos Persona. Supongamos que en SQL sólo queremos
obtener aquellas personas que son alumnos, una forma de hacerlo es con la siguiente
consulta:

SELECT * FROM persona WHERE pid IN (SELECT pid FROM alumno)

Si nos vamos a la Paleta de Propiedades del bloque de datos Persona, en el apartado


Base de Datos, encontramos la propiedad Cláusula WHERE que inicialmente está vacía.
Si la rellenamos con pid IN (SELECT pid FROM alumno), al ejecutar de nuevo el
formulario sólo nos mostrará a los alumnos.

¡Qué no se te olvide guardarlo!

EJERCICIO: Hacer un formulario maestro detalle para los profesores de forma


análoga a como hemos realizado el ejemplo anterior. Será más fácil si no
modificas el diseño hasta que no tienes los bloques maestro y detalle.

33
Nota: Si queremos que cuando ejecutemos un formulario no tengamos que pulsar el
botón Ejecutar Consulta para empezar a visualizar los registros vamos a hacer que lo
haga de forma automática cuando cree el formulario. Para ello, en el navegador de
objetos, nos vamos a Disparadores y pulsamos el botón de crear , seleccionamos el
disparador WHEN-NEW-FORM-INSTANCE y pulsamos el botón de Aceptar.

En la ventana de Editor PL/SQL escribimos la línea

34
execute_query;
que si nos fijamos es ejecutar_consulta en inglés, le damos al botón Compilar y luego a
Cerrar. De esta forma cada vez que ejecutemos el formulario no tendremos que pulsar el
botón Ejecutar Consulta para ver los registros.

2 Formulario Matrícula

Vamos a hacer un formulario maestro-detalle, donde el maestro será la tabla Matrícula y


el detalle la tabla DetalleMatrícula. En este formulario podremos borrar/añadir
asignaturas a una matrícula. Vamos a hacerlo de forma similiar a como hemos realizado
el anterior ejemplo, pero con dos pequeñas diferencias.

En el asitente de diseño, para el bloque maestro, escogemos un estilo de diseño


Pantalla, pulsamos Siguiente y al marco le damos el título de Matrícula, después
pulsamos Terminar.

35
La segunda diferencia, es que en el asistente de diseño,para el bloque detalle (que es la
tabla DetalleMatricula), escogemos un estilo de diseño Tabular, pulsamos Siguiente
y al marco le damos el título de Asignaturas, los registros visualizado serán 10 y
marcaramos la casilla de Visualizar Barra de Desplazamiento, después pulsamos
Terminar.

De esta forma y retocando un poco con el editor de diseño debería quedar algo parecido
a:

36
Este formulario queda bastanta poco intuitivo y dificil de utilizar, para ello vamos a
realizar varios cambios, el primero será realizar una lista estática para el campo Tipo, de
forma que aparezcan las opciones: Ordinaria, Libre, Personal Universidad y que, en
realidad, en la base de datos se almacene los valores O, L,U (respectivamente). Y el
número de plazos, otra lista, que tome los valores 1 ó 2.

La siguiente mejora será utilizar una lista desplegable como las usadas en Tipo y en
Número de plazos, para las asignaturas, de forma que podamos ver en la lista el nombre
de la asignatura y no haga falta conocer el nombre de todas las asignaturas. Observa
que, con los conocimientos que tenemos, para cada asignatura que se añada a la base de
datos tendríamos que cambiar el diseño de nuestro formulario, de forma que incluyese
la nueva asignatura como una opción más de la lista. Esto no es realista es un entorno
normal, es decir, no se cambia la aplicación cuando se cambia la base de datos, no
tendría sentido. Para esto vamos a realizar listas dinámicas a contraposición de las
usadas hasta hora que son estáticas. Las listas dinámicas se construirán cada vez que
ejecutemos el formulario a partir de los valores almacenados en la base de datos.

Construiremos una lista dinámica para la parte de asignaturas a partir de la tabla


Asignaturas. Para ello, lo primero que tenemos que hacer es definir el campo Nombre
de DetalleMatrícula como Elemento de Lista. Usaremos un valor por defecto conocido

37
y rellenaremos la lista con un sólo valor (esto es para que forms developer no nos diga
que la lista está mal), para esto podemos usar el valor por defecto Base de Datos
(Correspondencia con otros valores), y en la lista podemos añadir el elemento Base de
Datos y que almacene Base de Datos en la base de datos.

Ya tenemos una lista estática que si compilamos el formulario no nos sirve de nada,
para hacerla dinámica realizaremos los siguientes pasos:

1. Escribir una consulta que obtenga las distintas asignaturas de la base de datos
con las que construiremos la lista
2. Escribir un prodecimiento PL/SQL que se encargue de rellenar la lista con los
datos obtenidos en la anterior consulta
3. Llamar al procedimiento PL/SQL para que rellene la lista cuando se utilice el
formulario

Para crear la consulta que nos permita obtener los datos de las consultas, en el
Navegador de Objetos, seleccionaremos Grupo de Registros (una consulta, en
realidad) y le damos al botón de crear , introduciendo el siguiente texto:

SELECT nombre, nombre FROM Asignatura order by 1


Con esta consulta, obtendremos el valor que se mostrará en la lista (nombre) y el valor
correspondiente que se alamcenará en la base de datos (nombre) ordenados de forma
alfabética. A la nueva consulta creada, le damos el nombre de asignaturas (por ejemplo,
usando la paleta de propiedades -> nombre)

38
Ahora crearemos un procedimiento PL/SQL para rellenar una lista a partir de los datos
de una consulta. Como este proceso es probable que lo utilicemos más de una vez en
nuestros formularios lo vamos a hacer reutilizable, en forma de biblioteca. Para ello, ,
en el Navegador de Objetos, marcaremos Bibliotecas PL/SQL y le damos al botón de
crear , ahí seleccionaremos Unidades de Programa y le volvemos a dar al botón
de crear . Introducimos el nombre de la Unidad de Programa, que será llena_listas y
le damos al botón Aceptar.

En el editor PL/SQL que nos aparece introduciremos el siguiente código:

PROCEDURE llena_listas (lista in VARCHAR2, grupo in VARCHAR2) IS


verror NUMBER :=0;
errorRellenoLista exception;
BEGIN
verror:= Populate_Group(grupo);
if verror = 0 then
Clear_List(lista); /*Elimina el contenido de la lista*/
Populate_List(lista,grupo);
elsif verror = 1403 then /*No se encuentra ningún */
/*elemento en la lista*/
null; /*no se hace nada*/
else
raise errorRellenoLista;
end if;
EXCEPTION
when errorRellenoLista then
message ('Excepción: no se puede rellenar la '||lista||
' con la consulta de '||grupo||'.');
END;
Pulsamos Compilar y si no hay ningún problema, le damos a Cerrar

39
Nos vamos a la biblioteca creada y le damos al botón de guardar , la guardamos
como MiBiblioteca, recuerda el sitio donde la guardas, (por ejemplo, en u:/bd2/).
Seleccionamos la biblioteca y la compilamos (en el menú, nos vamos a Programa-
>Compilar Selección). Ahorá sólo nos queda añadir la biblioteca a nuestro formulario y,
en general, a cualquier formulario que deseemos crear, para esto, dentro de nuestro
formulario nos vamos dentro del Navegador de Objetos a Bibliotecas Incorporadas(o
Bibliotecas Asociadas, dependiendo de la versión de Developer) y pulsamos el botón de
crear . Examinamos y seleccionamos la biblioteca y le damos a Incorporar.

Nos preguntará si suprimir la ruta para que la aplicación sea portable, le decimos que
No. Esto tiene el problema que si la biblioteca no está en la ruta especificada, el
formulario no funcionará. Esto es importante a tener en cuenta a la hora de detallar la
instalación de un formulario.

Ya sólo nos queda llamar al procedimiento PL/SQL para que rellene la lista con los
datos de la consulta cuando se utilice el formulario. Para esto, en el navegador de
objetos, nos vamos a Disparadores y pulsamos el botón de crear , seleccionamos el

40
disparador WHEN-NEW-FORM-INSTANCE y pulsamos el botón de Aceptar. Y
añadimos el siguiente código:

llena_listas('DetalleMatricula.nombre','asignaturas');
si además queremos que nos salga el formulario inicializado, sería:
BEGIN
llena_listas('DetalleMatricula.nombre','asignaturas');
execute_query;
END;
Observa que la llamada al procedimiento llena_listas de MiBiblioteca tiene dos
párametros, el primero el bloque datos y elemento a rellenar, el segundo es la consulta
que se va a utilizar para ello. Le damos a Compilar y Cerrar

Finalmente, el formulario tendrá un aspecto similiar a:

¡Qué no se te olvide guardarlo!

3 Bloque LOV (List of Values - Lista de Valores)

41
En lugar de utilizar listas, en muchos casos nos interesará más utilizar bloques LOV.
Con un Bloque LOV podremos asignar más de un valor a la vez, es decir, seleccionando
un elemento de un bloque LOV podremos rellenar varios campos del formulario a la
vez. Los bloques LOV son dinámicos en el sentido de que se construyen a partir de los
datos de la base de datos y además nos permitirán ver más datos que los que se van a
utilizar para rellenar el formulario.

Para ilustrar el ejemplo de los bloques LOV: si nos fijamos en el formulario anterior el
campo alumno es sólo un código que no nos dice mucho, si hubiera que cambiar la
asignación de una matrícula a un alumno (por ejemplo, para deshacer un error del
secretario), habría que buscar en alumnos el código (o, al menos, saberlo) y con ese
código cambiar la matrícula. Para evitar esto, vamos a crear un bloque LOV que nos
permita ver datos del los alumnos, pero que nos almacene sólo el código del mismo.

Abrimos el formulario de matrículas si no lo tenemos abierto ya. En el navegador de


objetos, seleccionamos Listas de Valores (o elementos LOV, según la versión de
Developer) y le damos al botón de crear . Le decimos que sí queremos utilizar el
Asistente de Listas de Valores. Dejamos seleccionado Nuevo Grupo de Registros
basado en una consulta y le damos al botón Siguiente.

En la parte de la consulta SQL, vamos a introducir la siguiente consulta:

SELECT alumno.pid, nif, nombre, apellido1, apellido2


FROM alumno, persona
WHERE (alumno.pid=persona.pid)
Nos conectamos (si no lo estamos ya) y le damos a Comprobar Sintaxis para ver si la
consulta está correcta. Le damos al botón Siguiente.

42
En la ventana de selección movemos todos los atributos a la columna de la derecha, ya
que en la misma consulta hemos seleccionado los atributos que queremos que nos
salgan en la lista de valores. Le damos a Siguiente.

En la siguiente ventana del asistente, nos muestra la forma en que se van a mostrar los
valores en el bloque LOV, cambiamos el ancho de las columnas (ver imagen), y en la
fila del PID, en la columna Valor de Retorno ponemos MATRICULA.IDALUMNO (o
en lugar de escribirlo, podemos seleccionarlo pulsando el botón Buscar elemento de
retorno...), ésto lo que hace es devolver el elemento PID del bloque LOV en el campo
Matricula.IDAlumno. Si quisiéramos devolver más valores utilizaríamos las casillas
correspondientes en la columna Valor de retorno. Dejamos activado la casilla de
Ajustar automáticamente el tamaño de las columnas y pulsamos Siguiente.

43
Le damos de título Selección de Alumno, dejando el resto de valores por defecto,
pulsamos dos veces Siguiente.

44
Finalmente desplazamos Matricula.IDAlumno a la columna de la derecha y le damos al
botón Terminar.

Cuando ejecutemos el formulario, al irnos a la casilla de Alumno, nos saldrá en la barra


de estado (abajo) de Oracle Forms Runtime la anotación Lista de Valores, pulsamos F9
y nos aparecerá el bloque LOV.

Si quieres que la Lista de Valores se visualice automáticamente al irnos a la casilla de


Alumno, sin tener que pulsar F9, tienes que irte a la Paleta de Propiedades de la Lista
de Valores creada y poner la propiedad Visualización Automática a Sí

45
4 Ventanas y lienzos

Los Lienzos son elementos del diseño sobre el que se sitúan los otros elementos de
nuestro formulario. Una ventana actúa como un visor sobre el lienzo permitiendo
desplazarse por su contenido. Cuando ejecutamos un formulario se dispone una ventana
principal que no dispone de lienzos, mediante la cual se visualiza el resto de las
ventanas que si contendrán lienzos. Podemos distinguir distintos tipos de lienzos:

1. Contenido: Elemento contenedor de otros. Es el que se crea por defecto con un


formulario nuevo y una ventana debe tener al menos un lienzo de este tipo, ya
que es un lienzo contenedor de los elementos del formulario o de otros lienzos
2. Apilado: Un lienzo que se muestra encima de otros.
3. Tabular: Lienzo para poder hacer pestañas en nuestro formulario.
4. Barra de Herramientas: Contiene botones que se muestran en forma vertical u
horizontal en la ventana.

Como ya hemos visto de forma implícita el uso de lienzos contenedores y los lienzos
apilados se pueden simular poniendo los elementos de distintos bloques de datos en el
mismo lienzo, vamos a ver los lienzos tabulares y las barras de herramientas. También
veremos un tipo especial de ventanas que son las Alertas y que nos serán muy útiles.

4.1 Lienzos tabulares

Vamos a realizar un formulario de Matriculación donde en una parte tengamos los datos
de la matrícula y abajo tengamos dos pestañas: una con las asignaturas asociadas a la
matrícula y otra con los pagos de la matrícula. De esta forma tendremos un bloque de
datos Maestro (Matrícula) y dos bloques Detalle (Asignaturas y Pagos), cada uno en una
pestaña.

Abrid Form Builder (empezamos sin ningún formulario) y mediante el Asistente


creamos nuestro bloque de datos asociado a la tabla matrícula, como ya hicimos en el
aparatado 2, seleccionando todos sus atributos. Fíjate que en el asistente de diseño,
después de la bienvenida aparece la ventana Tipo de Lienzo y que, por defecto, tiene un
tipo de lienzo contenedor.

46
Visualizad todos los campos, en formato Pantalla, que el título del marco sea Matrícula,
se vea un sólo registro y tenga la barra de desplazamiento.

Verifica que funciona y guárdalo, por ejemplo, como Matriculacion2.fmb. Observa que
moviéndonos con la barra de desplazamiento nos vamos moviendo por las distintas
tuplas de la tabla Matrícula.

Ahora vamos a crear la primera pestaña para las asignaturas. Vamos a crear el bloque
detalle basado en la tabla DetalleMatrícula (recuerda que para crear un bloque detalle,
debes seleccionar primero el bloque de datos maestro y darle al botón de crear),
seleccionando todos sus campos. En el Asistente de Diseño, en la ventana de Tipo de
Lienzo, vamos a asignarle un lienzo nuevo (Nuevo Lienzo) que será de tipo Tabular y
una Nueva Página con Pestaña.

Visualizaremos sólamente el campo Nombre (de una asignatura) y elegiremos una


presentación tabular visualizando 5 registros y la barra de desplazamiento. En el
navegador de objetos buscamos en Lienzos el nuevo lienzo tabular que hemos creado

47
(puedes ver el nombre en el editor de diseño) y, dentro de éste, en Páginas con Pestaña
le cambiamos el nombre a la primera que hay, que tendrá un nombre parecido a PAGE5
(puedes hacerlo en la Paleta de Propiedades cambiando el atributo Etiqueta por el valor
Asignaturas).

Al ejecutar el formulario, sólo verás la parte de matrícula, no importa, luego lo


cambiaremos. Ahora vamos a crear la segunda pestaña para el bloque detalle Pagos
seleccionando todos sus campos. Ten cuidado, al crear la relación, en este caso ya que al
tener dos bloques de datos el asistente se puede confundir. Para evitarlo, antes de pulsar
Crear Relación desactivamos Unir automáticamente bloques de datos, hacemos la
relación basada en una condición de unión sobre el campo IDMatricula de Matricula y
el campo IDMatricula de Pago.

En el Asistente de Diseño, en la ventana Tipo de Lienzo, vamos a asignarle el lienzo


tabular antes creado con las asignaturas, pero sí vamos a seleccionar una Nueva Página
con Pestaña.

48
Visualizaremos todos los campos menos IDMatricula. Escogemos un diseño tabular, de
título Pagos, y que se muestren sólo 2 registros, sin barra de desplazamiento. Le
cambiamos el nombre a la pestaña, como hicimos anteriormente para las asignaturas
(cambiando la propiedad Etiqueta por Pagos de la nueva página con pestaña creada).

Ahora vamos a redimensionar los lienzos para que se vean al ejecutar el formulario.
Para ello, en el navegador de objetos, nos vamos a los lienzos y seleccionamos el lienzo
Tabular (el segundo), abrimos la Paleta de Propiedades y cambiamos la propiedad
Posición Y en la Puerta de Vista a 90 y la propiedad Bisel a Ninguno

De esta forma colocaremos el lienzo con las pestañas debajo de los datos de la
matrícula. Ten en cuenta en redimensionar el lienzo de la Matrícula (si no es lo
suficientemente grande) para que quepa debajo el lienzo tabular. Poniendo Bisel a
ninguno, lo que hacemos es quitar una línea que separa los dos lienzos. Ejecutamos, el
lienzo, corregimos y guardamos el formulario.

49
Si en el navegador de objetos, el bloque de datos Maestro (Matricula) está después de
un bloque de datos detalle, no se visualizará correctamente.

Si se quiere ver en el editor de diseño los dos lienzos en lugar de tener dos editores de
diseño (uno por lienzo), en el editor de diseño del bloque maestro vete a la opción Ver
del menú y de ahí a Vistas Apiladas ..., seleccionamos el lienzo tabular y le damos al
botón Aceptar.

Para cambiar el título de la ventana, en le navegador de objetos, vete a Ventanas,


selecciona la que hay y abre su paleta de propiedades. Cambia la propiedad Título a, por
ejemplo, Matriculación.

4.2 Ventanas de Avisos (Alertas)

50
Developer tiene un tipo especial de ventanas para enviar avisos al usuario. Básicamente
mostrará un mensaje y puede tener hasta tres botones (por ejemplo, "Si" "No" y
"Cancelar"). Hay tres tipos de estilos de alerta: Parar, Precaución y Nota.

Vamos a crear una alerta que nos muestre un mensaje de bienvenida cuando se ejecute
el formulario de Matriculación, para ello tendremos que tenerlo abierto previamente con
Forms Builder. En el Navegador de Objetos, seleccionamos Alertas y pulsamos el
botón de crear . Abrimos la paleta de propiedades de la alerta creada.

Cambiamos las siguiente propiedades:

• A Nombre le damos Bienvenida


• A Título le damos Bienvenido
• A Mensaje le damos Bienvenido al proceso de matriculación.
• A Etiqueta de Botón 1 escribimos Aceptar
• A Etiqueta de Botón 2 y a Etiqueta de Botón 3 lo dejamos en blanco

Ya sólo nos queda llamar a la alerta, para ello, en el disparador


WHEN_NEW_FORM_INSTANCE, escribimos el código:

DECLARE
boton NUMBER;
BEGIN
/*Mostramos la alerta BIENVENIDA y
guardamos el botón pulsado*/
boton := Show_Alert('Bienvenida');

/*Miramos que botón se ha pulsado*/


IF boton = ALERT_BUTTON1 THEN
/*Sólo hay uno, no hacemos nada*/
NULL;
END IF;

/*Rellenamos el formulario*/
Execute_Query;

51
END;
De esta forma, al ejecutar el formulario nos debería salir, algo parecido a

La función Show_alert devuelve el número ALERT_BUTTON1, ALERT_BUTTON2,


ALERT_BUTTON3 dependiendo de que botón haya sido pulsado

4.3 Barras de herramientas

Para ilustrar el funcionamiento de una barra de herramientas, vamos a crear una para
nuestro formulario de matriculación que será horizontal y con cuatro botones, dos para
movernos entre los registros, otro para almacenar los cambios realizados y un cuarto
botón para cerrar el formulario, mostrando un aviso antes. La barra de herramientas
tendrá el siguiente aspecto:

Lo primero será crear un lienzo, para ello, en el navegador de objetos vete a lienzos y
pulsa el botón de crear . Abre la paleta de propiedades del lienzo creado y cambia
las siguientes propiedades:

• A Nombre le damos Botones


• A Tipo de Lienzo le damos Barra de Herramientas Horizontal
• A Ventana le damos WINDOWS1 (o la que tengas si tienes otra, pero sólo
deberías tener una)
• A Altura le escribimos 30

52
Abrimos el editor de diseño, seleccionando previamente el lienzo creado. Mediante el
botón para crear botones , le añadimos los cuatro botones para que tengan un aspecto
parecido a lo que estamos buscando. Inicialmente, tendrá este aspecto:

Fíjate que los botones se deben de crear como elementos del bloque de datos
Matricula. Debiendo quedar algo como:

Mediante la paleta de propiedades de cada botón, le cambiamos la propiedad Etiqueta a


los valores <,>, Guardar y Cerrar y la propiedad Nombre a los valores anterior,posterior,
salva y salida.

Ahora mismo si ejecutamos el formulario, nos aparecerá la barra de herramientas pero


los botones no hacen nada. Para el botón anterior creamos un nuevo disparador del tipo
WHEN-BUTTON-PRESSED, con el siguiente código:

do_key('up');
e igualmente para el botón posterior, pero con el código:

53
do_key('down');
para el botón salva, el código es:
commit_form;

Al ejecutar el formulario comprobarás que los botones ya funcionan (con excepción al


de cerrar), el código del disparador WHEN-BUTTON-PRESSED, se ejecuta (como dice
su nombre) cuando se pulsa un botón. Ahora nos quedan el otro botón que es un poco
más complicados. En el botón de salir, usaremos una alerta que pregunte si se quieren
almacenar los cambios antes de salir y que tenga tres botones, "Si" "No" y "Cancelar".
Dependiendo del botón que se pulse se guardarán los resultados y se cerrará el
formulario, no se guardarán los cambios y saldrá del formulario y no hará nada
(respectivamente). Para ello, lo primero, será crear una Alerta con las siguientes
propiedades:

• A Nombre le damos Salir


• A Título le damos Salir
• A Mensaje le damos ¿Quieres almacenar los cambios antes de salir?
• A Estilo de Alerta le damos Precaución
• A Etiqueta de Botón 1 escribimos Sí
• A Etiqueta de Botón 2 escribimos No
• A Etiqueta de Botón 1 escribimos Cancelar

54
Para terminar al botón Salida para su disparador WHEN-BUTTON-PRESSED le
asignamos el siguiente código:

DECLARE
boton NUMBER;
BEGIN
/*Preguntamos si guardar*/
boton := show_alert('salir');

/*Si se ha pulsado el primer botón,


guardamos los cambios*/
if boton = ALERT_BUTTON1 then
commit_form;
end if;

/*Si no se ha pulsado el tercer botón,


nos salimos*/
if boton <> ALERT_BUTTON3 then
exit_form(no_commit);
end if;
END;

El aspecto del formulario será:

55
5 Elementos con resultados de cálculos

En Developer se pueden crear campos que muestren datos calculados a partir de otros
campos. Para ilustrar esta funcionalidad, para cada pago vamos a añadir un campo que
sea Pagado (pago.abonado*pago.cantidad) que nos muestre para un pago dado si se ha
pagado o no, y dos campos uno con la suma de las cantidades de los pagos (Precio
Total matrícula) y otro con la suma de las cantidades pagadas (Total Pagado).

En el navegador de objetos seleccionamos Elementos del bloque de datos Pago y


pulsamos el botón de crear , nos creará un nuevo campo de texto. Con la Paleta de
Propiedades le damos los siguientes valores:

• A Nombre le damos Pagado


• A Tipo de Dato le damos Number
• A Modo de Cálculo le escogemos Fórmula
• En Fórmula escribimos :pago.abonado*:pago.cantidad
• En Elemento de Base de datos elegimos No
• A Lienzo le asignamos el lienzo tabular (el segundo creado)
• En Página con Pestaña le damos la página con la pestaña de pagos (la segunda
creada)
• A Prompt le damos el valor Pagado
• En Justificación del Prompt nos quedamos con Centro
• En Borde del anexo del Prompt escogemos Superior

En el editor de diseño colocamos mejor el campo creado (como son dos pagos, se verán
dos campos de texto). Si ejecutamos el formulario comprobaremos que funciona, basta
con cambiar el valor de Abonado.

56
En el editor de diseño creamos dos nuevos campos de texto , tal y como muestra la
figura.

Si los campos de texto creados nos aparecen en el bloque de datos Pago (¡Nos saldrán
dobles!), no hay ningún problema, pero si nos salen en el bloque de datos Matrícula
(como en el ejemplo), los arrastraremos hasta el bloque de datos Pago que es donde
queremos hacer los cálculos.

Al campo situado más a la izquierda, mediante la paleta de propiedades, le modificamos


los siguiente atributos:

• A Nombre le damos Total


• A Tipo de Dato le damos Number
• A Modo de Cálculo le escogemos Total
• En Función totalizar seleccionamos Sum
• En Bloque de Total elegimos Pago
• En Elemento de Total ponemos Cantidad
• En Número de elementos visualizados escribimos 1
• En Elemento de Base de datos elegimos No
• A Prompt le damos el valor Precio Total Matrícula
• En Grosor de la Fuente del Prompt nos quedamos con Negrita

Al campo situado más a la derecha, mediante la paleta de propiedades, le modificamos


los siguiente atributos:

• A Nombre le damos TotalPagado


• A Tipo de Dato le damos Number
• A Modo de Cálculo le escogemos Total
• En Función totalizar seleccionamos Sum
• En Bloque de Total elegimos Pago
• En Elemento de Total ponemos Pagado

57
• En Número de elementos visualizados escribimos 1
• En Elemento de Base de datos elegimos No
• A Prompt le damos el valor Total Pagado
• En Grosor de la Fuente del Prompt nos quedamos con Negrita

Al bloque de datos Pago le cambiamos la propiedad Consultar todos los registros a Sí y


la propiedad Precalcular Totales como No. Ya sólo queda ajustar los campos de totales
creados por si no se visualizaran bien y ejecutar el formulario cambiando los valores de
cantidad/abonado para ver que ocurre.

Nota:Estos campos no se almacenan datos en la base de datos (no existe un campo


donde hacerlo)

6 Menús

Cualquier formulario tiene un menú por defecto que permite ejecutar las órdenes
habituales, algunas de ellas las vimos al principio cuando ejecutamos nuestro primer
formulario. El menú por defecto no se puede modificar, pero si se puede cambiar por un
menú personalizado, para ello, es conveniente partir de un menú previamente definido,
nosotros usaremos menudef.mmb.

Empezamos con el formulario para matriculaciones con el que hemos estado trabajando.
En el navegador de objetos, seleccionamos Menús y pulsamos el botón de abrir ,
seleccionamos el fichero menudef.mmb (ten en cuenta en la ruta donde lo has
guardado). Seleccionamos el menú incorporado y pulsando el botón derecho del ratón,
nos vamos al Editor de Menús.

58
Lo primero que haremos para familiarizarnos con el editor de menús es traducir las
entradas del inglés al castellano, quedando con el siguiente aspecto:

Lo siguiente que vamos a hacer en crear una opción del menú que llame al formulario
de alumnos. Para ello vamos a crear una entrada nueva en la opción de menú Consulta.
Debajo de Sig. Grupo, vamos a crear un separador, para ello nos vamos a Consulta-
>Sig.Grupo y pulsamos el botón de Crear debajo . Al nuevo elemento del menú le
cambiamos las siguiente propiedades: Nombre: SeparadorForms, Etiqueta:
SeparadorForms, Tipo de Elemento de Menú: Separador.

Debajo del separador creado creamos la entrada Formularios pulsando el botón de Crear
debajo . Al nuevo elemento le damos: Nombre: Formularios, Etiqueta: Formularios,
Tipo de Elemento de Menú: Normal.

59
Con la opción Formularios seleccionada pulsamos el botón de Crear a la derecha .
Al nuevo elemento le damos: Nombre: Alumnos, Etiqueta: Alumnos, Tipo de Elemento
de Menú: Normal.

Para ejecutar el formulario Alumnos cuando se elija la opción Alumnos del menú,
tendremos que modificar su propiedad Código del Elemento de Menú con el siguiente
código:

DECLARE
parametros Paramlist;
BEGIN
/*Creamos la lista de parametros vacía*/
parametros := Create_Parameter_List('nada');

/*Llamamos al formulario de Alumnos*/


Run_PRODUCT(FORMS,'Alumno',SYNCHRONOUS, RUNTIME,
FILESYSTEM,parametros ,NULL);
END;

60
La función Run_PRODUCT nos servirá para ejecutar cualquier elemento de
Developer, el primer parámetro sera FORMS si llamamos a un formulario y
REPORTS si llamamos a un informe, el segundo parámetros será el formulario o
informe que queremos usar y el penúltimo será una lista de parámetros que le pasamos
al formulario o informe, en este ejemplo, está vacía. Para más información acerca del
procedimiento Run_PRODUCT, puedes consultar la ayuda interactiva de Developer.

En el navegador de objetos, seleccionamos el objeto menú con el que estamos


trabajando y nos vamos a Fichero -> Guardar Como. Lo guardamos como mimenu.mmb.
Ya sólo nos queda compilarlo (manteniéndolo seleccionado, nos vamos a Fichero
->Administración -> Compilar Fichero) e incorporar el menú compilado al formulario.
Para ello, abrimos la paleta de propiedades del formulario (el único elemento de
Pantallas en el navegador de objetos) y cambiamos la propiedad Módulo de Menús a
mimenu.mmx. Ejecutamos y probamos si funciona la opción de ver el formulario de
alumnos.

7 Formularios con parámetros

Un formulario puede tener parámetros de forma que, cuando lo invoquemos (por


ejemplo, desde un menú o un botón), tenga un comportamiento distinto dependiendo de
los parámetros. Un parámetro será una variable asociada a un Formulario o a un
Informe.

Vamos a crear un formulario donde se visualicen los datos de un alumno en particular y


lo vamos a invocar desde nuestro formulario de Matriculación. Primero, copiamos
nuestro formulario Alumno.fmb a otro fichero, por ejemplo, AlumnoP.fmb y abrimos

61
el nuevo formulario creado. Para crear un parámetro, en el navegador de objetos
seleccionamos Parámetros y pulsamos el botón de crear . Al nuevo parámetro
creado le damos el nombre Seleccionado, será de tipo numérico (Number) y el valor
Inicial será 1.

El siguiente paso que daremos será cambiar la cláusula WHERE del bloque de datos
Persona, de forma que se muestre el registro cuyo PID se le pasa como parámetro. Para
ello le damos a la propiedad Cláusula WHERE el valor pid = :Parameter.seleccionado

Si ejecutamos el formulario creado nos mostrará la persona con PID igual a 1 (recuerda
el valor inicial del parámetro). Cerramos el formulario y abrimos el formulario
matrícula, en éste formulario vamos a añadir un botón nuevo en la barra de herramientas
que nos va a servir para abrir el formulario AlumnoP.fmb con el alumno del que
estamos visualizando su matrícula. Para ello, abrimos la barra de herramientas en el
Editor de diseño y le añadimos un botón , redimensionamos los que tenemos para
que quepa correctamente. Abrimos la paleta de propiedades del botón creado y ponemos
Alumno en las propiedades Nombre y Etiqueta.

62
Ya tenemos el nuevo botón que ahora mismo no hace nada, para que abra el formulario
AlumnoP, le vamos a añadir un disparador del tipo WHEN-BUTTON-PRESSED con el
siguiente código:

DECLARE
parametros Paramlist;
BEGIN
/*Creamos la lista de parámetros*/
parametros := Create_Parameter_List('Param');

/*Le añadimos el alumno a visualizar*/


Add_parameter(parametros,'seleccionado',
TEXT_Parameter,:matricula.IDAlumno);

/*Llamamos al formulario de Alumnos*/


Run_PRODUCT(FORMS,'AlumnoP',SYNCHRONOUS, RUNTIME,
FILESYSTEM,parametros ,NULL);

/*Limpiamos la la lista de parámetros creados*/


Destroy_Parameter_List(parametros);
END;

63
Con el procedimiento Add_parameter se pueden añadir tantos parámetros como haga
falta, primero tendrá la lista de parámetros, después el nombre del parámetros, el tipo de
parámetro (normalmente, TEXT_Parameter) y finalmente el valor del parámetro.
Observa que aquí escogemos el atributo IDAlumno del bloque de datos Matricula

Guardamos y ejecutamos el formulario para ver que el nuevo botón funciona


correctamente.

64
REPORTS DEVELOPER

1 Informe Asignaturas

Vamos a hacer un primer informe que nos va a mostrar una relación de asignaturas que
se pueden cursar, para ello ejecutamos Report Builder, que es la herramienta para
construir informes

Lo primero que nos saldrá será una pantalla de bienvenida con diversas opciones,
nosotros escogeremos Utilizar el Asistente de Informes y le damos al botón Aceptar.

Nos sale otra bienvenida, la ignoramos y pulsamos el botón Siguiente, nos preguntará el
título de nuestro informe y el tipo del mismo. Como Título pondremos Asignaturas y
escogeremos el tipo tabular. Pulsamos Siguiente

65
Nos preguntará el tipo de consulta que queremos utilizar, seleccionaremos Sentencia
SQL y pulsamos Siguiente. En la siguiente ventana nos pedirá la consulta y
aprovechamos, pulsando el botón conectar para identificarnos. La consulta que debemos
introducir es:

SELECT nombre, creditosTeoricos, creditosPracticos, tipo,


cuatrimestre FROM asignatura;

Nos aparecerá una ventana con dos columnas para seleccionar los atributos que
deseamos visualizar en nuestro informe, los vamos a visualizar todos, así que nos los
llevamos todos a la columna de la derecha.

En la siguiente pantalla nos permite calcular totales, mínimos, máximos, etcétera, por lo
pronto, la ignoramos y pulsamos Siguiente. Ahora nos preguntará por las Etiquetas del
Informe y el tamaño de cada uno de los campos, nos limitamos a cambiar
"creditosTeoricos" por "Créditos Teóricos" y "creditosPracticos" por "Créditos
Prácticos".

66
Finalmente, seleccionamos la plantilla de diseño con la que parecerá nuestro informe,
escogemos la que más nos gusta, por ejemplo, escogemos la primera Corporate 1 y le
damos al botón de Terminar.

Como resultado ya tenemos nuestro primer informe, en el Report Editor podemos


cambiar aquellos detalles que no nos gusten. Que no se te olvide guardarlo como
asignaturas.rdf

67
2 Informe Matrículas

Vamos a crear un informe donde, para cada alumno, nos muestre las matrículas que ha
realizado y para cada matrícula los pagos de la misma. Utilizamos el Asistente de
Informes para hacerlo. El estilo de informe será Agrupar a la izquierda y el título
"Matriculas".

El motivo de agruparlo a la izquierda es que queremos agrupar las matriculas por


alumnos (un alumno se puede matricular más de una vez) y los pagos por matricula (una
matricula puede tener uno o dos pagos). El tipo de consulta sera mediante Sentencia
SQL y el código de la misma será:

68
SELECT matricula.idmatricula, tipo, numeroplazos, fechaexpedicion,
curso,cantidad, abonado, fechapago, persona.nombre, persona.apellido1,
persona.apellido2
FROM pago, matricula, persona
WHERE (pago.idmatricula=matricula.idmatricula) and
(matricula.idalumno=persona.pid);

Le damos a conectar para identificarnos y pulsamos Siguiente. En la siguiente


pantalla, tendremos que elegir por que grupos de atributos vamos a realizar las
agrupaciones. Primero pasamos nombre, apellido1, apellido2 que estará en el nivel 1 e
idmatricula estará en el nivel 2. Para dejar de añadir atributos al nivel 1 y empezar al
nivel 2, simplemente hay que cerrar el árbol del nivel 1. Nos quedará:

El resto de atributos lo añadimos luego en la parte de campos visualizados en el


siguiente orden: curso, tipo, fechaexpedicion, numeroplazos, cantidad, abonado,
fechapago.

69
Cuando nos pregunta los campos sobre los cuales se desea calcular el total,
seleccionaremos el campo cantidad, así nos sumará las cantidades de los pagos de una
matrícula y los totales de las distintas matriculas de un alumno. Entonces,
seleccionamos cantidad y nos lo llevamos a la columna de totales, usando el botón de
Suma >

Ya sólo nos queda poner los títulos y ajustar los tamaños de los distintos campos.
Observa que nos salen tres nuevos atributos:

• SumCantidadPeridmatricula, que nos sumará las distintas cantidades por


matrícula
• SumCantidadPernombre, que nos sumará las distintas cantidades por persona
• SumCantidadPerReport, que nos hará la suma de todas las cantidades del
informe

70
Escogemos la plantilla predefinida NCA yellow y le damos a Terminar. Qué no se te
olvide guardarlo cómo matriculas.rdf

3 Informes con parámetros e invocación de informes

Al igual que con los formularios, en los informes también podemos parametrizar su
funcionalidad, para demostrar su uso, vamos a copiar el último informe creado
(matriculas.rdf) con el nombre de matricula.rdf para que nos muestre las matrículas y
pagos de una sola persona que se le pasará como parámetro.

Para crear un parámetro, en el navegador de objetos nos vamos al Modelo de Datos y de


ahí, seleccionamos Parámetros de Usuario y pulsamos el botón de crear . Al nuevo
parámetro creado le damos el nombre Elegido, será de tipo Character y el valor Inicial
será 1.

71
Modificaremos la consulta del informe, eso se puede hacer por el navegador de objetos
y la paleta de propiedades del informe, cambiando la propiedad Sentencia de Consulta
SQL de la consulta que haya dentro de Consultas en el Modelo de datos o abriendo el
Asistente de Informes (dentro del menú herramientas) y escogiendo la pestaña Datos.
Introduciremos la siguiente sentencia SQL:

SELECT matricula.idmatricula, tipo, numeroplazos, fechaexpedicion,


curso,
cantidad, abonado, fechapago,
persona.nombre, persona.apellido1, persona.apellido2
FROM pago, matricula, persona
WHERE (pago.idmatricula=matricula.idmatricula) and
(matricula.idalumno=persona.pid) and
(:elegido =persona.pid);

Si ejecutamos el informe veremos que antes de mostrarlo nos sale una ventan donde nos
pregunta por los parámetro de usuario.

72
Pulsamos el icono del semáforo verde para visualizar el informe y sólo nos muestra
las matrículas de una persona (la que coincide con el valor introducido).

Para evitar que cuando lo llamemos desde nuestro menú o desde un formulario nos
aparezca la ventana de parámetros, nos vamos al menú Herramientas->Constructor de
Pantalla de Parámetros. Dejamos en blanco el Titulo, la Linea de Indicación y la Línea
de Estado, además deseleccionamos aquellos atributos que estuviesen seleccionados en
la lista. Guardamos y cerramos el informe.

73
Abrimos nuestro formulario de matriculación con su menú y al menú le añadimos una
opción nueva que será Imp. Matriculas. Para ello, debajo de la entrada Formularios
creamos la entrada Informes pulsando el botón de Crear debajo . Al nuevo elemento
le damos: Nombre: Informes, Etiqueta: Informes, Tipo de Elemento de Menú: Normal.
Con la opción Informes seleccionada pulsamos el botón de Crear a la derecha . Al
nuevo elemento le damos: Nombre: Imp_Matriculas, Etiqueta: Imp. Matriculas, Tipo de
Elemento de Menú: Normal.

Para ejecutar el informe Matricula.rdf cuando se elija la opción Imp. Matrículas del
menú, tendremos que modificar su propiedad Código del Elemento de Menú con el
siguiente código:

DECLARE
parametros Paramlist;
elemento Item;
BEGIN
/*Buscamos el ítem IDAlumno*/
elemento := Find_Item('IDalumno');

/*Creamos la lista de parámetros*/


parametros := Create_Parameter_List('Param_i');

/*Le añadimos el alumno elegido*/


Add_parameter(parametros,'elegido', TEXT_Parameter,
Get_Item_Property(elemento,DATABASE_VALUE));

74
/*Llamamos al informe de matricula de un alumno*/
Run_PRODUCT(REPORTS,'Matricula',SYNCHRONOUS, RUNTIME,
FILESYSTEM,parametros ,NULL);

/*Limpiamos la la lista de parámetros creados*/


Destroy_Parameter_List(parametros);
END;

En el navegador de objetos, seleccionamos el objeto menú con el que estamos


trabajando y le damos al botón de guardar . Ya sólo nos queda compilarlo
(manteniéndolo seleccionado, nos vamos a Fichero ->Administración -> Compilar
Fichero). Ejecutamos el formulario y probamos si funciona la opción de ver el informe
de las matrículas de un alumno.

75
76
PREGUNTAS FRECUENTES

Preguntas

1. ¿Que versión de Developer instalo?


2. ¿Que versión de Oracle instalo?
3. ¿Cómo conectar Oracle Developer con la base de datos Oracle de la ETSII?
4. ¿Cómo conectar Oracle Developer con la base de datos Oracle de mi ordenador?
5. No consigo conectar con la base de datos Oracle de la ETSII¿Qué pasa?
6. ¿Cómo referenciar a una clave externa con dos campos?
7. ¿Cómo almaceno horas en Oracle o fechas y horas?
8. No me recupera ningún registro desde Developer pero desde Sql Plus al hacer un
select me salen los datos ¿Qué pasa?
9. ¿Cómo usar mis imágenes para decorar los formularios/informes?
10. ¿Cómo generar valores consecutivos (un código) para un campo desde un
formulario?
11. ¿Cómo empezar con el formulario con valores sin tener que pulsar el botón
execute_query/ejecuta_consulta?
12. Utilizo un LOV y al ejecutar el formulario me sale en la barra de estado Lista de
Valores/List of Values pero el LOV no se muestra ¿Por qué?
13. ¿Cómo hacer un acceso identificado para mi aplicación?
14. ¿Como ejecutar un formulario/informe distinto al que estamos usando al pulsar
un botón?
15. ¿Como elegir diferentes opciones de características de un formulario?
16. En un formulario quiero rellenar un campo darle a un botón y que me rellene el
resto de los campos ¿Cómo lo hago?
17. ¿Cómo puedo borrar la tupla actual que se muestra en un formulario pulsando un
botón?
18. Me sale el error FRM-402002: Es obligatorio introducir un valor en el elemento
¿cómo lo quito?
19. ¿Como puedo modelar una relación muchos a muchos ?
20. ¿Cómo hago que un elemento no se pueda modifica (que sólo se muestre)?
21. ¿Cómo usar imágenes de la BD en los formularios?
22. ¿Cómo pasar parámetros a un formulario o a un informe?
23. ¿Cómo usar los parámetros de un informe en la consulta?
24. ¿Cómo quitar la ventana que te pide los parámetros de un informe?
25. ¿Se puede utilizar una lista dinámica para una clave primaria o para una clave
externa utilizada en una relación?
26. Me gustaría que al entrar a un formulario, se realizara automaticamente
Execute_query con un campo relleno. ¿Cómo lo hago?
27. ¿Cómo pasar parametros de un formulario a otro?
28. ¿Cómo saber que valor he escogido de un grupo de Radio Button?
29. ¿Cómo saber si he marcado un checkbox?
30. ¿Cómo incrementar el campo código si uso secuencias?
31. ¿Cómo incrementar el campo código si tengo una letra antes del número?
32. ¿Quiero crear una tabla donde tenga una comprobación de tiempo respecto a la
fecha actual ¿Cómo lo hago?
33. ¿Cómo hago que en mi formulario se vea sólo la parte de una tabla que cumple
determinadas características?

77
34. Tengo una serie de bloques de datos en el mismo formulario y que no están
relacionados (por ejemplo, varias pestañas) y al ejecutar un execute_query
(ejecutar consulta) sólo se me rellena el primero de ellos ¿cómo relleno los
demás?
35. Tengo una especialización y tengo problemas para mostrarla junto su
generalización ¿cómo lo hago?
36. Quiero hacer un insert/update dentro de un disparador, pero no funciona ¿cómo
hago que funcione?
37. ¿Hay que entregar el diseño de la aplicación otra vez?
38. ¿Cómo preparo los ficheros de mi aplicación para que no me den problemas con
las rutas (path)?

Respuestas

1.

¿Que versión de Developer instalo?

Lo más aconsejable es que instales la que hay instalada en las aulas de prácticas
de la ETSII que es la 6i, ya que la presentación de la aplicación se hará en esas
aulas. Si utilizas una versión superior (9i o 10g) seguramente no funcionará y
tendrás que llevarte tu propio ordenador.

2. ¿Que versión de Oracle instalo?

Lo más sencillo es que instales sólo Developer y con éste te conectes a la Base
de Datos de la ETSII, pero para ello necesitas conexión a internet. Si prefieres
trabajar en local sigue las instrucciones del tutorial de instalación.

3. ¿Cómo conectar Oracle Developer con la base de datos Oracle de la ETSII?

Para acceder al servidor Oracle de forma remota se puede hacer usando la


aplicación SQL Net Easy configuration (dependiendo de la versión de
Developer se puede llamar también Oracle Net8 Easy Config o Net
Configuration Assistant). Los pasos que hay que dar son:

o crear/agregar un alias (o un nuevo servicio o configurar los métodos de


nomenclatura), por ejemplo, lo puedes llamar bd2 (se llama alias,
nombre del servicio o nombre del servicio de red)
o que utilice TCP/IP. No cambiar (si lo permite) el puerto por defecto 1521
o Que use como servidor (TCP/IP host name) oracle0.ugr.es

. Sería conveniente comprobar antes que podeis acceder a dicho servidor,


para ello desde MS-Dos (símbolo del sistema) poned "ping
oracle0.ugr.es", si no responde es probable que se haya caido el servidor.

78
o La instancia de la base de datos (database instance o SID de la Base de
datos) es PRACTBD

De esta forma para conectarse a la base de datos (tanto en SQL Plus como en
Developer), te hará falta el usuario, el password y en la cadena de conexión
pones el alias creado (por ejemplo, bd2)

4. ¿Cómo conectar Oracle Developer con la base de datos Oracle de mi


ordenador?

Lo primero es usar el usuario que has creado porque no se conectará con los
usuarios SYS o SYSTEM. Si aún no se conecta, prueba a configurar un alias
(como en el apartado anterior). Donde la instancia de la BD (SID) es la que tú
has creado y el servidor es localhost. De esta forma para conectarse a la base de
datos (tanto en SQL Plus como en Developer), te hará falta el usuario, el
password y en la cadena de conexión pones el alias creado.

5. No consigo conectar con la base de datos Oracle de la ETSII¿Qué pasa?

Suponiendo que se han seguido todos los pasos correctamente y que el


cortafuegos no nos cierra el puerto 1521. Tendremos que asegurarnos que nos
estamos conectando a la red de la universidad de Granada por VPN. En algunos
casos la versión 2005 del Panda Platinum bloquea el acceso a Oracle.

6. ¿Cómo referenciar a una clave externa con dos campos?

Supongamos que tenemos una clave primaria en la tabla Proveedor cuya clave
primaria es Nombre y Dirección y una tabla Distribuye que relaciona la anterior
con una tabla productos y cuyos campos son Nombre, Dirección y
CodigoProducto. La forma de crearla sería la siguente:

CREATE TABLE Distribuye (


Nombre VARCHAR(10), /*Referencia a
Proveedor(Nombre)*/
Direccion VARCHAR(25), /*Referencia a
Proveedor(Nombre)*/
CodigoProdcuto INTEGER REFERENCES
Productos(cod), /*Referencia a Producto(cod)*/

/*La clave primaria son los 3 campos, relación


muchos a muchos)*/
CONSTRAINT ClavePrimariaDistribuye
PRIMARY KEY
(Nombre,Direccion,CodigoProducto),

/*La clave externa son 2 campos de la tabla


proveedor*/
CONSTRAINT ClaveExternaDobleProveedort
FOREIGN KEY (Nombre,Direccion) REFERENCES
Proveedor(Nombre,Direccion)

79
);

7. ¿Cómo almaceno horas en Oracle o fechas y horas?

Usando el tipo de dato DATE y la función SET_DATE, la cual, tiene dos


argumentos uno con la fecha/hora y otro con el formato que sigue esa fecha y
hora. Por ejemplo, si queremos guardar una cita con un cliente un día y a una
hora determinada sería

INSERT INTO Citas


VALUES('11223344X',to_date('6/06/2006:20:00:00','dd/mm/yyyy:hh24
:mi:ss'));

que guardaría una cita con el cliente 11223344X el día 6 de Junio de 2006 a las
20:00 horas. Si queremos guardar sólo la fecha

INSERT INTO Citas


VALUES('11223344X',to_date('6/06/2006','dd/mm/yyyy'));

o sólo la hora

INSERT INTO Citas


VALUES('11223344X',to_date('20:00:00','hh24:mi:ss'));

En developer en la paleta de propiedades de los elementos de Tipo de dato Date


hay una propiedad que nos sirve para poner el formato a usar en la fecha
denominada máscara de formato que utiliza el mismo formato que la función
TO_DATE

8. No me recupera ningún registro desde Developer pero desde Sql Plus al


hacer un select me salen los datos ¿Qué pasa?

Después de crear las tablas y de insertar los datos iniciales tienes que hacer un
commit;

9. ¿Cómo usar mis imágenes para decorar los formularios/informes?

Desde Archivo->Importar->Imagen y desde ahí puedes abrir una imagen que se


te incorpora al formulario o al informe No todos los tipos de formato de imagen
son soportados pero si los más comunes.

10. ¿Cómo generar valores consecutivos (un código) para un campo desde un
formulario?

80
Usando dicho campo (por ejemplo, codigo) en el bloque de datos (por ejemplo,
productos) que se usa, pero no mostrándolo (eso se hace en el asistente de
diseño). Posteriormente desde el disparador PRE-COMMIT escribir SELECT
MAX(codigo)+1 INTO :productos.codigo FROM tabla_productos;

11. ¿Cómo empezar con el formulario con valores sin tener que pulsar el botón
execute_query/ejecuta_consulta?

Poniendo dentro del cuerpo del disparador WHEN-NEW-FORM-INSTANCE la


línea execute_query;

12. Utilizo un LOV y al ejecutar el formulario me sale en la barra de estado


Lista de Valores/List of Values pero el LOV no se muestra ¿Por qué?

Tienes que poner la propiedad de Visualización Automática del LOV a si. Si


quieres que no se visualice automaticamente lo pones a No y cuando quieres que
se visualice pulsas F9.

13. ¿Cómo hacer un acceso identificado para mi aplicación?

Vamos a hacer un acceso identificado para el ejemplo del tutorial, usaremos el


nombre de empleado como login y su edad como contraseña. Lo que vamos a
hacer es utilizar acceso identificado al formulario de recursos humanos (el de loz
lienzos tabulares) Lo primero que haremos será crear un formulario (lo
llamaremos Acceso) con un bloque de datos basado en la tabla Persona dónde se
visualice un sólo registro. Añadiremos un botón Aceptar, otro Limpiar y otro
Salir.

Para que no se nos muestre el password (campo edad) al hacer un


ejecutar_consulta tendremos que irnos a sus propiedades y poner Ocultar Datos
a Si y Elemento de la Base de Datos a No

Para cada botón definiremos un disparador WHEN-BUTTON-PRESSED (para


cada botón no para todo el formulario), donde el codigo del boton Aceptar seria:

DECLARE
cursor usuario is select edad, nombre from persona where
nombre= :persona.nombre;
tipo usuario %rowtype;
ignora number;

BEGIN

open usuario;
fetch usuario into tipo;

if :persona.edad = tipo.edad then


/*Si queremos que no se cierre el formulario de acceso usamos
OPEN_FORM('RecursosHumanos');

81
CLEAR_FORM(NO_VALIDATE);
*/
/*Abrimos el nuevo formulario y cerramos el de acceso*/
CALL_FORM('RecursosHumanos');
exit_form;
else
/*En caso de fallo mostramos un Alert diciendo que hay un
acceso erroneo*/
ignora:=Show_Alert('errorAcceso');
/*Limpiamos para empezar de nuevo*/
CLEAR_FORM(NO_VALIDATE);
end if;

close usuario;
END;

Observamos que cuando se comete un error llama a la Alerta errorAcceso por


tanto hay que crearla. Se puede usar tanto CALL_FORM como OPEN_FORM si
se quiere ver las diferencias o si se quisiera utilizar parámetros al llamar al
formulario, mirar la ayuda en línea de Oracle Developer.

El codigo del boton Borrar sería clear_form(no_validate);y para el botón Salir


seria exit_form;

Si para la contraseña usamos cadenas de texto a la hora de declarar los campos


debe usarse VARCHAR, si usamos CHAR no funcionará.

14. ¿Como ejecutar un formulario/informe distinto al que estamos usando al


pulsar un botón?

Sería de forma análoga como hemos llamado en la pregunta anterior al


formulario Principal desde el formulario Acceso.

15. ¿Como elegir diferentes opciones de características de un formulario?

Con la utilización de parámetros al igual que como se hace en los informes.

16. En un formulario quiero rellenar un campo darle a un botón y que me


rellene el resto de los campos ¿Cómo lo hago?

Supongamos que el campo que queremos rellenar es Nombre (el ejemplo de


lienzos tabulares del tutorial nos sirve). Le damos al botón de Introducir
Consulta (Enter Query) rellenamos el nombre (por ejemplo Ramon) y le damos
al botón de Ejecutar Consulta.

Si queremos no tener que utilizar estos dos botones y hacerlo de forma que sólo
se introduzca el nombre y le demos a un botón, se haría creando un nuevo botón,
al que le asociamos un disparador WHEN-BUTTON-PRESSED donde ponemos

82
de código execute_query; y el disparador WHEN-NEW-FORM-INSTANCE del
formulario añadimos la línea enter_query;.

17. ¿Cómo puedo borrar la tupla actual que se muestra en un formulario


pulsando un botón?

Añadiríamos un botón con un disparador WHEN-BUTTON-PRESSED cuyo


código sería delete_record; y lo que haría sería borrar el registro que se está
visualizando

18. Me sale el error FRM-402002: Es obligatorio introducir un valor en el


elemento ¿cómo lo quito?

Esto ocurre cuando al campo del formulario tiene la propiedad de Obligatorio


puesta a Sí. Basta con cambiarlo a No, pero si lo que se quiere es obligar al
usuario a introducir datos en un campo sin usar esta característica de Oracle, se
tendría que comprobar en un disparador que el contenido no está vacío.

19. ¿Como puedo modelar una relación muchos a muchos ?

Supongamos que tenemos una relación mucho a muchos entre las entidades
Coche, Caracteristicas y la relación Tiene. Si lo hacemos normalmente, creamos
el Bloque de Datos Coche, luego lo relacionamos con Tiene y finalmente
añadimos el Bloque de Datos Caracteristicas relacionado con el Bloque Tiene,
nos va a salir que cada coche tiene una sóla característica, si visualizamos los
campos del bloque de datos Tiene veremos que para cada coche se ven todas sus
entradas de la tabla Tiene y para cada una de estas se muestra sólo una
caracteristica.

Si quisieramos ver todas las características de cada coche las solución más fácil
es crear una vista que aglutine Tiene y Caracteriticas, y a la hora de realizar el
formulario se haga con dos Bloques de Datos uno para Coche y otro para la vista
creada.

20. ¿Cómo hago que un elemento no se pueda modifica (que sólo se muestre)?

Para cada elemento que no quieras que se modifique activale la propiedad


Activado a No

21. ¿Cómo usar imágenes de la BD para los formularios?

Esto lo vamos a hacer de una forma sencilla, en un campo de una tabla


guardaremos la ruta hasta la imagen (path) y en el formulario lo que haremos
será leer desde un fichero la imagen cuya ruta nos da la BD y mostrarla en el

83
formulario. Es importante que esa ruta sea simple (portabilidad de la aplicación
a la ETSII) y que los ficheros con las imágenes existan.

Vamos a suponer que en el ejemplo de la granja tenemos en la tabla persona un


campo llamado Foto, donde guardaremos la ruta hacia la imagen de la persona.
Cuando construyamos el Bloque de Datos sobre la tabla Persona escogeremos
también el campo Foto, pero no los mostraremos.

Una vez con el bloque de datos para Persona creado, en el Editor de Diseño
crearemos un Elemento de Imagen (icono con un paisaje), la cambiaremos el
nombre a, por ejemplo, IMAGENFOTO y le cambiaremos la propiedad
Elemento de Base de Datos a No y la propiedad Obligatoria a No.

Para el bloque de datos Persona crearemos un disparador POST-BLOCK cuyo


código será READ_IMAGE_FILE(:Persona.foto, 'JPG',
'Persona.IMAGENFOTO'); donde le decimos que lea una imagen desde un
fichero (el que le da :Persona.foto) y lo ponga en un elemento de imagen
(llamado 'Persona.IMAGENFOTO'). Si quieres saber más acerca del disparador
POST-BLOCK o de la función READ_IMAGE_FILE mira la ayuda en línea de
Developer.

22. ¿Cómo pasar parámetros a un formulario o a un informe?

Tanto si usamos CALL_FORM, OPEN_FORM(ambos para formularios y que


tiene una forma que acepta una lista de parámetros) o RUN_PRODUCT (que
nos sirve tanto para formularios como para informes) tendremos que definir una
lista de parámetros y añadir los parámetro uno a uno. Por ejemplo:

DECLARE
parametros Paramlist; /*Definimos la lista de parametros*/
BEGIN
/*Creamos la lista de parametros*/
parametros := Create_Parameter_List('datos');

/*Añadimos parametros*/
Add_parameter(parametros,'empleado',TEXT_Parameter,:persona.no
mbre);
Add_parameter(parametros,'tipo',TEXT_Parameter,'Pago');

/*Llamamos a un informe con parametros*/


Run_PRODUCT(REPORTS,'LibroContabilidadEmpleadoTipo',SYNCHRONOU
S, RUNTIME, FILESYSTEM,parametros ,NULL);
END;

En el anterior ejemplo añadimos a la lista de parámetros llamada parametros dos


parametros de texto (TEXT_PARAMETER) cuyo nombre son empleado y tipo
y en el primero le pasamos el valor cogiendo de un campo de un bloque de datos
( persona.nombre) y en el segundo le pasamos una cadena ('Pago').

23. ¿Cómo usar los parámetros de un informe en la consulta?

84
En el Report Builder, Iniciamos el asistente y creamos una consulta temporal
que no utilice los paramétros.

Una vez creada la consulta, desde el navegador de objetos creamos dos


Parámetros del Usuario con sus respectivos nombres y tipos (siguiendo el
ejemplo anterior les ponemos Empleado y Tipo, usando el Tipo de Dato
Cararacter). Ejecutamos el Asitente de Informes y en la pestaña datos
modificamos la consulta para que utilice los parámetros (en nuestro caso sería,
por ejemplo, select * from librocuentas where persona= :empleado AND
tipooperacion= :tipo;)

24. ¿Cómo quitar la ventana que te pide los parámetros de un informe?

Desde el Reports Builder con el informe abierto, nos vamos a herramientas-


>Constructor de Pantalla de Parametros. Dejamos en blanco el Titulo, la Linea
de Indicación y la Línea de Estado, además deseleccionamos aquellos atributos
que estuviesen seleccionados en la lista.

25. ¿Se puede utilizar una lista dinámica para una clave primaria o para una
clave externa utilizada en una relación?

No se debe, ya que la lista está vacía al principio (sólo tiene el valor por defecto)
y posteriormente la rellenas cuando se crea el formulario, si está la clave
primaria vacía o la clave externa vacía no puede recuperar bien los datos de la
base de datos, ni hacer bien las relaciones.

Lo aconsejable sería utilizar bloque LOV.

26. Me gustaría que al entrar a un formulario, se realizara automaticamente


Execute_query con un campo relleno. ¿Cómo lo hago?

Supongamos que lo que queremos hacer es que en el formulario de Recursos


Humanos empiece siempre mostrando al empleado 'Ignacio'. Para ello en el
disparador WHEN-NEW-FORM-INSTANCE del formulario añadimos el
siguiente código:

DECLARE

bloquedatos Block;
BEGIN
/*Nos vamos al bloque de datos en el que queremos hacer la
consulta*/
bloquedatos := Find_Block('Persona');

/*Modificamos la clausula WHERE del bloque de datos*/


Set_Block_Property(bloquedatos,DEFAULT_WHERE, ' nombre =
''Ignacio'' ');

85
/*Ejecutamos la consulta*/
Execute_Query;

END;

27. ¿Cómo pasar parametros de un formulario a otro?

Supongamos que en el formulario de Acceso al darle al botón Aceptar queremos


que se pase el nombre del empleado que se ha identificado de forma que en el
formulario de RecursosHumanos (llamador por Acceso) se nos muestren los
datos de dicho empleado.

Lo primero que tendremos que hacer es modificar el código del botón Aceptar
en el formulario Acceso para que mande el nombre del empleado como
parámetro al llamar al formulario RecursosHumanos:

open usuario;
fetch usuario into tipo;

if :persona.edad = tipo.edad then

/*Creamos la lista de parametros*/


parametros := Create_Parameter_List('datos');

/*Añadimos como parametro la persona que se ha


identificado*/
Add_parameter(parametros,'empleado',TEXT_Parameter,:p
ersona.nombre);

/*Llamamos al formulario de Recursos Humanos*/


Run_PRODUCT(FORMS,'RecursosHumanos',SYNCHRONOUS,
RUNTIME, FILESYSTEM,parametros ,NULL);
/*cerramos el de acceso*/
exit_form;
else
/*En caso de fallo mostramos un Alert diciendo que hay un
acceso erroneo*/
ignora:=Show_Alert('errorAcceso');
/*Limpiamos para empezar de nuevo*/
CLEAR_FORM(NO_VALIDATE);
end if;

close usuario;
END;

Lo segundo que haremos es modificar el formulario de RecursosHumanos para


que se inicialice con la persona que se le pasa como parámetro. Antes de anda
tendremos que definir un nuevo parámetro en el navegador de objetos (dándole a
crear) y le daremos nombre EMPLEADO (el nombre con el que lo llamamos
desde el formulario Acceso) y que sea de tipo carácter. Después modificaremos
el disparador WHEN-NEW-FORM-INSTANCE como en la pregunta anterior
pero cambiando la línea Set_Block_Property(bloquedatos,DEFAULT_WHERE,
' nombre = ''Ignacio'' '); por

86
Set_Block_Property(bloquedatos,DEFAULT_WHERE, ' nombre =
:Parameter.empleado ');.

28. ¿Cómo saber que valor he escogido de un grupo de Radio Button?

Para cada botón de un grupo de Radio buttons tenemos que activar la propiedad
Valor de Botón de Radio a un valor diferente, por ejemplo 1, 2 y 3 si tenemos
tres botones. Posteriormente para saber que valor tiene, si el grupo de botones de
radio se llama GBRADIo y está en el bloque de datos PERSONA, tendremos
que comparar :Persona.gbradio con 0, 1 y 2 para saber que botón es el que está
activado. Para el grupo de Radio buttons (GBRADIO en nuestro caso) habrá que
poner la propiedad ValorInicial a uno de los valores introducidos en los radio
buttón, por ejemplo, 1 para que se marque ese por defecto.

29. ¿Cómo saber si he marcado un checkbox?

Tendremos que inicilizar las propiedades Valor Si Está Comprobado y Valor Si


No Está Comprobado, por ejemplo a 1 y 0, el primero si está marcado y el
segundo para si no lo está. Posteriormente para saber que valor tiene, si el
checkbox se llama MiCheckBox y está en el bloque de datos PERSONA,
tendremos que comparar :Persona.micheckbox con 1 ó 0 para saber si está
activado o no.

30. ¿Cómo incrementar el campo código si uso secuencias?

Igual que cuando lo vimos en la pregunta ¿Cómo generar valores consecutivos


(un código) para un campo desde un formulario? pero podemos poner SELECT
misecuencia.NEXTVAL INTO :productos.codigo FROM dual;

31. ¿Cómo incrementar el campo código si tengo una letra antes del número?

Básicamente como muestra el siguiente código:

DECLARE
cadena1 varchar2(50);
cadena2 varchar2(50);
numero number;

BEGIN
/*Me quedo con la subcadena que tiene el numero*/

cadena1:=substr(:Productos.codigo.texto,2,length(:Productos.codi
go));

/*Lo paso a numero*/


numero:=TO_number(cadena1);

/*Lo incremento*/

87
numero:=numero+1;

/*Lo vuelvo a pasar a cadena*/


cadena2:=TO_CHAR(numero);

/*Le añado la letra la principio*/


cadena1:='T'||cadena2;

/*Actualizo la clave*/
:Prodcutos.codigo :=cadena1;

END;

Hay que tener en cuenta que esto está pensado para códigos que tiene una sóla
letra (la T) antes de un número y que incrementa el que se encuentra en el
formulario (para obtener el maximo a partir de la tabla se podría hacer con un
SELECT INTO con un ORDER BY para que los ordene).

32. ¿Quiero crear una tabla donde tenga una comprobación de tiempo respecto
a la fecha actual ¿Cómo lo hago?

No se puede hacer, ya que no se puede usar SYSTIME en la creación de tablas.


Ten en cuenta que la tabla se crea una vez y usar SYSTIME en una clausula
CHECK sería algo dinámico. Para hacerlo se pueden usar disparadores (triggers)
dentro de la base de datos, pero eso se sale un poco de nuestros objetivos, lo
ideal sería hacer las comprobaciones en nuestra aplicación.

33. ¿Cómo hago que en mi formulario se vea sólo la parte de una tabla que
cumple determinadas características?

Los bloques de datos de nuestros formularios son consultas a la base de datos


pero que no tienen, por defecto, una clausula WHERE. Esta clausula WHERE se
puede definir en la paleta de propiedades de los bloques de datos algo que
hicimos en PL/SQL en las preguntas 24 y 25.

34. Tengo una serie de bloques de datos en el mismo formulario y que no están
relacionados (por ejemplo, varias pestañas) y al ejecutar un execute_query
(ejecutar consulta) sólo se me rellena el primero de ellos ¿cómo relleno los
demás?

Rellenando cada uno por separado en el disparador WHEN-NEW-FORM-


INSTANCE:

Go_Block('librodecuentas');
Execute_Query;
Go_Block('personas');
Execute_Query;
Go_Block('empleados');
Execute_Query;
Go_Block('alojamiento');

88
Execute_Query;

35. Tengo una especialización y tengo problemas para mostrarla junto su


generalización ¿cómo lo hago?

Como cualquier otras dos tablas que están relacionadas, si aún así tienes
problemas puedes usar una vista para unir todos los campos de ambas tablas

36. Quiero hace un un insert/update dentro de un disparador, pero no funciona


¿cómo hago que funcione?

Este problema se suele dar cuando tenemos un bloque de datos a partir de una
tabla de la base de datos y queremos realizar alguna operación sobre dicha
tablas. El problema está en que Forms abre la tabla (para usarla, lógico) y la
bloquea de forma que cualquier operación insert/update sobre dicha tabla fallará.
La única solución a este problema es no usar dicha tabla para construir un
bloque de datos (y contruir el bloque de datos manualmente, rellenando sus
datos desde PL/SQL), o bien, usar el form para añadir/actualizar registros en la
base de datos.

37. ¿Hay que entregar el diseño de la aplicación otra vez?

Si. Hay que entregarlo con los fallos corregidos, que ya se indicaron en su día.

38. ¿Cómo preparo los ficheros de mi aplicación para que no me den


problemas con las rutas (path)?

Lo ideal sería que todos los ficheros estuvieran en un CD y se pudiese ejecutar


desde ahí. Aunque también se puede optar por guardar todos los ficheros en un
directorio (o estructura sencilla) que cuelgue de C: e indicarlo de forma muy
clara en la entrega.

89

También podría gustarte