MANUAL ORACLE DEVELOPER ESPAÑOL.pdf
MANUAL ORACLE DEVELOPER ESPAÑOL.pdf
MANUAL ORACLE DEVELOPER ESPAÑOL.pdf
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>ORACLE</strong> <strong>DEVELOPER</strong><br />
Instalación<br />
Forms<br />
Reports<br />
1
INDICE<br />
Inicio …………………………………. Pag 3<br />
Instalación ……………………………. Pag 5<br />
Forms Developer ……………………... Pag 23<br />
Reports Developer …………………… Pag 65<br />
Preguntas Frecuente …………………. Pag 77<br />
2
INICIO<br />
En este tutorial se explicará la utilización de Oracle Developer para la realización de las<br />
prácticas de Bases de Datos 2. Oracle Developer es una herramienta visual para la<br />
creación fácil de aplicaciones que trabajen sobre la base de datos Oracle.<br />
Dentro de Oracle Developer, distinguiremos dos partes fundamentalmente:<br />
1. Forms Developer: Nos va a permitir construir formularios con los que<br />
podremos acceder a la Base de Datos. En dichos formularios podremos hacer<br />
consultas, modificaciones, inserciones y borrados sobre elementos de la base de<br />
datos.<br />
2. Reports Developer: Nos va a permitir construir informes con los que podremos<br />
presentar e imprimir los datos de una forma ordenada y con un formato<br />
visualmente agradable.<br />
Dentro de este tutorial se distinguen los siguientes apartados:<br />
• Instalación:<br />
En esta sección veremos como instalar la base de datos Oracle y/o<br />
la herramienta Oracle Developer en nuestro ordenador personal. Eso no es<br />
necesario ya que las prácticas se pueden realizar dentro las prácticas utilizando<br />
la partición orag, pero puede ser útil para un mayor conocimiento de las<br />
herramientas o para organizarse de forma personalizada.<br />
• Tutorial Forms Developer:<br />
En este tutorial veremos como crear distintos tipos<br />
de formularios y con distintas opciones<br />
• Tutorial Reports Developer:<br />
En este tutorial veremos como crear distintos<br />
tipos de informes y como conectarlos con los formularios creados con Forms<br />
Developer.<br />
• Preguntas frecuentes:<br />
Conjunto de preguntas con sus respectivas respuestas de<br />
dudas que suelen aparecer frecuentemente en el uso de Oracle Developer.<br />
Si se quiere ampliar conocimientos sobre el uso de Oracle Developer se puede consultar<br />
el tutorial de la Granja El Cerdito Valiente, que se ha utilizado en años anteriores y<br />
la sección de preguntas frecuentes.<br />
Base de Datos<br />
En este tutorial seguiremos con el ejemplo de la Facultad de Estudios Avanzados<br />
centrándonos en una parte del mismo. Del diagrama Entidad/Relación nos quedaremos<br />
con el siguiente trozo para ilustrar el uso de Oracle Developer:<br />
3
De donde obtenemos las siguientes tablas:<br />
• Persona: PID, nombre, apellido1, apellido2, direccion, cp, localidad, provincia,<br />
telefono, email, lugarNacimiento, fechaNacimiento, NIF, sexo, nacionalidad<br />
• Alumno: PID, login, password, familiaNumerosa, centroProcedencia, acceso,<br />
notaAcceso<br />
• Profesor: PID, login, password, categoria, fechaAlta, departamento, despacho,<br />
telefonoDpcho<br />
• Matricula: IDMatricula, IDAlumno, tipo, numeroPlazos, fechaExpedicion,<br />
curso, PID<br />
• Pago: IDPago, cantidad, abonado, fechaPago, IDMatricula<br />
• Asignatura: nombre, creditosTeoricos, creditosPracticos, tipo, cuatrimestre<br />
• DetalleMatricula: IDMatricula, nombre<br />
Para el diseño físico de la base de datos tenemos tres ficheros:<br />
• CreaBD.sql:<br />
Fichero que contiene el conjunto de sentencias SQL necesario para<br />
crear la base de datos.<br />
• DatosBD.sql:<br />
Fichero que contiene el conjunto de sentencias SQL que<br />
inicializan la base de datos con unas cuantas tuplas de ejemplo.<br />
• BorraBD.sql:<br />
Fichero que contiene el conjunto de sentencias SQL que borra la<br />
base de datos.<br />
4
Introducción<br />
INSTALACION<br />
En esta parte del tutorial se explicará como instalar Oracle 9i Personal Edition y Oracle<br />
Developer 6i (Forms Developer y Reports Developer) para poder tener disponibles<br />
dichas herramientas en nuestro ordenador personal.<br />
En principio no hará falta instalar ningún software en el ordenador personal, ya que las<br />
prácticas se han configurado y temporizado para su realización en las instalaciones de la<br />
E.T.S.I.I. Sin embargo, aquellos alumnos que deseen profundizar en el conocimiento de<br />
estas herramientas u organizar su trabajo de forma personalizada, pueden acceder de<br />
forma gratuita a las mismas, para uso docente.<br />
1 Opciones de Instalación<br />
Primero tenemos que decidir que tipo de instalación queremos hacer, para ello tenemos<br />
distintas posibilidades:<br />
1. Instalar sólo Oracle Developer y acceder al servidor Oracle de la E.T.S.I.I. Para<br />
ello nos hará falta una conexión a Internet. Esta es la opción recomendada para<br />
ordenadores con poca potencia/memoria pero que dispongan de una conexión<br />
Internet<br />
2. Instalar Oracle 9i Personal Edition y Oracle Developer 6i, de esta forma no nos<br />
hará falta una conexión y la realización de las prácticas no dependerá de posibles<br />
caídas de red o del servidor. Tengamos en cuenta que sería conveniente tener<br />
una máquina con al menos 256MB o 512MB de memoria RAM, 1Ghz de<br />
velocidad del microprocesador y unos 8GB de espacio libre en el disco duro.<br />
3. Si tenemos un ordenador poco potente (menos de 1Ghz) o con poca memoria<br />
(menos de 256Mb) y sin conexión a Internet, podemos optar por la instalación<br />
de otras versiones de Oracle, para ello consultaremos la Guía de instalación de<br />
Oracle usada en años anteriores.<br />
De esta forma si queremos instalar la base de datos Oracle y Oracle Developer<br />
tendremos que seguir todos los pasos de este tutorial a excepción, quizás del último (7)<br />
que nos sirve para utilizar la base de datos del servidor de la escuela (si se dispone de<br />
conexión a Internet sería interesante que se probaran tanto la base de datos local como<br />
la del servidor de la escuela).<br />
Si tenemos una conexión a Internet y sólo queremos instalarnos Oracle Developer y<br />
usar la base de datos de la escuela tendremos que realizar los pasos 3,4 y 7.<br />
2 Instalación de Oracle Database 9i Personal Edition<br />
Las instrucciones que se dan se han probado usando como sistema operativo Windows<br />
XP SP2 versión de 32 bits.<br />
Primero tendremos que comprobar en el Panel de Control (subapartado conexiones de<br />
red) que tenemos instalado el protocolo TCP/IP (si accedemos a Internet ya lo<br />
tendremos instalado)<br />
5
Para no tener problemas se aconseja seguir uno a uno los pasos de forma escrupulosa,<br />
dichos pasos son:<br />
• Descargarnos Oracle9i Database Release 2 Enterprise/Standard/Personal Edition<br />
for Windows NT/2000/XP desde la página web de Oracle. Téngase en cuenta<br />
que para ello tendremos que aceptar las condiciones de la licencia y estar dados<br />
de alta previamente en la página web de Oracle .<br />
• Creamos tres directorios llamados Disk1, Disk2 y Disk3y descargamos los tres<br />
ficheros que hay en la página web:<br />
o 92010NT_Disk1.zip (612,802,971 bytes)<br />
o 92010NT_Disk2.zip (537,604,934 bytes)<br />
o 92010NT_Disk3.zip (254,458,106 bytes)<br />
cada fichero lo guardamos en su directorio correspondiente.<br />
• Descomprimimos cada fichero descargado en cada uno de los directorios.<br />
Dentro de Disk1, ejecutar Setup.exe. Nos aparecerá la pantalla de bienvenida,<br />
pulsamos el botón Siguiente<br />
6
• Nos aparecerá la pantalla de Ubicación de Ficheros de origen y destino, no se<br />
aconseja cambiar nada, quedándonos con el valor por defecto (c:\oracle\ora92\)<br />
y si lo cambiáramos por cualquier motivo (p.e. motivos de espacio) lo tendremos<br />
en cuenta a la hora de interpretar el tutorial. Pulsamos el botón Siguiente<br />
• Posteriormente se nos muestra la pantalla de selección de tipo de instalación,<br />
escogemos Personal Edition y pulsamos el botón Siguiente<br />
7
• Nos preguntará el tipo de configuración de la Base de Datos según el uso que le<br />
demos, escogemos Uso General y pulsamos el botón Siguiente<br />
• Nos preguntará por el puerto a usar por Oracle MTS Recovery Service, dejamos<br />
el valor por defecto (2030) y pulsamos el botón Siguiente<br />
8
• Posteriormente nos pedirá el nombre de la base de datos global y el SID<br />
(Identificador de Sistema de Oracle), utilizamos los valores que se muestran en<br />
la imagen (progBD2.localhost y progBD2) y pulsamos el botón Siguiente.<br />
9
• Nos pregunta por la Ubicación de los archivos de datos, dejamos el valor por<br />
defecto y pulsamos el botón Siguiente<br />
• Nos permite cambiar el juego de caracteres, dejaremos que utilice el juego de<br />
caracteres por defecto y pulsamos el botón Siguiente<br />
• Finalmente nos aparece un pequeño resumen con distintas opciones de la<br />
instalación, pulsamos el botón Instalar<br />
10
• Después de un rato instalándose y configurándose nos pedirá las contraseñas<br />
para los superusuarios de la base de datos (SYS y SYSTEM). Ten en cuenta que<br />
estas contraseñas no debemos olvidarlas. Podemos usar la misma para ambos<br />
superusuarios.<br />
• Si no ha habido ningún problema nos aparecerá la pantalla de Fin de la<br />
instalación, pulsamos el botón Salir<br />
11
3 Instalación de Oracle Forms Developer<br />
Nos descargarnos Oracle Forms Developer desde la página web de Oracle. Nos<br />
bajaremos la versión 6i release 2 para Windows XP. Téngase en cuenta que para ello<br />
tendremos que aceptar las condiciones del contrato y estar dados de alta previamente en<br />
la página web de Oracle<br />
Una vez descargado, tendremos un fichero comprimido llamado 6i_rel2_xp.zip (si no<br />
le hemos cambiado el nombre al descargarlo). Lo descomprimimos y ejecutamos<br />
Setup.exe. Seguimos los siguientes pasos:<br />
• Lo primero que nos aparece es una ventana para que introduzcamos algunas<br />
definiciones de instalación, cogemos los mismos valores que en la imagen y le<br />
damos a Ok.<br />
• Nos pregunta que herramienta instalar, seleccionamos Oracle Forms Developer<br />
y le damos la botón Aceptar/OK.<br />
12
• Cuando nos pregunta por el tipo de instalación seleccionamos Typical<br />
• Cuando nos pregunta si queremos instalar Forms Server, seleccionamos No<br />
• Le damos a Aceptar un par de veces y ya hemos instalado Oracle Forms<br />
Developer.<br />
4 Instalación de Oracle Reports Developer<br />
Usando el mismo fichero Setup.exe obtenido a partir de descomprimir el fichero<br />
6i_rel2_xp.zip también podremos instalar Oracle Reports Developer<br />
• Lo primero que nos aparece es una ventana para que introduzcamos algunas<br />
definiciones de Instalación de Oracle, cogemos los mismos valores que en la<br />
imagen y le damos a Ok.<br />
13
• Nos pregunta que herramienta instalar, seleccionamos "Oracle Reports<br />
Developer" y le damos la botón Aceptar.<br />
• Cuando nos pregunta por el tipo de instalación seleccionamos Typical<br />
• Cuando nos pregunta si queremos instalar Reports Server, seleccionamos No<br />
14
• Le damos a Aceptar un par de veces y ya hemos instalado Oracle Reports<br />
Developer.<br />
5 Creación de Usuarios<br />
Vamos a crear un usuario sin privilegios para poder trabajar sin complicaciones en<br />
nuestra base de datos, para ello utilizaremos la herramienta SQL Plus, que la podremos<br />
encontrar en el grupo de programas Oracle-OraHome92 en Application Development-<br />
>SQL Plus<br />
Nos pedirá que nos identifiquemos, entramos como el superusuario system y con la<br />
contraseña que dimos durante la configuración. Pulsamos el botón Aceptar.<br />
Una vez identificados en SQL Plus vamos a crear un usuario, se recomienda que la<br />
cuenta de usuario tenga el mismo nombre que la que tenéis en la BD de la Escuela y<br />
trabajar sobre ella. Esto se puede hacer, con las siguientes sentencias:<br />
create user identified by default<br />
tablespace users temporary tablespace temp quota 4M on<br />
users quota 1M on temp;<br />
grant connect, resource to ;<br />
15
Por ejemplo:<br />
Si todo sale bien nos dirá primero que el usuario ha sido creado y que la concesión ha<br />
terminado correctamente.<br />
6 Conexión de Oracle Developer con la Base de Datos instalada en nuestro<br />
ordenador<br />
Para acceder al servidor Oracle lo vamos a hacer añadiendo un nombre de servicio (o<br />
alias), usando para ello la aplicación Oracle Net8 Easy Config, que la podremos<br />
encontrar en el grupo de programas Oracle para Windows NT-developer<br />
Los pasos que hay que dar son:<br />
• Añadir un nuevo servicio, por ejemplo, lo puedes llamar casa y pulsas siguiente<br />
16
• El protocolo que va a usar es TCP/IP (Protocolo Internet).<br />
• El nombre del host será localhost y el número de puerto es 1521(el valor por<br />
defecto, no cambiar)<br />
17
• El identificador del sistema (SID de la Base de datos) es el que hemos<br />
introducido en la instalación, esto es, PROGBD2<br />
• Ya sólo nos hace falta probar que la conexión funciona perfectamente, para ello<br />
usaremos el usuario creado recientemente<br />
De esta forma para conectarse a la base de datos (con las distintas herramientas de<br />
Developer), te hará falta el usuario que has creado, el password y en la cadena de<br />
conexión pones el alias creado (en este ejemplo, casa). Por ejemplo, si utilizamos la<br />
versión de SQL Plus que viene con developer y que podrás encontrar el grupo de<br />
programas Oracle para Windows NT-developer tendrás que poner dicha cadena de<br />
conexión, por ejemplo:<br />
18
Puede que algún cortafuegos (firewall) nos de problemas al usar el puerto 1521, si ese<br />
es el caso se debe permitir la utilización de ese puerto en el cortafuegos.<br />
7 Conexión de Oracle Developer con la Base de Datos de la ETSII<br />
Para acceder al servidor Oracle lo vamos a hacer añadiendo un nombre de servicio (o<br />
alias), usando para ello la aplicación Oracle Net8 Easy Config, que la podremos<br />
encontrar en el grupo de programas Oracle para Windows NT-developer<br />
Los pasos que hay que dar son:<br />
• Añadir un nuevo servicio, por ejemplo, lo puedes llamar UGR y pulsas siguiente<br />
19
• El protocolo que va a usar es TCP/IP (Protocolo Internet).<br />
• El nombre del host será oracle0.ugr.es. Sería conveniente comprobar antes que<br />
podéis acceder a dicho servidor, para ello desde MS-Dos (símbolo del sistema)<br />
poned "ping oracle0.ugr.es", si no responde es probable que se haya caído el<br />
servidor.<br />
El número de puerto es 1521(el valor por defecto, no cambiar)<br />
20
• El identificador del sistema (SID de la Base de datos) es PRACTBD<br />
• Ya sólo nos hace falta probar que la conexión funciona perfectamente, para ello<br />
usaremos nuestro usuario y contraseña que tenemos en la base de datos de la<br />
ETSII<br />
De esta forma para conectarse a la base de datos (con las distintas herramientas de<br />
Developer), te hará falta el usuario de la escuela, su password y en la cadena de<br />
conexión pones el alias creado (en este ejemplo, UGR). Por ejemplo, si utilizamos la<br />
versión de SQL Plus que viene con developer y que podrás encontrar el grupo de<br />
21
programas Oracle para Windows NT-developer tendrás que poner dicha cadena de<br />
conexión, por ejemplo:<br />
Puede que algún cortafuegos (firewall) nos de problemas al usar el puerto 1521, si ese<br />
es el caso se debe permitir la utilización de ese puerto en el cortafuegos.<br />
22
1 Formulario Personas-Alumnos<br />
FORMS <strong>DEVELOPER</strong><br />
Vamos a hacer un primer formulario que nos va a permitir introducir nuevos alumnos<br />
en la base de datos, además de poder consultar, modificar y borrar los que ya existen.<br />
Para ello realizaremos una serie de pasos:<br />
1. Crear el bloque de datos Persona que muestra una única persona<br />
2. Crear el bloque detalle Alumno asociado a cada persona<br />
1.1 Bloque Maestro Persona<br />
Ejecutar Form Builder, que es la herramienta para construir formularios<br />
Lo primero que nos saldrá será una pantalla de bienvenida con diversas opciones,<br />
nosotros escogeremos Utilizar el Asistente de Bloques de Datos y le damos al botón<br />
Aceptar.<br />
Nos sale otra bienvenida, la ignoramos y pulsamos el botón Siguiente, donde nos<br />
preguntará el tipo de nuestro bloque de datos, nosotros utilizaremos siempre Tabla o<br />
Vista, pulsamos Siguiente<br />
23
Ahora nos pedirá la tabla o vista que queremos utilizar, para seleccionarla le damos al<br />
botón examinar, en este momento nos pedirá que nos conectemos a la base de datos,<br />
para ello metemos nuestro usuario, contraseña y en Base de Datos el alias que hemos<br />
creado en la fase de instalación (casa para la base de datos local, ugr para la base de<br />
datos de la escuela y si estamos en las aulas de prácticas la dejamos en blanco). Por<br />
ejemplo:<br />
Si nos hemos identificado correctamente nos saldrá una lista con las tablas y vistas del<br />
usuario con el que nos hemos conectado, seleccionamos la tabla Persona y pulsamos<br />
Aceptar. En la columna de la izquierda tenemos los atributos de la tabla seleccionada y<br />
en la de la derecha los atributos que queremos utiliza. Inicialmente la columna de la<br />
derecha está vacía, así que nos llevamos todos los atributos a la columna de la derecha y<br />
le damos al botón Terminar.<br />
24
Ya hemos terminado de usar el Asistente de Bloques de Datos y comenzamos el<br />
Asistente de Diseño que nos dará la bienvenida, le damos al botón Siguiente. Nos<br />
preguntará por el Lienzo y tipo de Lienzo, lo ignoramos y le damos al botón Siguiente.<br />
Nos aparecerá una ventana don dos columnas para seleccionar los atributos que<br />
deseamos visualizar. En principio, los vamos a visualizar todos, así que nos los<br />
llevamos todos a la columna de la derecha.<br />
Ahora nos preguntará el Prompt (que es la cadena que sale en el formulario), el ancho y<br />
el alto para cada atributo. Dejamos los valores de ancho y alto que nos salen excepto<br />
para PID que le ponemos un ancho de 20 y en la parte del Prompt, cambiamos<br />
"Lugarnacimiento" por "Lugar de Nacimiento" y "Fechanacimiento" por "Fecha de<br />
Nacimiento" y le damos al botón Terminar.<br />
25
Como resultado ya tenemos nuestro primer bloque de datos.<br />
Una vez terminado los asistentes de datos y diseño, nos aparecen dos subventanas<br />
dentro de Forms Builder, el Navegador de Objetos que es una ventana con estructura<br />
de árbol que nos muestra todos los elementos de nuestro formulario y el Editor de<br />
Diseño que nos permite ver el aspecto de nuestro formulario y lo que es más<br />
importante, modificarlo.<br />
26
Si no nos aparecen en algún momento, tanto el Navegador de Objetos como el Editor de<br />
Diseño, siempre los podemos llamar desde el menú Herramientas. Dentro del editor de<br />
diseño vamos a cambiar el prompt de "Apellido1" por "Primer Apellido" y "Apellido2"<br />
por "Segundo Apellido". También cambiaremos el tamaño de la entrada del PID, que es<br />
demasiado grande para almacenar tan sólo un número. Podemos hacer todos los<br />
cambios que consideremos necesarios en el diseño para que se quede a nuestro gusto.<br />
(Ten en cuenta que para deshacer se usan las teclas CTRL+Z)<br />
27
Podemos observar que cuando seleccionamos algo en el editor de diseño cambia la<br />
posición en el Navegador de objetos, de forma que se va al elemento seleccionado. Si en<br />
el editor de diseño hacemos doble click sobre cualquier elemento nos saldrá la Paleta<br />
de Propiedades de dicho elemento. La paleta de propiedades de un elemento es, como<br />
su nombre indica, las distintas propiedades que puede tener un elemento y que ya<br />
iremos viendo poco a poco.<br />
Ahora vamos a ejecutar nuestro formulario, para ello pulsamos el icono del semáforo<br />
verde (aparece tanto en el editor de diseño como en el navegador de objetos o en el<br />
menú, Programa->Ejecutar Pantalla->Cliente/Servidor). Lo que hace es llamar al Oracle<br />
Forms Runtime que se encarga de ejecutar el formulario.<br />
28
Los distintos botones de Oracle Forms Runtime que queremos destacar son:<br />
• Guardar: Este botón nos permite almacenar las modificaciones hechas en un<br />
registro, las nuevas tuplas creadas y las entradas eliminadas. Es como un commit<br />
en la base de datos.<br />
• Salir: Con este botón nos salimos de la ejecución del formulario.<br />
• Ejecutar consulta: Con este botón ejecutamos una consulta sobre la base de<br />
datos en función del contenido del formulario, si no tienen ningún valor, nos<br />
permite consultar todos los registros.<br />
• Introducir consulta: Nos permite introducir una consulta para traernos<br />
aquellas tuplas de la base de datos que cumplan una determinada condición.<br />
• Bloque anterior: Sirve para irnos al anterior bloque de datos, cuando hay<br />
más de uno.<br />
• Registro anterior: Nos permite irnos al anterior registro, cuando hay más<br />
de uno.<br />
• Registro siguiente: Sirve para irnos al siguiente registro, cuando hay más de<br />
uno.<br />
• Bloque siguiente: Nos permite irnos al siguiente bloque de datos, cuando<br />
hay más de uno.<br />
• Insertar registro: Este botón sirve para añadir un nuevo registro a la tabla.<br />
• Suprimir registro: Con este botón podemos borrar el registro que se<br />
muestra.<br />
Prueba a darle al botón de Ejecutar Consulta, muévete por los registros, crea uno nuevo,<br />
modifica alguno de los anteriormente creados y borra el último que hayas creado. Para<br />
29
ver que los cambios se producen en la base de datos, haz consultas sobre la tabla<br />
personas desde SQL Plus<br />
Ya sólo nos hace falta guardar el formulario para poder utilizarlo en un futuro, para ello<br />
le damos a la opción del menú Fichero->Guardar y le damos de nombre, por ejemplo,<br />
persona.fmb. Ten en cuenta que si lo guardas en la unidad C en el aula de prácticas no<br />
podrás reutilizar este formulario.<br />
Si modificas el valor del atributo Sexo de cualquier registro poniendo, por ejemplo, una<br />
X y le damos al botón de guardar. En la barra de estado (abajo) de Oracle Forms<br />
Runtime nos saldrá un error diciendo que Oracle no puede actualizar el registro, eso es<br />
debido a que es campo sólo puede tomar dos valores H o M, pues al crear la base de<br />
datos forzamos mediante la cláusula CHECK IN que así fuera. Para evitar problemas, ya<br />
que puede que el usuario no sepa quw valores son los permitidos, vamos a utilizar una<br />
lista desplegable para este atributo.<br />
Para ello, en el navegador de objetos nos vamos al bloque de datos Persona y de ahí al<br />
elemento Sexo, lo seleccionamos con el ratón y le damos al botón derecho, del menú<br />
contextual que nos aparece seleccionamos Paleta de Propiedades (Otra forma de acceder<br />
a la Paleta de Propiedades del elemento Sexo, es pulsándolo dos veces en el Editor de<br />
Diseño como ya sabes). Cambiaremos el atributo Tipo de Elemento a Elemento de<br />
Lista y el atributo Correspondencia con otros valores lo ponemos a M(sería el valor<br />
por defecto).<br />
Ahora cambiamos la propiedad Elementos de la lista donde nos saldrá una subventana<br />
con dos partes, en la primera será cada uno de los valores de la lista que se muestran, y<br />
el campo de abajo para cada uno de esos valores que se muestran los valores que se<br />
almacenan en la base de datos, de esta forma, en la lista de valores que se muestran<br />
pondremos Hombre y Mujer y los valores correspondientes que se guardarán serán,<br />
lógicamente, H y M<br />
EJERCICIO: Hacer un formulario que nos permita consultar, introducir, borrar y<br />
modificar las asignaturas<br />
1.2 Bloque detalle Alumno<br />
30
Seguimos con el formulario persona con el que hemos estado trabajando anteriormente.<br />
Seleccionamos, en el navegador de objetos, el bloque de datos Persona y pulsamos en el<br />
navegador de objetos el botón de crear . De esta forma crearemos un nuevo bloque<br />
de datos (detalle) asociado al bloque de datos seleccionado (Persona - Maestro)<br />
Nos preguntará que cómo queremos crear el nuevo bloque de datos, le decimos que<br />
queremos utilizar el asistente de bloques de datos<br />
Escogeremos la tabla Alumno y nos quedaremos con todos sus atributos, después de<br />
pulsar Siguiente nos aparecerá una ventana donde crear la relación maestro-detalle. Le<br />
daremos al botón Crear Relación (el tipo de la relación será basada en una condición de<br />
unión), escogeremos la tabla Persona (la única que nos parece en la lista) y le damos a<br />
Aceptar. Como elemento detalle y como elemento maestro escogeremos el atributo PID.<br />
Marcamos la casilla de Unir Automáticamente bloques de datos.<br />
31
Le damos a Terminar para iniciar el asistente de diseño. Los atributos que se mostrarán<br />
serán todos menos el PID, puesto que éste ya se nos muestra en la tabla de persona. En<br />
el tamaño de cada campo, modificamos el de la nota de acceso, le ponemos un tamaño<br />
de 20. Le daremos al botón Terminar.<br />
Una vez terminado el asistente de diseño, desde el editor de diseño adecuaremos el<br />
aspecto visual del formulario a nuestro gusto. Cuando lo ejecutemos nos daremos<br />
cuenta que los campos de los alumnos sólo se nos rellenarán cuando estemos<br />
moviéndonos por una persona que sea un alumno. Esto tiene el inconveniente de que<br />
nos muestra también aquellas personas que no son alumnos (o sea, los profesores).<br />
32
Nota: Para que nos muestre tan sólo a los alumnos, vamos a restringir los elementos que<br />
nos traemos en el bloque de datos Persona. Supongamos que en SQL sólo queremos<br />
obtener aquellas personas que son alumnos, una forma de hacerlo es con la siguiente<br />
consulta:<br />
SELECT * FROM persona WHERE pid IN (SELECT pid FROM alumno)<br />
Si nos vamos a la Paleta de Propiedades del bloque de datos Persona, en el apartado<br />
Base de Datos, encontramos la propiedad Cláusula WHERE que inicialmente está vacía.<br />
Si la rellenamos con pid IN (SELECT pid FROM alumno), al ejecutar de nuevo el<br />
formulario sólo nos mostrará a los alumnos.<br />
¡Qué no se te olvide guardarlo!<br />
EJERCICIO: Hacer un formulario maestro detalle para los profesores de forma<br />
análoga a como hemos realizado el ejemplo anterior. Será más fácil si no<br />
modificas el diseño hasta que no tienes los bloques maestro y detalle.<br />
33
Nota: Si queremos que cuando ejecutemos un formulario no tengamos que pulsar el<br />
botón Ejecutar Consulta para empezar a visualizar los registros vamos a hacer que lo<br />
haga de forma automática cuando cree el formulario. Para ello, en el navegador de<br />
objetos, nos vamos a Disparadores y pulsamos el botón de crear , seleccionamos el<br />
disparador WHEN-NEW-FORM-INSTANCE y pulsamos el botón de Aceptar.<br />
En la ventana de Editor PL/SQL escribimos la línea<br />
34
execute_query;<br />
que si nos fijamos es ejecutar_consulta en inglés, le damos al botón Compilar y luego a<br />
Cerrar. De esta forma cada vez que ejecutemos el formulario no tendremos que pulsar el<br />
botón Ejecutar Consulta para ver los registros.<br />
2 Formulario Matrícula<br />
Vamos a hacer un formulario maestro-detalle, donde el maestro será la tabla Matrícula y<br />
el detalle la tabla DetalleMatrícula. En este formulario podremos borrar/añadir<br />
asignaturas a una matrícula. Vamos a hacerlo de forma similiar a como hemos realizado<br />
el anterior ejemplo, pero con dos pequeñas diferencias.<br />
En el asitente de diseño, para el bloque maestro, escogemos un estilo de diseño<br />
Pantalla, pulsamos Siguiente y al marco le damos el título de Matrícula, después<br />
pulsamos Terminar.<br />
35
La segunda diferencia, es que en el asistente de diseño,para el bloque detalle (que es la<br />
tabla DetalleMatricula), escogemos un estilo de diseño Tabular, pulsamos Siguiente<br />
y al marco le damos el título de Asignaturas, los registros visualizado serán 10 y<br />
marcaramos la casilla de Visualizar Barra de Desplazamiento, después pulsamos<br />
Terminar.<br />
De esta forma y retocando un poco con el editor de diseño debería quedar algo parecido<br />
a:<br />
36
Este formulario queda bastanta poco intuitivo y dificil de utilizar, para ello vamos a<br />
realizar varios cambios, el primero será realizar una lista estática para el campo Tipo, de<br />
forma que aparezcan las opciones: Ordinaria, Libre, Personal Universidad y que, en<br />
realidad, en la base de datos se almacene los valores O, L,U (respectivamente). Y el<br />
número de plazos, otra lista, que tome los valores 1 ó 2.<br />
La siguiente mejora será utilizar una lista desplegable como las usadas en Tipo y en<br />
Número de plazos, para las asignaturas, de forma que podamos ver en la lista el nombre<br />
de la asignatura y no haga falta conocer el nombre de todas las asignaturas. Observa<br />
que, con los conocimientos que tenemos, para cada asignatura que se añada a la base de<br />
datos tendríamos que cambiar el diseño de nuestro formulario, de forma que incluyese<br />
la nueva asignatura como una opción más de la lista. Esto no es realista es un entorno<br />
normal, es decir, no se cambia la aplicación cuando se cambia la base de datos, no<br />
tendría sentido. Para esto vamos a realizar listas dinámicas a contraposición de las<br />
usadas hasta hora que son estáticas. Las listas dinámicas se construirán cada vez que<br />
ejecutemos el formulario a partir de los valores almacenados en la base de datos.<br />
Construiremos una lista dinámica para la parte de asignaturas a partir de la tabla<br />
Asignaturas. Para ello, lo primero que tenemos que hacer es definir el campo Nombre<br />
de DetalleMatrícula como Elemento de Lista. Usaremos un valor por defecto conocido<br />
37
y rellenaremos la lista con un sólo valor (esto es para que forms developer no nos diga<br />
que la lista está mal), para esto podemos usar el valor por defecto Base de Datos<br />
(Correspondencia con otros valores), y en la lista podemos añadir el elemento Base de<br />
Datos y que almacene Base de Datos en la base de datos.<br />
Ya tenemos una lista estática que si compilamos el formulario no nos sirve de nada,<br />
para hacerla dinámica realizaremos los siguientes pasos:<br />
1. Escribir una consulta que obtenga las distintas asignaturas de la base de datos<br />
con las que construiremos la lista<br />
2. Escribir un prodecimiento PL/SQL que se encargue de rellenar la lista con los<br />
datos obtenidos en la anterior consulta<br />
3. Llamar al procedimiento PL/SQL para que rellene la lista cuando se utilice el<br />
formulario<br />
Para crear la consulta que nos permita obtener los datos de las consultas, en el<br />
Navegador de Objetos, seleccionaremos Grupo de Registros (una consulta, en<br />
realidad) y le damos al botón de crear , introduciendo el siguiente texto:<br />
SELECT nombre, nombre FROM Asignatura order by 1<br />
Con esta consulta, obtendremos el valor que se mostrará en la lista (nombre) y el valor<br />
correspondiente que se alamcenará en la base de datos (nombre) ordenados de forma<br />
alfabética. A la nueva consulta creada, le damos el nombre de asignaturas (por ejemplo,<br />
usando la paleta de propiedades -> nombre)<br />
38
Ahora crearemos un procedimiento PL/SQL para rellenar una lista a partir de los datos<br />
de una consulta. Como este proceso es probable que lo utilicemos más de una vez en<br />
nuestros formularios lo vamos a hacer reutilizable, en forma de biblioteca. Para ello, ,<br />
en el Navegador de Objetos, marcaremos Bibliotecas PL/SQL y le damos al botón de<br />
crear , ahí seleccionaremos Unidades de Programa y le volvemos a dar al botón<br />
de crear . Introducimos el nombre de la Unidad de Programa, que será llena_listas y<br />
le damos al botón Aceptar.<br />
En el editor PL/SQL que nos aparece introduciremos el siguiente código:<br />
PROCEDURE llena_listas (lista in VARCHAR2, grupo in VARCHAR2) IS<br />
verror NUMBER :=0;<br />
errorRellenoLista exception;<br />
BEGIN<br />
verror:= Populate_Group(grupo);<br />
if verror = 0 then<br />
Clear_List(lista); /*Elimina el contenido de la lista*/<br />
Populate_List(lista,grupo);<br />
elsif verror = 1403 then /*No se encuentra ningún */<br />
/*elemento en la lista*/<br />
null; /*no se hace nada*/<br />
else<br />
raise errorRellenoLista;<br />
end if;<br />
EXCEPTION<br />
when errorRellenoLista then<br />
message ('Excepción: no se puede rellenar la '||lista||<br />
' con la consulta de '||grupo||'.');<br />
END;<br />
Pulsamos Compilar y si no hay ningún problema, le damos a Cerrar<br />
39
Nos vamos a la biblioteca creada y le damos al botón de guardar , la guardamos<br />
como MiBiblioteca, recuerda el sitio donde la guardas, (por ejemplo, en u:/bd2/).<br />
Seleccionamos la biblioteca y la compilamos (en el menú, nos vamos a Programa-<br />
>Compilar Selección). Ahorá sólo nos queda añadir la biblioteca a nuestro formulario y,<br />
en general, a cualquier formulario que deseemos crear, para esto, dentro de nuestro<br />
formulario nos vamos dentro del Navegador de Objetos a Bibliotecas Incorporadas(o<br />
Bibliotecas Asociadas, dependiendo de la versión de Developer) y pulsamos el botón de<br />
crear . Examinamos y seleccionamos la biblioteca y le damos a Incorporar.<br />
Nos preguntará si suprimir la ruta para que la aplicación sea portable, le decimos que<br />
No. Esto tiene el problema que si la biblioteca no está en la ruta especificada, el<br />
formulario no funcionará. Esto es importante a tener en cuenta a la hora de detallar la<br />
instalación de un formulario.<br />
Ya sólo nos queda llamar al procedimiento PL/SQL para que rellene la lista con los<br />
datos de la consulta cuando se utilice el formulario. Para esto, en el navegador de<br />
objetos, nos vamos a Disparadores y pulsamos el botón de crear , seleccionamos el<br />
40
disparador WHEN-NEW-FORM-INSTANCE y pulsamos el botón de Aceptar. Y<br />
añadimos el siguiente código:<br />
llena_listas('DetalleMatricula.nombre','asignaturas');<br />
si además queremos que nos salga el formulario inicializado, sería:<br />
BEGIN<br />
llena_listas('DetalleMatricula.nombre','asignaturas');<br />
execute_query;<br />
END;<br />
Observa que la llamada al procedimiento llena_listas de MiBiblioteca tiene dos<br />
párametros, el primero el bloque datos y elemento a rellenar, el segundo es la consulta<br />
que se va a utilizar para ello. Le damos a Compilar y Cerrar<br />
Finalmente, el formulario tendrá un aspecto similiar a:<br />
¡Qué no se te olvide guardarlo!<br />
3 Bloque LOV (List of Values - Lista de Valores)<br />
41
En lugar de utilizar listas, en muchos casos nos interesará más utilizar bloques LOV.<br />
Con un Bloque LOV podremos asignar más de un valor a la vez, es decir, seleccionando<br />
un elemento de un bloque LOV podremos rellenar varios campos del formulario a la<br />
vez. Los bloques LOV son dinámicos en el sentido de que se construyen a partir de los<br />
datos de la base de datos y además nos permitirán ver más datos que los que se van a<br />
utilizar para rellenar el formulario.<br />
Para ilustrar el ejemplo de los bloques LOV: si nos fijamos en el formulario anterior el<br />
campo alumno es sólo un código que no nos dice mucho, si hubiera que cambiar la<br />
asignación de una matrícula a un alumno (por ejemplo, para deshacer un error del<br />
secretario), habría que buscar en alumnos el código (o, al menos, saberlo) y con ese<br />
código cambiar la matrícula. Para evitar esto, vamos a crear un bloque LOV que nos<br />
permita ver datos del los alumnos, pero que nos almacene sólo el código del mismo.<br />
Abrimos el formulario de matrículas si no lo tenemos abierto ya. En el navegador de<br />
objetos, seleccionamos Listas de Valores (o elementos LOV, según la versión de<br />
Developer) y le damos al botón de crear . Le decimos que sí queremos utilizar el<br />
Asistente de Listas de Valores. Dejamos seleccionado Nuevo Grupo de Registros<br />
basado en una consulta y le damos al botón Siguiente.<br />
En la parte de la consulta SQL, vamos a introducir la siguiente consulta:<br />
SELECT alumno.pid, nif, nombre, apellido1, apellido2<br />
FROM alumno, persona<br />
WHERE (alumno.pid=persona.pid)<br />
Nos conectamos (si no lo estamos ya) y le damos a Comprobar Sintaxis para ver si la<br />
consulta está correcta. Le damos al botón Siguiente.<br />
42
En la ventana de selección movemos todos los atributos a la columna de la derecha, ya<br />
que en la misma consulta hemos seleccionado los atributos que queremos que nos<br />
salgan en la lista de valores. Le damos a Siguiente.<br />
En la siguiente ventana del asistente, nos muestra la forma en que se van a mostrar los<br />
valores en el bloque LOV, cambiamos el ancho de las columnas (ver imagen), y en la<br />
fila del PID, en la columna Valor de Retorno ponemos MATRICULA.IDALUMNO (o<br />
en lugar de escribirlo, podemos seleccionarlo pulsando el botón Buscar elemento de<br />
retorno...), ésto lo que hace es devolver el elemento PID del bloque LOV en el campo<br />
Matricula.IDAlumno. Si quisiéramos devolver más valores utilizaríamos las casillas<br />
correspondientes en la columna Valor de retorno. Dejamos activado la casilla de<br />
Ajustar automáticamente el tamaño de las columnas y pulsamos Siguiente.<br />
43
Le damos de título Selección de Alumno, dejando el resto de valores por defecto,<br />
pulsamos dos veces Siguiente.<br />
44
Finalmente desplazamos Matricula.IDAlumno a la columna de la derecha y le damos al<br />
botón Terminar.<br />
Cuando ejecutemos el formulario, al irnos a la casilla de Alumno, nos saldrá en la barra<br />
de estado (abajo) de Oracle Forms Runtime la anotación Lista de Valores, pulsamos F9<br />
y nos aparecerá el bloque LOV.<br />
Si quieres que la Lista de Valores se visualice automáticamente al irnos a la casilla de<br />
Alumno, sin tener que pulsar F9, tienes que irte a la Paleta de Propiedades de la Lista<br />
de Valores creada y poner la propiedad Visualización Automática a Sí<br />
45
4 Ventanas y lienzos<br />
Los Lienzos son elementos del diseño sobre el que se sitúan los otros elementos de<br />
nuestro formulario. Una ventana actúa como un visor sobre el lienzo permitiendo<br />
desplazarse por su contenido. Cuando ejecutamos un formulario se dispone una ventana<br />
principal que no dispone de lienzos, mediante la cual se visualiza el resto de las<br />
ventanas que si contendrán lienzos. Podemos distinguir distintos tipos de lienzos:<br />
1. Contenido: Elemento contenedor de otros. Es el que se crea por defecto con un<br />
formulario nuevo y una ventana debe tener al menos un lienzo de este tipo, ya<br />
que es un lienzo contenedor de los elementos del formulario o de otros lienzos<br />
2. Apilado: Un lienzo que se muestra encima de otros.<br />
3. Tabular: Lienzo para poder hacer pestañas en nuestro formulario.<br />
4. Barra de Herramientas: Contiene botones que se muestran en forma vertical u<br />
horizontal en la ventana.<br />
Como ya hemos visto de forma implícita el uso de lienzos contenedores y los lienzos<br />
apilados se pueden simular poniendo los elementos de distintos bloques de datos en el<br />
mismo lienzo, vamos a ver los lienzos tabulares y las barras de herramientas. También<br />
veremos un tipo especial de ventanas que son las Alertas y que nos serán muy útiles.<br />
4.1 Lienzos tabulares<br />
Vamos a realizar un formulario de Matriculación donde en una parte tengamos los datos<br />
de la matrícula y abajo tengamos dos pestañas: una con las asignaturas asociadas a la<br />
matrícula y otra con los pagos de la matrícula. De esta forma tendremos un bloque de<br />
datos Maestro (Matrícula) y dos bloques Detalle (Asignaturas y Pagos), cada uno en una<br />
pestaña.<br />
Abrid Form Builder (empezamos sin ningún formulario) y mediante el Asistente<br />
creamos nuestro bloque de datos asociado a la tabla matrícula, como ya hicimos en el<br />
aparatado 2, seleccionando todos sus atributos. Fíjate que en el asistente de diseño,<br />
después de la bienvenida aparece la ventana Tipo de Lienzo y que, por defecto, tiene un<br />
tipo de lienzo contenedor.<br />
46
Visualizad todos los campos, en formato Pantalla, que el título del marco sea Matrícula,<br />
se vea un sólo registro y tenga la barra de desplazamiento.<br />
Verifica que funciona y guárdalo, por ejemplo, como Matriculacion2.fmb. Observa que<br />
moviéndonos con la barra de desplazamiento nos vamos moviendo por las distintas<br />
tuplas de la tabla Matrícula.<br />
Ahora vamos a crear la primera pestaña para las asignaturas. Vamos a crear el bloque<br />
detalle basado en la tabla DetalleMatrícula (recuerda que para crear un bloque detalle,<br />
debes seleccionar primero el bloque de datos maestro y darle al botón de crear),<br />
seleccionando todos sus campos. En el Asistente de Diseño, en la ventana de Tipo de<br />
Lienzo, vamos a asignarle un lienzo nuevo (Nuevo Lienzo) que será de tipo Tabular y<br />
una Nueva Página con Pestaña.<br />
Visualizaremos sólamente el campo Nombre (de una asignatura) y elegiremos una<br />
presentación tabular visualizando 5 registros y la barra de desplazamiento. En el<br />
navegador de objetos buscamos en Lienzos el nuevo lienzo tabular que hemos creado<br />
47
(puedes ver el nombre en el editor de diseño) y, dentro de éste, en Páginas con Pestaña<br />
le cambiamos el nombre a la primera que hay, que tendrá un nombre parecido a PAGE5<br />
(puedes hacerlo en la Paleta de Propiedades cambiando el atributo Etiqueta por el valor<br />
Asignaturas).<br />
Al ejecutar el formulario, sólo verás la parte de matrícula, no importa, luego lo<br />
cambiaremos. Ahora vamos a crear la segunda pestaña para el bloque detalle Pagos<br />
seleccionando todos sus campos. Ten cuidado, al crear la relación, en este caso ya que al<br />
tener dos bloques de datos el asistente se puede confundir. Para evitarlo, antes de pulsar<br />
Crear Relación desactivamos Unir automáticamente bloques de datos, hacemos la<br />
relación basada en una condición de unión sobre el campo IDMatricula de Matricula y<br />
el campo IDMatricula de Pago.<br />
En el Asistente de Diseño, en la ventana Tipo de Lienzo, vamos a asignarle el lienzo<br />
tabular antes creado con las asignaturas, pero sí vamos a seleccionar una Nueva Página<br />
con Pestaña.<br />
48
Visualizaremos todos los campos menos IDMatricula. Escogemos un diseño tabular, de<br />
título Pagos, y que se muestren sólo 2 registros, sin barra de desplazamiento. Le<br />
cambiamos el nombre a la pestaña, como hicimos anteriormente para las asignaturas<br />
(cambiando la propiedad Etiqueta por Pagos de la nueva página con pestaña creada).<br />
Ahora vamos a redimensionar los lienzos para que se vean al ejecutar el formulario.<br />
Para ello, en el navegador de objetos, nos vamos a los lienzos y seleccionamos el lienzo<br />
Tabular (el segundo), abrimos la Paleta de Propiedades y cambiamos la propiedad<br />
Posición Y en la Puerta de Vista a 90 y la propiedad Bisel a Ninguno<br />
De esta forma colocaremos el lienzo con las pestañas debajo de los datos de la<br />
matrícula. Ten en cuenta en redimensionar el lienzo de la Matrícula (si no es lo<br />
suficientemente grande) para que quepa debajo el lienzo tabular. Poniendo Bisel a<br />
ninguno, lo que hacemos es quitar una línea que separa los dos lienzos. Ejecutamos, el<br />
lienzo, corregimos y guardamos el formulario.<br />
49
Si en el navegador de objetos, el bloque de datos Maestro (Matricula) está después de<br />
un bloque de datos detalle, no se visualizará correctamente.<br />
Si se quiere ver en el editor de diseño los dos lienzos en lugar de tener dos editores de<br />
diseño (uno por lienzo), en el editor de diseño del bloque maestro vete a la opción Ver<br />
del menú y de ahí a Vistas Apiladas ..., seleccionamos el lienzo tabular y le damos al<br />
botón Aceptar.<br />
Para cambiar el título de la ventana, en le navegador de objetos, vete a Ventanas,<br />
selecciona la que hay y abre su paleta de propiedades. Cambia la propiedad Título a, por<br />
ejemplo, Matriculación.<br />
4.2 Ventanas de Avisos (Alertas)<br />
50
Developer tiene un tipo especial de ventanas para enviar avisos al usuario. Básicamente<br />
mostrará un mensaje y puede tener hasta tres botones (por ejemplo, "Si" "No" y<br />
"Cancelar"). Hay tres tipos de estilos de alerta: Parar, Precaución y Nota.<br />
Vamos a crear una alerta que nos muestre un mensaje de bienvenida cuando se ejecute<br />
el formulario de Matriculación, para ello tendremos que tenerlo abierto previamente con<br />
Forms Builder. En el Navegador de Objetos, seleccionamos Alertas y pulsamos el<br />
botón de crear . Abrimos la paleta de propiedades de la alerta creada.<br />
Cambiamos las siguiente propiedades:<br />
• A Nombre le damos Bienvenida<br />
• A Título le damos Bienvenido<br />
• A Mensaje le damos Bienvenido al proceso de matriculación.<br />
• A Etiqueta de Botón 1 escribimos Aceptar<br />
• A Etiqueta de Botón 2 y a Etiqueta de Botón 3 lo dejamos en blanco<br />
Ya sólo nos queda llamar a la alerta, para ello, en el disparador<br />
WHEN_NEW_FORM_INSTANCE, escribimos el código:<br />
DECLARE<br />
boton NUMBER;<br />
BEGIN<br />
/*Mostramos la alerta BIENVENIDA y<br />
guardamos el botón pulsado*/<br />
boton := Show_Alert('Bienvenida');<br />
/*Miramos que botón se ha pulsado*/<br />
IF boton = ALERT_BUTTON1 THEN<br />
/*Sólo hay uno, no hacemos nada*/<br />
NULL;<br />
END IF;<br />
/*Rellenamos el formulario*/<br />
Execute_Query;<br />
51
END;<br />
De esta forma, al ejecutar el formulario nos debería salir, algo parecido a<br />
La función Show_alert devuelve el número ALERT_BUTTON1, ALERT_BUTTON2,<br />
ALERT_BUTTON3 dependiendo de que botón haya sido pulsado<br />
4.3 Barras de herramientas<br />
Para ilustrar el funcionamiento de una barra de herramientas, vamos a crear una para<br />
nuestro formulario de matriculación que será horizontal y con cuatro botones, dos para<br />
movernos entre los registros, otro para almacenar los cambios realizados y un cuarto<br />
botón para cerrar el formulario, mostrando un aviso antes. La barra de herramientas<br />
tendrá el siguiente aspecto:<br />
Lo primero será crear un lienzo, para ello, en el navegador de objetos vete a lienzos y<br />
pulsa el botón de crear . Abre la paleta de propiedades del lienzo creado y cambia<br />
las siguientes propiedades:<br />
• A Nombre le damos Botones<br />
• A Tipo de Lienzo le damos Barra de Herramientas Horizontal<br />
• A Ventana le damos WINDOWS1 (o la que tengas si tienes otra, pero sólo<br />
deberías tener una)<br />
• A Altura le escribimos 30<br />
52
Abrimos el editor de diseño, seleccionando previamente el lienzo creado. Mediante el<br />
botón para crear botones , le añadimos los cuatro botones para que tengan un aspecto<br />
parecido a lo que estamos buscando. Inicialmente, tendrá este aspecto:<br />
Fíjate que los botones se deben de crear como elementos del bloque de datos<br />
Matricula. Debiendo quedar algo como:<br />
Mediante la paleta de propiedades de cada botón, le cambiamos la propiedad Etiqueta a<br />
los valores , Guardar y Cerrar y la propiedad Nombre a los valores anterior,posterior,<br />
salva y salida.<br />
Ahora mismo si ejecutamos el formulario, nos aparecerá la barra de herramientas pero<br />
los botones no hacen nada. Para el botón anterior creamos un nuevo disparador del tipo<br />
WHEN-BUTTON-PRESSED, con el siguiente código:<br />
do_key('up');<br />
e igualmente para el botón posterior, pero con el código:<br />
53
do_key('down');<br />
para el botón salva, el código es:<br />
commit_form;<br />
Al ejecutar el formulario comprobarás que los botones ya funcionan (con excepción al<br />
de cerrar), el código del disparador WHEN-BUTTON-PRESSED, se ejecuta (como dice<br />
su nombre) cuando se pulsa un botón. Ahora nos quedan el otro botón que es un poco<br />
más complicados. En el botón de salir, usaremos una alerta que pregunte si se quieren<br />
almacenar los cambios antes de salir y que tenga tres botones, "Si" "No" y "Cancelar".<br />
Dependiendo del botón que se pulse se guardarán los resultados y se cerrará el<br />
formulario, no se guardarán los cambios y saldrá del formulario y no hará nada<br />
(respectivamente). Para ello, lo primero, será crear una Alerta con las siguientes<br />
propiedades:<br />
• A Nombre le damos Salir<br />
• A Título le damos Salir<br />
• A Mensaje le damos ¿Quieres almacenar los cambios antes de salir?<br />
• A Estilo de Alerta le damos Precaución<br />
• A Etiqueta de Botón 1 escribimos Sí<br />
• A Etiqueta de Botón 2 escribimos No<br />
• A Etiqueta de Botón 1 escribimos Cancelar<br />
54
Para terminar al botón Salida para su disparador WHEN-BUTTON-PRESSED le<br />
asignamos el siguiente código:<br />
DECLARE<br />
boton NUMBER;<br />
BEGIN<br />
/*Preguntamos si guardar*/<br />
boton := show_alert('salir');<br />
END;<br />
/*Si se ha pulsado el primer botón,<br />
guardamos los cambios*/<br />
if boton = ALERT_BUTTON1 then<br />
commit_form;<br />
end if;<br />
/*Si no se ha pulsado el tercer botón,<br />
nos salimos*/<br />
if boton ALERT_BUTTON3 then<br />
exit_form(no_commit);<br />
end if;<br />
El aspecto del formulario será:<br />
55
5 Elementos con resultados de cálculos<br />
En Developer se pueden crear campos que muestren datos calculados a partir de otros<br />
campos. Para ilustrar esta funcionalidad, para cada pago vamos a añadir un campo que<br />
sea Pagado (pago.abonado*pago.cantidad) que nos muestre para un pago dado si se ha<br />
pagado o no, y dos campos uno con la suma de las cantidades de los pagos (Precio<br />
Total matrícula) y otro con la suma de las cantidades pagadas (Total Pagado).<br />
En el navegador de objetos seleccionamos Elementos del bloque de datos Pago y<br />
pulsamos el botón de crear , nos creará un nuevo campo de texto. Con la Paleta de<br />
Propiedades le damos los siguientes valores:<br />
• A Nombre le damos Pagado<br />
• A Tipo de Dato le damos Number<br />
• A Modo de Cálculo le escogemos Fórmula<br />
• En Fórmula escribimos :pago.abonado*:pago.cantidad<br />
• En Elemento de Base de datos elegimos No<br />
• A Lienzo le asignamos el lienzo tabular (el segundo creado)<br />
• En Página con Pestaña le damos la página con la pestaña de pagos (la segunda<br />
creada)<br />
• A Prompt le damos el valor Pagado<br />
• En Justificación del Prompt nos quedamos con Centro<br />
• En Borde del anexo del Prompt escogemos Superior<br />
En el editor de diseño colocamos mejor el campo creado (como son dos pagos, se verán<br />
dos campos de texto). Si ejecutamos el formulario comprobaremos que funciona, basta<br />
con cambiar el valor de Abonado.<br />
56
En el editor de diseño creamos dos nuevos campos de texto , tal y como muestra la<br />
figura.<br />
Si los campos de texto creados nos aparecen en el bloque de datos Pago (¡Nos saldrán<br />
dobles!), no hay ningún problema, pero si nos salen en el bloque de datos Matrícula<br />
(como en el ejemplo), los arrastraremos hasta el bloque de datos Pago que es donde<br />
queremos hacer los cálculos.<br />
Al campo situado más a la izquierda, mediante la paleta de propiedades, le modificamos<br />
los siguiente atributos:<br />
• A Nombre le damos Total<br />
• A Tipo de Dato le damos Number<br />
• A Modo de Cálculo le escogemos Total<br />
• En Función totalizar seleccionamos Sum<br />
• En Bloque de Total elegimos Pago<br />
• En Elemento de Total ponemos Cantidad<br />
• En Número de elementos visualizados escribimos 1<br />
• En Elemento de Base de datos elegimos No<br />
• A Prompt le damos el valor Precio Total Matrícula<br />
• En Grosor de la Fuente del Prompt nos quedamos con Negrita<br />
Al campo situado más a la derecha, mediante la paleta de propiedades, le modificamos<br />
los siguiente atributos:<br />
• A Nombre le damos TotalPagado<br />
• A Tipo de Dato le damos Number<br />
• A Modo de Cálculo le escogemos Total<br />
• En Función totalizar seleccionamos Sum<br />
• En Bloque de Total elegimos Pago<br />
• En Elemento de Total ponemos Pagado<br />
57
• En Número de elementos visualizados escribimos 1<br />
• En Elemento de Base de datos elegimos No<br />
• A Prompt le damos el valor Total Pagado<br />
• En Grosor de la Fuente del Prompt nos quedamos con Negrita<br />
Al bloque de datos Pago le cambiamos la propiedad Consultar todos los registros a Sí y<br />
la propiedad Precalcular Totales como No. Ya sólo queda ajustar los campos de totales<br />
creados por si no se visualizaran bien y ejecutar el formulario cambiando los valores de<br />
cantidad/abonado para ver que ocurre.<br />
Nota:Estos campos no se almacenan datos en la base de datos (no existe un campo<br />
donde hacerlo)<br />
6 Menús<br />
Cualquier formulario tiene un menú por defecto que permite ejecutar las órdenes<br />
habituales, algunas de ellas las vimos al principio cuando ejecutamos nuestro primer<br />
formulario. El menú por defecto no se puede modificar, pero si se puede cambiar por un<br />
menú personalizado, para ello, es conveniente partir de un menú previamente definido,<br />
nosotros usaremos menudef.mmb.<br />
Empezamos con el formulario para matriculaciones con el que hemos estado trabajando.<br />
En el navegador de objetos, seleccionamos Menús y pulsamos el botón de abrir ,<br />
seleccionamos el fichero menudef.mmb (ten en cuenta en la ruta donde lo has<br />
guardado). Seleccionamos el menú incorporado y pulsando el botón derecho del ratón,<br />
nos vamos al Editor de Menús.<br />
58
Lo primero que haremos para familiarizarnos con el editor de menús es traducir las<br />
entradas del inglés al castellano, quedando con el siguiente aspecto:<br />
Lo siguiente que vamos a hacer en crear una opción del menú que llame al formulario<br />
de alumnos. Para ello vamos a crear una entrada nueva en la opción de menú Consulta.<br />
Debajo de Sig. Grupo, vamos a crear un separador, para ello nos vamos a Consulta-<br />
>Sig.Grupo y pulsamos el botón de Crear debajo . Al nuevo elemento del menú le<br />
cambiamos las siguiente propiedades: Nombre: SeparadorForms, Etiqueta:<br />
SeparadorForms, Tipo de Elemento de Menú: Separador.<br />
Debajo del separador creado creamos la entrada Formularios pulsando el botón de Crear<br />
debajo . Al nuevo elemento le damos: Nombre: Formularios, Etiqueta: Formularios,<br />
Tipo de Elemento de Menú: Normal.<br />
59
Con la opción Formularios seleccionada pulsamos el botón de Crear a la derecha .<br />
Al nuevo elemento le damos: Nombre: Alumnos, Etiqueta: Alumnos, Tipo de Elemento<br />
de Menú: Normal.<br />
Para ejecutar el formulario Alumnos cuando se elija la opción Alumnos del menú,<br />
tendremos que modificar su propiedad Código del Elemento de Menú con el siguiente<br />
código:<br />
DECLARE<br />
parametros Paramlist;<br />
BEGIN<br />
/*Creamos la lista de parametros vacía*/<br />
parametros := Create_Parameter_List('nada');<br />
/*Llamamos al formulario de Alumnos*/<br />
Run_PRODUCT(FORMS,'Alumno',SYNCHRONOUS, RUNTIME,<br />
FILESYSTEM,parametros ,NULL);<br />
END;<br />
60
La función Run_PRODUCT nos servirá para ejecutar cualquier elemento de<br />
Developer, el primer parámetro sera FORMS si llamamos a un formulario y<br />
REPORTS si llamamos a un informe, el segundo parámetros será el formulario o<br />
informe que queremos usar y el penúltimo será una lista de parámetros que le pasamos<br />
al formulario o informe, en este ejemplo, está vacía. Para más información acerca del<br />
procedimiento Run_PRODUCT, puedes consultar la ayuda interactiva de Developer.<br />
En el navegador de objetos, seleccionamos el objeto menú con el que estamos<br />
trabajando y nos vamos a Fichero -> Guardar Como. Lo guardamos como mimenu.mmb.<br />
Ya sólo nos queda compilarlo (manteniéndolo seleccionado, nos vamos a Fichero<br />
->Administración -> Compilar Fichero) e incorporar el menú compilado al formulario.<br />
Para ello, abrimos la paleta de propiedades del formulario (el único elemento de<br />
Pantallas en el navegador de objetos) y cambiamos la propiedad Módulo de Menús a<br />
mimenu.mmx. Ejecutamos y probamos si funciona la opción de ver el formulario de<br />
alumnos.<br />
7 Formularios con parámetros<br />
Un formulario puede tener parámetros de forma que, cuando lo invoquemos (por<br />
ejemplo, desde un menú o un botón), tenga un comportamiento distinto dependiendo de<br />
los parámetros. Un parámetro será una variable asociada a un Formulario o a un<br />
Informe.<br />
Vamos a crear un formulario donde se visualicen los datos de un alumno en particular y<br />
lo vamos a invocar desde nuestro formulario de Matriculación. Primero, copiamos<br />
nuestro formulario Alumno.fmb a otro fichero, por ejemplo, AlumnoP.fmb y abrimos<br />
61
el nuevo formulario creado. Para crear un parámetro, en el navegador de objetos<br />
seleccionamos Parámetros y pulsamos el botón de crear . Al nuevo parámetro<br />
creado le damos el nombre Seleccionado, será de tipo numérico (Number) y el valor<br />
Inicial será 1.<br />
El siguiente paso que daremos será cambiar la cláusula WHERE del bloque de datos<br />
Persona, de forma que se muestre el registro cuyo PID se le pasa como parámetro. Para<br />
ello le damos a la propiedad Cláusula WHERE el valor pid = :Parameter.seleccionado<br />
Si ejecutamos el formulario creado nos mostrará la persona con PID igual a 1 (recuerda<br />
el valor inicial del parámetro). Cerramos el formulario y abrimos el formulario<br />
matrícula, en éste formulario vamos a añadir un botón nuevo en la barra de herramientas<br />
que nos va a servir para abrir el formulario AlumnoP.fmb con el alumno del que<br />
estamos visualizando su matrícula. Para ello, abrimos la barra de herramientas en el<br />
Editor de diseño y le añadimos un botón , redimensionamos los que tenemos para<br />
que quepa correctamente. Abrimos la paleta de propiedades del botón creado y ponemos<br />
Alumno en las propiedades Nombre y Etiqueta.<br />
62
Ya tenemos el nuevo botón que ahora mismo no hace nada, para que abra el formulario<br />
AlumnoP, le vamos a añadir un disparador del tipo WHEN-BUTTON-PRESSED con el<br />
siguiente código:<br />
DECLARE<br />
parametros Paramlist;<br />
BEGIN<br />
/*Creamos la lista de parámetros*/<br />
parametros := Create_Parameter_List('Param');<br />
/*Le añadimos el alumno a visualizar*/<br />
Add_parameter(parametros,'seleccionado',<br />
TEXT_Parameter,:matricula.IDAlumno);<br />
/*Llamamos al formulario de Alumnos*/<br />
Run_PRODUCT(FORMS,'AlumnoP',SYNCHRONOUS, RUNTIME,<br />
FILESYSTEM,parametros ,NULL);<br />
/*Limpiamos la la lista de parámetros creados*/<br />
Destroy_Parameter_List(parametros);<br />
END;<br />
63
Con el procedimiento Add_parameter se pueden añadir tantos parámetros como haga<br />
falta, primero tendrá la lista de parámetros, después el nombre del parámetros, el tipo de<br />
parámetro (normalmente, TEXT_Parameter) y finalmente el valor del parámetro.<br />
Observa que aquí escogemos el atributo IDAlumno del bloque de datos Matricula<br />
Guardamos y ejecutamos el formulario para ver que el nuevo botón funciona<br />
correctamente.<br />
64
1 Informe Asignaturas<br />
REPORTS <strong>DEVELOPER</strong><br />
Vamos a hacer un primer informe que nos va a mostrar una relación de asignaturas que<br />
se pueden cursar, para ello ejecutamos Report Builder, que es la herramienta para<br />
construir informes<br />
Lo primero que nos saldrá será una pantalla de bienvenida con diversas opciones,<br />
nosotros escogeremos Utilizar el Asistente de Informes y le damos al botón Aceptar.<br />
Nos sale otra bienvenida, la ignoramos y pulsamos el botón Siguiente, nos preguntará el<br />
título de nuestro informe y el tipo del mismo. Como Título pondremos Asignaturas y<br />
escogeremos el tipo tabular. Pulsamos Siguiente<br />
65
Nos preguntará el tipo de consulta que queremos utilizar, seleccionaremos Sentencia<br />
SQL y pulsamos Siguiente. En la siguiente ventana nos pedirá la consulta y<br />
aprovechamos, pulsando el botón conectar para identificarnos. La consulta que debemos<br />
introducir es:<br />
SELECT nombre, creditosTeoricos, creditosPracticos, tipo,<br />
cuatrimestre FROM asignatura;<br />
Nos aparecerá una ventana con dos columnas para seleccionar los atributos que<br />
deseamos visualizar en nuestro informe, los vamos a visualizar todos, así que nos los<br />
llevamos todos a la columna de la derecha.<br />
En la siguiente pantalla nos permite calcular totales, mínimos, máximos, etcétera, por lo<br />
pronto, la ignoramos y pulsamos Siguiente. Ahora nos preguntará por las Etiquetas del<br />
Informe y el tamaño de cada uno de los campos, nos limitamos a cambiar<br />
"creditosTeoricos" por "Créditos Teóricos" y "creditosPracticos" por "Créditos<br />
Prácticos".<br />
66
Finalmente, seleccionamos la plantilla de diseño con la que parecerá nuestro informe,<br />
escogemos la que más nos gusta, por ejemplo, escogemos la primera Corporate 1 y le<br />
damos al botón de Terminar.<br />
Como resultado ya tenemos nuestro primer informe, en el Report Editor podemos<br />
cambiar aquellos detalles que no nos gusten. Que no se te olvide guardarlo como<br />
asignaturas.rdf<br />
67
2 Informe Matrículas<br />
Vamos a crear un informe donde, para cada alumno, nos muestre las matrículas que ha<br />
realizado y para cada matrícula los pagos de la misma. Utilizamos el Asistente de<br />
Informes para hacerlo. El estilo de informe será Agrupar a la izquierda y el título<br />
"Matriculas".<br />
El motivo de agruparlo a la izquierda es que queremos agrupar las matriculas por<br />
alumnos (un alumno se puede matricular más de una vez) y los pagos por matricula (una<br />
matricula puede tener uno o dos pagos). El tipo de consulta sera mediante Sentencia<br />
SQL y el código de la misma será:<br />
68
SELECT matricula.idmatricula, tipo, numeroplazos, fechaexpedicion,<br />
curso,cantidad, abonado, fechapago, persona.nombre, persona.apellido1,<br />
persona.apellido2<br />
FROM pago, matricula, persona<br />
WHERE (pago.idmatricula=matricula.idmatricula) and<br />
(matricula.idalumno=persona.pid);<br />
Le damos a conectar para identificarnos y pulsamos Siguiente. En la siguiente<br />
pantalla, tendremos que elegir por que grupos de atributos vamos a realizar las<br />
agrupaciones. Primero pasamos nombre, apellido1, apellido2 que estará en el nivel 1 e<br />
idmatricula estará en el nivel 2. Para dejar de añadir atributos al nivel 1 y empezar al<br />
nivel 2, simplemente hay que cerrar el árbol del nivel 1. Nos quedará:<br />
El resto de atributos lo añadimos luego en la parte de campos visualizados en el<br />
siguiente orden: curso, tipo, fechaexpedicion, numeroplazos, cantidad, abonado,<br />
fechapago.<br />
69
Cuando nos pregunta los campos sobre los cuales se desea calcular el total,<br />
seleccionaremos el campo cantidad, así nos sumará las cantidades de los pagos de una<br />
matrícula y los totales de las distintas matriculas de un alumno. Entonces,<br />
seleccionamos cantidad y nos lo llevamos a la columna de totales, usando el botón de<br />
Suma ><br />
Ya sólo nos queda poner los títulos y ajustar los tamaños de los distintos campos.<br />
Observa que nos salen tres nuevos atributos:<br />
• SumCantidadPeridmatricula, que nos sumará las distintas cantidades por<br />
matrícula<br />
• SumCantidadPernombre, que nos sumará las distintas cantidades por persona<br />
• SumCantidadPerReport, que nos hará la suma de todas las cantidades del<br />
informe<br />
70
Escogemos la plantilla predefinida NCA yellow y le damos a Terminar. Qué no se te<br />
olvide guardarlo cómo matriculas.rdf<br />
3 Informes con parámetros e invocación de informes<br />
Al igual que con los formularios, en los informes también podemos parametrizar su<br />
funcionalidad, para demostrar su uso, vamos a copiar el último informe creado<br />
(matriculas.rdf) con el nombre de matricula.rdf para que nos muestre las matrículas y<br />
pagos de una sola persona que se le pasará como parámetro.<br />
Para crear un parámetro, en el navegador de objetos nos vamos al Modelo de Datos y de<br />
ahí, seleccionamos Parámetros de Usuario y pulsamos el botón de crear . Al nuevo<br />
parámetro creado le damos el nombre Elegido, será de tipo Character y el valor Inicial<br />
será 1.<br />
71
Modificaremos la consulta del informe, eso se puede hacer por el navegador de objetos<br />
y la paleta de propiedades del informe, cambiando la propiedad Sentencia de Consulta<br />
SQL de la consulta que haya dentro de Consultas en el Modelo de datos o abriendo el<br />
Asistente de Informes (dentro del menú herramientas) y escogiendo la pestaña Datos.<br />
Introduciremos la siguiente sentencia SQL:<br />
SELECT matricula.idmatricula, tipo, numeroplazos, fechaexpedicion,<br />
curso,<br />
cantidad, abonado, fechapago,<br />
persona.nombre, persona.apellido1, persona.apellido2<br />
FROM pago, matricula, persona<br />
WHERE (pago.idmatricula=matricula.idmatricula) and<br />
(matricula.idalumno=persona.pid) and<br />
(:elegido =persona.pid);<br />
Si ejecutamos el informe veremos que antes de mostrarlo nos sale una ventan donde nos<br />
pregunta por los parámetro de usuario.<br />
72
Pulsamos el icono del semáforo verde para visualizar el informe y sólo nos muestra<br />
las matrículas de una persona (la que coincide con el valor introducido).<br />
Para evitar que cuando lo llamemos desde nuestro menú o desde un formulario nos<br />
aparezca la ventana de parámetros, nos vamos al menú Herramientas->Constructor de<br />
Pantalla de Parámetros. Dejamos en blanco el Titulo, la Linea de Indicación y la Línea<br />
de Estado, además deseleccionamos aquellos atributos que estuviesen seleccionados en<br />
la lista. Guardamos y cerramos el informe.<br />
73
Abrimos nuestro formulario de matriculación con su menú y al menú le añadimos una<br />
opción nueva que será Imp. Matriculas. Para ello, debajo de la entrada Formularios<br />
creamos la entrada Informes pulsando el botón de Crear debajo . Al nuevo elemento<br />
le damos: Nombre: Informes, Etiqueta: Informes, Tipo de Elemento de Menú: Normal.<br />
Con la opción Informes seleccionada pulsamos el botón de Crear a la derecha . Al<br />
nuevo elemento le damos: Nombre: Imp_Matriculas, Etiqueta: Imp. Matriculas, Tipo de<br />
Elemento de Menú: Normal.<br />
Para ejecutar el informe Matricula.rdf cuando se elija la opción Imp. Matrículas del<br />
menú, tendremos que modificar su propiedad Código del Elemento de Menú con el<br />
siguiente código:<br />
DECLARE<br />
parametros Paramlist;<br />
elemento Item;<br />
BEGIN<br />
/*Buscamos el ítem IDAlumno*/<br />
elemento := Find_Item('IDalumno');<br />
/*Creamos la lista de parámetros*/<br />
parametros := Create_Parameter_List('Param_i');<br />
/*Le añadimos el alumno elegido*/<br />
Add_parameter(parametros,'elegido', TEXT_Parameter,<br />
Get_Item_Property(elemento,DATABASE_VALUE));<br />
74
*Llamamos al informe de matricula de un alumno*/<br />
Run_PRODUCT(REPORTS,'Matricula',SYNCHRONOUS, RUNTIME,<br />
FILESYSTEM,parametros ,NULL);<br />
/*Limpiamos la la lista de parámetros creados*/<br />
Destroy_Parameter_List(parametros);<br />
END;<br />
En el navegador de objetos, seleccionamos el objeto menú con el que estamos<br />
trabajando y le damos al botón de guardar . Ya sólo nos queda compilarlo<br />
(manteniéndolo seleccionado, nos vamos a Fichero ->Administración -> Compilar<br />
Fichero). Ejecutamos el formulario y probamos si funciona la opción de ver el informe<br />
de las matrículas de un alumno.<br />
75
Preguntas<br />
PREGUNTAS FRECUENTES<br />
1. ¿Que versión de Developer instalo?<br />
2. ¿Que versión de Oracle instalo?<br />
3. ¿Cómo conectar Oracle Developer con la base de datos Oracle de la ETSII?<br />
4. ¿Cómo conectar Oracle Developer con la base de datos Oracle de mi ordenador?<br />
5. No consigo conectar con la base de datos Oracle de la ETSII¿Qué pasa?<br />
6. ¿Cómo referenciar a una clave externa con dos campos?<br />
7. ¿Cómo almaceno horas en Oracle o fechas y horas?<br />
8. No me recupera ningún registro desde Developer pero desde Sql Plus al hacer un<br />
select me salen los datos ¿Qué pasa?<br />
9. ¿Cómo usar mis imágenes para decorar los formularios/informes?<br />
10. ¿Cómo generar valores consecutivos (un código) para un campo desde un<br />
formulario?<br />
11. ¿Cómo empezar con el formulario con valores sin tener que pulsar el botón<br />
execute_query/ejecuta_consulta?<br />
12. Utilizo un LOV y al ejecutar el formulario me sale en la barra de estado Lista de<br />
Valores/List of Values pero el LOV no se muestra ¿Por qué?<br />
13. ¿Cómo hacer un acceso identificado para mi aplicación?<br />
14. ¿Como ejecutar un formulario/informe distinto al que estamos usando al pulsar<br />
un botón?<br />
15. ¿Como elegir diferentes opciones de características de un formulario?<br />
16. En un formulario quiero rellenar un campo darle a un botón y que me rellene el<br />
resto de los campos ¿Cómo lo hago?<br />
17. ¿Cómo puedo borrar la tupla actual que se muestra en un formulario pulsando un<br />
botón?<br />
18. Me sale el error FRM-402002: Es obligatorio introducir un valor en el elemento<br />
¿cómo lo quito?<br />
19. ¿Como puedo modelar una relación muchos a muchos ?<br />
20. ¿Cómo hago que un elemento no se pueda modifica (que sólo se muestre)?<br />
21. ¿Cómo usar imágenes de la BD en los formularios?<br />
22. ¿Cómo pasar parámetros a un formulario o a un informe?<br />
23. ¿Cómo usar los parámetros de un informe en la consulta?<br />
24. ¿Cómo quitar la ventana que te pide los parámetros de un informe?<br />
25. ¿Se puede utilizar una lista dinámica para una clave primaria o para una clave<br />
externa utilizada en una relación?<br />
26. Me gustaría que al entrar a un formulario, se realizara automaticamente<br />
Execute_query con un campo relleno. ¿Cómo lo hago?<br />
27. ¿Cómo pasar parametros de un formulario a otro?<br />
28. ¿Cómo saber que valor he escogido de un grupo de Radio Button?<br />
29. ¿Cómo saber si he marcado un checkbox?<br />
30. ¿Cómo incrementar el campo código si uso secuencias?<br />
31. ¿Cómo incrementar el campo código si tengo una letra antes del número?<br />
32. ¿Quiero crear una tabla donde tenga una comprobación de tiempo respecto a la<br />
fecha actual ¿Cómo lo hago?<br />
33. ¿Cómo hago que en mi formulario se vea sólo la parte de una tabla que cumple<br />
determinadas características?<br />
77
34. Tengo una serie de bloques de datos en el mismo formulario y que no están<br />
relacionados (por ejemplo, varias pestañas) y al ejecutar un execute_query<br />
(ejecutar consulta) sólo se me rellena el primero de ellos ¿cómo relleno los<br />
demás?<br />
35. Tengo una especialización y tengo problemas para mostrarla junto su<br />
generalización ¿cómo lo hago?<br />
36. Quiero hacer un insert/update dentro de un disparador, pero no funciona ¿cómo<br />
hago que funcione?<br />
37. ¿Hay que entregar el diseño de la aplicación otra vez?<br />
38. ¿Cómo preparo los ficheros de mi aplicación para que no me den problemas con<br />
las rutas (path)?<br />
Respuestas<br />
1.<br />
¿Que versión de Developer instalo?<br />
Lo más aconsejable es que instales la que hay instalada en las aulas de prácticas<br />
de la ETSII que es la 6i, ya que la presentación de la aplicación se hará en esas<br />
aulas. Si utilizas una versión superior (9i o 10g) seguramente no funcionará y<br />
tendrás que llevarte tu propio ordenador.<br />
2. ¿Que versión de Oracle instalo?<br />
Lo más sencillo es que instales sólo Developer y con éste te conectes a la Base<br />
de Datos de la ETSII, pero para ello necesitas conexión a internet. Si prefieres<br />
trabajar en local sigue las instrucciones del tutorial de instalación.<br />
3. ¿Cómo conectar Oracle Developer con la base de datos Oracle de la ETSII?<br />
Para acceder al servidor Oracle de forma remota se puede hacer usando la<br />
aplicación SQL Net Easy configuration (dependiendo de la versión de<br />
Developer se puede llamar también Oracle Net8 Easy Config o Net<br />
Configuration Assistant). Los pasos que hay que dar son:<br />
o crear/agregar un alias (o un nuevo servicio o configurar los métodos de<br />
nomenclatura), por ejemplo, lo puedes llamar bd2 (se llama alias,<br />
nombre del servicio o nombre del servicio de red)<br />
o que utilice TCP/IP. No cambiar (si lo permite) el puerto por defecto 1521<br />
o Que use como servidor (TCP/IP host name) oracle0.ugr.es<br />
. Sería conveniente comprobar antes que podeis acceder a dicho servidor,<br />
para ello desde MS-Dos (símbolo del sistema) poned "ping<br />
oracle0.ugr.es", si no responde es probable que se haya caido el servidor.<br />
78
o La instancia de la base de datos (database instance o SID de la Base de<br />
datos) es PRACTBD<br />
De esta forma para conectarse a la base de datos (tanto en SQL Plus como en<br />
Developer), te hará falta el usuario, el password y en la cadena de conexión<br />
pones el alias creado (por ejemplo, bd2)<br />
4. ¿Cómo conectar Oracle Developer con la base de datos Oracle de mi<br />
ordenador?<br />
Lo primero es usar el usuario que has creado porque no se conectará con los<br />
usuarios SYS o SYSTEM. Si aún no se conecta, prueba a configurar un alias<br />
(como en el apartado anterior). Donde la instancia de la BD (SID) es la que tú<br />
has creado y el servidor es localhost. De esta forma para conectarse a la base de<br />
datos (tanto en SQL Plus como en Developer), te hará falta el usuario, el<br />
password y en la cadena de conexión pones el alias creado.<br />
5. No consigo conectar con la base de datos Oracle de la ETSII¿Qué pasa?<br />
Suponiendo que se han seguido todos los pasos correctamente y que el<br />
cortafuegos no nos cierra el puerto 1521. Tendremos que asegurarnos que nos<br />
estamos conectando a la red de la universidad de Granada por VPN. En algunos<br />
casos la versión 2005 del Panda Platinum bloquea el acceso a Oracle.<br />
6. ¿Cómo referenciar a una clave externa con dos campos?<br />
Supongamos que tenemos una clave primaria en la tabla Proveedor cuya clave<br />
primaria es Nombre y Dirección y una tabla Distribuye que relaciona la anterior<br />
con una tabla productos y cuyos campos son Nombre, Dirección y<br />
CodigoProducto. La forma de crearla sería la siguente:<br />
CREATE TABLE Distribuye (<br />
Nombre VARCHAR(10), /*Referencia a<br />
Proveedor(Nombre)*/<br />
Direccion VARCHAR(25), /*Referencia a<br />
Proveedor(Nombre)*/<br />
CodigoProdcuto INTEGER REFERENCES<br />
Productos(cod), /*Referencia a Producto(cod)*/<br />
/*La clave primaria son los 3 campos, relación<br />
muchos a muchos)*/<br />
CONSTRAINT ClavePrimariaDistribuye<br />
PRIMARY KEY<br />
(Nombre,Direccion,CodigoProducto),<br />
/*La clave externa son 2 campos de la tabla<br />
proveedor*/<br />
CONSTRAINT ClaveExternaDobleProveedort<br />
FOREIGN KEY (Nombre,Direccion) REFERENCES<br />
Proveedor(Nombre,Direccion)<br />
79
);<br />
7. ¿Cómo almaceno horas en Oracle o fechas y horas?<br />
Usando el tipo de dato DATE y la función SET_DATE, la cual, tiene dos<br />
argumentos uno con la fecha/hora y otro con el formato que sigue esa fecha y<br />
hora. Por ejemplo, si queremos guardar una cita con un cliente un día y a una<br />
hora determinada sería<br />
INSERT INTO Citas<br />
VALUES('11223344X',to_date('6/06/2006:20:00:00','dd/mm/yyyy:hh24<br />
:mi:ss'));<br />
que guardaría una cita con el cliente 11223344X el día 6 de Junio de 2006 a las<br />
20:00 horas. Si queremos guardar sólo la fecha<br />
INSERT INTO Citas<br />
VALUES('11223344X',to_date('6/06/2006','dd/mm/yyyy'));<br />
o sólo la hora<br />
INSERT INTO Citas<br />
VALUES('11223344X',to_date('20:00:00','hh24:mi:ss'));<br />
En developer en la paleta de propiedades de los elementos de Tipo de dato Date<br />
hay una propiedad que nos sirve para poner el formato a usar en la fecha<br />
denominada máscara de formato que utiliza el mismo formato que la función<br />
TO_DATE<br />
8. No me recupera ningún registro desde Developer pero desde Sql Plus al<br />
hacer un select me salen los datos ¿Qué pasa?<br />
Después de crear las tablas y de insertar los datos iniciales tienes que hacer un<br />
commit;<br />
9. ¿Cómo usar mis imágenes para decorar los formularios/informes?<br />
Desde Archivo->Importar->Imagen y desde ahí puedes abrir una imagen que se<br />
te incorpora al formulario o al informe No todos los tipos de formato de imagen<br />
son soportados pero si los más comunes.<br />
10. ¿Cómo generar valores consecutivos (un código) para un campo desde un<br />
formulario?<br />
80
Usando dicho campo (por ejemplo, codigo) en el bloque de datos (por ejemplo,<br />
productos) que se usa, pero no mostrándolo (eso se hace en el asistente de<br />
diseño). Posteriormente desde el disparador PRE-COMMIT escribir SELECT<br />
MAX(codigo)+1 INTO :productos.codigo FROM tabla_productos;<br />
11. ¿Cómo empezar con el formulario con valores sin tener que pulsar el botón<br />
execute_query/ejecuta_consulta?<br />
Poniendo dentro del cuerpo del disparador WHEN-NEW-FORM-INSTANCE la<br />
línea execute_query;<br />
12. Utilizo un LOV y al ejecutar el formulario me sale en la barra de estado<br />
Lista de Valores/List of Values pero el LOV no se muestra ¿Por qué?<br />
Tienes que poner la propiedad de Visualización Automática del LOV a si. Si<br />
quieres que no se visualice automaticamente lo pones a No y cuando quieres que<br />
se visualice pulsas F9.<br />
13. ¿Cómo hacer un acceso identificado para mi aplicación?<br />
Vamos a hacer un acceso identificado para el ejemplo del tutorial, usaremos el<br />
nombre de empleado como login y su edad como contraseña. Lo que vamos a<br />
hacer es utilizar acceso identificado al formulario de recursos humanos (el de loz<br />
lienzos tabulares) Lo primero que haremos será crear un formulario (lo<br />
llamaremos Acceso) con un bloque de datos basado en la tabla Persona dónde se<br />
visualice un sólo registro. Añadiremos un botón Aceptar, otro Limpiar y otro<br />
Salir.<br />
Para que no se nos muestre el password (campo edad) al hacer un<br />
ejecutar_consulta tendremos que irnos a sus propiedades y poner Ocultar Datos<br />
a Si y Elemento de la Base de Datos a No<br />
Para cada botón definiremos un disparador WHEN-BUTTON-PRESSED (para<br />
cada botón no para todo el formulario), donde el codigo del boton Aceptar seria:<br />
DECLARE<br />
cursor usuario is select edad, nombre from persona where<br />
nombre= :persona.nombre;<br />
tipo usuario %rowtype;<br />
ignora number;<br />
BEGIN<br />
open usuario;<br />
fetch usuario into tipo;<br />
if :persona.edad = tipo.edad then<br />
/*Si queremos que no se cierre el formulario de acceso usamos<br />
OPEN_FORM('RecursosHumanos');<br />
81
CLEAR_FORM(NO_VALIDATE);<br />
*/<br />
/*Abrimos el nuevo formulario y cerramos el de acceso*/<br />
CALL_FORM('RecursosHumanos');<br />
exit_form;<br />
else<br />
/*En caso de fallo mostramos un Alert diciendo que hay un<br />
acceso erroneo*/<br />
ignora:=Show_Alert('errorAcceso');<br />
/*Limpiamos para empezar de nuevo*/<br />
CLEAR_FORM(NO_VALIDATE);<br />
end if;<br />
close usuario;<br />
END;<br />
Observamos que cuando se comete un error llama a la Alerta errorAcceso por<br />
tanto hay que crearla. Se puede usar tanto CALL_FORM como OPEN_FORM si<br />
se quiere ver las diferencias o si se quisiera utilizar parámetros al llamar al<br />
formulario, mirar la ayuda en línea de Oracle Developer.<br />
El codigo del boton Borrar sería clear_form(no_validate);y para el botón Salir<br />
seria exit_form;<br />
Si para la contraseña usamos cadenas de texto a la hora de declarar los campos<br />
debe usarse VARCHAR, si usamos CHAR no funcionará.<br />
14. ¿Como ejecutar un formulario/informe distinto al que estamos usando al<br />
pulsar un botón?<br />
Sería de forma análoga como hemos llamado en la pregunta anterior al<br />
formulario Principal desde el formulario Acceso.<br />
15. ¿Como elegir diferentes opciones de características de un formulario?<br />
Con la utilización de parámetros al igual que como se hace en los informes.<br />
16. En un formulario quiero rellenar un campo darle a un botón y que me<br />
rellene el resto de los campos ¿Cómo lo hago?<br />
Supongamos que el campo que queremos rellenar es Nombre (el ejemplo de<br />
lienzos tabulares del tutorial nos sirve). Le damos al botón de Introducir<br />
Consulta (Enter Query) rellenamos el nombre (por ejemplo Ramon) y le damos<br />
al botón de Ejecutar Consulta.<br />
Si queremos no tener que utilizar estos dos botones y hacerlo de forma que sólo<br />
se introduzca el nombre y le demos a un botón, se haría creando un nuevo botón,<br />
al que le asociamos un disparador WHEN-BUTTON-PRESSED donde ponemos<br />
82
de código execute_query; y el disparador WHEN-NEW-FORM-INSTANCE del<br />
formulario añadimos la línea enter_query;.<br />
17. ¿Cómo puedo borrar la tupla actual que se muestra en un formulario<br />
pulsando un botón?<br />
Añadiríamos un botón con un disparador WHEN-BUTTON-PRESSED cuyo<br />
código sería delete_record; y lo que haría sería borrar el registro que se está<br />
visualizando<br />
18. Me sale el error FRM-402002: Es obligatorio introducir un valor en el<br />
elemento ¿cómo lo quito?<br />
Esto ocurre cuando al campo del formulario tiene la propiedad de Obligatorio<br />
puesta a Sí. Basta con cambiarlo a No, pero si lo que se quiere es obligar al<br />
usuario a introducir datos en un campo sin usar esta característica de Oracle, se<br />
tendría que comprobar en un disparador que el contenido no está vacío.<br />
19. ¿Como puedo modelar una relación muchos a muchos ?<br />
Supongamos que tenemos una relación mucho a muchos entre las entidades<br />
Coche, Caracteristicas y la relación Tiene. Si lo hacemos normalmente, creamos<br />
el Bloque de Datos Coche, luego lo relacionamos con Tiene y finalmente<br />
añadimos el Bloque de Datos Caracteristicas relacionado con el Bloque Tiene,<br />
nos va a salir que cada coche tiene una sóla característica, si visualizamos los<br />
campos del bloque de datos Tiene veremos que para cada coche se ven todas sus<br />
entradas de la tabla Tiene y para cada una de estas se muestra sólo una<br />
caracteristica.<br />
Si quisieramos ver todas las características de cada coche las solución más fácil<br />
es crear una vista que aglutine Tiene y Caracteriticas, y a la hora de realizar el<br />
formulario se haga con dos Bloques de Datos uno para Coche y otro para la vista<br />
creada.<br />
20. ¿Cómo hago que un elemento no se pueda modifica (que sólo se muestre)?<br />
Para cada elemento que no quieras que se modifique activale la propiedad<br />
Activado a No<br />
21. ¿Cómo usar imágenes de la BD para los formularios?<br />
Esto lo vamos a hacer de una forma sencilla, en un campo de una tabla<br />
guardaremos la ruta hasta la imagen (path) y en el formulario lo que haremos<br />
será leer desde un fichero la imagen cuya ruta nos da la BD y mostrarla en el<br />
83
formulario. Es importante que esa ruta sea simple (portabilidad de la aplicación<br />
a la ETSII) y que los ficheros con las imágenes existan.<br />
Vamos a suponer que en el ejemplo de la granja tenemos en la tabla persona un<br />
campo llamado Foto, donde guardaremos la ruta hacia la imagen de la persona.<br />
Cuando construyamos el Bloque de Datos sobre la tabla Persona escogeremos<br />
también el campo Foto, pero no los mostraremos.<br />
Una vez con el bloque de datos para Persona creado, en el Editor de Diseño<br />
crearemos un Elemento de Imagen (icono con un paisaje), la cambiaremos el<br />
nombre a, por ejemplo, IMAGENFOTO y le cambiaremos la propiedad<br />
Elemento de Base de Datos a No y la propiedad Obligatoria a No.<br />
Para el bloque de datos Persona crearemos un disparador POST-BLOCK cuyo<br />
código será READ_IMAGE_FILE(:Persona.foto, 'JPG',<br />
'Persona.IMAGENFOTO'); donde le decimos que lea una imagen desde un<br />
fichero (el que le da :Persona.foto) y lo ponga en un elemento de imagen<br />
(llamado 'Persona.IMAGENFOTO'). Si quieres saber más acerca del disparador<br />
POST-BLOCK o de la función READ_IMAGE_FILE mira la ayuda en línea de<br />
Developer.<br />
22. ¿Cómo pasar parámetros a un formulario o a un informe?<br />
Tanto si usamos CALL_FORM, OPEN_FORM(ambos para formularios y que<br />
tiene una forma que acepta una lista de parámetros) o RUN_PRODUCT (que<br />
nos sirve tanto para formularios como para informes) tendremos que definir una<br />
lista de parámetros y añadir los parámetro uno a uno. Por ejemplo:<br />
DECLARE<br />
parametros Paramlist; /*Definimos la lista de parametros*/<br />
BEGIN<br />
/*Creamos la lista de parametros*/<br />
parametros := Create_Parameter_List('datos');<br />
/*Añadimos parametros*/<br />
Add_parameter(parametros,'empleado',TEXT_Parameter,:persona.no<br />
mbre);<br />
Add_parameter(parametros,'tipo',TEXT_Parameter,'Pago');<br />
/*Llamamos a un informe con parametros*/<br />
Run_PRODUCT(REPORTS,'LibroContabilidadEmpleadoTipo',SYNCHRONOU<br />
S, RUNTIME, FILESYSTEM,parametros ,NULL);<br />
END;<br />
En el anterior ejemplo añadimos a la lista de parámetros llamada parametros dos<br />
parametros de texto (TEXT_PARAMETER) cuyo nombre son empleado y tipo<br />
y en el primero le pasamos el valor cogiendo de un campo de un bloque de datos<br />
( persona.nombre) y en el segundo le pasamos una cadena ('Pago').<br />
23. ¿Cómo usar los parámetros de un informe en la consulta?<br />
84
En el Report Builder, Iniciamos el asistente y creamos una consulta temporal<br />
que no utilice los paramétros.<br />
Una vez creada la consulta, desde el navegador de objetos creamos dos<br />
Parámetros del Usuario con sus respectivos nombres y tipos (siguiendo el<br />
ejemplo anterior les ponemos Empleado y Tipo, usando el Tipo de Dato<br />
Cararacter). Ejecutamos el Asitente de Informes y en la pestaña datos<br />
modificamos la consulta para que utilice los parámetros (en nuestro caso sería,<br />
por ejemplo, select * from librocuentas where persona= :empleado AND<br />
tipooperacion= :tipo;)<br />
24. ¿Cómo quitar la ventana que te pide los parámetros de un informe?<br />
Desde el Reports Builder con el informe abierto, nos vamos a herramientas-<br />
>Constructor de Pantalla de Parametros. Dejamos en blanco el Titulo, la Linea<br />
de Indicación y la Línea de Estado, además deseleccionamos aquellos atributos<br />
que estuviesen seleccionados en la lista.<br />
25. ¿Se puede utilizar una lista dinámica para una clave primaria o para una<br />
clave externa utilizada en una relación?<br />
No se debe, ya que la lista está vacía al principio (sólo tiene el valor por defecto)<br />
y posteriormente la rellenas cuando se crea el formulario, si está la clave<br />
primaria vacía o la clave externa vacía no puede recuperar bien los datos de la<br />
base de datos, ni hacer bien las relaciones.<br />
Lo aconsejable sería utilizar bloque LOV.<br />
26. Me gustaría que al entrar a un formulario, se realizara automaticamente<br />
Execute_query con un campo relleno. ¿Cómo lo hago?<br />
Supongamos que lo que queremos hacer es que en el formulario de Recursos<br />
Humanos empiece siempre mostrando al empleado 'Ignacio'. Para ello en el<br />
disparador WHEN-NEW-FORM-INSTANCE del formulario añadimos el<br />
siguiente código:<br />
DECLARE<br />
bloquedatos Block;<br />
BEGIN<br />
/*Nos vamos al bloque de datos en el que queremos hacer la<br />
consulta*/<br />
bloquedatos := Find_Block('Persona');<br />
/*Modificamos la clausula WHERE del bloque de datos*/<br />
Set_Block_Property(bloquedatos,DEFAULT_WHERE, ' nombre =<br />
''Ignacio'' ');<br />
85
END;<br />
/*Ejecutamos la consulta*/<br />
Execute_Query;<br />
27. ¿Cómo pasar parametros de un formulario a otro?<br />
Supongamos que en el formulario de Acceso al darle al botón Aceptar queremos<br />
que se pase el nombre del empleado que se ha identificado de forma que en el<br />
formulario de RecursosHumanos (llamador por Acceso) se nos muestren los<br />
datos de dicho empleado.<br />
Lo primero que tendremos que hacer es modificar el código del botón Aceptar<br />
en el formulario Acceso para que mande el nombre del empleado como<br />
parámetro al llamar al formulario RecursosHumanos:<br />
open usuario;<br />
fetch usuario into tipo;<br />
if :persona.edad = tipo.edad then<br />
/*Creamos la lista de parametros*/<br />
parametros := Create_Parameter_List('datos');<br />
/*Añadimos como parametro la persona que se ha<br />
identificado*/<br />
Add_parameter(parametros,'empleado',TEXT_Parameter,:p<br />
ersona.nombre);<br />
/*Llamamos al formulario de Recursos Humanos*/<br />
Run_PRODUCT(FORMS,'RecursosHumanos',SYNCHRONOUS,<br />
RUNTIME, FILESYSTEM,parametros ,NULL);<br />
/*cerramos el de acceso*/<br />
exit_form;<br />
else<br />
/*En caso de fallo mostramos un Alert diciendo que hay un<br />
acceso erroneo*/<br />
ignora:=Show_Alert('errorAcceso');<br />
/*Limpiamos para empezar de nuevo*/<br />
CLEAR_FORM(NO_VALIDATE);<br />
end if;<br />
close usuario;<br />
END;<br />
Lo segundo que haremos es modificar el formulario de RecursosHumanos para<br />
que se inicialice con la persona que se le pasa como parámetro. Antes de anda<br />
tendremos que definir un nuevo parámetro en el navegador de objetos (dándole a<br />
crear) y le daremos nombre EMPLEADO (el nombre con el que lo llamamos<br />
desde el formulario Acceso) y que sea de tipo carácter. Después modificaremos<br />
el disparador WHEN-NEW-FORM-INSTANCE como en la pregunta anterior<br />
pero cambiando la línea Set_Block_Property(bloquedatos,DEFAULT_WHERE,<br />
' nombre = ''Ignacio'' '); por<br />
86
Set_Block_Property(bloquedatos,DEFAULT_WHERE, ' nombre =<br />
:Parameter.empleado ');.<br />
28. ¿Cómo saber que valor he escogido de un grupo de Radio Button?<br />
Para cada botón de un grupo de Radio buttons tenemos que activar la propiedad<br />
Valor de Botón de Radio a un valor diferente, por ejemplo 1, 2 y 3 si tenemos<br />
tres botones. Posteriormente para saber que valor tiene, si el grupo de botones de<br />
radio se llama GBRADIo y está en el bloque de datos PERSONA, tendremos<br />
que comparar :Persona.gbradio con 0, 1 y 2 para saber que botón es el que está<br />
activado. Para el grupo de Radio buttons (GBRADIO en nuestro caso) habrá que<br />
poner la propiedad ValorInicial a uno de los valores introducidos en los radio<br />
buttón, por ejemplo, 1 para que se marque ese por defecto.<br />
29. ¿Cómo saber si he marcado un checkbox?<br />
Tendremos que inicilizar las propiedades Valor Si Está Comprobado y Valor Si<br />
No Está Comprobado, por ejemplo a 1 y 0, el primero si está marcado y el<br />
segundo para si no lo está. Posteriormente para saber que valor tiene, si el<br />
checkbox se llama MiCheckBox y está en el bloque de datos PERSONA,<br />
tendremos que comparar :Persona.micheckbox con 1 ó 0 para saber si está<br />
activado o no.<br />
30. ¿Cómo incrementar el campo código si uso secuencias?<br />
Igual que cuando lo vimos en la pregunta ¿Cómo generar valores consecutivos<br />
(un código) para un campo desde un formulario? pero podemos poner SELECT<br />
misecuencia.NEXTVAL INTO :productos.codigo FROM dual;<br />
31. ¿Cómo incrementar el campo código si tengo una letra antes del número?<br />
Básicamente como muestra el siguiente código:<br />
DECLARE<br />
cadena1 varchar2(50);<br />
cadena2 varchar2(50);<br />
numero number;<br />
BEGIN<br />
/*Me quedo con la subcadena que tiene el numero*/<br />
cadena1:=substr(:Productos.codigo.texto,2,length(:Productos.codi<br />
go));<br />
/*Lo paso a numero*/<br />
numero:=TO_number(cadena1);<br />
/*Lo incremento*/<br />
87
numero:=numero+1;<br />
/*Lo vuelvo a pasar a cadena*/<br />
cadena2:=TO_CHAR(numero);<br />
/*Le añado la letra la principio*/<br />
cadena1:='T'||cadena2;<br />
/*Actualizo la clave*/<br />
:Prodcutos.codigo :=cadena1;<br />
END;<br />
Hay que tener en cuenta que esto está pensado para códigos que tiene una sóla<br />
letra (la T) antes de un número y que incrementa el que se encuentra en el<br />
formulario (para obtener el maximo a partir de la tabla se podría hacer con un<br />
SELECT INTO con un ORDER BY para que los ordene).<br />
32. ¿Quiero crear una tabla donde tenga una comprobación de tiempo respecto<br />
a la fecha actual ¿Cómo lo hago?<br />
No se puede hacer, ya que no se puede usar SYSTIME en la creación de tablas.<br />
Ten en cuenta que la tabla se crea una vez y usar SYSTIME en una clausula<br />
CHECK sería algo dinámico. Para hacerlo se pueden usar disparadores (triggers)<br />
dentro de la base de datos, pero eso se sale un poco de nuestros objetivos, lo<br />
ideal sería hacer las comprobaciones en nuestra aplicación.<br />
33. ¿Cómo hago que en mi formulario se vea sólo la parte de una tabla que<br />
cumple determinadas características?<br />
Los bloques de datos de nuestros formularios son consultas a la base de datos<br />
pero que no tienen, por defecto, una clausula WHERE. Esta clausula WHERE se<br />
puede definir en la paleta de propiedades de los bloques de datos algo que<br />
hicimos en PL/SQL en las preguntas 24 y 25.<br />
34. Tengo una serie de bloques de datos en el mismo formulario y que no están<br />
relacionados (por ejemplo, varias pestañas) y al ejecutar un execute_query<br />
(ejecutar consulta) sólo se me rellena el primero de ellos ¿cómo relleno los<br />
demás?<br />
Rellenando cada uno por separado en el disparador WHEN-NEW-FORM-<br />
INSTANCE:<br />
Go_Block('librodecuentas');<br />
Execute_Query;<br />
Go_Block('personas');<br />
Execute_Query;<br />
Go_Block('empleados');<br />
Execute_Query;<br />
Go_Block('alojamiento');<br />
88
Execute_Query;<br />
35. Tengo una especialización y tengo problemas para mostrarla junto su<br />
generalización ¿cómo lo hago?<br />
Como cualquier otras dos tablas que están relacionadas, si aún así tienes<br />
problemas puedes usar una vista para unir todos los campos de ambas tablas<br />
36. Quiero hace un un insert/update dentro de un disparador, pero no funciona<br />
¿cómo hago que funcione?<br />
Este problema se suele dar cuando tenemos un bloque de datos a partir de una<br />
tabla de la base de datos y queremos realizar alguna operación sobre dicha<br />
tablas. El problema está en que Forms abre la tabla (para usarla, lógico) y la<br />
bloquea de forma que cualquier operación insert/update sobre dicha tabla fallará.<br />
La única solución a este problema es no usar dicha tabla para construir un<br />
bloque de datos (y contruir el bloque de datos manualmente, rellenando sus<br />
datos desde PL/SQL), o bien, usar el form para añadir/actualizar registros en la<br />
base de datos.<br />
37. ¿Hay que entregar el diseño de la aplicación otra vez?<br />
Si. Hay que entregarlo con los fallos corregidos, que ya se indicaron en su día.<br />
38. ¿Cómo preparo los ficheros de mi aplicación para que no me den<br />
problemas con las rutas (path)?<br />
Lo ideal sería que todos los ficheros estuvieran en un CD y se pudiese ejecutar<br />
desde ahí. Aunque también se puede optar por guardar todos los ficheros en un<br />
directorio (o estructura sencilla) que cuelgue de C: e indicarlo de forma muy<br />
clara en la entrega.<br />
89