11.04.2013 Views

MANUAL ORACLE DEVELOPER ESPAÑOL.pdf

MANUAL ORACLE DEVELOPER ESPAÑOL.pdf

MANUAL ORACLE DEVELOPER ESPAÑOL.pdf

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!