martes, 22 de marzo de 2011

¿Cómo obtener el valor de una campo de una secuencia Oracle trabajando con ADF BC?

Un título largo y descriptivo que plantea perfectamente el problema a tratar. Resulta que cuando queremos que el valor de una campo se obtenga directamente de una secuencia Oracle y estamos utilizando ADF Business Components, es fácil que cometamos un error.

Cuando configuramos los atributos de un Entity Object, podemos seleccionar varios tipos de dato, entre los que se encuentra DBSequence. Cuando elegimos esta opción, el diálogo de jDeveloper muestra un par de campos nuevos en los que nos pide que indiquemos un nombre de secuencia, y un valor de comienzo. Es lógico pensar que si ponemos en ese campo, por ejemplo, SEQ_PERSONA, el framework se encargará de coger el valor correspondiente de la secuencia, e inyectarlo en el campo que estamos editando. Nada más lejos de la realidad...

El utilizar el tipo DBSequence para un campo indica a ADF que el valor para el mismo va a ser proporcionado por la base de datos, pero ADF no se va a encargar de obtenerlo. Lo que va a hacer es asignar un valor temporal al campo, y esperar a que la base de datos le proporcione el real a la hora de persistir la información. El valor temporal será un número negativo.

Esto implica que nos toca a nosotros obtener el valor de la secuencia y utilizarlo para informar el campo. Una forma sencilla de hacerlo es crear un trigger en la base de datos que se ejecute antes de cada inserción en la tabla correspondiente. De forma general el código tendría el siguiente aspecto.

CREATE OR REPLACE TRIGGER %NOMBRE_TRIGGER%
BEFORE INSERT ON %TABLA% FOR EACH ROW
BEGIN
IF :NEW.%CAMPO% IS NULL OR :NEW.%CAMPO% < 0 THEN
SELECT %NOMBRE_SECUENCIA%.NEXTVAL
INTO :NEW.%CAMPO%
FROM DUAL;
END IF;
END;

Y, entonces, ¿para qué nos pide el IDE el nombre de la secuencia? Pues este dato sólo tendrá utilidad si estamos utilizando un enfoque en el que creemos en primer lugar nuestros objetos de negocio, y a partir de ellos queramos generar el esquema de datos. En este caso, jDeveloper creará, además de la tabla, la secuencia indicada en la base de datos.

jueves, 10 de marzo de 2011

Tutorial de Oracle ADF

Hoy me han publicado un nuevo tutorial en Javahispano. En este caso sobre el desarrollo de una aplicación Web con Oracle ADF, utilizando jDeveloper 11.

En el documento se hace una breve introducción teórica al framework de Oracle, comentando su arquitectura y, posteriormente, se detallan los pasos a seguir para crear una aplicación Web simple basada en ADF utilizando el entorno de desarrollo jDeveloper, en su versión 11. En el proceso se cubre desde la definición de la base de datos hasta el despliegue en el servidor WebLogic integrado en el IDE.

ADF es un framework basado en la arquitectura MVC, y ofrece un solución para cada una de las capas, aunque permite igualmente el uso de casi cualquier combinación de las tecnologías J2EE más extendidas. En el ejemplo del tutorial se ha optado por trabajar con JSF para la vista y el controlador (con la implementación ADFFaces, concretamente), y con EJB para la capa de servicios de negocio.

El tutorial se puede descargar en esta dirección.

Muchas gracias de nuevo a todo el equipo de Javahispano.

martes, 8 de marzo de 2011

Android - Gestión de aplicaciones

Después de un tiempo bicheando con Android, desarrollando y probando aplicaciones, te puedes encontrar que el emulador esté hasta arriba de iconos, y quieras eliminar algunos. Si no estás familiarizado con el funcionamiento de estos móviles, como me pasa a mí, puede que no atines a encontrar la forma de hacerlo, aunque es bastante simple.

Lo primero es pulsar el botón Menú, con lo que aparecerán una serie de opciones. Seleccionamos Manage Apps. Esto nos lleva a una pantalla en la que se muestran todas las aplicaciones del emulador (con los iconos de la sección superior se puede restringir la vista para mostrar las que se encuentran en la tarjeta SD, por ejemplo). Si buscamos en esa lista (ordenada alfabéticamente) la aplicación que queremos eliminar, y la seleccionamos, accederemos a una pantalla donde se mostrará información sobre ella, y en la que podemos ver un botón Uninstall.


Si pulsamos este botón y confirmamos, la aplicación desaparecerá de nuestro emulador.

Sin llegar al extremo de eliminarla, nos puede pasar que ejecutemos una aplicación y al salir de ella se quede ejecutándose. Me ha pasado, por ejemplo, con algunos juegos con sonidos; si sales con el botón de vuelta atrás, el juego sigue ejecutándose, y por tanto sonando.

Para parar la aplicación podemos volver a la pantalla de gestión de aplicaciones, y encontramos una opción en la botonera superior para mostrar las aplicaciones que se están ejecutando. Sin embargo, es muy posible que no encontremos la aplicación que queremos parar. Para verla tendremos que volver a pulsar el botón Menú desde esa pantalla, y seleccionar la opción Show Cached Processes. En la nueva lista sí que podremos ver todas las aplicaciones que se están ejecutando y, al seleccionarlas, tendremos un botón Stop, que detendrá su ejecución.

viernes, 18 de febrero de 2011

Jasper Server

En las últimas semanas he comenzado a trabajar en un nuevo proyecto que, además de demasiados cambios a nivel personal (como demuestra que me halle escribiendo aquí a estas horas), me ha proporcionado algunas interesantes novedades a nivel profesional.

Una de ellas es el haber comenzado a trabajar con Jasper Server. Ya había utilizado anteriormente la tecnología de JasperSoft para crear informes, siempre a través de la herramienta iReport, pero nunca había llegado a tocar el servidor.

En mi caso me lo encontré ya montado y funcionando, pero me tocó hacer algunas modificaciones a los informes que contenía. La gran duda me surgió nada más empezar. ¿Cómo me bajo un reporte para poder editarlo? Lo primero que me indicó mi instinto fue que bichease la interfaz Web buscando una opción que lo permitiese, pero para mi sorpresa no la había, o estaba muy bien escondida.

Así que tiré del plan B, y rebuscando por iReport encontré una vista hasta entonces desconocida: el repositorio JasperServer.

Cuando se activa, esta vista muestra un panel desde el que se pueden configurar conexiones a servidores Jasper simplemente dando los parámetros necesarios mediante un wizard.


Una vez establecida la conexión, es posible navegar por el contenido del servidor hasta localizar los ficheros jrxml en él publicados. Basta entonces con hacer clic derecho sobre ellos y seleccionar la opción 'Open in editor' para tener el informe en el editor, y en una carpeta temporal de nuestro ordenador. Desde ahí no tenemos más que guardarlo donde nos interese.

Si tras hacer modificaciones queremos realizar el proceso inverso, actualizando la versión del servidor a partir de nuestra copia local, no tenemos más que volver a hacer clic derecho, y seleccionar en este caso 'Replace with current document' (lógicamente con el informe modificado abierto y activo en el editor).

Todo esto dicho para la versión 3.7.0 de iReport.

sábado, 5 de febrero de 2011

Uno de los errores que me he encontrado habitualmente desarrollando para Android con el plugin de Eclipse ADT es el siguiente:

emulator: ERROR: the user data image is used by another emulator. aborting

Cuando esto pasa resulta imposible desplegar una aplicación por más que reiniciemos el emulador, el eclipse, o lo que queramos. El porqué empieza a aparecer este error la verdad es que no he conseguido averiguarlo, pero sí que he encontrado una solución satisfactoria en los foros de stackoverflow.

Como ahí se explica, para solucionar el problema basta con eliminar dos carpetas ubicadas en la ruta C:\Documents and Settings\%user%\.android\avd\%nombreTelefono%.avd, cache.img.lock y userdata-qemu.img.lock.

En mi caso funcionó perfectamente, aunque en un principio obtuve un comportamiento extraño: cada vez que arrancaba la aplicación se lanzaba una nueva instancia del emulador. No duró mucho.

Otras alternativa que parece algo más limpia es la de reiniciar el servidor ADB. La he probado y funciona igualmente. Se puede hacer yendo a la vista DDMS, a la pestaña Devices, y al View Menu (la flecha blanca que apunta hacia abajo). Ahí tenemos la opción Reset ADB.