137
Introducción a gvHIDRA Índice de contenido 1. Introducción a . Introducción a PHP b . Entendiendo el entorno , arquitectura MVC c . Comunidad www . gvhidra . org 2. Infraestructura a . Infraestructura de servidor LAPP / LAMP / WAMP , etc . Base de Datos Oracle Base de Datos PostgreSQL PHP b . Configuración del entorno de desarrollo . i . IDE : Eclipse . Navegador : Firefox + plugins . Debugger Eclipse PDT Firefox + Plugins SQL Developer iReport Debugger ii . Instalación de una demo gvHidra iii . Otras herramientas 3. ¿ Qué es gvHidra ? a . Guía de estilo b . Arquitectura de una aplicación c . Patrones de interfaz d . Mi primera aplicación , uso de Genaro . e . Autenticación i . Sin autenticación ii . Mediante usuario / contraseña iii . Mediante más de una fuente 1

Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Introducción a gvHIDRAÍndice de contenido

1. Introducción a . Introducción a PHP b . Entendiendo el entorno , arquitectura MVC c . Comunidad www . gvhidra . org

2. Infraestructura a . Infraestructura de servidor LAPP / LAMP / WAMP , etc .

Base de Datos Oracle Base de Datos PostgreSQL PHP

b . Configuración del entorno de desarrollo . i . IDE : Eclipse . Navegador : Firefox + plugins . Debugger

Eclipse PDT Firefox + Plugins SQL Developer iReportDebugger

ii . Instalación de una demo gvHidra iii . Otras herramientas

3. ¿ Qué es gvHidra ? a . Guía de estilo b . Arquitectura de una aplicación c . Patrones de interfaz d . Mi primera aplicación , uso de Genaro . e . Autenticación

i . Sin autenticación ii . Mediante usuario / contraseña iii . Mediante más de una fuente

1

Page 2: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

iv . Autenticación externa v . Otros

f . Autorización : módulos y roles g . Información de estado

4. Desarrollando software con gvHidra ( Caso práctico ) a . Presentación del caso

RequisitosModelo diagrama de clases de apoyo Modelo entidad relación de apoyo

b . Preparación entorno , personalización y carga de datos c . Creación de mantenimientos d . Incorporar la lógica de presentación

i . Componentes simples ii . Componentes avanzados iii . Acciones de interfaz

e . Incorporar la lógica de negocio i . Acciones genéricas ii . Acciones particulares

5. Programación de informes a . Introducción

i . Presentación de la herramienta ii . Compañía desarrolladora y mantenimiento iii . IDE ' s para JasperReports : iReport iv . Ficheros generados por JasperReports v . Advertencia

b . Secciones en un fichero . jrxml c . Objetos Básicos

i . Campos o Fields ii . Variables iii . Parámetros iv . Grupos

d . SubReports : informes Maestro / Detalle e . Recomendaciones Caso práctico iReport

6. Integración de informes con gvHidra a . Preparación del entorno

i . Configuración servidor ii . Configuración aplicación gvHidra iii . Configuración del navegador

b . Integración en el código 7. Conclusiones Anexo 1: Wizard iReport

2

Page 4: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

1. Introducción

a. Introducción a PHPPHP es un lenguaje interpretado que permite la generación dinámica de contenidos en un servidor web. Sus siglas significan Php Hypertext Preprocessor (acrónimo recursivo). Su licencia está considerada como una licencia de software libre: http :// es . wikipedia . org / wiki / Licencia _ PHP .

Es muy similar a C y Perl en cuanto a programación estructurada pero también es un lenguaje muy potente en cuanto a programación Orientada a Objetos. Nosotros utilizaremos el lenguaje en ambas formas (estructurada y orientada a objetos), pero siempre contenidos en el marco de trabajo del framework gvHidra el cual nos aislará del código a bajo nivel y nos facilitará enormemente el trabajo.

El código PHP normalmente se guarda en ficheros con extensión .php. Dentro del fichero el código se delimita normalmente por las etiquetas <?php y ?>.

El funcionamiento básico se puede describir en el siguiente orden:1. El navegador web cliente solicita el documento mediante su URL, ejemplo:

http://localhost/informacion.php2. El servidor web recibe la solicitud, llama al intérprete de PHP, ejecuta el código y

retorna el resultado. Ejemplo de código 3. El servidor web devuelve el resultado generado al navegador web.

4

Page 5: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

En todo caso, para el desarrollo de nuestra lógica de negocio nos vendrá muy bien consultar el manual http :// www . php . net / manual / es /

b. Entendiendo el entorno, arquitectura MVCEs necesario explicar el entorno o la arquitectura en la que nos movemos, hecho que nos permitirá entender mejor nuestros desarrollos, la potencia de la herramienta, así como detectar antes errores de código o configuración.

Los desarrollos pequeños o “de antes” en PHP son lo que ahora se denomina peyorativamente como “Spaguetti code”. Nos referimos, al hecho de mezclar en una única porción de código varios lenguajes como PHP y HTML, así como mezclar la lógica de negocio y la lógica de presentación (que queremos hacer y que es como lo queremos mostrar).

Ejemplo:

<?php$a=1;$b=2;echo '<html>';echo '<head>';echo '</head>';echo '<body>';echo '<form action="ejemplo.php">';if($a+$b==1){

echo '<p>Nombre<input type="text" name="nombre" value="" /></p>';}else{

echo '<p>Telefono<input type="text" name="telefono" value="" /></p>';}echo '</form>';echo '</body>';echo '</html>';

?>

Nuestros desarrollos se van a enmarcar en un framework de desarrollo que implementa la arquitectura MVC (Modelo Vista Controlador), que en grandes rasgos consiste en separar la lógica de negocio por un lado (Modelo), la presentación en pantalla por otro (Vista) y su ejecución ordenada o único punto de entrada por otro (Controlador).

5

Page 6: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Esta ilustración refleja fielmente el flujo en la arquitectura MVC:

Para el caso concreto de gvHidra, se utilizan los siguientes “componentes” para la implementación del MVC.

Modelo: Implementado con el propio PHP y librerías PEAR, tales como MDB2 para la persistencia de los datos (Oracle, PostgreSQL, SqlServer, MySQL, Sqlite2,...), MAIL para el envío de e-mails o SOAP para los webservices.

Vista: Para la implementación de la vista se ha incluido el famoso motor de plantillas Smarty, el cual se ha sobrecargado con “menús” dinámicos, máscaras, diálogos modales, etc.

Controlador: Como controlador se incluye el proyecto Phrame, sobrecargado para poder ejecutar código en el lado del servidor sin recargar la pantalla.

c. Comunidad www . gvhidra . org

6

Page 7: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Todo proyecto software libre que se precie, tiene una comunidad de usuarios y colaboradores. Para el caso de gvHidra, podemos encontrarla en el enlace www . gvhidra . org . Es por lo tanto importante que revisemos y conozcamos todo los contenidos que puede ofrecernos.

Para un desarrollador, los contenidos más relevantes serán el manual de usuario así como el espacio de comunicación con otros desarrolladores. Por ello, en este curso realizaremos la descarga de la última versión del manual y a su vez nos registraremos en la lista de correo.

Otros elementos no menos importantes son la forja del proyecto, donde podremos seguir su roadmap, conocer features y bugs, así como consultar el código fuente.

7

Page 8: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

2. Infraestructura

a. Infraestructura de servidor LAPP/LAMP/WAMP, etc.En este punto vamos a conocer, instalar y configurar la infraestructura del lado servidor necesaria para la correcta ejecución del framework gvHidra.

El framework necesita unos componentes mínimos para funcionar, estos son: un servidor web, un módulo que interprete PHP 5 y según casos una base de datos relacional.En las instalaciones típicas de otros frameworks y/o aplicaciones web, suelen utilizarse paquetes preparados para satisfacer esos tres componentes, por ello podremos encontrar fácilmente por la red paquetes como:

● LAPP: Linux, Apache, PostgreSQL y PHP.● LAMP: Linux, Apache, MySQL y PHP.● WAMP: Windows, Apache, MySQL y PHP.● WAPP: Windows, Apache, PostgreSQL y PHP.

Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del entorno gvHidra” disponible en la web del proyecto www . gvHidra . org .

Queremos hacer hincapié en que la siguiente instalación puede no ser adecuada para un servidor de producción, donde siempre será más adecuado realizar una instalación controlada de cada elemento necesario. En cualquier caso, estos aspectos quedan fuera del ámbito del curso.

Base de Datos OraclePara desarrollar con oracle, podemos usar la versión “Oracle Database 11g Express Edition” que aunque tiene algunas limitaciones, es fácil de instalar y más que suficiente para un entorno de desarrollo.

Los pasos de instalación son:

1. Descargar la última versión desde http :// www . oracle . com / technetwork / products / express - edition / downloads / index . html (requiere registro).

2. Hay que descomprimir el fichero y ejecutar el fichero “DISK1\setup.exe”. Dejaremos la ruta de instalación por defecto (c:\oraclexe). Como contraseña de sys y system pondremos “curso”. La instalación del software y de una instancia se hace con los siguientes parámetros:

8

Page 9: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

3. Una vez finalizada la instalación, arrancamos la base de datos con el comando Inicio -> Oracle Database 11g Express Edition -> Start database. Podemos iniciar una conexión con comando “Run SQL Command Line”, tecleando

SQL> connect system/curso;

Base de Datos PostgreSQLCon el fin de poder ejecutar una demo de gvHidra que veremos en el apartado 2.b.iii, instalaremos también la base de datos postgresql. Seguiremos los siguientes pasos:

1. Descargar la versión 9.1.4 de http :// postgresql . org . Ejecutamos el fichero y dejamos la ruta por defecto, directorio de datos por defecto, como contraseña del administrador usaremos también “curso”, puerto por defecto, configuración regional por defecto, y no marcar la opción de instalar “Stack Builder”.

2. Añadir al PATH la ruta C:\Archivos de Programa\PostgreSQL\9.1\bin.

3. Una vez finalizada la instalación, podemos conectarnos usando el pgAdmin III que viene con la instalación.

PHP

9

Page 10: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

La actual versión estable de gvHidra es la 3.1.8, que todavía no soporta PHP 5.3, por lo que vamos a utilizar wampserver (http :// www . wampserver . com / en / ), ya que nos permite usar fácilmente varias versiones de PHP. Los pasos para la instalación son:

1. Descargar la versión WAMPSERVER (32 BITS & PHP 5.3) 2.2E, y ejecutar. Lo instalaremos en la ruta c:\wamp, y cuando nos pregunte la ubicación del navegador le indicaremos la ruta del Firefox (c:\archivos de programa\Mozilla Firefox)

2. Ejecutarlo y si aparece el icono en verde significa que ya está en marcha el servidor web apache y la base de datos mysql. En otro caso ir a la guía de instalación.

3. Como la versión instalada es la 5.3 de PHP, tenemos que descargar ahora desde “addons” -> “download PHP addons” la versión “PHP 5.2.9”. Ejecutamos el fichero y al finalizar, ya podremos elegir la nueva versión de PHP

4. Podemos acceder al servidor en http :// localhost (sirve contenidos en C:\wamp\www).

5. Para el acceso a bases de datos oracle y postgresql, necesitamos habilitar la extensión PHP oci8 y la pgsql. Tenemos que hacerlo en el menu PHP -> PHP Extensions -> php_oci8 y php_pgsql. Para que funcione también en línea de comando (CLI), tenemos que descomentar las líneas correspondientes en C:\wamp\bin\php\php5.2.9\php.ini.

6. Ahora ya podemos instalar todas las librerias PEAR necesarias, con los siguientes comandos:

cd c:\wamp\bin\php\php5.2.9\php5.2.9go-pear (opciones por defecto)

10

Page 11: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

-- ejecutar el fichero C:\wamp\bin\php\php5.2.9\PEAR_ENV.regpear upgrade PEARpear install Authpear install MDB2pear install MDB2_Driver_oci8pear install MDB2_Driver_pgsqlpear install Mailpear config-set preferred_state alphapear install --alldeps Image_Graphpear install --alldeps SOAP

7. Desde el menú wamp, en opción PHP -> php.ini fijar estas variables:error_reporting = E_ALL & ~E_NOTICEinclude_path = ".;C:\wamp\bin\php\php5.2.9\PEAR"

b. Configuración del entorno de desarrollo.

i. IDE: Eclipse. Navegador: Firefox + plugins. DebuggerTener un Entorno de Desarrollo Integrado (IDE) cómodo, potente y efectivo es muy importante. Por ello, instalaremos las herramientas, que desde nuestra experiencia, consideramos más adecuadas para el desarrollo de aplicaciones con gvHidra.

Eclipse PDTEn primer lugar descargaremos e instalaremos el popular IDE Eclipse, con soporte para desarrollo en PHP (PHP Development Tools). http :// www . eclipse . org / pdt / downloads / Esta herramienta nos permitirá resaltar la sintaxis del código, autocompletar invocaciones a métodos y/o propiedades de clases, así como sincronizar nuestros desarrollos para trabajo en grupo con herramientas de control de versiones (cvs, svn,...).

Los proyectos en gvHidra usan codificación de caracteres ISO-8859-1 (o latin1) por lo que para evitar problemas, conviene fijar la codificación de forma general para todos los proyectos. Se hace desde el menú Windows -> Preferences, opción General -> Workspace -> Text file encoding. En otro caso habrá que hacerlo individualmente para cada proyecto.

11

Page 12: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Firefox + PluginsAhora, para probar nuestros desarrollos instalamos el navegador web Mozilla Firefox http :// www . mozilla . org / . Elegimos esta aplicación porque cuenta con numerosos plugins/complementos que nos permitirán encontrar errores de programación. Por lo tanto, una vez instalado el navegador, añadiremos un complemento llamado Web Developer que podremos descargar desde https :// addons . mozilla . org .

SQL DeveloperHerramienta gráfica y gratuita desarrollada por Oracle para las bases de datos a partir de la versión 9.2.0.1. Permite, entre otras cosas, explorar los objetos de la base de datos, ejecutar sentencias y scripts SQL, editar y depurar código PL/SQL. Requiere la JDK 1.5 o superior. Podemos descargarla de http :// www . oracle . com / technetwork / developer - tools / sql - developer / downloads / index . html (requiere registro).

iReportEn el caso de tener que desarrollar informes/entregables, utilizaremos una herramienta para diseñarlos. Esta herramienta es iReport y la podemos descargar desde http :// sourceforge . net / projects / ireport /

12

Page 13: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

DebuggerEs una herramienta incluida en el propio framework, actúa a modo de log y nos sirve para depurar el código, obtener trazas de ejecución, conocer el valor de las variables que queramos, ... En cualquier aplicación gvHidra podemos acceder a ella en la URL http :// locahost / aplicacion / igep /_ debugger . php aunque lo normal será acceder desde la opción de menú incluida en la propia aplicación, como veremos más adelante.

ii. Instalación de una demo gvHidraLa mejor manera de conocer las posibilidades de la herramienta es verla funcionar “in situ”. Por ello vamos a realizar la instalación de una aplicación demo de gvHidra que contiene muchos (no todos) de los patrones y complementos que implementa gvHidra. Descargar el fichero demo-gvhidra.zip de la forja de desarrollo.

1. Descomprimimos la aplicación en nuestro raíz de documentos de Apache (c:\wamp\www).

2. Si no existe, creamos el directorio temporal de plantillas “templates_c” en el raiz de dicha aplicación, y nos aseguramos que no sea sólo lectura.

3. Descargamos gvHidra de la web, lo descomprimimos y la carpeta igep la colocamos dentro de la aplicación.

4. Instalamos la base de datos asociada a la aplicación:psql -h localhost -p 5432 -U postgres -f doc/demo.sql -L salida.log

5. Acceder con el navegador a http :// localhost / demo y accedemos con invitado/1.

Con la demo instalada, continuamos con el curso. Haremos referencia a ella para poder ver en funcionamiento cualquier patrón, componente o funcionalidad en el transcurso del curso.

iii. Otras herramientasHasta ahora hemos visto las herramientas que vamos a utilizar durante el curso. Sin embargo hay que tener en cuenta que hay otras que también conviene incluir en nuestro entorno de desarrollo, pero que aquí no podemos ver por falta de espacio. Destacamos las siguientes:

● Control de versiones: svn, cvs, git, mercurial, … Nos permiten llevar un control de cambios del código fuente y facilitan el trabajo en grupo y la gestíon de errores y funcionalidades en un proyecto.

13

Page 14: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

● Tests unitarios: PHPUnit es una herramienta basada en JUnit que nos permite controlar que las clases y métodos hacen lo que se ha definido en los tests. La ejecución de estos tests se suele automatizar para que se invoquen desde el control de versiones.

● Tests funcionales: Selenium. Nos permite testear nuestra aplicación a nivel de la interfaz web, como si fuera un usuario, que realiza una serie de pasos y espera obtener un resultado. También permite hacer los tests en distintos navegadores.

● Forja para el proyecto: redmine, gforge, trac, … o bien en la nube (google code, sourceforge, github, …) Hay muchos, y su objetivo es servir de ayuda en el desarrollo de un proyecto. Suelen incluir integración con el control de versiones, registro de errores y mejoras, planificación de versiones, tareas, repositorio de ficheros para descargar, ...

● Estándares de código: PHP_CodeSniffer. Verifica que el código fuente sigue los estándares de nomenclatura definidos, admitiendo los más populares como Pear, zend, …

14

Page 15: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

3. ¿Qué es gvHidra?

a. Guía de estilogvHidra son las iniciales de Generalitat Valenciana: Herramienta Integral de Desarrollo Rápido de Aplicaciones.

Si hay que dar una explicación rápida, podemos decir que se trata de un entorno de trabajo (framework) para el desarrollo de aplicaciones de gestión en entornos web con PHP siguiendo una guía de estilo .

Una guía de estilo es un documento que recoge normativas y patrones básicos relacionados con el aspecto y usabilidad en el proceso de desarrollo de aplicaciones nuevas dentro de un entorno concreto. Recoge el contenido o información de la pantalla; Textos, campos de formularios, botones, menús y su comportamiento. Cómo se comporta cuando un usuario envía un formulario (validaciones), hace clic en un botón. Así como la apariencia final de un sistema; colores, tipografía, disposición de los elementos en pantalla.

Una buena guía de estilo, debe integrarse de manera eficiente en el proceso de trabajo de un programador ofreciendo criterios y ayudando en la toma de decisiones en aspectos de diseño de interfaz. Nunca debe ser una carga. Siendo esto último el motivo de la creación de framework que automatice todas esas tareas.

b. Arquitectura de una aplicación

Antes hemos hablado del entorno MVC. Ahora vamos a entender como es la arquitectura de una aplicación desarrollada en gvHidra.

Podemos resumir que el desarrollador de aplicaciones modificará/creará los siguientes ficheros en relación al MVC. Aunque también es posible hacerlo de manera automática, como veremos más adelante (genaro).

Modelo: Clases PHP que heredan de las clases gvHidraForm y gvHidraFormDB, según queramos persistencia de datos o no. Normalmente almacenados en el directorio actions/

Vista: Ficheros PHP que instancian objetos del motor de plantillas Smarty, normalmente almacenados en el directorio views/ . Y plantillas (templates) en lenguaje Smarty, normalmente almacenadas en el directorio plantillas/

15

Page 16: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Controlador: Ficheros include.php, mappings.php y menuModulos.xml . Almacenados en el directorio include/

En resumen, estos serán los directorios de trabajo normales de una aplicación hecha con gvHidra:

`-- aplicacion |-- actions |-- include |-- plantillas `-- views

c. Patrones de interfazUn patrón de interfaz es una agrupación de formulario/s, botones y comportamientos. El framework implementa muchos de los patrones de interfaz más útiles para el desarrollo de aplicaciones gestión.

Nombre Codificación/Siglas

Patrón Tabular P 1 M 2( FIL - LIS ) Patrón Búsqueda P1M1(FIL)Patrón Tabular sin búsqueda P1M1(LIS)Patrón Alta Masiva P1M1(EDI)Patrón Registro P 1 M 2( FIL - EDI ) Patrón Registro sin búsqueda P1M1(EDI)Patrón Tabular - Registro P 1 M 3( FIL - LIS - EDI ) Patrón MD Maestro Tabular - Detalle Registro P2M2(FIL-LIS)M1(EDI)Patrón MD Maestro Tabular - Detalle Tabular P2M2(FIL-LIS)M1(LIS)Patrón MD Maestro Registro - Detalle Registro P2M2(FIL-EDI)M1(EDI)Patrón MD Maestro Registro - Detalle Tabular P 2 M 2( FIL - EDI ) M 1( LIS ) Patrón MD Maestro Registro - Detalle Tabular-Registro P2M2(FIL-EDI)M1(LIS-EDI)Patrón Árbol P1M2(FIL-EDI)

La codificación de los patrones indica:1. Px: número de paneles del patrón, siendo un panel un área que normalmente estará

asociada a una tabla2. Mx: número de modos del panel. Para los patrones con dos paneles, se indican los

modos para cada panel. Los modos usados son el de búsqueda o filtro (FIL), listado tabular (LIS) y listado monoregistro (EDI). A continuación del número de modos, se enumeran entre paréntesis los modos.

16

Page 17: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Podremos encontrar el esqueleto de estos patrones dentro del directorio de documentación del framework, en esta dirección igep/doc/plantillasTipo

El éxito de nuestros desarrollos se basará en gran parte en la elección adecuada del patrón a la hora de implementar las operaciones que queremos que haga nuestra aplicación.

d. Mi primera aplicación, uso de Genaro.

Una vez presentados todos los actores, vamos a realizar nuestra primera aplicación mediante el asistente de “Generación de código gvHidra” Genaro. Esta herramienta nos va a permitir construir un esqueleto básico y funcional de nuestra aplicación a partir de nuestro diseño de tablas relacional. La herramienta se puede descargar junto al proyecto gvHidra en www . gvhidra . org .

Para realizar nuestra primera aplicación, primero tendremos que crear el esqueleto mínimo de una aplicación en gvHidra. Esto lo podremos hacer extrayendo del zip de gvHidra, el directorio plantilla-gvHidra.

Para nuestra instalación concreta seguiremos los siguientes pasos.

1. Descargamos la última versión de gvHidra desde la web www . gvhidra . org

2. Descomprimimos el zip a nuestro raiz de documentos de Apache.

3. Copiamos el directorio plantilla-gvHidra a nuestra raiz de documentos de Apache

4. Damos permisos de escritura al usuario que ejecuta el servidor web en el directorio templates_c.

5. Añadimos dentro de nuestra plantilla el “core” del framework.

6. Descargamos Genaro desde la web www . gvhidra . org

7. Descomprimimos el zip a nuestro raiz de documentos Apache

8. Copiamos el directorio genaro al directorio include de nuestra plantilla

9. Damos permisos de escritura al usuario que ejecuta el servidor web en los directorios plantilla/include/genaro/compile, plantilla/actions, plantilla/views, plantilla/plantillas, plantilla/include/include.php, plantilla/include/mappings.php, plantilla/include/menudModulos.xml,

17

Page 18: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

10. Configuramos los parámetros de conexión a nuestra base de datos en el fichero gvHidraConfig.inc.xml del raiz de la aplicación y activamos el debug.(Los copiamos de la demo)

Una vez instalada correctamente la plantilla y el proyecto genaro, probamos la generación de nuestra primera pantalla accediendo a la url http :// localhost / plantilla / y haciendo click en “Genaro”.

Ejemplo a seguir en genaro:

1. Elegimos el dsn de conexión: g_dsn2. Pinchamos en la solapa: Patrón Simple3. Nombre módulo: GenaroInformes4. Clase Manejadora: GenaroInformes5. Seleccionar Tabla: informes6. Seleccionar Patrón: FIL-LIS-EDI7. Pulsar Generar

Tras la ejecución, podremos ver que Genaro ha creado ficheros necesarios en la arquitectura MVC que hemos visto con anterioridad.

`-- plantilla |-- actions/GenaroInformes/GenaroInformes.php |-- include/include.php: $al->registerClass('GenaroInformes.... |-- include/menuModulos.xml: <modulo titulo="genaroInformes"... |-- include/mappings.php: $this->_AddMapping('GenaroInformes... |-- plantillas/GenaroInformes/p_GenaroInformes.tpl `-- views/GenaroInformes/p_GenaroInformes.php

Con la generación de genaro ya tenemos la funcionalidad básica. Podemos refinar la plantilla, y añadir más funcionalidad en la clase en actions (modelo) y en mappings.php (controlador).

e. AutenticaciónCuando creamos una aplicación gvHidra, a partir de la plantilla, ésta viene con un control de acceso muy básico que permite conectarse con el usuario invitado. En este apartado vamos a ver como personalizar el control de acceso para adaptarlo a nuestra organización.

El control de acceso gestiona qué usuarios pueden acceder a qué recursos. Básicamente trata los dos siguientes aspectos:

● Autenticación: Procedimiento de comprobación de la identidad de un usuario

18

Page 19: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

● Autorización: Definición granular de permisos de acceso concedidos a un determinado usuario, dispositivo o sistema

La autenticación se basa en algo que el usuario sabe (p.e. contraseña), tiene (tarjeta de identidad, tarjeta inteligente, …) o características físicas (huella, retina, voz, … ). El más frecuente por su sencillez y bajo coste es mediante contraseña, aunque desde hace unos años empiezan a proliferar los basados en tarjetas inteligentes (certificados ACCV, DNIe, FNMT, …).

En gvHIDRA, durante el proceso de conectarnos a la aplicación, podemos distinguir dos fases:1. Comprobar credenciales (opcional)2. Carga de la información del usuario/aplicación

Las dos fases ocurren secuencialmente, y se comunican mediante una clase que definimos (hereda de gvhBaseAuth) y que implementa la lógica usando PEAR::Auth. Es usada desde:

1. login*.php → punto de entrada (autenticación)2. validacion::valida → inicializa parámetros (autorización)

Excepto el fichero de login que ha de situarse en la raíz de la aplicación, los otros dos pueden estar en cualquier sitio de la aplicación.

Con la creación de los tres ficheros mencionados ya tendriamos un nuevo mecanismo de autenticación.

Cuando accedemos a una aplicación gvHidra, se busca al primero de los ficheros con nombre login*.php. Si hubiera más de uno, podemos indicar en la URL al fichero del método de autenticación que queremos usar.

A continuación veremos los tipos más comunes, para ilustrar lo que se puede hacer y así poder adaptarlo a nuestra organización.

i. Sin autenticaciónCon esta solución podemos acceder a la aplicación sin introducir usuario. Éste se pone de forma fija por código. Para ello hay que indicar el usuario en el método autenticate (antes del start)

$aut->setAuth('invitado');

ii. Mediante usuario / contraseñaAuth incluye muchos gestores de donde obtener los usuarios (BD, Array, LDAP, Radius, SOAP, IMAP, …) y permite definir nuevos.

19

Page 20: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Para crear nuevos gestores se recomienda seguir los pasos en AuthGva en la doc (http :// www . gvpontis . gva . es / fileadmin / conselleria / images / Documentacion / migracionSwAbierto / H IDRA / Documentacion / doc - gvHIDRA -3_0_4/ auth _ gva . html ).

Podemos personalizar el formulario de login, para adaptarlo a nuestra guía de estilo.

La solución más simple sería tener los usuarios directamente en un array:

static $options = array( 'cryptType'=>'md5', 'users'=>array( 'usu1'=>'529113007b15005637b3dad6d9ba2f10', //md5(usu1) 'usu2'=>'9c60c45d8440e2ece3442fed8fe4c5c2', //md5(usu2)));$aut = new Auth('Array',self::$options);$aut->start();

Una vez validado el usuario, hay que inicializar su información en esa aplicación (para aplicar la autorización). Se hace en método validacion::valida. La información ha de seguir cierta estructura en la sesión, y se debe validar con:

$auth_container->checkData($_SESSION, $apli);

Para obtener la información del usuario en la aplicación lo más frecuente es conectarnos a un sistema externo (BD, ldap, …) y recuperarla. También podemos tenerla de forma estática en la aplicación (xml, php, ini...) aunque no es recomendable a menos que haya pocos usuarios (una decena máximo).

iii. Mediante más de una fuenteTambién podemos usar más de una fuente de datos para los usuarios. Veamos un ejemplo de contenedor que incluye:

1. Base de datos (MDB2 oci8)2. Array

Este podría ser el caso en que tenemos la mayoría de usuarios en una base de datos ya existente en la organización, y para unos pocos usuarios especiales que no queremos incluir en esa base de datos, usamos el otro contenedor con los usuario de forma estática.

En estos casos el orden de los contenedores es importante, ya que Auth va probando con cada uno hasta que consigue validar al usuario.

La definición seria:

static $options = array(

20

Page 21: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

array('type'=>'MDB2','options'=>array(

'dsn'=>'oci8://system:curso@localhost:1521/?service=xe', 'table'=>'usuarios', 'usernamecol'=>'usuario', 'passwordcol'=>'pwd', //'cryptType'=>'md5', // por defecto )), array(

'type'=>'Array','options'=>array(

'cryptType'=>'md5', 'users'=>array( 'usu1'=>'529113007b15005637b3dad6d9ba2f10', //md5(usu1) 'usu2'=>'9c60c45d8440e2ece3442fed8fe4c5c2', //md5(usu2)))));$aut = new Auth('Multiple',self::$options);

Por la definición que hemos hecho, debe existir la tabla usuarios, con columnas usuario y pwd al menos.

iv. Autenticación externaEn este caso la autenticación se realiza en un sistema externo, y éste comunica a la aplicación gvHidra que las credenciales del usuario son válidas.

Lo normal es pasar el usuario como parámetro, aunque también podemos pasar otra información que nos interese.

Esta solución seria la idónea para plataformas single sign on (SSO), donde el usuario se identifica en el servicio SSO, y ya puede acceder a todas las aplicaciones.

Para implementar la solución más simple, que el servicio SSO nos pasa como parámetro el usuario autenticado, sólo tenemos que incluir las siguientes líneas en el método autenticate (antes del start):

if (isset($_POST['user']))$aut->setAuth($_POST['user']);

Sin embargo esta solución sólo es válida a efectos didácticos, pues es una solución poco segura ya que es fácil para un usuario hacerse pasar por otro. Para evitar el problema hay que utilizar infraestructura de clave pública (PKI) para:

21

Page 22: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

● La información enviada a la aplicación vaya encriptada con la clave pública de la aplicación, para que sólo ésta pueda acceder a la información

● La información enviada vaya firmada por el servicio SSO (con su clave privada) para que la aplicación pueda verificar la autenticidad del origen del mensaje

Se puede encontrar más información y una implementación en el seminario de control de acceso en http :// gvhidra . org .

v. OtrosOtras soluciones que también se han integrado con gvHidra es el uso de las cuentas de correo de la GVA para autenticarse (usa Auth::IMAP).

También es posible autenticarnos con certificados digitales ACCV (próximamente con DNIe), y en otra aplicación se ha integrado un captcha.

f. Autorización: módulos y rolesLos módulos y roles se usan para controlar los permisos sobre recursos o funcionalidades

● Módulos: representan a los recursos, y pueden asignarse muchos por usuario. Cada módulo tiene un código, una descripción y opcionalmente puede tener un valor

● Roles: representan los perfiles de usuarios y pueden incluir muchos módulos. Cada usuario sólo tiene un role en una aplicación

Se inicializan la primera vez que se accede a la aplicación, en método postLogin, y han de seguir la siguiente estructura:

$_SESSION[<apl>]['modulos']$_SESSION[<apl>]['modulos'][<modulo x>]['valor']$_SESSION[<apl>]['modulos'][<modulo x>]['descrip']...$_SESSION[<apl>]['rolusuar']

Podemos usar los siguientes métodos para obtener información de módulos:IgepSession::hayModulo( string ) return booleanIgepSession::dameModulo( string ) return arrayIgepSession::dameModulos() return array de arrays

Si queremos controlar el acceso a los menús por módulos podemos usar los siguientes elementos:

<controlAcceso> <moduloPermitido id="Tramitar"/>

22

Page 23: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

</controlAcceso><controlAcceso>

<moduloPermitido id="Provincia"> <valorModulo valor="Valencia" /> <valorModulo valor="Alicante" />

</moduloPermitido></controlAcceso>

En el caso de los roles, podemos usar el siguiente método para obtener el role del usuario:

IgepSession::dameRol() return string

Para controlar el acceso a los menús usando roles, podemos usar:

<controlAcceso><rolPermitido valor="consultor"/><rolPermitido valor="gestor"/>

</controlAcceso>

g. Información de estadoEl protocolo HTTP es por naturaleza un protocolo sin estado, y no existe el concepto de sesión. Para solventar esta carencia y proporcionar una navegación como si tuviéramos sesiones, se utilizan las cookies. Estas consisten básicamente en una información (nombre, valor) que se almacena en el navegador, y que cada vez que se hace una petición al servidor se envían a éste. A partir de estas, el servidor obtiene la información que necesita del cliente.

En PHP se utiliza una cookie especial (por defecto con nombre PHPSESSID) cuyo valor utiliza para cargar la información de estado del usuario. En gvHidra esta cookie se nombra como gvHIDRA_c893ba… El valor de ésta lo usa el servidor para localizar el fichero con el estado de usuario (ver c:\wamp\tmp\sess_*), y la carga en la variable global $_SESSION. En gvHidra se encapsula el acceso a esta variable con la clase IgepSession (en carpeta igep/include)

Si tenemos necesidad de almacenar alguna información en un formulario para recuperarla en otro, también podemos hacer uso de la sesión para almacenar cualquier información usando los métodos:

IgepSession::guardaVariableGlobal($nombreVar, $valor)IgepSession::dameVariableGlobal($nomVariable)

23

Page 24: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

4. Desarrollando software con gvHidra (Caso práctico)

a. Presentación del caso

“Sedes festeras”

Una reciente publicación en el DOCV1 precisa a la administración a tener mayor control sobre los lugares de la Comunidad Valenciana donde se realizan festejos, lo que recibe el nombre de “Sede festera”. Con el objetivo de normalizar la actuación de dichas sedes, se prevé hacer una aplicación que regule las condiciones y tipología de estas, ubicadas en los municipios de la Comunitat Valenciana.

Se deberá registrar, por tanto la información relevante a esta, respecto a ubicación, tipología, fechas de alta/baja, asociación a la que pertenecen, así como su responsable.Para tener mayor agilidad y no perder control sobre los datos, se designarán usuarios con distintos perfiles que accederán a la aplicación para mantener los datos, pero que sobre los cuales se registrarán los movimientos más importantes (borrados, inserciones, etc.).

Por suerte, un equipo de desarrolladores en gvHidra ha decidido poner solución realizando una aplicación gvHidra, cumpliendo los requisitos extraídos, que será utilizable por todo el personal autorizado sin mayor inconveniente por tratarse de una aplicación multiplataforma y de interfaz universal (web).

Se establece como objetivo general el desarrollo de un sistema integral para el mantenimiento de las “sedes festeras”.

Requisitos● Mantener datos personales de responsables. Información de contacto, etc.● Gestión de un tipología de sedes claramente diferenciada y finita.● Alta de asociaciones de las cuales pertenecen sedes.● Alta datos de sedes; fechas de alta y baja, ubicación, descripción, etc.● Mantenimiento ubicaciones de la comunidad.● Informes.

1 Diari Oficial de la Comunitat Valenciana Num. 6485 pags 11971-11972 y Num. 6789 pags 16138-16139

24

Page 25: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Modelo diagrama de clases de apoyo

25

Page 26: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Modelo entidad relación de apoyo

26

Page 27: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

27

Page 28: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

b. Preparación entorno, personalización y carga de datos

A la hora de iniciar una nueva aplicación vamos a seguir los siguientes pasos:

1. Creamos un directorio para la nueva aplicación “sedes”: C:\wamp\www>mkdir C:\wamp\www\sedes

2. Descomprimir/copiar la “plantilla de aplicación” en su interior: C:\wamp\www>xcopy /RE gvHidra-3_1_8\plantilla-gvHidra\*.* C:\wamp\www\sedes

3. Descomprimir/copiar el core de gvHidra (igep) en su interior: C:\wamp\www>xcopy /RE C:\wamp\www\gvHidra-3_1_8\igep C:\wamp\www\sedes\igep

4. Descomprimir/copiar “Genaro 2” en su interior y realizar las configuraciones necesarias: C:\wamp\www>xcopy /RE genaro-2_0_0_rc1\*.* sedes\include\genaro2\

5. Crear proyecto PHP en Eclipse: Creamos el proyecto con soporte PHP a partir de la ruta: c:\wamp\www\sedes

6. Configurar conexión de la aplicación :

28

Page 29: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

<applicationName>sedes</applicationName> <appVersion>1.0.0</appVersion> <logSettings status='LOG_ALL' dsnRef="g_dsn_log_thin" />

<DSNZone> <dbDSN id='g_dsn_sedes' sgbd='oracle'> <dbHost>xe</dbHost> <dbUser>sedes</dbUser> <dbPassword>sedes</dbPassword> </dbDSN>

<dbDSN id='g_dsn_sedes_ae' sgbd='oracle'> <dbHost>xe</dbHost> <dbPort>1521</dbPort> <dbUser>sedes_ae</dbUser> <dbPassword>sedes_ae</dbPassword> </dbDSN>

<dbDSN id='g_dsn_log' sgbd='oracle'> <dbHost>xe</dbHost> <dbPort>1521</dbPort> <dbUser>sedes_log</dbUser> <dbPassword>sedes_log</dbPassword> </dbDSN>

<dbDSN id='g_dsn_log_thin' sgbd='thin'> <dbHost>localhost</dbHost> <dbPort>1521</dbPort> <dbDatabase>xe</dbDatabase> <dbUser>sedes_log</dbUser> <dbPassword>sedes_log</dbPassword> </dbDSN> <dbDSN id='g_dsn_sedes_thin' sgbd='thin'> <dbHost>localhost</dbHost> <dbPort>1521</dbPort> <dbDatabase>xe</dbDatabase> <dbUser>sedes</dbUser> <dbPassword>sedes</dbPassword> </dbDSN>

</DSNZone>

1

1 Para conexiones oci8 con listener añadir el path a tnsnames.ora en httpd.conf de apache:SetEnv TNS_ADMIN "E:\oracle\ora10201\NETWORK\ADMIN "

29

Page 30: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

7. Cargar, esquema, usuarios, datos y privilegios en la base de datos. Para ello podemos utilizar la herramienta SQLDeveloper.

/*USUARIOS*/--DROP USER sedes CASCADE;CREATE USER sedes IDENTIFIED BY sedes PROFILE DEFAULT ACCOUNT UNLOCK;

ALTER USER sedes DEFAULT TABLESPACE USERS; ALTER USER sedes DEFAULT ROLE ALL;ALTER USER sedes QUOTA UNLIMITED ON USERS;GRANT CREATE SESSION TO sedes;

--DROP USER sedes_ae CASCADE;CREATE USER sedes_ae IDENTIFIED BY sedes_ae PROFILE DEFAULT ACCOUNT UNLOCK; ALTER USER sedes_ae DEFAULT ROLE ALL;GRANT CREATE SESSION TO sedes_ae; --DROP USER sedes_ac CASCADE;CREATE USER sedes_ac IDENTIFIED BY sedes_ac PROFILE DEFAULT ACCOUNT UNLOCK; ALTER USER sedes_ac DEFAULT ROLE ALL;GRANT CREATE SESSION TO sedes_ac;

--DROP USER sedes_log CASCADE;CREATE USER sedes_log IDENTIFIED BY sedes_log PROFILE DEFAULT ACCOUNT UNLOCK; ALTER USER sedes_log DEFAULT ROLE ALL;GRANT CREATE SESSION TO sedes_log;

/*ROLES*/--DROP ROLE rsedes;CREATE ROLE rsedes;

--DROP ROLE rsedes_c;CREATE ROLE rsedes_c;

30

Page 31: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

GRANT rsedes TO sedes with admin option;GRANT rsedes_c TO sedes with admin option;

GRANT rsedes TO sedes_ae;GRANT rsedes_c TO sedes_ac;

/*TABLAS*/

--DROP TABLE sedes.tcmn_errlog;CREATE TABLE sedes.tcmn_errlog ( iderror integer NOT NULL, aplicacion varchar2(30) NOT NULL, modulo varchar2(10) default NULL, version varchar2(10) NOT NULL, usuario varchar2(30) not null, fecha timestamp default SYSDATE, tipo varchar(10) NOT NULL, mensaje CLOB NOT NULL);alter table sedes.tcmn_errlog add constraint pk_sedes_error primary key(iderror);

--DROP sequence SEDES.SCMN_ID_ERRLOG;CREATE SEQUENCE sedes.scmn_id_errlog minvalue 1 start with 1 increment by 1 cache 20;

CREATE SYNONYM sedes_log.scmn_id_errlog FOR sedes.scmn_id_errlog;CREATE SYNONYM sedes_log.tcmn_errlog FOR sedes.tcmn_errlog;

--DROP TABLE sedes.asociacion cascade constraints;CREATE TABLE sedes.asociacion( cif varchar2(12) NOT NULL, denom varchar2(200), cargo_responsable varchar2(200), responsable_nif varchar2(15));ALTER TABLE sedes.asociacion ADD CONSTRAINT PK_sedes_Asociacion PRIMARY KEY( cif)NOT DEFERRABLE INITIALLY IMMEDIATE;

--DROP TABLE sedes.sede cascade constraints;CREATE TABLE sedes.sede( id_sede integer NOT NULL, denominacion varchar2(200), direccion varchar2(200), temporalidad varchar2(1), telefono varchar2(15), observaciones varchar2(1000), fecha_alta date, fecha_baja date, url_map varchar2(200), asociacion_cif varchar2(12),

31

Page 32: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

cod_tipo_sede varchar2(10), muni_provincia_cod_prov varchar2(2), muni_cod_mun varchar2(3));ALTER TABLE sedes.sede ADD CONSTRAINT PK_sedes_Sede PRIMARY KEY( id_sede)NOT DEFERRABLE INITIALLY IMMEDIATE;--DROP TABLE sedes.responsable cascade constraints;CREATE TABLE sedes.responsable( nif varchar2(15) NOT NULL, nombre varchar2(100), apellido1 varchar2(100), apellido2 varchar2(100), email varchar2(100), telefono varchar2(15));ALTER TABLE sedes.responsable ADD CONSTRAINT PK_sedes_Responsable PRIMARY KEY( nif)NOT DEFERRABLE INITIALLY IMMEDIATE;--DROP TABLE sedes.usuario cascade constraints;CREATE TABLE sedes.usuario( usuario varchar2(20) NOT NULL, fecha_alta date, fecha_baja date, email varchar2(100), nombre varchar2(100), apellido_1 varchar2(100), apellido_2 varchar2(100), passw varchar2(32), perfil varchar2(20), nif varchar2(15), muni_provincia_cod_prov varchar2(2), muni_cod_mun varchar2(3));ALTER TABLE sedes.usuario ADD CONSTRAINT PK_sedes_Usuario PRIMARY KEY( usuario)NOT DEFERRABLE INITIALLY IMMEDIATE;--DROP TABLE sedes.tipo_sede cascade constraints;CREATE TABLE sedes.tipo_sede( cod_tipo varchar2(10) NOT NULL, valor varchar2(200));ALTER TABLE sedes.tipo_sede ADD CONSTRAINT PK_sedes_Tipo_sede PRIMARY KEY( cod_tipo

32

Page 33: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

)NOT DEFERRABLE INITIALLY IMMEDIATE;--DROP TABLE sedes.auditoria cascade constraints;CREATE TABLE sedes.auditoria( id integer NOT NULL, fecha_hora timestamp(0), tipo_cambio varchar2(25), id_sede integer, usuario varchar2(20));ALTER TABLE sedes.auditoria ADD CONSTRAINT PK_sedes_Auditoria PRIMARY KEY( id)NOT DEFERRABLE INITIALLY IMMEDIATE;--DROP TABLE sedes.municipios cascade constraints;CREATE TABLE sedes.municipios( muni_provincia_cod_prov varchar2(2) NOT NULL, muni_cod_mun varchar2(3) NOT NULL, muni_comarca_cod_com varchar2(2), muni_nom_mun varchar2(30), muni_area_cod_area varchar2(2), muni_litoral varchar2(1));ALTER TABLE sedes.municipios ADD CONSTRAINT PK_sedes_Municipios PRIMARY KEY( muni_provincia_cod_prov,muni_cod_mun)NOT DEFERRABLE INITIALLY IMMEDIATE;--DROP TABLE sedes.provincias cascade constraints;CREATE TABLE sedes.provincias( prov_cod_prov varchar2(2) NOT NULL, prov_com_aut_cod_comu varchar2(2), prov_nom_prov varchar2(30));ALTER TABLE sedes.provincias ADD CONSTRAINT PK_sedes_Provincias PRIMARY KEY( prov_cod_prov)NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.asociacion ADD CONSTRAINT FK_sedes_Responsable FOREIGN KEY( responsable_nif)REFERENCES sedes.responsable(nif) NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.sede ADD CONSTRAINT FK_sede2municipio FOREIGN KEY( muni_provincia_cod_prov,muni_cod_mun)

33

Page 34: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

REFERENCES sedes.municipios( muni_provincia_cod_prov,muni_cod_mun)NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.sede ADD CONSTRAINT FK_sedes_Asociacion FOREIGN KEY( asociacion_cif)REFERENCES sedes.asociacion(cif) NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.sede ADD CONSTRAINT FK_sedes_Tipo_sede FOREIGN KEY( cod_tipo_sede)REFERENCES sedes.tipo_sede(cod_tipo) NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.usuario ADD CONSTRAINT FK_usuario2municipio FOREIGN KEY( muni_provincia_cod_prov,muni_cod_mun)REFERENCES sedes.municipios( muni_provincia_cod_prov,muni_cod_mun)NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.auditoria ADD CONSTRAINT FK_id_sede FOREIGN KEY( id_sede)REFERENCES sedes.sede(id_sede) NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.auditoria ADD CONSTRAINT FK_usuario FOREIGN KEY( usuario)REFERENCES sedes.usuario(usuario) NOT DEFERRABLE INITIALLY IMMEDIATE;ALTER TABLE sedes.municipios ADD CONSTRAINT FK_Provincias FOREIGN KEY( muni_provincia_cod_prov)REFERENCES sedes.provincias(prov_cod_prov) NOT DEFERRABLE INITIALLY IMMEDIATE;CREATE INDEX impIndex_FK_Provincias ON sedes.municipios(muni_provincia_cod_prov);

/*PERMISOS SOBRE OBJETOS*/

GRANT ALL ON sedes.scmn_id_errlog to sedes_log;GRANT ALL ON sedes.tcmn_errlog to sedes_log;

GRANT ALL ON sedes.responsable to sedes;GRANT ALL ON sedes.asociacion to sedes;GRANT ALL ON sedes.tipo_sede to sedes;GRANT ALL ON sedes.sede to sedes;GRANT ALL ON sedes.auditoria to sedes;GRANT ALL ON sedes.usuario to sedes;

34

Page 35: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

GRANT ALL ON sedes.municipios to sedes;GRANT ALL ON sedes.provincias to sedes;

GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.PROVINCIAS TO RSEDES GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.MUNICIPIOS TO RSEDES GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.AUDITORIA TO RSEDES GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.TIPO_SEDE TO RSEDES GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.USUARIO TO RSEDES GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.RESPONSABLE TO RSEDES GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.SEDE TO RSEDES GRANT DELETE, INSERT, SELECT, UPDATE ON SEDES.ASOCIACION TO RSEDES

GRANT SELECT ON SEDES.PROVINCIAS TO RSEDES_C GRANT SELECT ON SEDES.MUNICIPIOS TO RSEDES_C GRANT SELECT ON SEDES.AUDITORIA TO RSEDES_C GRANT SELECT ON SEDES.TIPO_SEDE TO RSEDES_C GRANT SELECT ON SEDES.USUARIO TO RSEDES_C GRANT SELECT ON SEDES.RESPONSABLE TO RSEDES_C GRANT SELECT ON SEDES.SEDE TO RSEDES_C GRANT SELECT ON SEDES.ASOCIACION TO RSEDES_C

CREATE SYNONYM SEDES_AE.PROVINCIAS FOR SEDES.PROVINCIAS CREATE SYNONYM SEDES_AE.MUNICIPIOS FOR SEDES.MUNICIPIOS CREATE SYNONYM SEDES_AE.AUDITORIA FOR SEDES.AUDITORIA CREATE SYNONYM SEDES_AE.TIPO_SEDE FOR SEDES.TIPO_SEDE CREATE SYNONYM SEDES_AE.USUARIO FOR SEDES.USUARIO CREATE SYNONYM SEDES_AE.RESPONSABLE FOR SEDES.RESPONSABLE CREATE SYNONYM SEDES_AE.SEDE FOR SEDES.SEDE CREATE SYNONYM SEDES_AE.ASOCIACION FOR SEDES.ASOCIACION

CREATE SYNONYM SEDES_AC.PROVINCIAS FOR SEDES.PROVINCIAS CREATE SYNONYM SEDES_AC.MUNICIPIOS FOR SEDES.MUNICIPIOS CREATE SYNONYM SEDES_AC.AUDITORIA FOR SEDES.AUDITORIA CREATE SYNONYM SEDES_AC.TIPO_SEDE FOR SEDES.TIPO_SEDE CREATE SYNONYM SEDES_AC.USUARIO FOR SEDES.USUARIO CREATE SYNONYM SEDES_AC.RESPONSABLE FOR SEDES.RESPONSABLE CREATE SYNONYM SEDES_AC.SEDE FOR SEDES.SEDE CREATE SYNONYM SEDES_AC.ASOCIACION FOR SEDES.ASOCIACION

GRANT DELETE, INSERT, UPDATE, SELECT on sedes.responsable to rsedes;GRANT DELETE, INSERT, UPDATE, SELECT on sedes.asociacion to rsedes;GRANT DELETE, INSERT, UPDATE, SELECT on sedes.tipo_sede to rsedes;GRANT DELETE, INSERT, UPDATE, SELECT on sedes.sede to rsedes;GRANT DELETE, INSERT, UPDATE, SELECT on sedes.auditoria to rsedes;GRANT DELETE, INSERT, UPDATE, SELECT on sedes.usuario to rsedes;GRANT DELETE, INSERT, UPDATE, SELECT on sedes.municipios to rsedes;GRANT DELETE, INSERT, UPDATE, SELECT on sedes.provincias to rsedes;

GRANT SELECT on sedes.responsable to rsedes_c;GRANT SELECT on sedes.asociacion to rsedes_c;GRANT SELECT on sedes.tipo_sede to rsedes_c;GRANT SELECT on sedes.sede to rsedes_c;GRANT SELECT on sedes.auditoria to rsedes_c;GRANT SELECT on sedes.usuario to rsedes_c;

35

Page 36: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

GRANT SELECT on sedes.municipios to rsedes_c;GRANT SELECT on sedes.provincias to rsedes_c;

COMMIT;

36

Page 37: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

37

Page 38: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

c. Creación de mantenimientos Para comenzar, vamos a crear los mantenimientos necesarios según los requisitos del enunciado. Estos mantenimientos los podremos realizar de manera automática con la ayuda de la herramienta “genaro”. De igual modo, podríamos comenzar utilizando las plantillas de los patrones que están almacenadas en igep/doc/plantillasTipo/ y rellenándolas a mano.

En este ejercicio lo haremos todo con la herramienta “genaro” y el último mantenimiento, relativo al informe, lo haremos desde las plantillas para que sirva de ejemplo.

Accedemos a la plantilla de aplicación creada y nos validamos con usuario/contraseña invitado/1.

http :// localhost / sedes

38

Page 39: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Mantenimientos a realizar según los requisitos del enunciado:

1.- Patrón Tabular-Registro / P1M3(FIL-LIS-EDI) de mantenimiento de responsables.2.- Patrón Tabular / P1M2(FIL-LIS) de mantenimiento de tipos de Sede.3.- Patrón MD Maestro Tabular - Detalle Tabular/ P2M2(FIL-LIS)M1(LIS) de mantenimiento de provincias y municipios.4.- Patrón MD Maestro Registro - Detalle Tabular / P2M2(FIL-EDI)M1(LIS) de alta de asociaciones y sedes.5.- Patrón Búsqueda / P1M2(FIL-LIS) para sacar informes

Pinchamos en la opción de menú “Genaro 2” y comenzamos!.

39

Page 40: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

1.- Patrón Tabular-Registro / P1M3(FIL-LIS-EDI) Mantenimiento de responsables

40

Page 41: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

2.- Patrón Tabular / P1M2(FIL-LIS) Mantenimiento de tipos de Sede.

41

Page 42: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

42

Page 43: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

3.- Patrón MD Maestro Tabular - Detalle Tabular/ P2M2(FIL-LIS)M1(LIS) Mantenimiento de Provincias y Municipios.

43

Page 44: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

4.- Patrón MD Maestro Registro - Detalle Tabular / P2M2(FIL-EDI)M1(LIS) Alta de asociaciones y sedes.

44

Page 45: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

1

5.- Patrón Búsqueda / P1M1(FIL) Listado sedes por responsable

Este patrón lo haremos “a mano” desde las plantillas. En primer lugar creamos la “clase manejadora”, la cual se encargará del “negocio”.

1 Bug: $this->addHijo('MantSede', array('cif'), array('asociacion_cif')); por $this->addHijo('MantSede', array('edi_CIF'), array('lis_ASOCIACION_CIF'));

45

Page 46: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Copiamos el fichero classForm_DB.php al directorio actions/Informes/InfSedesPorResp.php.En el rellenaremos los siguientes datos; nombre de la clase manejadora (igual que el nombre del fichero), datos de conexión de la aplicación, tablas sobre las cual se va a operar, sentencia SQL para mostrar los datos.El resultado será algo como este:

<?php

class InfSedesPorResp extends gvHidraForm_DB {

public function __construct(){

$conf = ConfigFramework::getConfig(); //Identifique el nombre del dsn. $g_dsn = $conf->getDSN('g_dsn_sedes_ae'); $nombreTablas= array('responsable', 'sede', 'asociacion'); parent::__construct($g_dsn,$nombreTablas); //La select que mostramos en el panel de listado $this->setSelectForSearchQuery(" SELECT DISTINCT sedes.responsable.nif as \"lis_NIF\", sedes.responsable.apellido1 || ' '|| sedes.responsable.apellido2 || ', '|| sedes.responsable.nombre as \"lis_NOMBRE\", sedes.responsable.email as \"lis_EMAIL\", sedes.responsable.telefono as \"lis_TELEFONO\" FROM sedes.responsable, sedes.asociacion, sedes.sede " ); $this->setWhereForSearchQuery(" sedes.responsable.nif=sedes.asociacion.responsable_nif AND sedes.asociacion.cif=sedes.sede.asociacion_cif");

$this->setOrderByForSearchQuery("sedes.responsable.nif"); $this->addMatching('fil_nif', 'nif', 'sedes.responsable'); }

}?>

46

Page 47: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

En segundo lugar, creamos el ”template” o plantilla, donde definiremos el aspecto de la pantalla.

Copiamos el fichero plantilla-P1M2(FIL-LIS).tpl al directorio plantillas/Informes/p_InfSedesPorResp.tplEn el rellenaremos la información relativa a; clase manejadora, título y componentes que queremos mostrar. Para conocer dichos componentes y cómo rellenarlos haremos uso del manual de gvHidra descargado de la web. El resultado será algo como este:

47

Page 48: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

{CWVentana tipoAviso=$smty_tipoAviso codAviso=$smty_codError descBreve=$smty_descBreve textoAviso=$smty_textoAviso onLoad=$smty_jsOnLoad}{CWBarra usuario=$smty_usuario codigo=$smty_codigo customTitle=$smty_customTitle} {CWMenuLayer name="$smty_nombre" cadenaMenu="$smty_cadenaMenu"} {/CWBarra}{CWMarcoPanel conPestanyas="true"}

<!--*********** PANEL fil ******************--> {CWPanel id="fil" action="buscar" method="post" estado="$estado_fil" claseManejadora="InfSedesPorResp"} {CWBarraSupPanel titulo="Introduzca datos de responsable"} {*CWBotonTooltip imagen="01" titulo="Insertar registros" funcion="insertar" actuaSobre="ficha" action="InfSedesPorResp__nuevo"*} {CWBotonTooltip imagen="04" titulo="Restaurar valores" funcion="restaurar" actuaSobre="ficha"} {/CWBarraSupPanel} {CWContenedor} {CWFicha} {CWCampoTexto nombre="fil_nif" size="9" editable="true" textoAsociado="NIF/CIF" dataType=$smty_dataType_InfSedesPorResp.fil_nif} {CWCampoTexto nombre="fil_nombre" size="29" editable="false" dataType=$smty_dataType_InfSedesPorResp.fil_nombre} {/CWFicha} {/CWContenedor} {CWBarraInfPanel} {CWBoton imagen="50" texto="Buscar" class="boton" accion="buscar" } {/CWBarraInfPanel} {/CWPanel} <!-- ****************** PANEL lis ***********************--> {CWPanel id="lis" tipoComprobacion="envio" action="operarBD" method="post" estado="$estado_lis" claseManejadora="InfSedesPorResp"} {CWBarraSupPanel titulo="Listado responsables"} {*CWBotonTooltip imagen="01" titulo="Insertar registros" funcion="insertar" actuaSobre="tabla" action="InfSedesPorResp__nuevo"*} {*CWBotonTooltip imagen="02" titulo="Modificar registros" funcion="modificar" actuaSobre="tabla"*} {*CWBotonTooltip imagen="03" titulo="Eliminar registros" funcion="eliminar" actuaSobre="tabla"*} {/CWBarraSupPanel} {CWContenedor} {CWTabla conCheck="true" conCheckTodos="false" id="Tabla1" numPagInsertar="1" numFilasPantalla="6" datos=$smty_datosTabla} {CWFila tipoListado="false"} {CWCampoTexto nombre="lis_NIF" size="9" editable="true" textoAsociado="NIF/CIF" dataType=$smty_dataType_InfSedesPorResp.lis_NIF} {CWCampoTexto nombre="lis_NOMBRE" size="29" editable="true" textoAsociado="Nombre" dataType=$smty_dataType_InfSedesPorResp.lis_NOMBRE} {CWCampoTexto nombre="lis_EMAIL" size="19" editable="true" textoAsociado="e-mail" dataType=$smty_dataType_InfSedesPorResp.lis_EMAIL} {CWCampoTexto nombre="lis_TELEFONO" size="9" editable="true" textoAsociado="Teléfono" dataType=$smty_dataType_InfSedesPorResp.lis_TELEFONO} {/CWFila} {CWPaginador enlacesVisibles="3"} {/CWTabla} {/CWContenedor} {CWBarraInfPanel} {CWBoton imagen="41" texto="Guardar" class="boton" accion="guardar"} {CWBoton imagen="42" texto="Cancelar" class="boton" accion="cancelar"}

48

Page 49: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

{/CWBarraInfPanel} {/CWPanel} <!-- ****************** PESTAÑAS ************************--> {CWContenedorPestanyas} {CWPestanya tipo="fil" estado=$estado_fil} {CWPestanya tipo="lis" estado=$estado_lis} {/CWContenedorPestanyas}{/CWMarcoPanel}{/CWVentana}

49

Page 50: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Ahora vamos a crear el fichero que conecta la plantilla con la clase manejadora, es decir, la presentación con el negocio.

Copiamos el fichero views/views-P1M2(FIL-LIS).php al directorio views/Informes/p_InfSedesPorResp.phpEn el rellenaremos la clase manejadora y la ruta a la plantilla. El resultado será algo como este:

50

Page 51: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

<?php//Creamos una pantalla$comportamientoVentana= new IgepPantalla();

$panel1 = new IgepPanel('InfSedesPorResp',"smty_datosTabla");$panel1->activarModo("fil","estado_fil");$panel1->activarModo("lis","estado_lis");$comportamientoVentana->agregarPanel($panel1);

$s->display('Informes/p_InfSedesPorResp.tpl');?>

Ahora vamos a informar al controlador donde se encuentran nuestra nueva pantalla y que caminos debe tomar para ejecutarla.

51

Page 52: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Copiamos el CONTENIDO del fichero include/mappings-P1M2(FIL-LIS).php al interior de nuestro fichero include/mappings.php.En el rellenamos el nombre de la clase manejadora y la ruta al fichero de views que hemos creado en el paso anterior. El resultado será algo como este:

/*InfSedesPorResp*/$this->_AddMapping('InfSedesPorResp__iniciarVentana', 'InfSedesPorResp');$this->_AddForward('InfSedesPorResp__iniciarVentana', 'gvHidraSuccess', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=buscar');$this->_AddForward('InfSedesPorResp__iniciarVentana', 'gvHidraError', 'index.php?view=igep/views/aplicacion.php'); $this->_AddMapping('InfSedesPorResp__nuevo', 'InfSedesPorResp');$this->_AddForward('InfSedesPorResp__nuevo', 'gvHidraSuccess', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=listar'); $this->_AddMapping('InfSedesPorResp__operarBD', 'InfSedesPorResp');$this->_AddForward('InfSedesPorResp__operarBD', 'gvHidraSuccess', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=listar');$this->_AddForward('InfSedesPorResp__operarBD', 'gvHidraNoData', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=buscar'); $this->_AddMapping('InfSedesPorResp__buscar', 'InfSedesPorResp');$this->_AddForward('InfSedesPorResp__buscar', 'gvHidraSuccess', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=listar');$this->_AddForward('InfSedesPorResp__buscar', 'gvHidraNoData', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=listar');$this->_AddForward('InfSedesPorResp__buscar', 'gvHidraError', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=listar');/*InfSedesPorResp*/

Además, registramos la clase para que sea cargada solo cuando sea necesaria. Esto lo conseguimos añadiendo la siguiente línea en nuestro fichero include/include.php

$al->registerClass('InfSedesPorResp','actions/Informes/InfSedesPorResp.php');

Como último paso, solo nos queda crear la entrada de menú correspondiente para poder acceder a la pantalla. Para conseguirlo, tan solo tendremos que editar el fichero include/menuModulos.xml1 y añadir algo como esto:

<modulo titulo="Informes" imagen="menu/43.gif" descripcion="Informes varios"> <opcion titulo="Listado sedes por responsable" descripcion="Listado de sedes por responsable" url="phrame.php?action=InfSedesPorResp__iniciarVentana"/> </modulo>

1 Como siempre, encontraremos la información necesaria para diseñar el menú en el manual de gvHidra.52

Page 53: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

En resumen, hemos editado esta serie de ficheros:

En cada uno de ellos, hemos realizado el reemplazo de las palabras clave con los datos que identifican nuestra pantalla. Es decir, principalmente hemos identificado la “clase manejadora” del panel, el dsn de conexión, las tablas involucradas, los títulos de las ventanas, el nombre de fichero de plantilla, la relación con el controlador (mappings). Además, hemos realizado la consulta SQL que nos ha interesado, los campos de la tabla sobre los cuales realizaremos operaciones y en relación a estos los campos su visibilidad/editabilidad en la pantalla.

El resultado esperado en ejecución es este:

53

Page 54: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

d. Incorporar la lógica de presentaciónComo hemos podido observar, la generación de los mantenimientos con la herramienta “genaro” no nos proporciona el resultado final requerido. Tendremos que resolver por tanto, detalles de aspecto de los campos, ubicación y tamaño, la generación de claves primarias automáticamente, o facilitar el uso de claves foráneas.

Estas tareas las vamos a ir desarrollando en los siguientes apartados. Partiremos de las modificaciones más sencillas a las más complejas. No obstante, estas modificaciones serán relativas a la presentación, dejando para el punto siguiente las modificaciones de la lógica de negocio.

i. Componentes simplesAntes de empezar a modificar componentes, tal vez sea buena idea organizarlos en la pantalla adecuadamente. Como la generación de los componentes en html se realiza por la transformación de la plantilla, tendremos que intercalar código HTML con código del motor de plantillas Smarty. Lo más habitual será añadir saltos de página <br />, espacios en blanco &nbsp; o tablas <TABLE>1.Si observamos las plantillas generadas por la herramienta “genaro”, veremos que ya se ha seguido esta estrategia. En cambio, en la pantalla que hemos generado nosotros a mano, tal vez haya que retocarla algo, editamos por tanto 1 Si nos decantamos por la distribución mediante tablas, utilizar el estilo asociado llamado “formularios”.

54

Page 55: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

sedes/plantillas/Informes/p_InfSedesPorResp.tpl, guardamos los cambios y recargamos la pantalla.

Vamos ahora a mejorar la presentación de la pantalla “MantResponsable”, parametrizando los siguientes puntos:

Cambiar títulos en menú de acceso a la pantalla y en las pantallas de la aplicaciónFichero: include/menuModulos.xmlCódigo: <opcion titulo="Mantenimiento Responsables" descripcion="Mantenimiento de

Responsables de Asociaciones" url="phrame.php?action=MantResponsable__iniciarVentana"/>

Fichero: plantillas/Mantenimiento/p_MantResponsable.tplCódigo: {CWBarraSupPanel titulo="Búsqueda de Responsables"} , {CWBarraSupPanel

titulo="Listado de Responsables"}, {CWBarraSupPanel titulo="Mantenimiento de Responsables"}

Limitar tamaño de los campos en listado y alta/modificación:Fichero: plantillas/Mantenimientos/p_MantResponsable.tplCódigo: nombre-> size=15, apellido1-> size=30, apellido2-> size=30, e-mail-> size=20

Fichero: actions/Mantenimientos/MantResponsable.phpCódigo:$string9noOblig= new gvHidraString(false,9);

$this->addFieldType("edi_NIF", $string9noOblig);

Añadir máscara de formato a los campos NIF y teléfonoFichero: actions/Mantenimientos/MantResponsable.phpCódigo:

$string9noOblig->setInputMask('########x');$telefono= new gvHidraString(false,15);$telefono->setInputMask('(+##)-#########');

$this->addFieldType("edi_TELEFONO", $telefono);

Convertir en obligatorio los campos teléfono e e-mail.Fichero: actions/Mantenimientos/MantResponsable.phpCódigo:

$string9noOblig->setRequired(true);$telefono= new gvHidraString(true,15);

Vamos ahora a mejorar la pantalla “MantAsociacion”:Cambiamos títulos en menú y pantallas. Delimitamos mejor los campos del maestro y detalle para su correcta visualización.Convertimos el campo denominación de la asociación de “campo de texto” a “área de texto”

Fichero: plantillas/Asociaciones/p_MantAsociacion.tpl

55

Page 56: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Código: {CWAreaTexto textoAsociado="DENOM" nombre="edi_DENOM" size="200" cols="80" rows="8" editable="true" value=$defaultData_MantAsociacion.edi_DENOM dataType=$dataType_MantAsociacion.edi_DENOM}

Modificamos también el tamaño de los campos en cuanto al detalle que mantiene las asociaciones.Fichero: plantillas/Asociaciones/p_MantAsociacion.tplCódigo: {CWFila tipoListado="false"} {CWCampoTexto textoAsociado="ID" nombre="lis_ID_SEDE" size="10" oculto="true" editable="true" value=$defaultData_MantSede.lis_ID_SEDE dataType=$dataType_MantSede.lis_ID_SEDE} {CWCampoTexto textoAsociado="DENOMINACION" nombre="lis_DENOMINACION" size="20" editable="true" value=$defaultData_MantSede.lis_DENOMINACION dataType=$dataType_MantSede.lis_DENOMINACION} {CWCampoTexto textoAsociado="DIRECCION" nombre="lis_DIRECCION" size="20" editable="true" value=$defaultData_MantSede.lis_DIRECCION dataType=$dataType_MantSede.lis_DIRECCION} {*CWCampoTexto textoAsociado="TEMPORALIDAD" nombre="lis_TEMPORALIDAD" size="1" editable="true" value=$defaultData_MantSede.lis_TEMPORALIDAD dataType=$dataType_MantSede.lis_TEMPORALIDAD*} {CWCampoTexto textoAsociado="TELEFONO" nombre="lis_TELEFONO" size="15" editable="true" value=$defaultData_MantSede.lis_TELEFONO dataType=$dataType_MantSede.lis_TELEFONO} {CWCampoTexto textoAsociado="OBSERVACIONES" nombre="lis_OBSERVACIONES" size="20" editable="true" value=$defaultData_MantSede.lis_OBSERVACIONES dataType=$dataType_MantSede.lis_OBSERVACIONES} {CWCampoTexto textoAsociado="FECHA ALTA" nombre="lis_FECHA_ALTA" size="0" editable="true" value=$defaultData_MantSede.lis_FECHA_ALTA dataType=$dataType_MantSede.lis_FECHA_ALTA} {*CWCampoTexto textoAsociado="FECHA BAJA" nombre="lis_FECHA_BAJA" size="0" editable="true" value=$defaultData_MantSede.lis_FECHA_BAJA dataType=$dataType_MantSede.lis_FECHA_BAJA*} {CWCampoTexto textoAsociado="URL MAP" nombre="lis_URL_MAP" size="20" editable="true" value=$defaultData_MantSede.lis_URL_MAP dataType=$dataType_MantSede.lis_URL_MAP} {CWCampoTexto textoAsociado="CIF" nombre="lis_ASOCIACION_CIF" size="12" oculto="true" editable="true" value=$defaultData_MantSede.lis_ASOCIACION_CIF dataType=$dataType_MantSede.lis_ASOCIACION_CIF} {CWCampoTexto textoAsociado="TIPO SEDE" nombre="lis_COD_TIPO_SEDE" size="10" editable="true" value=$defaultData_MantSede.lis_COD_TIPO_SEDE dataType=$dataType_MantSede.lis_COD_TIPO_SEDE} {CWLista textoAsociado="PROVINCIA" nombre="lis_MUNI_PROVINCIA_COD_PROV" size="0" editable="true" datos=$defaultData_MantSede.lis_MUNI_PROVINCIA_COD_PROV dataType=$dataType_MantSede.lis_MUNI_PROVINCIA_COD_PROV actualizaA="lis_MUNI_COD_MUN"} {CWLista textoAsociado="MUNICIPIO" nombre="lis_MUNI_COD_MUN" size="3" editable="true" datos=$defaultData_MantSede.lis_MUNI_COD_MUN dataType=$dataType_MantSede.lis_MUNI_COD_MUN} {/CWFila}

ii. Componentes avanzados

56

Page 57: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

En cuanto a componentes avanzados vamos a tratar componentes que requieren de mayor configuración. De igual modo, dichos componentes dotarán de mayor potencia nuestras pantallas.

Vamos ahora a agrupar los datos por solapas. Esto lo realizaremos en el “Mantenimiento de Asociaciones”, agrupando los datos de responsable en una solapa separada del resto de datos

Fichero: plantillas/Asociaciones/p_MantAsociacion.tplCódigo: {CWSolapa titulo="Asociacion"" posicionSolapa=0}

<br /> {CWCampoTexto textoAsociado="CIF" nombre="edi_CIF" size="12" editable="true"

value=$defaultData_MantAsociacion.edi_CIF dataType=$dataType_MantAsociacion.edi_CIF} <br /><br /> {CWAreaTexto textoAsociado="DENOM" nombre="edi_DENOM" size="200" cols="80"

rows="8" editable="true" value=$defaultData_MantAsociacion.edi_DENOM dataType=$dataType_MantAsociacion.edi_DENOM}

<br /> {/CWSolapa}

{CWSolapa titulo="Responsable" posicionSolapa="1"} <br /> {CWCampoTexto textoAsociado="RESPONSABLE NIF" nombre="edi_RESPONSABLE_NIF"

size="15" editable="true" value=$defaultData_MantAsociacion.edi_RESPONSABLE_NIF dataType=$dataType_MantAsociacion.edi_RESPONSABLE_NIF}

<br /><br />{CWCampoTexto textoAsociado="CARGO RESPONSABLE" nombre="edi_CARGO_RESPONSABLE"

size="200" editable="true" value=$defaultData_MantAsociacion.edi_CARGO_RESPONSABLE dataType=$dataType_MantAsociacion.edi_CARGO_RESPONSABLE}

<br /> {/CWSolapa}

Un componente muy útil e interesante es el componente “fecha”, el cual nos permitirá delimitar la introducción de los datos a la vez que nos asiste con un calendario para no tener que teclearla. Este cambio lo realizaremos sobre el detalle del mantenimiento de asociaciones.

Fichero:actions/Asociaciones/MantSede.phpCódigo:

$fecha= new gvHidraDate(false);$fecha->setCalendar(true);

$fecha->setDayOfWeek(true);$this->addFieldType('lis_FECHA_ALTA', $fecha);

También parece interesante que a la hora de dar de alta una sede, se nos rellena automáticamente la fecha de alta con la fecha actual. Esto lo conseguiremos creando un objeto de tipo gvHidraTimestamp y añadiéndolo como dato por defecto.

Fichero:actions/Asociaciones/MantSede.phpCódigo:

57

Page 58: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

$today= new gvHidraTimestamp('today');$this->addDefaultData('lis_FECHA_ALTA', $today);

Otro componente avanzado, pero básico al mantener tablas con relaciones de claves ajenas es la lista desplegable. Por ello,transformaremos los campos de texto de provincia y municipio a listas desplegables dinámicas que mostrarán como valores posibles los que hayamos introducido en el mantenimiento de provincias y municipios.

Fichero:actions/Asociaciones/MantSede.phpCódigo:

$listaProvincias= new gvHidraList('lis_MUNI_PROVINCIA_COD_PROV', 'LISTA_PROVINCIAS');

$this->addList($listaProvincias);

Fichero: plantillas/Asociaciones/P_MantAsociacion.tplCódigo: {CWLista textoAsociado="MUNI PROVINCIA COD PROV"

nombre="lis_MUNI_PROVINCIA_COD_PROV" size="0" editable="true" datos=$defaultData_MantSede.lis_MUNI_PROVINCIA_COD_PROV dataType=$dataType_MantSede.lis_MUNI_PROVINCIA_COD_PROV}

Fichero: actions/principal/appMainwindow.phpCódigo: $conf->setList_DBSource('LISTA_PROVINCIAS',"select PROV_COD_PROV as "valor",

PROV_NOM_PROV as "descripcion" from sedes.provincias");

Fichero:actions/Asociaciones/MantSede.phpCódigo:

$listaMunicipios= new gvHidraList('lis_MUNI_COD_MUN','LISTA_MUNICIPIOS');$this->addList($listaMunicipios);

Fichero: plantillas/Asociaciones/P_MantAsociacion.tplCódigo: {CWLista textoAsociado="MUNI COD MUN" nombre="lis_MUNI_COD_MUN" size="3"

editable="true" datos=$defaultData_MantSede.lis_MUNI_COD_MUN dataType=$dataType_MantSede.lis_MUNI_COD_MUN}

Fichero: actions/principal/appMainwindow.phpCódigo: $conf->setList_DBSource('LISTA_MUNICIPIOS',"select MUNI_COD_MUN as "valor",

MUNI_NOM_MUN as "descripcion" from sedes.municipios");

58

Page 59: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Nota: Se debería hacer lo mismo para el campo “tipo de sede”.

Una vez creadas las listas, vemos que ambas son independientes, hecho que nos permite añadir un municipio de Castellón habiendo elegido como provincia Alicante y viceversa.Para solucionar este problema, y además permitir una mayor especialización de la información a la hora de escogerla, vamos a convertir las listas de provincias y municipios en listas dependientes.

Fichero:actions/Asociaciones/MantSede.phpCódigo:

$listaMunicipios->setDependence(array('lis_MUNI_PROVINCIA_COD_PROV'), array('MUNI_PROVINCIA_COD_PROV'));

Fichero:plantillas/Asociaciones/p_MantAsociacion.tplCódigo:

{CWLista textoAsociado="MUNI PROVINCIA COD PROV" nombre="lis_MUNI_PROVINCIA_COD_PROV" size="0" editable="true" datos=$defaultData_MantSede.lis_MUNI_PROVINCIA_COD_PROV dataType=$dataType_MantSede.lis_MUNI_PROVINCIA_COD_PROV actualizaA="lis_MUNI_COD_MUN"}

Otro componente avanzado muy útil es la “ventana de selección”. Este componente sirve para añadir el valor de un campo que exista en otra tabla referenciada por su clave ajena. Un ejemplo concreto es el Nif del responsable de la asociación. Para rellenar dicha pantalla, si no añadimos un nif válido de responsable, al hacer el insert, el SGBD nos avisará de la restricción de clave ajena no satisfecha.Vamos por tanto a añadir un componente “ventana de selección” para rellenar el campo NIF de la solapa “responsable” en el registro maestro del “Matenimiento de asociaciones.

Fichero:actions/Asociaciones/MantAsociacion.phpCódigo:

$responsables= new gvHidraSelectionWindow('edi_RESPONSABLE_NIF', 'VS_RESPONSABLES');

$responsables->addMatching('edi_RESPONSABLE_NIF', 'NIF');

$this->addSelectionWindow($responsables);

Fichero: plantillas/Asociaciones/P_MantAsociacion.tplCódigo: {CWBotonTooltip imagen="13" titulo="Busqueda de Responsables" funcion="abrirVS"

actuaSobre="edi_RESPONSABLE_NIF" claseManejadora="MantAsociacion"}

Fichero: actions/principal/appMainwindow.phpCódigo: $conf->setSelectionWindow_DBSource('VS_RESPONSABLES', 'select NIF as "NIF",

apellido1 || \' \' || apellido2 || \' ,\' || nombre as "NOMBRE" from sedes.responsable');

59

Page 60: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

iii. Acciones de interfazUna acción de interfaz consiste en ejecutar código que generalmente repercute sobre la interfaz, disparado por un evento que se produce en la interfaz. Por ejemplo, podríamos obtener directamente el nombre del responsable al abandonar el campo NIF habiéndolo rellenado correctamente.Vamos a realizar ese ejemplo. Para realizarlo, previamente necesitaremos añadir un campo de texto que contendrá el nombre del responsable que queremos rellenar automáticamente. Realizaremos esta acción de interfaz sobre un campo de la búsqueda de la pantalla “Mantenimiento de Asociaciones”

Fichero:actions/Asociaciones/MantAsociacion.phpCódigo:

$this->addAccionInterfaz('fil_RESPONSABLE_NIF', 'AccionInterfazNombreResp');

//Fuera del constructor

public function AccionInterfazNombreResp ($objDatos)

{

$nif = $objDatos->getValue('fil_RESPONSABLE_NIF');

if($nif!='')

{

$res=$this->consultar("select apellido1 || ' ' || apellido2 || ' ,' || nombre as \"NOMBRE\" from sedes.responsable where upper(nif)=upper('$nif')");

$objDatos->setValue('fil_RESPONSABLE_NOMBRE', $res[0]['NOMBRE']);

}

else

$objDatos->setValue('fil_RESPONSABLE_NOMBRE','');

return 0;

}

Fichero: plantillas/Asociaciones/P_MantAsociacion.tplCódigo:

<td>

60

Page 61: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

{CWCampoTexto textoAsociado="RESPONSABLE NIF" nombre=fil_RESPONSABLE_NIF size=15 editable="true" visible="true" value=$defaultData_MantAsociacion.fil_RESPONSABLE_NIF dataType=$dataType_MantAsociacion.fil_RESPONSABLE_NIF actualizaA="fil_RESPONSABLE_NOMBRE"}

{CWCampoTexto nombre=fil_RESPONSABLE_NOMBRE size=45 editable="false"}

</td>

Nota: Crear una lista estática asociada a una acción de interfaz que habilite un campo y además oculte otro.

e. Incorporar la lógica de negocioHasta ahora hemos visto como realizar cambios en la interfaz de nuestras pantallas que nos han facilitado la introducción de datos, pero estas porciones de código no dicen realmente nada del funcionamiento interno de nuestra aplicación. Consideramos lógica de negocio a todo lo que nuestra aplicación hace internamente.El framework nos da varios puntos de entrada al hilo de ejecución que transcurre mientras interactuamos con las pantallas. Cabe al menos diferenciar entre dos puntos de entrada, los que llamamos “acciones genéricas” y “acciones particulares”.Las acciones genéricas son propiamente las acciones CRUD. Estas acciones resuelven procesos comunes de un mantenimiento Create Read Update Delete , es decir Altas, Listados, Modificaciones y Borrados.Las acciones particulares son las acciones que resolverán necesidades concretas no resueltas por el framework. Como ejemplo, consultar un webservice, parsear un XML, etc.

i. Acciones genéricasLas acciones genéricas cuentan con métodos virtuales sobrecargables, antes y después de cada operación. Por ejemplo, podremos sobrecargar un método antes de una inserción que nos permita ejecutar código, por ejemplo validaciones de campos y podremos también sobrecargar otro método después de la inserción que nos permita realizar operaciones en otras tablas.El framework cuenta con los siguientes operaciones y métodos virtuales:

preIniciarVentana: Permite ejecutar código antes de entrar una ventana. Típicamente usado para validaciones de usuarios y perfiles.preBuscar: Permite ejecutar código antes de ejecutar la consulta a la base de datos. Típicamente usado para añadir condiciones al filtro dependiente de información no visible.postBuscar: Permite ejecutar código después de haber obtenido los datos de la base de datos. Típicamente usado para añadir datos extra o complementarlos.preEditar: Permite ejecutar código cuando pasamos de un patrón tabular a otro en modo ficha editando el registro. Típicamente usado para mostrar u ocultar campos según perfil.postEditar: Permite ejecutar código cuando guardamos los cambios en el modo ficha y volvemos al tabular. Típicamente usado para redirigir a otras pantallas.

61

Page 62: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

preRecargar: Permite ejecutar código en un detalle cuando cambia su maestro, antes de la consulta.postRecargar:Permite ejecutar código en un detalle cuando cambia su maestro, después de la consulta.preModificar: Permite ejecutar código en un panel que esté editándose antes de realizar los cambios.postModificar:Permite ejecutar código en un panel que estaba editándose después de realizar los cambios.

Y como su propio nombre indica:preBorrar y postBorrarpreInsertar y postInsertarpreNuevo y postNuevo

Estos métodos tienen las siguientes características:- Reciben por parámetro un objeto que contiene información de la pantall o de la base de datos, según sea el método.- Pueden retornar tres valores que implican distintos comportamientos:

0: Todo fue bien, la ejecución continúa. Se corresponde con la acción gvHidraSuccess-1: Algo fue mal, la ejecución se detiene.Se corresponde con la acción gvHidraErroractionForward: Objeto PHP que corresponde con otro camino a seguir distinto de

correcto o error.

Ejemplo:

public function preBuscar($objDatos){ if ($objDatos->getValue("asociados")==true) $this->setParametrosBusqueda("id_asociado is not null"); return 0;}

Para este curso vamos a realizar los siguientes ejemplos:1. Parametrización de la búsqueda; entrar directamente sin pulsar el botón buscar en el

mantenimiento de provincias. Además, luego fijaremos que solo salgan municipios de una provincia concreta. (preBuscar)

2. Añadiremos el cálculo automático de la clave primaria en el mantenimiento de sedes. (preNuevo o preInsertar)

3. Añadiremos auditoría sobre las modificaciones que realiza un usuario en los datos de una Asociación, registrando usuario y operación.(preModificar, preBorrar,...)

4. Añadiremos color a las filas del detalle de Asociaciones, según la sede sea de nueva creación o ya existente. (postRecargar)

62

Page 63: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

1. Parametrizar búsqueda automática y añadir filtro extra por condiciones externas

Fichero: include/menuModulos.xmlCódigo:<opcion titulo="Mantenimiento de provincias" descripcion="Mantenimiento de Provincias y

Municipios" url="phrame.php?action=MantProv__buscar"/>

Fichero: actions/Mantenimientos/MantProv.phpCódigo: /** * metodo preBuscar * * @access public * @param object $objDatos * * Incorpore aqui la logica para parametrizar la busqueda. Por ejemplo: * - Incluir condiciones de filtrado. * - Cancelar la accion de buscar. */ public function preBuscar($objDatos) { //Sacar solo municipios de la provincia del usuario registrado $datosUsuario = IgepSession::dameDatosUsuario(); IgepDebug::setDebug(DEBUG_USER,"<pre>".print_r($datosUsuario,true)."</pre>"); //Simulamos tener información del usuario conectado if($objDatos->getValue('PROV_COD_PROV')=='') if('Castellon'){ $this->setParametrosBusqueda("PROV_COD_PROV = '02'"); } return 0; }

2. Añadir cálculo automático de clave primaria en el mantenimiento de sedes.Nota: Elegimos programarlo en preInsertar porque de este modo minimizamos el riesgo de concurrencia al obtener la clave primaria.

Fichero: actions/Mantenimientos/MantSede.phpCódigo: /** * metodo preInsertar * * @access public * @param object $objDatos

63

Page 64: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

* * Incorpore aqui la logica para parametrizar los datos a insertar. Por ejemplo: * - Calcular el valor de una secuencia. * - Cancelar la acción de insercion. */ public function preInsertar($objDatos) { $id_sede=$this->calcularSecuencia('sede', 'id_sede', array()); $datos= $objDatos->getAllTuplas(); foreach ($datos as &$dato){ $dato['lis_ID_SEDE']=$id_sede; $id_sede++; } $objDatos->setAllTuplas($datos); return 0; }

Fichero: plantillas/Mantenimientos/p_mantAsociacion.tplCódigo:{CWCampoTexto textoAsociado="ID" nombre="lis_ID_SEDE" size="10" oculto="true" editable="true"

value=$defaultData_MantSede.lis_ID_SEDE dataType=$dataType_MantSede.lis_ID_SEDE}

3. Añadir auditoría sobre las modificaciones

/** * metodo postModificar * * @access public * @param object $objDatos * * Incorpore aqui la logica para completar la operacion de actulizacion. Por ejemplo: * - Actualizar en una segunda tabla */ public function postModificar($objDatos) { $id= $this->calcularSecuencia('AUDITORIA', 'ID', array()); $usuario= IgepSession::dameUsuario(); $operacion='Modificar'; $datos= $objDatos->getAllTuplas(); foreach ($datos as $dato){ $id_sede= $dato['lis_ID_SEDE']; $this->operar("INSERT INTO AUDITORIA (ID, FECHA_HORA, TIPO_CAMBIO, ID_SEDE, USUARIO) VALUES('$id',SYSDATE,'$operacion', '$id_sede', '$usuario')"); $id++; } return 0; }

64

Page 65: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

4. Añadir color a las filas

Fichero:action/Mantenimientos/MantMuni.phpCódigo:

/** * metodo postRecargar * * @access public * @param object $objDatos * * Incorpore aqui la logica para parametrizar los datos obtenidos. Por ejemplo: * - Completar la informacion obtenida. * - Cambiar el color de las filas dependiendo de su valor */ public function postRecargar($objDatos) { //Obtenemos la matriz de datos $m_datos = $objDatos->getAllTuplas(); IgepDebug::setDebug(DEBUG_USER, print_r($m_datos,true)); foreach($m_datos as $indice =>$tupla) { //Si el tipo de la tupla es urgente lo marcamos con un color. switch ($tupla['MUNI_PROVINCIA_COD_PROV']){ case '01': $objDatos->setRowColor($m_datos[$indice],'alerta'); break; case '02': $objDatos->setRowColor($m_datos[$indice],'aviso'); break; case '03': $objDatos->setRowColor($m_datos[$indice],'error'); break; case '04': $objDatos->setRowColor($m_datos[$indice],'sugerencia'); break; } } //Guardamos la matriz de datos modificada $objDatos->setAllTuplas($m_datos);

65

Page 66: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

return 0; }

ii. Acciones particularesUna acción particular es un método programado en la clase que maneja el panel, la cual es invocada desde un botón añadido expresamente para dicha operación. La acción particular debe retornar obligatoriamente un objeto del tipo ActionForward para que el framework sepa donde acabar el hilo de ejecución.

Las acciones particulares tienen un punto de entrada común, el método virtual sobrecargable accionesParticulares.

/** * metodo accionesParticulares * * @access public * @param string $str_accion * @param object $objDatos * * Incorpore aqui la logica de sus acciones particulares. * -En el parametro $str_accion aparece el id de la accion. * -En el parametro $objDatos esta la informacion de la peticion. Recuerde que debe fijar la operacion * con el metodo setOperacion. */ public function accionesParticulares($str_accion, $objDatos) { throw new Exception('Se ha intentado ejecutar la acción '.$str_accion.' y no está programada.'); }

Este método recibe dos parámetros, en primer lugar la acción asociada al botón que le invoca y en segundo lo datos que vienen desde la pantalla.

Normalmente el anterior método se programa para que sirva de lanzador de los métodos privados programados en la clase, como hemos dicho en las primeras líneas.

/** * metodo accionesParticulares * * @access public * @param string $str_accion * @param object $objDatos * * Incorpore aqui la logica de sus acciones particulares. * -En el parametro $str_accion aparece el id de la accion.

66

Page 67: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

* -En el parametro $objDatos esta la informacion de la peticion. Recuerde que debe fijar la operacion * con el metodo setOperacion. */ public function accionesParticulares($str_accion, $objDatos) {

switch ($str_accion) { case 'accion1': //Acción del botón 1 $actionForward=$this->accion1($objDatos); break;

case 'accion2': //Acción del botón 2 $actionForward=$this->accion2($objDatos); break; default: throw new Exception('Se ha intentado ejecutar la acción '.$str_accion.' y no está programada en la clase: '.__CLASS__); } return $actionForward; }

Donde los métodos que ejecutan el negocio serían así:

private function accion1($objDatos) { if($ok) $actionForward=$objDatos->getForward('Success'); else $actionForward=$objDatos->getForward('Error'); return $actionForward; }

private function accion2($objDatos) { if($ok) $actionForward=$objDatos->getForward('Success'); else $actionForward=$objDatos->getForward('Error'); return $actionForward; }

Por último, faltaría un botón que invoque el método y unos “mappings” que informen al controlador que hacer en cada retorno.

Botones{CWBoton imagen="31" texto="Accion1" class="boton" accion="particular" action="accion1" }

{CWBoton imagen="31" texto="Accion2" class="boton" accion="particular" action="accion2" }

ó

{CWBotonTooltip imagen="31" titulo="Accion1" funcion="particular" action="accion1" actuaSobre="tabla"}

67

Page 68: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

{CWBotonTooltip imagen="31" titulo="Accion2" funcion="particular" action="accion2" actuaSobre="tabla"}

Mappings$this->_AddMapping('ClaseManejadora__accion1', 'ClaseManejadora');$this->_AddForward('ClaseManejadora__accion1', 'Success', 'index.php?view=views/modulo/p_clasemanejadora.php&panel=buscar');$this->_AddForward('ClaseManejadora__accion1', 'Error', 'index.php?view=views/modulo/p_clasemanejadora.php&panel=buscar');

$this->_AddMapping('ClaseManejadora__accion2', 'ClaseManejadora');$this->_AddForward('ClaseManejadora__accion2', 'Success', 'index.php?view=views/modulo/p_clasemanejadora.php&panel=buscar');$this->_AddForward('ClaseManejadora__accion2', 'Error', 'index.php?view=views/modulo/p_clasemanejadora.php&panel=buscar');

Para entender mejor el funcionamiento, vamos a crear la siguiente lógica de negocio mediante acciones particulares:

1. Borrado de una sede aunque tengan restricción de clave ajena con tabla auditoría.2. Duplicar una sede asignando un nuevo identificador.

1. Borrado de una sede con restricción de integridad

Fichero: Asociaciones/MantSede.phpCódigo: /** * metodo accionesParticulares * * @access public * @param string $str_accion * @param object $objDatos * * Incorpore aqui la logica de sus acciones particulares. * -En el parametro $str_accion aparece el id de la accion. * -En el parametro $objDatos esta la informacion de la peticion. Recuerde que debe fijar la operacion * con el metodo setOperacion. */ public function accionesParticulares($str_accion, $objDatos) {

switch ($str_accion) { case 'aniquilar': //Acción del botón aniquilar $id_sede=$objDatos->getValue('lis_ID_SEDE','seleccionar'); $actionForward=$this->aniquilarSede($objDatos); break;

68

Page 69: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

default: throw new Exception('Se ha intentado ejecutar la acción '.$str_accion.' y no está programada en la clase: '.__CLASS__); } return $actionForward; }

private function aniquilarSede($objDatos){ $id_sede=$objDatos->getValue('lis_ID_SEDE','seleccionar');

$conexion=$this->getConnection(); $conexion->empezarTransaccion(); $res=$conexion->operar("DELETE FROM AUDITORIA WHERE ID_SEDE='$id_sede'"); if($res>=0)$res=$conexion->operar("DELETE FROM SEDE WHERE ID_SEDE='$id_sede'");

if($res>=0){ $conexion->acabarTransaccion(false); $actionForward=$objDatos->getForward('Success'); } else{ $conexion->acabarTransaccion(true); $actionForward=$objDatos->getForward('Error'); } $this->refreshDetail(); return $actionForward;

}

Fichero: plantillas/Asociacion/p_MantAsociacion.tplCódigo:{CWBotonTooltip imagen="31" titulo="Aniquilar sede" funcion="particular" action="aniquilar" actuaSobre="tabla"}

Fichero: include/mappings.phpCódigo:$this->_AddMapping('MantSede__aniquilar', 'MantSede');

$this->_AddForward('MantSede__aniquilar', 'Success', 'index.php?view=views/Asociaciones/p_MantAsociacion.php&panel=buscar');

$this->_AddForward('MantSede__aniquilar', 'Error', 'index.php?view=views/Asociaciones/p_MantAsociacion.php&panel=buscar');

69

Page 70: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

2. Duplicar sede

Fichero: Asociaciones/MantSede.phpCódigo: /** * metodo accionesParticulares * * @access public * @param string $str_accion * @param object $objDatos * * Incorpore aqui la logica de sus acciones particulares. * -En el parametro $str_accion aparece el id de la accion. * -En el parametro $objDatos esta la informacion de la peticion. Recuerde que debe fijar la operacion * con el metodo setOperacion. */ public function accionesParticulares($str_accion, $objDatos) {

switch ($str_accion) { case 'aniquilar': //Acción del botón aniquilar $actionForward=$this->aniquilarSede($objDatos); case 'duplicar': //Acción del botón aniquilar $actionForward=$this->duplicarSede($objDatos); break; break;

default: throw new Exception('Se ha intentado ejecutar la acción '.$str_accion.' y no está programada en la clase: '.__CLASS__); } return $actionForward; }

Fichero: plantillas/Asociacion/p_MantAsociacion.tplCódigo:

{CWBotonTooltip imagen="51" titulo="Duplicar sede" funcion="particular" action="duplicar" actuaSobre="tabla"}

70

Page 71: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Fichero: include/mappings.phpCódigo:

$this->_AddMapping('MantSede__duplicar', 'MantSede');$this->_AddForward('MantSede__duplicar', 'Success', 'index.php?view=views/Asociaciones/p_MantAsociacion.php&panel=buscar');$this->_AddForward('MantSede__duplicar', 'Error', 'index.php?view=views/Asociaciones/p_MantAsociacion.php&panel=buscar');

Fichero:Asociaciones/MantSede.phpCódigo: private function duplicarSede($objDatos){

$datos=$objDatos->getAllTuplas('seleccionar'); $sede=$datos[0]; $id_sede=$this->calcularSecuencia('sede', 'id_sede', array()); $conexion=$this->getConnection(); $conexion->empezarTransaccion(); $res=$conexion->operar("INSERT INTO SEDE (ID_SEDE, DENOMINACION, DIRECCION, TELEFONO, OBSERVACIONES, URL_MAP, ASOCIACION_CIF, COD_TIPO_SEDE, MUNI_PROVINCIA_COD_PROV, MUNI_COD_MUN) VALUES ('$id_sede','{$sede['lis_DENOMINACION']}','{$sede['lis_DIRECCION']}','{$sede['lis_TELEFONO']}','{$sede['lis_OBSERVACIONES']}','{$sede['lis_URL_MAP']}','{$sede['lis_ASOCIACION_CIF']}','{$sede['lis_COD_TIPO_SEDE']}','{$sede['lis_MUNI_PROVINCIA_COD_PROV']}','{$sede['lis_MUNI_COD_MUN']}' )"); if($res>=0){ $conexion->acabarTransaccion(false); $actionForward=$objDatos->getForward('Success'); } else{ $conexion->acabarTransaccion(true); $actionForward=$objDatos->getForward('Error'); } $this->refreshDetail(); return $actionForward; }

71

Page 72: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

5. Programación de informes

a. Introducción

i. Presentación de la herramientaJasperReports es un motor de informes compuesto por una colección de librerías Java, y liberado bajo licencia abierta.Es un proyecto maduro que compite con los mejores generadores de informes propietarios, como pueda ser CrystalReports, etc...Sus características principales son:

● Licencia de código abierto (GPL. LGPL, BSD...)● Independencia del sistema (GNU/Linux, MS-Windows)● Posibilidad de integrarse en distintos entornos tecnológicos (entorno web multicapa,

entorno cliente-servidor) y con diferentes lenguajes ( PHP, Java,..) puede extraer los datos a mostrar en los listados de infinidad de diferentes fuentes de datos: Bases de datos relacionales, Bases de datos multidimensionales, Ficheros CSV, XML, Excel, Componentes de negocio o de acceso a datos, etc.

● Puede exportar los informes en multitud de formatos: PDF (gracias a la inclusión de la herramienta iText dentro de JasperReports ), HTML, RTF, XLS, CSV, XML y OpenDocument (ODT).

● Simplicidad en su uso gracias al desarrollo de herramientas complementarias que permiten trabajar con IDE's gráficos (iReport/JasperSoft Studio)

● Diversas herramientas complementarias para programar la generación periódica de informes cuyo acceso esté controlado de acuerdo a nuestra política de seguridad ( JasperServer ), migración de datos ( JasperETL ), Datawarehouse y Datamining ( JasperAnalysis)

ii. Compañía desarrolladora y mantenimientoJasperSoft ofrece sus programas simultáneamente bajo 2 contratos distintos:Bajo licencia LGPL: en cuyo caso obtiene sus ingresos de la formación y documentación- La documentación ( entregada igual que la de Java ) de referencia de las clases y métodos existentes es pública.- los manuales de aprendizaje con ejemplos en los que se va incrementando gradualmente la dificultad son de pago- Cursillos y formación personalizada que se encuentra disponible también en castellano y es de pago

72

Page 73: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Licencia comercial: es el mismo código que en GPL pero JasperSoft firma documentos en los que se hace responsable de que el software no causará daños y del cumplimiento de un nivel de servicio determinado en la resolución de problemas con la aplicación.JasperSoft mantiene 2 páginas web distintas, una para cada tipo de licencia:www . jasperforge . org en la que publica todos sus proyectos OpenSource entre los que se encuentran entre otros, herramientas de migración de Datos (jasperETL) y herramientas OLAP (JasperAnalysis)www . jaspersoft . com en la que publica todos sus proyectos de pago ( con licencia comercial )

iii. IDE's para JasperReports: iReportLa librería JasperReports nació sin una interfaz gráfica o IDE que ayudará a construir los ficheros .jrxml, pero debido a su éxito, posteriormente surgió el proyecto iReport que mantiene la misma compañía y que le aporta el IDE y la interfaz gráfica a JasperReports para crear los ficheros .jrxml de una forma visual arrastrando controles de una barra de herramientas con el uso del ratón, sin tener que escribir ni modificar nunca ningún tag xml del fichero .jrxmliReport comenzó inicialmente siendo un IDE de múltiples paneles diseñado por JasperSoft que se llama “IDE Clásico”, pero luego fue sustituido por NetBeans a la que más tarde ha seguido otra versión paralela para Eclipse. Cada nueva versión de JasperReports que se ha liberado ha venido siempre acompañada del lanzamiento de una nueva versión de iReport para NetBeans adaptada a la última versión de JasperReports por lo que recomendamos este IDE.iReport tiene un asistente de instalación muy simple, que ya incluye la herramienta JasperReports.La versión que explicamos en este tutorial es iReport 4.5.1 en su versión NetBeans y con las opciones de menú en inglés.

iv. Ficheros generados por JasperReportsLos informes se especifican mediante una plantilla maestra genérica que le indica el formato con el que debe generar las páginas de los informes. Esta plantilla puede ser especificada de dos formas:

● mediante llamadas a los métodos y clases de JasperReports para describir todos los controles: sus posiciones, aspectos gráficos, etc.

● mediante la creación de un fichero XML ( con extensión .jrxml ) que está dividido en las típicas secciones de cabecera de informe, cabecera de página, detalle, pie de página y pie de informe de forma que la forma de presentar cada una de estas zonas se especifica por separado. Posteriormente este fichero se compila a un fichero .jasper

Los ficheros .jasper se envían a la librería Jasper junto con los parámetros y una fuente de datos para que los convierta en informes que son objetos java que se visualizan en un applet

73

Page 74: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

llamado “JasperViewer” que viene integrado en todos los IDE y desde el que podemos visualizar el informe, grabarlo (serializarlo) en fichero .jrprint , imprimirlo exportarlo a otro formato ( odt, pdf, xml, rtf, …)

v. AdvertenciaCuando se diseñan informes que obtengan sus datos de sistemas gestores de base de datos, podemos escribir por error sentencias SQL que se descarguen gran cantidad de datos. Podemos evitar lanzar consultas que generen mucho tráfico y que tarden mucho en ejecutarse limitando el número de registros que recuperamos en las ejecuciones de sentencias SQL, en la opción de iReport siguiente:Menú Herramientas/opciones/Pestaña Compilation and Execution/Sección Execution options/Limit the number of records.En la pestaña “Virtualizer” podemos configurar el espacio de memoria utilizado por la caché.Igualmente, en la pestaña “Report Query” de introducción de las sentencias SQL que podemos mostrar desde el nodo principal del panel “Report Inspector” conviene tener desactivada la opción que ejecuta constantemente en segundo plano la sentencia SQL para crear de forma automática los objetos Field y que se llama “Automatically Retrieve Fields”

b. Secciones en un fichero .jrxml

● Add Band/Delete Band: La forma más rápida de hacer aparecer o desaparecer secciones que no necesitamos, es ir al Report Inspector, seleccionar la banda en cuestión y pulsar el botón derecho del ratón. Cuando la banda no se utiliza, muestra la opción “Add Band” y al seleccionarla provoca que la propiedad de altura de la banda cambie de 0 a 50 píxeles. “Delete Band” tiene el efecto contrario.

● Title: Es la primera sección que se genera y que lo hará una única vez en el informe. En propiedades del informe se puede marcar la opción “Title on a new page” para que se genere como una primera página que sirva de cubierta del informe.

● Page Header: Cabecera que se repite en el extremo superior de todas las páginas.

● Detail: es la sección que se va a repetir por cada registro que se recupere de la fuente de datos.

● Page Footer :Se alinea al extremo inferior de la página.

● Cuando no se se utiliza la sección “Last Page Footer” se imprime el contenido de la sección Page Footer en todas las hojas.

74

Page 75: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

● Last Page Footer: Se alinea al extremo inferior de la página. Cuando se utiliza permite que el pie de la última hoja sea diferente al pie de las páginas anteriores.

● Summary: Se utiliza generalmente para anexar datos adicionales al final del informe, normalmente gráficos de resumen de todos los datos anteriores.

● Para ubicar el contenido que genere la sección Summary, JasperReports moverá hacia atrás el puntero de la posición actual en el informe generado y lo intentará colocar justo a continuación del último detalle o pie de grupo si existe espacio

suficiente.

● JasperReports calcula el resultado que generará la sección de Summary en último lugar, después incluso de calcular la sección LastPageFooter. Si colocamos controles que puedan ocupar toda una página, conviene activar la opción “Summary with Page Header and Footer” para que la tenga en cuenta en el recuento de páginas.

● Sección "no Data": Las Propiedades del Informe, en la propiedad “When no data” permiten especificar que se presente esta sección cuando no se hayan podido recuperar datos de la fuente de datos. En principio esta posibilidad no es necesaria en GvHidra porque GvHidra ya tiene sus propios mensajes de avisos para estos casos

● Sección “Background” permite colocar como fondo de todas las hojas dibujos semitransparentes o “marcas de agua”

c. Objetos BásicosLos objetos básicos de cálculo que utiliza JasperReports son Parámetros, Campos y Variables.Notar: Parámetros, Campos y Variables son objetos o instancias de clases Java que generalmente será una clase estándar de Java o de la librería JasperReports, sin embargo podemos añadir nuestros propios ficheros de clases al classpath para que JasperReports los localice e importar sus definiciones añadiendo el nombre de nuestra propia clase en la propiedad del informe “imports” lo que nos permite escribir llamadas a métodos y propiedades de objetos y componentes propios que deseemos reutilizar.

i. Campos o FieldsPara generar un informe, JasperReports obtiene y almacena todos los datos en un objeto DataSet y tras ello se dedica a recorrer este conjunto de datos fila por fila, como si fuera un cursor de base de datos, evaluando en cada iteración como mínimo la banda de detalle.Field = es un objeto que representa el valor que tiene un campo o columna cuando nos encontramos evaluando la fila o detalle actual del DataSet.

75

Page 76: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Cada vez que JasperReports avanza en su recorrido de los registros y solicita la siguiente fila del DataSet, cada celda o columna envía el contenido de la fila actual al objeto Field correspondiente.En cada evaluación de una banda de detalle solo se disponen de los valores del DataSet de la fila actual y no se puede consultar directamente los registros o filas anteriores ni posteriores al actual.Los objetos Fields pueden ser creados manualmente uno a uno desde el Report Inspector, indicando nombre y tipo o bien podemos dejar que iReport los cree todos simultáneamente de forma automática cuando disponemos de una conexión a una fuente de datos que sea una base de datos o un fichero CSV.Para crear los objetos Field de forma automática, debemos ir al panel del Report Inspector y nos colocamos en el nodo raíz, con el botón de la derecha mostramos la opción “Edit Query” que mostrará la consulta a base de datos y dispone de un botón Read Fields que al pulsarlo creará todos los objetos Field y decidirá automáticamente el tipo de datos más aproximado en Java y que en cualquier caso nosotros podemos modificarlo. En el caso de los ficheros CSV, como el fichero es de tipo texto plano, todos los campos se crean como String por defecto, y deberemos cambiar el tipo de aquellos que no vayan a ser tratados como String.Cuando el informe se ejecute, JasperReports buscará por cada fila recuperada de la fuente de datos, un elemento que se llame igual que el Field que hemos definido y lo intentará transformar al tipo de datos que hayamos especificado. Si no se recupera ningún elemento con el mismo nombre que el Field, el Field quedará con el valor "null" o el valor que hayamos configurado en las propiedades del informe y JasperReports intentará continuar su trabajo.Notar: Es importante resaltar que cuando arrastramos un Field desde el panel de Estructura del Documento" que presenta iReport al diseño del informe, lo que estamos colocando en el informe NO es un Field, sino un control que presenta el valor de un Field. Ya que un mismo valor puede ser presentado varias veces con aspectos diferentes ( por ejemplo una fecha puede ser presentada en formato numérico reducido 1/1/2008 y como texto " a 1 de enero del dos mil ocho " y cada presentación del mismo dato puede llevar tipos de letra distintos )

ii. VariablesLas variables son el mecanismo más simple para solicitar a JasperReports que realice un cálculo durante el proceso de generación del informe.La variable tiene una propiedad “Initial Value Expression” para indicar la forma de inicializarla y una propiedad “Variable Expression” para que indiquemos la operación a realizar para calcular su nuevo valor.Algunas operaciones típicas como sumar los valores de un campo, obtener el valor máximo de un campo, etc. ya vienen preprogramadas y podemos utilizar el combo “Calculation” y limitarnos a colocar en “Variable Expression” el objeto sobre el que se aplica.Por defecto las variables tienen la propiedad Increment type = None, lo que significa que se evalúa una vez cada vez que se consiga recuperar una fila de datos desde la fuente de datos.

76

Page 77: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Existen otros valores de Increment type cómo Page, etc. que fuerzan a que cada vez que se genere una nueva página se ejecute la reinicialización de la variable especificada en la propiedad “Initial Value Expression”Existen algunas variables predefinidas en JasperReports y que no podemos modificar como:$V{ROWCOUNT} es el contador de registros detalle procesados$V{PAGENUMBER} es el número de la página que se está generando actualmente

Atención: Las variables se calculan en el mismo orden ( de arriba hacia abajo ) en que se crean y aparecen en el árbol de la estructura del documento ( panel Report Inspector ).Dado que unas variables pueden referenciar el contenido de otras, el orden de evaluación entre dos variables A y B que se evalúen en todas las filas ( que es el caso general cuando increment type= none ) donde A contiene una referencia a B determina que el cálculo de A utilice el nuevo valor de la variable B o bien el valor que tenia B cuando se procesaban los datos de la fila anterior.

iii. ParámetrosLos Parámetros son la forma de enviar datos desde cualquier otro programa al informe, pueden contener valores por defecto en su propiedad “Default Value Expression”, de forma que si no se recibe el programa el informe pueda ejecutarse igualmente. También permiten introducir expresiones Java en esta propiedad, por lo en realidad se trata de variables que se evalúan una única vez antes de comenzar la ejecución del informe.Cuando ejecutemos el informe desde iReport podemos marcar el check "use as prompt" de las propiedades del parámetro para que antes de ejecutar el informe, iReport cree una ventana en la que nos solicite el valor del parámetro y así podamos probar el informe sin salir del entorno de iReport.

Los parámetros además de permitir pasar objetos o literales que deseemos que aparezcan en el informe y flags de control que personalicen la aparición o aspecto de algún control también permiten adaptar en tiempo de ejecución la consulta a base de datos que utilizan los informes cuya fuente de datos sea una base de datos.

FORMATO A: ( Habitual )

$P{Nombre_Parámetro}

Ejemplo de uso: select * from expedientes where expedientes.codigo = $P{codigoseleccionado}

77

Page 78: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

En este caso el parámetro será un objeto del mismo tipo que corresponda a la columna o campo de la base de datos con la que se va a comparar.En el caso de los informes que obtienen sus datos de una base de datos, JasperReports permite un nivel de anidamiento adicional en los parámetros, de forma que un parámetro pueda hacer uso de otros

FORMATO B: ( Solo para extraer datos de una base de datos )$P!{Nombre_Parámetro}

Este parámetro se da de alta como un parámetro normal, pero deberá tener siempre el tipo de valor "java.lang.String" y el valor por defecto a una cadena vacía.La gran diferencia con el formato anterior es que su tipo no corresponde al tipo de una celda de base de datos ( un tipo simple ) sino que su valor es una subcadena string que forma parte de la cadena SQL que sirve de base para el informe.Los parámetros $P!{Nombre_Parámetro} pueden contener a su vez referencias a parámetro $P!{Nombre_Parámetro} que se comparen con columnas o campos de la base de datos.Para incluir dentro de la cadena que se pase como valor de $P!{Nombre_Parámetro} un nuevo parámetros de tipo $P{Nombre_Parámetro} se escapará el parámetro $P dentro de la cadena enviada duplicando el símbolo dolar, o sea:$P!{Param1} = "... + $$P{Param2}+ ..."En GvHidra es útil pasar parámetros $P! para enviar la cadena SQL, pero en principio no es probable que sea útil incluir dentro del valor de el parámetro $P! otro parámetro $P, ya que toda la información de selección de datos se introduce en una misma pantalla previa al lanzamiento del informe.Los parámetros $P!{Nombre_Parámetro} permiten modificar la cadena SQL que sirve de base para el informe. En concreto pueden contener:

A - la totalidad de la sentencia SQL en la que se basa el informe,en ese caso el informe solo contiene en su clausula base: $P!{CadSQL}B - una cláusula completa de las que componente una sentencia SQL,como por ejemplo "ORDER BY 1,2" o "WHERE tddm_expediente.codtit='PAYA "C - una parte de alguna cláusula de las que componente una sentencia SQL,como por ejemplo ( dentro de la cláusula WHERE ) " AND tddm_expediente.codtit='PAYA' "

Para utilizar la solución C, en la sentencia SQL debemos añadir un parámetro $P!{CadenaWhereOpcional} al final de la cláusula WHERE:- cuando el usuario no especifique un valor para el campo opcional "codigo titulo", el parámetro $P!{CadenaWhereOpcional} se pasará como cadena vacía- cuando el usuario rellene por ejemplo el parámetro opcional "codigo titulo" con el valor "PAYA" el parámetro $P!{CadenaWhereOpcional} tomará el valor "AND tddm_expediente.codtit='PAYA' "

78

Page 79: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

iv. Grupos

GeneralidadesLos Grupos se crean desde el nodo raíz del Report Inspector, utilizando el botón derecho y la opción “Add Group”Un grupo se define con la introducción de la propiedad “Group Expression” donde se introduce cualquier expresión que puede combinar parámetros, fields, variables,constantes y objetos y que debe devolver un resultado.En cada iteración, JasperReport procesa un registro de detalle y evaluará la propiedad “Group Expression”. Luego comparará el valor obtenido en la iteración actual con el valor obtenido en la iteración anterior. Si ambos valores son distintos, iReport considerará que el registro actual pone fin al grupo anterior ( si el registro actual no es el primero ) mediante la generación de la sección Group Footer e inicia un nuevo grupo mediante la generación de una nueva sección Group Header. El nuevo grupo finalizará cuando se obtenga un resultado distinto al evaluar la propiedad “Group Expression”o se acaben los registros a procesar.

Importante: Aunque los grupos de JasperReports permiten generar cabeceras que muestran datos comunes a un conjuntos de detalles, los grupos de JasperReports no reordenan los datos ni aseguran que los valores de esas cabeceras no se repitan.En el caso de un informe que obtenga sus datos con una sentencia SQL lanzada contra una base de datos, seguirá siendo el orden especificado en la cláusula ORDER BY de la select.Por tanto, es importante recordar cuando nos pidan un listado ordenado y agrupado por un campo X y con totales de cada conjunto de registros que tiene el mismo valor en el campo X , la recuperación de los datos se ha de ordenar con el mismo criterio que los grupos, ya que en caso contrario, nos podemos encontrar con que un mismo grupo se divida en varios subgrupos repartidos en distintas hojas del informe, con lo que no tendremos el total del grupo.Un grupo puede estar formado por más de un campo, para ello en “Group Expression” podemos introducir una expresión como por ejemplo: $F{titulo}+$F{asignatura}

Creación de secciones adicionales mediante grupos auxiliaresLas secciones del informe pueden exigir que no se divida su contenido entre una página y la siguiente por lo que son un elemento importante para controlar el aspecto final del informe. Cada grupo puede crear dos secciones nuevas: Cabecera de Grupo y Pie de Grupo y estas secciones están dotadas de muchas más propiedades que las secciones por defecto que ya tienen un comportamiento predefinido.Los grupos pueden servir por tanto no sólo para presentar cabeceras que muestran datos comunes a un conjuntos de detalles, sino para hacer aparecer conjuntos de controles bajo las condiciones que deseemos.Los dos casos más comunes en los que podemos utilizar este recurso son:

● Creación de una cabecera y pie del detalle adicional:

79

Page 80: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

● Podemos lograr que nuestro panel de detalle se divida en varios creando un grupo con una propiedad Group Expression que devuelva un valor distinto en cada registro, esto se consigue rápidamente con el contador de posición de registro actual $V{ROWCOUNT}

● El panel Footer que se crea permitirá seguir trabajando con el registro actual después de evaluar la banda de detalle.

● Podemos utilizar la propiedad “Print When Expression” de la sección, para introducir una expresión que provocará que sólo se muestre el panel cuando la expresión devuelva true.

● También podemos utilizar las propiedades de la banda para resetear el contador de páginas o introducir un salto de página.

● El panel Header no tiene mucha utilidad dado que el registro actual todavía no estará completamente disponible.

● Creación de una cabecera y pie de todo el informe adicional:Podemos crear una cabecera única que se muestre después del Page Header ( que a

su vez se muestra después del Title ) o un pie de informe que se muestre después del último registro y antes del Summary creando un grupo con una propiedad Group Expression que devuelva siempre el mismo valor distinto en todos los registro, esto se consigue fácilmente utilizando cualquier constante, como por ejemplo “new Integer(1)”

Controles básicos y tiempos de evaluaciónEn las secciones del diseño del informe son se colocan objetos parámetro, field o variable sino que sólo se pueden colocar controles como:

● label: literales no modificables● textfield: expresiones que pueden utilizar cualquier combinación de parámetros, fields,

variables con constantes y objetos cuya definición se pueda localizar. ● Nótese que un textfield NO PUEDE referenciar el valor de otro textfield calculado en la

misma iteración o evaluación de un detalle y que cuando se desee reutilizar expresiones, éstas deben llevarse a una variable.

Cuando arrastramos un parámetro, un campo o una variable del panel Report Inspector que muestra la estructura del documento al diseño del informe, lo que colocamos en el diseño, no es ninguno de los anteriores elementos, sino un control que en su expresión Java de cálculo indica que se pinte el valor del elemento seleccionado.Los controles tienen varios posibles momentos en los que se puede imprimir su valor.

80

Page 81: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Por ejemplo, si arrastramos de la paleta el control que nos ofrece iReport por defecto de "Página X de Y" comprobaremos que tanto la variable que nos indica la página actual como la variable que nos indica el número de páginas totales son en realidad la misma variable:$V{PAGE_NUMBER}, que se encarga de mantener el contador de páginas generadas.La diferencia que provoca que la misma variable devuelva dos valores distintos es el momento en el que se evalúa.Para mostrar la página actual la propiedad Evaluation Time = "Now" para que en cada página nos presente el valor actual de esa variable en dicha páginaPara mostrar el número total de páginas que ha generado el informe, la misma variable tiene como Evaluation Time = "Report" que indica a iReport que se espere a finalizar el procesado de todos los registros del informe para rellenar dicho campo a posteriori, por lo que dicho control mostrará siempre el último valor del contador de número de páginas, que coincide con el total de páginas existentes.Existen otros tiempos de evaluación como:

● “Page” : indica que se calcule el contenido del control al finalizar los registros que hayan cabido en la página

● “Group” ( indicando el grupo en cuestión de entre todos los existentes ): indica que se calcule el contenido del control al finalizar los registros que hayan formado parte de dicho grupo.

● “Auto”: los controles que tengan este momento de evaluación, se calcularán después de los controles que tengan el tiempo de evaluación a “Report”.

● Permite calcular porcentajes que requieran dividir una cantidad por un total, cuando no dispongamos a priori del valor total en un parámetro o Field.

● Si para calcular un total necesitamos definir una variable y esperar a que se recorran todos los registros, necesitamos una iteración adicional para poder calcular porcentajes que utilicen el anterior total.

EstilosUn estilo es una agrupación de propiedades referentes a la representación gráfica de un control como tipos de fuentes letra, tamaño de la letra, si la letra aparece en negrita, etc. colores de la fuente y del fondo del control, sombreados, etc.Los estilos se muestran como un nodo dentro del Report Inspector de iReport.Los estilos pueden ser creados para uso exclusivo del informe actual o pueden ser extraídos en ficheros .jrtx independientes para ser compartidos entre varios informes.Los estilos pueden aplicarse a uno o a varios controles simultáneamente. Para ello basta ir al panel de propiedades del control y en el combo Estilo podemos elegir alguno de los estilos que tengamos disponibles.Cuando un estilo se desee aplicar a todos los controles del informe a la vez, es posible marcar en el estilo el check de "estilo por Defecto" y entonces se aplicará a todos los controles automáticamente. Sólo puede haber un estilo con este check marcado en todo el informe.Estilos condicionales = se permite crear estilos particulares para un informe concreto que varíen en función de alguna expresión.

81

Page 82: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Un estilo condicional deberá especificar un aspecto por defecto bien en las propiedades o mediante la selección de otro estilo ( particular del informe o estilo genérico que se haya importado desde un fichero .jrtx )Además se puede incluir tantas veces como se desee un par formado por una expresión Java que sea una condición booleana que devuelva true o false y la sobreescritura o modificación de algunas propiedades respecto del formato establecido en la raíz del estilo condicional.Cuando JasperReports aplica un estilo condicional, evalúa de arriba hacia abajo todas las condiciones existentes, si ninguna condición devuelve true se limitará a aplicar el formato por defecto definido en la raíz del estilo. Pero si durante la evaluación de las condiciones del estilo, alguna condición resulta cierta, la evaluación del estilo se parará en la primera condición que devuelva true y aplicará primero el formato por defecto establecido en la raíz del estilo y sobre éste aplicará luego la modificación asociada a la condición que resultó cierta.

d. SubReports: informes Maestro/Detalle

JasperReports permite que un informe tenga tantos subdetalles como sea necesario con gracias a varios controles entre los que destaca el Subreport por su flexibilidad para adaptarse a nuestras necesidades, por su rapidez de ejecución y por tratarse de un mecanismo perfecto para reutilizar diseños de informes.Cuando deseamos crear un listado de tipo Maestro/Detalle con subreports, crearemos físicamente dos plantillas de informe separadas, cada una con sus propios ficheros de extensión ".jrxml" y ".jasper".Para lanzar un informe Maestro/Detalle desde GvHidra, actuaremos igual que si tuviéramos que lanzar un único informe simple creado en el fichero ".jasper" Maestro, despreocupándonos de los ficheros jasper de los Detalles cuya gestión es responsabilidad de los ficheros maestro. El código que escribamos en GvHidra no tendrá ninguna referencia a los ficheros Detalles, pero deberemos incluirlos todos en la carpeta de informes Jasper.El informe que actúe como maestro llevará un control "Subreport" en la banda “Detail” por cada uno de los detalles que deba mostrar, el control de "SubReport" marcará la zona del informe padre que se reserva para que se visualice el informe detalle.Una restricción que JasperReports impone a sus informes, es que cada fichero .jasper sólo puede utilizar como máximo una conexión a fuente de datos y como máximo podrá lanzar una consulta SQL a base de datos. El resto de datos que necesite los puede conseguir bien en algún objeto que reciba como parámetro de entrada o utilizando otro fichero .jasper que lance otra consulta SQL distinta.La comunicación entre un informe Maestro y un Subreport que se utilice para mostrar un detalle de cada registro del Maestro, se suele producir principalmente de dos formas:

● En informes que obtienen sus datos con la ejecución de sentencias SQL contra base de datos:

● El informe que actúe como detalle recibirá del informe maestro la conexión a base de datos ( la propiedad “Connection type” del Subreport tendrá el valor “Use a

connection expression” y la propiedad “Connection Expression” tendrá como

82

Page 83: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

valor el parámetro $P{REPORT_CONNECTION} que indica que se envía al detalle el mismo objeto conexión del informe maestro ) y algunos parámetros de entrada que le permita adaptar su propia consulta SQL para filtrar los datos que forman parte del conjunto de registros detalle.

● Esta es la opción más habitual en GvHidra

● En informes que utilizan fuentes de datos XML:

● El informe que actúe como detalle recibirá un subdatasource que es un subconjuntos de datos XML que deberá recorrer ( la propiedad “Connection type” del Subreport tendrá el valor “Use a datasource expression” y la propiedad “Connection Expression” tendrá un valor como ((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("./dataRow/subresultSet/subdataRow") donde $P{REPORT_DATA_SOURCE} es el objeto dataSource que contiene los datos xml del informe maestro y el método subDataSource permite generar un subconjunto de nodos del árbol de datos xml aplicando un filtro que se expresa en nomenclatura XPath

● Esta posibilidad se utiliza en GvHidra cuando necesitemos consultar datos repartidos entre diferentes gestores de bases de datos que requieran conexiones distintas. En este caso dejaremos que el programa GvHidra obtenga, mezcle y reordene el conjunto de datos y en el informe nos limitaremos a recibir el conjunto de datos como un fichero xml.

e. RecomendacionesPara facilitar el mantenimiento de los informes en nuestras aplicaciones gvHidra se recomienda utilizar las siguientes posibilidades de JasperReport:

● Dejar en mano de la aplicación gvHidra la formación de las cadenas SQL que obtengan los datos cuando estos provengan de un solo gestor de bases de datos y que el informe recibirá como un parámetro de entrada, ya que gvHidra permite mantener un catálogo de consultas SQL que pueden ser reutilizadas. En cambio, cuando los datos deban ser extraídos de distintos sistemas gestores de bases de datos ( por ejemplo: Oracle y PostgreSQL ) lo más cómodo es dejar que el programa gvHidra realice todas las consultas, mezcle y ordene los datos y los envíe al informe como un conjunto de datos XML

● Diseñar los encabezados en los que deban figurar logotipos oficiales y conmemorativos como un subinforme separado, de forma que se puedan añadir a posterior imágenes al subinforme y con una recompilación de todos los informes se actualicen los encabezados. Este sistema también permite modificar de forma global las alturas de los encabezados.

83

Page 84: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

● Mover la mayor cantidad posible de cálculos a variables que son fácilmente accesibles desde el panel de Report Inspector. Un simple renombre de la variable provocará que iReport nos informe de todos los controles que utilizaban la antigua denominación de la variable y ahora al no encontrarla generan un error y así detectaremos con facilidad todos los controles donde se hace uso de las operaciones descritas en las variables. de forma que se pueda

● Utilizar estilos definidos en ficheros externos .jrtx dado que al actualizarse desencadenan la actualización en los informes en los que se hayan incluido, en vez de utilizar plantillas, que permiten inicializar las propiedades de aspecto y posición de los controles pero no mantienen la vinculación con los informes en los que se hayan utilizado.

● Utilizar subinformes grabados en ficheros .jrxml distintos para reutilizar conjuntos de controles comunes a varios informes distintos y suministrar la ruta a dichos ficheros de subinforme mediante un parámetro.

84

Page 85: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Caso práctico iReport

Se solicita la elaboración de un informe sobre las sedes de las asociaciones registradas que venga clasificado por municipio y provincia donde se encuentran ubicadas dichas sedes. Para facilitar la labor se entrega un informe de partida con muchos Fields, Variables y controles ya creados y que el alumno deberá limitarse a recolocar y ajustar.

El informe final deberá presentar el siguiente aspecto:

85

Page 86: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

86

Page 87: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

87

Page 88: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Se mostrarán los detalles siguientes de todas las sedes de asociaciones:● nombre

● fecha de alta en el registro

● tipo ( nueva / ya existente )

- Dichos detalles de sedes vendrán clasificados y ordenados por municipio y provinciaEn el encabezado de la provincia aparecerá el total de nuevas sedes creadas en dicha provincia y el porcentaje que representa dicho total respecto al total de sedes recientemente creadasEn el pie de la provincia se repetirán también esos mismos datos más el total parcial de sedes nuevas que se hayan listado hasta el momento, pero con una mejora que es la aplicación de los estilos corporativos de forma que el acumulado parcial se muestre en el estilo Resaltado Negrita y los dos restantes datos en un estilo condicional que por defecto será el Resaltado Negrita pero cuando la provincia haya registrado más de una sede nueva, el color cambiará del amarillo original a rojo.No se desea que aparezcan encabezados de municipios separados de las sedes que se ubican en dicho municipio.

88

Page 89: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

- Debajo de cada sede se desglosarán como un subdetalle todo los datos de auditoría que permite hacer el seguimiento de las alteraciones de la información de la sede, en concreto la fecha de cuando se ha realizado la incorporación de la sede al registro y cuando se ha modificado dicha información.- En el encabezado de cada página aparecerá el nombre y versión del informe y la fecha- En el pie de cada página aparecerá el total parcial de la cantidad de sedes totales que se llevan mostradas así como el número de página actual y el número de páginas totales del informe- Cada vez que se hayan presentado tres sedes consecutivas, sin tener en cuenta si son del mismo municipio o provincia, debe aparecer un cuadro recordatorio que nos informe de cual es la sede con fecha de alta más reciente hasta dicho momento, indicando su Identificador, su nombre y la fecha de alta.Este mismo cuadro se deberá presentar al final del informe, añadiendo el total de nuevas sedes creadas.- El informe se iniciará con una portada en la que solo aparecerá el título del informe, a continuación unos párrafos de presentación en los que se remarcará el número total de sedes nuevas que se han creado.- El informe finalizará con la presentación de los siguientes datos de resumen:

● una gráfica de tarta en 3 Dimensiones mostrando cómo se han repartido la creación de nuevas sedes en la provincia

● una tabla cruzada que desglosará todas las sedes existentes y nuevas en sus columnas y mostrará los distintos municipios y provincias en sus filas, ofreciendo todos los totales que resultan de cruzar todos estos ejes.

AYUDA PROPORCIONADAPara facilitar la realización del ejercicio se entregan un informe con muchos Fields, Variables y controles ya creados y que el alumno deberá recolocar y ajustar.En concreto se necesita:- Crear todas las secciones de grupo- Retocar las variables que se reinicializan tras cada cambio de grupo- Arrastrar los controles de la sección NoData a sus respectivas secciones y ajustar los tiempos de evaluación- Crear los controles para la tarta 3D y la tabla cruzada

El significado de las variables proporcionadas es:

● EsNuevaSede: Devuelve un Boolean que nos indica si el tipo de Sede actual es Nueva

● ContSedesNuevas: Devuelve un Integer con el contador de Sedes de tipo Nueva

● ContSedesNuevasProvincia:Devuelve un Integer con el contador de Sedes de tipo Nueva de la Provincia actual

● EsMasReciente: Devuelve un Boolean que nos indica si la fecha de alta de la Sede actual es posterior a las fechas de alta de las sedes ya procesadas

● IdSedeMasReciente: Devuelve el IdSede de la sede con fecha de Alta más reciente encontrada hasta el momento

89

Page 90: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

● DenominacionSedeMasReciente: Devuelve el Nombre de la sede con fecha de Alta más reciente encontrada hasta el momento

● FechaSedeMasReciente: Devuelve la fecha de la sede con fecha de Alta más reciente encontrada hasta el momento

● ContSedesTotales: Entero que mantiene el contador de sedes totales procesadas hasta el momento

● HeProcesado3SedesMas: Devuelve un Boolean que se pone al valor "true" cada vez que complete un nueva secuencia de tres registros de sede procesados

SOLUCIÓN

A) GRUPOS DE MUNICIPIOS, PROVINCIAS Y ACUMULADOS POR PROVINCIA

- Ordenar datos Por Provincia, MunicipioCuando un informe vaya a contener secciones de grupos, en general se espera que cada uno de los valores alternativos en los que se clasifican los registros sean únicos.Para conseguir esto, deberemos asegurarnos de que en el informe recorremos los registros según el mismo ordenamiento que las secciones de grupos de nuestro informe.Cuando la fuente de Datos sea una consulta SQL, lo podemos ajustar utilizando la cláusula ORDER BY de la consulta que fuerza a que la base de datos ordene los datos seleccionados antes de enviarlos o bien con la opción Sort Option que obliga a JasperReports a realizar una ordenación previa de los datos recibidos.Cuando la fuente de Datos sea XML, el fichero debe venir ya ordenado puesto que las expresiones XPath que nos permite especificar JasperReports sólo permiten aplicar filtros pero no ordenaciones, que se pueden logran por otros medios como ficheros XSLT que generen ficheros XML ordenados, etc.

- Creación del Grupo Municipio:En el Report Inspector nos colocaremos en el nodo principal y con botón derecho elegiremos la opción "Add Report Group", le daremos un nombre a nuestra sección ( por ejemplo "Municipio") e introduciremos la propiedad Group Expression = $F{SEDE_MUNI_COD_MUN}Una vez creada la sección conviene modificar su propiedad Min Height To Start New Page de 150 o 200Dentro de la sección de cabecera que hayamos creado para el grupo de los municipios, arrastraremos:* Label "Municipio:" y TextField contiguo que muestra $F{MUNICIPIOS_MUNI_NOM_MUN}* Label "Cod. Muncipio" y TextField contiguo que muestra $F{SEDE_MUNI_COD_MUN}*Líneaa

90

Page 91: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

- Creación del grupo Provincia:En el Report Inspector nos colocaremos en el nodo principal y con botón derecho elegiremos la opción "Add Report Group", le daremos un nombre a nuestra sección ( por ejemplo "Provincia") e introduciremos la propiedad Group Expression = $F{SEDE_MUNI_PROVINCIA_COD_PROV}Una vez creada la sección conviene modificar su propiedad Keep Toguether para que esté activada.

- Una vez creado el grupo podemos arreglar la Variable "ContSedesNuevasProvincia" para que se reinicialice cada vez que se cambie de provincia, colocando su propiedad "Reset Type" a "Group"y "Reset Group" al grupo de las provincias que acabamos de crear

Dentro de la sección de cabecera que hayamos creado para el grupo de los municipios, arrastraremos:* Label "Provincia:" y TextField contiguo que muestra $F{PROVINCIAS_PROV_NOM_PROV}* Label "Cod. Prov." y TextField contiguo que muestra $F{SEDE_MUNI_PROVINCIA_COD_PROV}* Label "Sedes Nuevas de la Provincia" y TextField que muestra $V{ContSedesNuevasProvincia}* Label "% Sedes Nuevas aportadas por la Provincia" y TextField contiguo que muestra new Double($V{ContSedesNuevasProvincia}.doubleValue()/$V{ContSedesNuevas}.doubleValue())*100* Rectángulo

Dentro de la sección de cabecera que se ha creado para nuestro grupo de las provincias, modificar las propiedades de:* TextField que acompaña a la Label "Sedes Nuevas de la Provincia" y poner el Evaluation Time a "Group" y elegir en "Evaluation Group" aquel grupo que hayamos creado para las provincias* TextField que acompaña a la Label "% Sedes Nuevas aportadas por la Provincia" y poner el Evaluation Time a "Auto"

- Dentro de la sección del pie que se ha creado para nuestro grupo de las provincias, arrastraremos:* linea divisoria* TexField "TOTALES DE LA PROVINCIA DE "+ $F{PROVINCIAS_PROV_NOM_PROV}.toUpperCase()* Label "Acumulado parcial de Sedes Nuevas Totales" y TextField contiguo que muestra $V{ContSedesNuevas}* Label "Sedes Nuevas en la Provincia" y TextField contiguo que muestra $V{ContSedesNuevasProvincia}* Label "% Sedes Nuevas aportadas por la Provincia" y TextField contiguo que muestra new Double($V{ContSedesNuevasProvincia}.doubleValue()/$V{ContSedesNuevas}.doubleValue())*100

91

Page 92: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Dentro de la sección del pie que se ha creado para nuestro grupo de las provincias, modificaremos:* TextField que acompaña a la Label "Sedes Nuevas en la Provincia" y poner el Evaluation Time a "Group" y elegir en "Evaluation Group" aquel grupo que hayamos creado para las provincias* TextField que acompaña a la Label "% Sedes Nuevas aportadas por la Provincia" y poner el Evaluation Time a "Auto"

B) SEDE MÁS RECIENTE

- Para mostrar los valores finales que muestran la Sede más reciente de todas:

En el Report Inspector nos colocaremos en la Sección "Summary" y con botón derecho elegiremos la opción "Add Band" lo que le da una altura de 50 pixels a la banda para que se vea en la pestaña de diseño. Buscaremos la banda y arrastrándola con el ratón la alargaremos para que quepan todos los controles que vamos a arrastrar dentro y que son:* Label "Sedes Nuevas Totales" y TextField contiguo que muestra $V{ContSedesNuevas}* Label "Fecha de la Ultima Nueva Sede" y TextField contiguo que muestra $V{FechaSedeMasReciente* Label "Id de la Ultima Nueva Sede" y TextField contiguo que muestra $V{IdSedeMasReciente}* Label "Nombre de la Ultima Nueva Sede" y TextField contiguo que muestra $V{DenominacionSedeMasReciente}* Recuadro

- Para mostrar los valores parciales alcanzados tras haber procesado tres sedes adicionales:*Estrategia: Crearemos un nuevo grupo que generará una cabecera y pie adicionales por cada registro de sede que se procese pero sólo haremos visibles estas secciones cuando el número de registro procesado sea múltiplo de 3, esta operación ya se calcula en la variable $V{HeProcesado3SedesMas}

*Creación y configuración del nuevo grupo:En el Report Inspector nos colocaremos en el nodo principal y con botón derecho elegiremos la opción "Add Report Group", le daremos un nombre a nuestra sección ( por ejemplo "CabYPieDeCadaRegistro") e introduciremos la propiedad Group Expression = $V{REPORT_COUNT} que es la variable interna de jasperReport que cuenta los registros procesados por lo que se trata de un valor que siempre se modifica al pasar de un registro al siguiente y provoca que siempre se genere un nuevo grupo "CabYPieDeCadaRegistro"Una vez creada la sección conviene modificar su propiedad.Solicitaremos únicamente la creación del "Group Footer"En la sección de Pie del nuevo grupo recién creado modificaremos la propiedad "Print When Expression" y le daremos el valor $V{HeProcesado3SedesMas}

92

Page 93: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

C) CABECERAS DE PÁGINA, PIES DE PÁGINA, TÍTULO Y TEXTOS INTRODUCTORIOS

- Cabecera de las páginas:En el Report Inspector nos colocaremos en la Sección "Page Header" y con botón derecho elegiremos la opción "Add Band" lo que le da una altura de 50 pixels a la banda para que se vea en la pestaña de diseño. Buscaremos la banda y arrastrándola con el ratón la alargaremos para que quepan todos los controles que vamos a arrastrar dentro y que es:* TextField "Informe de Sedes de Asociaciones -Versión 1.0"Para que aparezca la fecha actual en todas las páginas arrastraremos de la Paleta a la Sección "Page Header" el control "Current Date" y en su propiedad "Pattern" le daremos el aspecto que más nos guste.- Pie de las páginas:En el Report Inspector nos colocaremos en la Sección "Page Footer" y con botón derecho elegiremos la opción "Add Band" lo que le da una altura de 50 pixels a la banda para que se vea en la pestaña de diseño. Buscaremos la banda y arrastrándola con el ratón la alargaremos para que quepan todos los controles que vamos a arrastrar dentro y que son:

* TextField que muestra "Llevamos mostradas " + $V{ContSedesTotales} + " sedes". Cambiaremos la propiedad "Evaluation Time" de "Report" a "Now"

* Los TextFields del número de páginas. El segundo TextField que muestra el total de páginas del documento ( " " + $V{PAGE_NUMBER} ) deberá cambiar su propuedad "Evaluation Time" de "Now" a "Report"

- Títulos:Para poder tener una página de presentación del informe, en el Report Inspector nos colocaremos en el nodo principal y luego mostraremos la pestaña de propiedades. Activaremos la opción "Title on new Page"

En el Report Inspector nos colocaremos en la Sección "Page Header" y con botón derecho elegiremos la opción "Add Band" lo que le da una altura de 50 pixels a la banda para que se vea en la pestaña de diseño. Buscaremos la banda y arrastrándola con el ratón la alargaremos para que quepan todos los controles que vamos a arrastrar dentro y que es:

Label que contiene: "REPORTAJE SOBRE LAS SEDES DE LAS ASOCIACIONES CULTURALES Y FESTERAS VALENCIANAS"

Para poder tener una sección adicional que aparezca debajo del Page Header y aparezca únicamente antes del procesar el primer registro, la estategia es crear un grupo que en realidad no diferenciará los registros en diferentes categorías sino que todos los registros que se procesen pasarán a formar parte de la misma y única categoría.En el Report Inspector nos colocaremos en el nodo principal y con botón derecho elegiremos la opción "Add Report Group", le daremos un nombre a nuestra sección ( por ejemplo

93

Page 94: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

"CabeceraYPieDeInforme") e introduciremos en la propiedad Group Expression cualquier valor constante como por ejemplo "new Integer(1)".Dentro de la nueva sección arrastraremos los tres TextField que contienen la presentación del dossier a los lectores.Dado que los TextField contienen retornos de carros y variables que deben ser sustituidas, el espacio que necesitarán es variable en función del contenido de la fuente de datos, para lograr que los textos se muestren completos en los 3 TextField hay que activar la propiedad "Stretch with Overflow"Para lograr que el desboradamiento del texto de un TextField provoque que los siguientes se desplacen hacia abajo y no se superpongan, se debe modificar la propiedad "Position Type" del segundo y tercer textFiueld por orden de aparición y colocarla al valor "Float"El Segundo TextField que muestra el número de sedes nuevas antes de que se hayan procesado todos los registros, debe cambiar su propiedad Evaluation Time a "Report"Si deseamos que la segunda página solo muestre esta introducción y los datos empiecen a aparecer a partir de la tercera, introduciremos un control "break" al final de la nueva sección.

D) SUBDETALLE CON LOS DATOS DE AUDITORÍA QUE PERMITEN HACER UN SEGUIMIENTO DEL REGISTRO DE CADA SEDEEnsancharemos la sección de Detalle y arrastraremos de la Paleta el control SubReport, elegiremos la opción "Use an existing report" y elegiremos el fichero "SedesReport_subreport1.jasper"A partir de aqui hay diferentes formas de configurarlo según la fuente de datos elegida:Opción A )

Si estamos utilizando una conexión contra Base de Datos elegiremos la opción "Use the same connection used to fill master report"

Opción B )Si estamos utilizando una conexión XML elegiremos la opción "Use a JRDataSource Expression" e introduciremos((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("./dataRow/subresultSet/subdataRow")que genera un nuevo DataSource de datos XML aplicando un filtro expresado en formato XPath ("./dataRow/subresultSet/subdataRow") donde indicamos que se seleccionen los nodos que cuelgan de una determinada ruta a partir del nodo actual.

A continuación, independientemente de la opción anterior que hayamos elegido, nos mostrará los parámetros de entrada del Subreport, en nuestro caso, el subinforme muestra los datos de auditoría solo para una IdSede concreta que se pasa en el parámetro IdSede. Haremos click con el ratón en la zona Expression y desplegaremos el combo para elegir el Field del informe maestro $F{SEDE_ID_SEDE}Luego elegiremos la opción "Store the directory name in a parameter, lo que creará el parámetro $P{SUBREPORT_DIR} que tomará como valor por defecto la ruta absoluta del

94

Page 95: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

fichero "SedesReport_subreport1.jasper". Para hacer más portable el informe, cambiaremos ese valor absoluto almecenado en la propiedad "Default Value Expression" por una ruta relativa, cambiando la anterior propiedad por el valor ".\"

Observaremos que el informe detalle, se han suprimido los márgenes ( Si en el Report Inspector nos colocaremos en el nodo principal y pasamos a la pestaña de propiedades observaremos que los 4 valores del margen del informe valen 0 )

E) GRÁFICA DE TARTA 3D SOBRE LAS NUEVAS SEDES CREADAS EN CADA PROVINCIA Y TABLA CRUZADA DE SEDES NUEVAS Y EXISTENTES POR MUNICIPIOS Y PROVINCIAS

Los datos de resumen que se suelen anexar al final del informe van en la sección del Summary. Cuando esta sección va a contener varios elementos que pueden ocupar toda la página, lo mejor es modificar las propiedades del informe para convertirla en una página adicional.Para ello, en el Report Inspector nos colocaremos en el nodo principal y nostraremos las propiedades, marcando la opción "Summary on a new page" y para que esta página tenga la misma cabecera y pie de página que el resto marcaremos también la opción "Summary with Page Header and Footer"

- Gráfica de Tarta 3D:En la paleta elegiremos el control Chart y lo arrastraremos a la sección Summary. De entre las posibles gráficas elegiremos la opción "3DPie Chart".Cuando nos pide un subconjunto de datos sobre el que trabajar mantendremos el valor por defecto de "Main report dataset" que indica que se utilizará el mismo conjunto de datos que para el informe.A continuación nos pedirá el valor que diferenciará las distintas porciones de la tarta que en nuestro caso será $F{PROVINCIAS_PROV_NOM_PROV} que indentifica a las provinciasLuego nos pedirá el valor que utilizará para calcular el tamaño de la porción que le corresponde a cada parte de la tarta y que en nuestro caso será: $V{ContSedesNuevasProvincia}Luego en la pestaña propiedades modificaremos la propiedad "Title Expression" de la gráfica a "Nuevas Sedes por Provincia" y colocaremos una letra de tamaño de 14 y en negrita

- Tabla cruzada:En la paleta elegiremos el control Crosstab y lo arrastraremos a la sección Summary.Cuando nos pide un subconjunto de datos sobre el que trabajar mantendremos el valor por defecto de "Main report dataset" que indica que se utilizará el mismo conjunto de datos que para el informe.A continuación nos pedirá las agrupaciones que se utilizarán en las filas que en nuestro caso serán dos:primero $V{PROVINCIAS_PROV_NOM_PROV}y luego $V{MUNICIPIOS_MUNI_NOM_MUN}Como agrupación para las columnas utilizaremos:

95

Page 96: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

$V{TIPO_SEDE_VALOR}Como valor a medir utilizaremos la clave de los registros que recorremos $V{SEDE_ID_SEDE} y la función CountFinalmente elgegiremos el aspecto visual, finalizaremos el asistente y redimensionaremos el control para ajustarlo a la página.Observese que en la ventana de Diseño de iReport habrá aparecido en la zona inferior una pestaña de CrossTab para configurar la tabla cruzada

F) ESTILOS

El informe de ejemplo tiene un estilo particular "EstiloAvisoEnSede" que no se utiliza en ningun control.Este estilo es condicional ya que cuando la expresión "($V{ContSedesNuevasProvincia}.intValue()>1)" resulte cierta, el estilo por defecto se modificará y el color pasará a ser rojo.Lo primero que vamos a hacer es redefinirlo para que se ajuste al estilo corporativo de nuestra organización. Para ello, en el Report Inspector abriremos el nodo "Styles" y con el botón derechodel ratón mostraremos la opción de "Agregar/Style Reference" donde elegiremos el fichero "TemplateCorporativo.jrtx" eso provocará que nuestro informe cargue dos definiciones de estilos:- EstiloResaltadoNegrita- EstiloAvisoPodemos observar que desde nuestro proyecto no es posible visualizar las propiedades de estos estilos ni alterarlas.Nos colocaremos en el nodo "Styles/EstiloAvisoEnSede" y modificaremos la propiedad "Style" escribiremos o seleccionaremos "EstiloAviso"Luego tenemos que aplicar los estilos disponibles asÍ:En la sección Provincia Group Footer modificaremos las propiedades de los 3 controles siguientes:* TextField que contiene $V{ContSedesNuevas} y acompaña a la Label "Acumulado parcial de Sedes Nuevas Totales" le aplicaremos el estilo EstiloResaltadoNegrita* TextField que contiene $V{ContSedesNuevasProvincia} y acompaña a la Label "Sedes Nuevas en la Provincia" le aplicaremos el estilo EstiloAvisoEnSede* TextField que contiene new Double($V{ContSedesNuevasProvincia}.doubleValue()/$V{ContSedesNuevas}.doubleValue())*100 y acompaña a la Label "% Sedes Nuevas aportadas por la Provincia" le aplicaremos el estilo EstiloAvisoEnSede

96

Page 97: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

6. Integración de informes con gvHidraEn la sesión anterior hemos visto cómo utilizar la herramienta iReport para diseñar informes. Ahora vamos a ver como utilizar esos informes dentro del framework.

iReport es una herramienta que diseña informes para ser ejecutados por el motor de informes JasperReports. Por ello, para poder ejecutar los informes desde el framework gvHidra, necesitamos incluir un módulo/proyecto llamado “Jasper” que decargaremos de la web del proyecto www.gvhidra.es

a. Preparación del entornoEn este punto entendemos que ya se tiene configurado un entorno de desarrollo de informes con iReport, por lo que nos quedará configurar el servidor web para que pueda ejecutar procesos Java, nuestra aplicación gvHidra y por último el navegador web si realizamos los informes en PDF y este no dispone de visor.

i. Configuración servidorLa configuración del servidor para que ejecute procesos java, como lo es el proceso que realiza en informe en JasperReport, es bastante sencilla y se resume en dos pasos.

1. Tener una máquina virtual java instalada2. Que sea accesible por el usuario que ejecuta el servidor web.

Para el primer paso tenemos que mirar en el panel de control de windows si ya tenemos una máquina virtual de java instalada.

97

Page 98: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Si ya la tenemos, hacemos doble click y elegimos la solapa “java” y hacemos click en “ver” con la intención de ver donde está instalada.

98

Page 99: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

La ruta donde esté instalada la máquina virtual nos servirá para informar nuestra variable JAVA_HOME. Para este ejemplo la variable JAVA_HOME apuntaría a C:\Archivos de programa\Java\jre7

Para definir una variable de entorno y que sea visible por el servidor web, seguimos los siguientes pasos:

1. Hacemos “click” sobre el icono de WampServer en nuestro SystemTray.2. Seleccionamos Apache/httpd.conf y editamos el fichero.

99

Page 100: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

3. Añadimos al final del fichero la siguiente linea:SetEnv JAVA_HOME "C:\Archivos de programa\Java\jre7"

4. Guardamos los cambios y reiniciamos el servicio.

5. Finalmente solo nos queda comprobar que la configuración del servidor es correcta. Esto lo haremos ejecutando el método phpInfo(); el cual ya viene preparado en la instalación de WampServer y viendo si aparece la variable en la sección “Apache Environment”.

100

Page 101: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

101

Page 102: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

ii. Configuración aplicación gvHidraComo hemos dicho antes, para poder ejecutar los informes generados con iReport dentro del framework gvHidra, tenemos que incluir el proyecto “Jasper” dentro de nuestra aplicación.

Estos pasos también son muy sencillos:1. Descargar el proyecto de la web www . gvhidra . org 2. Descomprimir dentro del directorio include de nuestra aplicación (C:\wamp\www\sedes\include)3. Registrar en el fichero include/include.php las clases php necesarias para su invocación.

$al->registerClass('InformeJasper','include/jasper/modulosPHP/informeJasper.php');

iii. Configuración del navegadorPor último, si vamos a generar ficheros en formato PDF, tendremos que asegurarnos que el navegador web que vamos a utilizar tiene el plugin/visor correspondiente instalado.

Esto lo podremos saber escribiendo en el campo dirección del navegador la siguiente URI:about:plugins

102

Page 103: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Llegados este punto, comprobaremos que todo funciona correctamente accediendo a la siguiente URL.

http :// localhost / sedes / include / jasper / testJasper . php

b. Integración en el códigoExisten multitud de formas de lanzar un informe desde una pantalla programada en gvHidra. Aquí explicaremos la que consideramos como mejor práctica.

Anteriormente, hemos programado un patrón FIL-LIS a mano para usarlo ahora como lanzador de informes. Dado que dicho patrón muestra un resultado por filas, añadiremos un “boton tooltip” en la parte superior, que lanzará el informe para la tupla seleccionada. El código para lanzar el informe lo escribiremos en una acción particular y utilizaremos un fichero en views/ para cargar el informe en una ventana.

Resumiendo los pasos son:1. Añadir botón en la plantilla2. Programar la acción particular que construirá el informe.3. Configurar el controlador y añadir fichero de apoyo

1. Añadir botón a la plantillaFichero:plantillas/Informes/p_InfSedesPorResp.tplCódigo:

103

Page 104: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

{CWBotonTooltip imagen="pdf" titulo="Informe Responsable" funcion="particular" action="lanzarInforme" actuaSobre="tabla"}

2. Programar acción particular

Fichero:sedes/actions/InfSedesPorResp.phpCódigo:

/** * metodo accionesParticulares * * @access public * @param string $str_accion * @param object $objDatos * * Incorpore aqui la logica de sus acciones particulares. * -En el parametro $str_accion aparece el id de la accion. * -En el parametro $objDatos esta la informacion de la peticion. Recuerde que debe fijar la operacion * con el metodo setOperacion. */ public function accionesParticulares($str_accion, $objDatos) { switch ($str_accion) { case 'lanzarInforme': //Acción del botón aniquilar $actionForward=$this->informeResponsable($objDatos); break; default: throw new Exception('Se ha intentado ejecutar la acción '.$str_accion.' y no está programada en la clase: '.__CLASS__); } return $actionForward; } private function informeResponsable($objDatos){ $nif=$objDatos->getValue('lis_NIF','seleccionar'); if($nif=='') return $objDatos->getForward('Error'); //Creamos el objeto que manejará el informe $informeJasper = new InformeJasper('InformeResponsable'); $informeJasper->setDataSourceType('sgbd'); $g_dsn = ConfigFramework::getConfig()->getDSN('g_dsn_sedes_thin'); $informeJasper->importPearDSN($g_dsn); //Fijamos la disposición del informe incrustado en la ventana $informeJasper->setDisposition('inline'); //Fijamos el fichero jasper que nos hace de plantilla $informeJasper->setJasperFile('./plantillasJasper/informeResponsable.jasper'); //Añado parámetro para el filtro del informe $informeJasper->addParam("nif", $nif, 'String'); //Asignamos el informe como variable de clase para poder //acceder a él desde el fichero views donde realizaremos "la ejecución"

104

Page 105: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

$this->informe = $informeJasper; //Hacemos un fork de la ejecución en una nueva ventana, recuperando el forward del mapping $actionForwardHijo=$objDatos->getForward('Print'); $this->openWindow($actionForwardHijo); //Continua ejecución padre $actionForwardPadre = $objDatos->getForward('Success'); return $actionForwardPadre; }

3. Añadir mappings y fichero lanzadorFichero: include/mappings.phpCódigo:

$this->_AddMapping('InfSedesPorResp__lanzarInforme', 'InfSedesPorResp'); $this->_AddForward('InfSedesPorResp__lanzarInforme', 'Success', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=listar'); $this->_AddForward('InfSedesPorResp__lanzarInforme', 'Error', 'index.php?view=views/Informes/p_InfSedesPorResp.php&panel=listar'); $this->_AddForward('InfSedesPorResp__lanzarInforme', 'Print', 'index.php?view=views/Informes/p_InfSedesPorRespInforme.php');

Fichero:views/Informes/p_infSedesPorRespInforme.phpCódigo:<?php

if (IgepSession::existeVariable('InfSedesPorResp',"informe")){ $informeJasper = IgepSession::dameVariable('InfSedesPorResp',"informe"); IgepSession::borraVariable('InfSedesPorResp',"informe"); //INI Debug // $informeJasper->setDebugMode(true); //FIN Debug $informeJasper->createResultFile('pdf'); }else $s->display('../igep/plantillas/l_errorList.tpl');?>

Nota: Si no tenemos un informe para lanzar, utilizaremos el wizard de iReport para generar uno rápidamente (ver anexos).

105

Page 106: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

7. Conclusiones

Consideramos que el framework de desarrollo gvHidra es una herramienta ágil y creciente que permite desarrollar software de calidad con una curva de aprendizaje baja.En este curso se ha pretendido enseñar de manera teórica y práctica los conceptos básicos a conocer por analistas y desarrolladores para abordar con éxito el desarrollo de nuevas aplicaciones. Para mayor profundización existen manuales, guías y otros tutoriales sobre la herramienta en la web del proyecto http :// www . gvhidra . es

En esta parte, nos gustaría conocer las opiniones de los participantes, sugerencias y quejas que puedan servirnos para mejorar.

106

Page 107: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Anexo 1: Wizard iReportPara utilizar la herramienta iReport con una conexión a la instalación local de Oracle, debemos cargar previamente la librería JDBC proporcionada por la instalación de Oracle para permitir la conexión.

Ir a Opciones

107

Page 108: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Añadir librería JDBC de Oracle al classpath de la herramienta.

108

Page 109: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

109

Page 110: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

110

Page 111: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Crear una nueva conexión.

111

Page 112: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Elegir conexión de tipo JDBC

112

Page 113: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Seleccionar conexión Oracle y rellenar los datos de la conexión local de Oracle XE.

113

Page 114: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Guardar la conexión.

114

Page 115: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Para realizar un informe de manera rápida, utilizaremos el asisten de iReport.

Hacer click en el “report wizard”.

115

Page 116: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Seleccionar una plantilla y hacer click en “Launch Report Wizard”

116

Page 117: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Rellenar nombre del informe y guardar fichero en c:\wamp\www\sedes\plantillasJasper\

117

Page 118: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Selecionar conexión y hacer click en “Desing query”

118

Page 119: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Seleccionar las tablas del esquema/usuario SEDES y arrastrarlas al panel vacío

119

Page 120: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Botón derecho sobre WHERE , seleccionar “add condition” y añadir una condición

120

Page 121: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Al cambiar a la solapa “syntax” podremos ver la consulta SQL generada.

121

Page 122: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Aceptar y continuar

122

Page 123: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Seleccionar los campos que queremos ver en el informe

123

Page 124: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

124

Page 125: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Seleccionar los grupos que queramos que distinga el informe

125

Page 126: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Terminar y guardar

126

Page 127: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Editar título y colocar campos y columnas

127

Page 128: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Ahora vamos a editar la consulta del informe para que el valor del campo responsable.nif sea igual al valor que contenga un parámetro. De este modo, el informe variará según el valor de dicho parámetro.

Botón derecho sobre la raíz del árbol de la izquierda y seleccionar “Edit Query”

128

Page 129: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Hacer click en “New parameter”

129

Page 130: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Dar nombre a dicho parámetro

130

Page 131: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

131

Page 132: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Arrastrar el parámetro y soltarlo sobre las comillas simples de la condición de la where para remplazarlas.

132

Page 133: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Si hacemos click en preview podremos ver el informe diseñado

133

Page 134: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Dar valor al parámetro para que se ejecute la condición de filtro

134

Page 135: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Resultado del informe.

135

Page 136: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Ahora solo nos falta compilar y guardar el informe. Al compilar se generará un fichero .jasper que utilizaremos en gvHidra.

136

Page 137: Introducción a gvHIDRA · Nosotros instalaremos de manera manual el entorno que nos interese para este curso, y nos puede servir de ayuda la “Guía de instalación rápida del

Muestra del informe invocado desde gvHidra, añadiendo como parámetro el valor del campo “lis_NIF” de la fila seleccionada en el tabular.

137