Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Instalación
Forms
Reports
1
INDICE
2
INICIO
• 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.
Base de Datos
3
De donde obtenemos las siguientes tablas:
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:
Las instrucciones que se dan se han probado usando como sistema operativo Windows
XP SP2 versión de 32 bits.
5
Para no tener problemas se aconseja seguir uno a uno los pasos de forma escrupulosa,
dichos pasos son:
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
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
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.
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
• 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.
12
• Cuando nos pregunta por el tipo de instalación seleccionamos Typical
• 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.
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:
15
Por ejemplo:
Si todo sale bien nos dirá primero que el usuario ha sido creado y que la concesión ha
terminado correctamente.
• 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.
• 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:
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:
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
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.
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:
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.
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
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.
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:
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.
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
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.
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.
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:
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.
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.
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.
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).
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.
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.
DECLARE
boton NUMBER;
BEGIN
/*Mostramos la alerta BIENVENIDA y
guardamos el botón pulsado*/
boton := Show_Alert('Bienvenida');
/*Rellenamos el formulario*/
Execute_Query;
51
END;
De esta forma, al ejecutar el formulario nos debería salir, algo parecido a
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:
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:
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;
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');
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 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.
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
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');
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.
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');
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
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:
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.
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".
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);
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:
70
Escogemos la plantilla predefinida NCA yellow y le damos a Terminar. Qué no se te
olvide guardarlo cómo matriculas.rdf
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.
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:
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');
74
/*Llamamos al informe de matricula de un alumno*/
Run_PRODUCT(REPORTS,'Matricula',SYNCHRONOUS, RUNTIME,
FILESYSTEM,parametros ,NULL);
75
76
PREGUNTAS FRECUENTES
Preguntas
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.
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.
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.
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)
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.
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:
79
);
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
o sólo la hora
Después de crear las tablas y de insertar los datos iniciales tienes que hacer un
commit;
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?
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;
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;
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;.
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)?
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.
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.
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');
84
En el Report Builder, Iniciamos el asistente y creamos una consulta temporal
que no utilice los paramétros.
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.
DECLARE
bloquedatos Block;
BEGIN
/*Nos vamos al bloque de datos en el que queremos hacer la
consulta*/
bloquedatos := Find_Block('Persona');
85
/*Ejecutamos la consulta*/
Execute_Query;
END;
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;
close usuario;
END;
86
Set_Block_Property(bloquedatos,DEFAULT_WHERE, ' nombre =
:Parameter.empleado ');.
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.
31. ¿Cómo incrementar el campo código si tengo una letra antes del número?
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 incremento*/
87
numero:=numero+1;
/*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?
33. ¿Cómo hago que en mi formulario se vea sólo la parte de una tabla que
cumple determinadas características?
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?
Go_Block('librodecuentas');
Execute_Query;
Go_Block('personas');
Execute_Query;
Go_Block('empleados');
Execute_Query;
Go_Block('alojamiento');
88
Execute_Query;
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
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.
Si. Hay que entregarlo con los fallos corregidos, que ya se indicaron en su día.
89