<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Crysfel&#039;s Blog &#187; Tutoriales</title>
	<atom:link href="http://www.crysfel.com/category/tutoriales/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.crysfel.com</link>
	<description>Blog geek</description>
	<lastBuildDate>Wed, 10 Mar 2010 23:16:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Combos dependientes con Ext JS</title>
		<link>http://www.crysfel.com/2008/11/26/combos-dependientes-con-ext-js/</link>
		<comments>http://www.crysfel.com/2008/11/26/combos-dependientes-con-ext-js/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 16:52:37 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/?p=69</guid>
		<description><![CDATA[El día de hoy pongo el primer screencast o videotutorial en mi blog, lo que explico es como crear unos combos dependientes por medio de Ext Js.
Puedes ver el demo del tutorial aqui o descarga el código fuentes desde aqui.


Éste screencast es el primero de muchos mas, la idea es que de aquí en adelante [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El día de hoy pongo el primer screencast o videotutorial en mi blog, lo que explico es como crear unos combos dependientes por medio de Ext Js.</p>
<p>Puedes ver el <a href="http://www.crysfel.com/demos/combosDependientes/">demo del tutorial aqui</a> o <a href="http://www.crysfel.com/wp-content/uploads/2008/11/combos.zip">descarga el código fuentes desde aqui</a>.</p>
<p><object width="504" height="380"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2350142&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2350142&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="504" height="380"></embed></object></p>
<p><span id="more-74"></span><br />
Éste screencast es el primero de muchos mas, la idea es que de aquí en adelante todos los tutoriales sean en video, creo que es mas sencillo verlo que leerlo, cualquier duda o comentario con respecto al tutorial pueden hacerlo en los comentarios.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/11/26/combos-dependientes-con-ext-js/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Introducción a Ext Js</title>
		<link>http://www.crysfel.com/2008/03/24/introduccion-a-ext-js/</link>
		<comments>http://www.crysfel.com/2008/03/24/introduccion-a-ext-js/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 23:25:30 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/03/24/introduccion-a-ext-js/</guid>
		<description><![CDATA[En el último proyecto en el cual he trabajado, he utilizado un framework javascript que vale la pena hablar de él en este blog, y se trata de Ext Js, una excelente librería para crear interfaces de usuario, Ext nos facilita mucho el trabajo a los desarrolladores, pues en unas cuantas líneas de javascript podemos [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>En el último proyecto en el cual he trabajado, he utilizado un <a href="http://www.quizzpot.com/">framework javascript</a> que vale la pena hablar de él en este blog, y se trata de Ext Js, una excelente librería para crear interfaces de usuario, Ext nos facilita mucho el trabajo a los desarrolladores, pues en unas cuantas líneas de javascript podemos hacer interfaces realmente buenas.</p>
<p>En este artículo quiero mostrar como hacer mensajes, tablas y ventanas, con esto pretendo dar una introducción a esta fantástica librería y así mostrar la facilidad en el desarrollo de software.</p>
<div style="text-align:center"><img src="http://www.crysfel.com/wp-content/uploads/2008/03/extjs.png" title="Ext Js Introduccion" /></div>
<p><span id="more-63"></span></p>
<p>Primeramente es necesario mencionar que Ext Js originalmente surgió como una extensión de la librería de Yahoo, con esto me refiero a que Ext Js nos da funcionalidad de más alto nivel, el manejo del DOM, AJAX y funcionalidades básicas son hechas por la librería YUI, pues Ext Js se enfoca en componentes o widgets.</p>
<p>Al ser diseñada desde un principio como una extensión montada sobre YUI, ahora es posible utilizarlas con otras librerías como JQuery o  Prototype.  Solo es necesario utilizar el “adapter” adecuado, y Ext JS utilizará la librería que uno necesite o conozca mejor para realizar las operaciones de bajo nivel, como manejo de eventos, consultas al DOM, manejo del CSS y todo lo que es posible hacer con tu librería favorita.</p>
<p>Una vez que tenemos una idea general de lo que se trata Ext Js, el siguiente paso es <a href="http://extjs.com/download">descargar la última versión</a> liberada, para poder continuar con esta introducción.</p>
<p>Una vez descargado, es necesario importar al documento tu librería favorita, el adapter correspondiente y el archivo “Ext-all.js”, estas son las posibles combinaciones que puede hacer, y el orden en que deben estar:</p>
<p>Utilizando Ext en modo Stand-alone, al decir stand alone significa que Ext Js utilizará su propia librería, que se llama Ext base, la cual contiene todo lo necesario para manejo de Dom, Ajax, animaciones, etc.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
ext-base.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>Utilizando Yahoo! UI (.12+)<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
yui-utilities.js<br />
ext-yui-adapter.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>Utilizando jQuery (1.1+), jQuery es una de las librerías mas populares dentro de los desarrolladores, es por eso que Ext js ha creado un adapter para que podamos utilizar esta librería, los archivos a importar son los siguientes:<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
jquery.js<br />
ext-jquery-adapter.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>Utilizando Prototype (1.5+) / Scriptaculous (1.7+), prototype fué uno de los primeros frameworks javascript, es muy popular y me atreveria a decir que la mas utilizada entre desarrolladores.<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
prototype.js<br />
scriptaculous.js?load=effects  (o cualquier cosa que necesites cargar de scriptaculous)<br />
ext-prototype-adapter.js<br />
ext-all.js (o los componentes que necesites)</p>
<p>En este tutorial se explica en modo “stand-alone”, esto por que mi librería favorita no esta soportada por Ext Js <img src='http://www.crysfel.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  (Mootools, que por cierto, hay un adapter de terceros para la versión Ext 1.1), por lo tanto se incluye al documento “adapter/ext/ext-base.js” y “ext-all.js”, para esto crea un carpeta en tu disco duro (donde quieras), copia los archivos anteriores a esta nueva carpeta, y además copia la carpeta “resources”, pues en esta se encuentran las imágenes y hojas de estilo necesarias para los componentes, además es necesario importar “ext-all.css”, crear el archivo HTML donde se trabajará, una buena practica es separar el HTML del javascript, entonces creamos el archivo “introduccion.js” donde se escribirá todo el javascript de este tutorial, los imports deben quedar así:</p>
<p><code lang="html"><br />
<script type="text/javascript" src="ext-base.js"></script><br />
<script type="text/javascript" src="ext-all.js"></script><br />
<script type="text/javascript" src="introduccion.js"></script></p>
<link rel="stylesheet" type="text/css" href="resources/css/ext-all.css">
</code></p>
<p>En el archive introduccion.js colocar el siguiente código:</p>
<p><code lang="javascript"><br />
Ext.onReady(function() {<br />
	alert("Felicidades!  Has configurado Ext correctamente!");<br />
});<br />
</code></p>
<p>Este mensaje tiene que aparecer si todo esta configurado correctamente, además de que se ejecutara cuando el DOM este listo para ser utilizado.</p>
<p><strong>Mensajes</strong><br />
Lo primero que mostraré es la forma de mandar mensajes al usuario, como alertas, confirmaciones, errores, etc. Lo que se hará ahora es cambiar el archivo introducción.js por lo siguiente:</p>
<p><code lang="javascript"><br />
Ext.onReady(function() {</p>
<p>	Ext.Msg.alert('Bienvenido','Felicidades!  Has configurado Ext correctamente!');</p>
<p>});<br />
</code></p>
<p>Al hacer esto, se esta mandando un alert al usuario, pero con la interfaz de Ext, como puedes ver es algo muy sencillo y se ve muy bien, ahora voy a mostrar un método con más opciones de configuración para mandar mensajes y tener control sobre los botones que ha presionado el usuario.</p>
<p><code lang="javascript"><br />
Ext.onReady(function() {</p>
<p>	Ext.Msg.show({<br />
	   title:'Bienvenido',<br />
	   msg: 'Felicidades!  Has configurado Ext correctamente! ¿estas emocionado?',<br />
	   buttons: Ext.Msg.YESNOCANCEL,<br />
	   fn: procesarResultado,<br />
	   icon: Ext.MessageBox.QUESTION<br />
	});</p>
<p>	function procesarResultado (btn){<br />
		if(btn=='yes'){<br />
			Ext.Msg.alert('Resultado','SI estas emocionado!! Excelente!!');<br />
		}else{<br />
			Ext.Msg.alert('Resultado','NO estas emocionado!! pues nimodos!!');<br />
		}<br />
	}<br />
});<br />
</code></p>
<p>Lo más importante a resaltar es notar la diferencia entre la forma de mostrar el mensaje, en el primer ejemplo es el método alert, recibiendo dos parámetros, siendo que en el segundo ejemplo el método show recibe un solo parámetro, el cual es un objeto con propiedades de configuración.</p>
<p>Otro punto importante es que la propiedad fn permite referenciar la función que manejará los eventos del usuario, cuando de clic en algún botón, la función que se ha especificado aquí será disparada, te recomiendo comiences a jugar un poco cambiando algunas opciones, puede encontrar las opciones permitidas en <a href="http://extjs.com/deploy/dev/docs/">el API de Ext Js</a>.</p>
<p><strong>Grids o Tablas</strong><br />
La tabla o grid, es el componente más popular de este framework, ya que es muy sencillo hacer tablas con capacidades realmente buenas.</p>
<p>Primeramente se necesita la información que va a ser desplegada, contenida en un array por cada renglón que se quiere desplegar, en proyectos reales esta información puede venir de una base de datos o de un webservice, para este ejemplo “hardcode”.</p>
<p><code lang="javascript"><br />
var myData = [<br />
	['Apple',29.89,0.24,0.81,'9/1 12:00am'],<br />
	['Ext',83.81,0.28,0.34,'9/12 12:00am'],<br />
	['Google',71.72,0.02,0.03,'10/1 12:00am'],<br />
	['Microsoft',52.55,0.01,0.02,'7/4 12:00am'],<br />
	['Yahoo!',29.01,0.42,1.47,'5/22 12:00am']<br />
];<br />
</code></p>
<p>El siguiente paso es crear un lector que pueda interpretar esta información, para poder procesarla en la tabla, existen varios tipos de lectores, para este caso se utiliza el de ArrayReader, pues la información anterior es un array, es muy común utilizar el lector de XML cuando usamos Ajax.</p>
<p><code lang="javascript"><br />
var myReader = new Ext.data.ArrayReader({}, [<br />
	{name: 'company'},<br />
	{name: 'price', type: 'float'},<br />
	{name: 'change', type: 'float'},<br />
	{name: 'pctChange', type: 'float'},<br />
	{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}<br />
]);<br />
</code></p>
<p>Como se puede notar, se le ha asignado un nombre a cada columna, al igual que el tipo de dato que esta contiene, en el caso de la fecha se ha creado un formato de despliegue, es importante especificar el tipo de dato, pues al momento de ordenar la tabla, es de vital importancia.</p>
<p>El último paso es crear la tabla, donde se le pasará la información, contenida en el arreglo, y el lector de esta.</p>
<p><code lang="javascript"><br />
var grid = new Ext.grid.GridPanel({<br />
	store: new Ext.data.Store({<br />
		data: myData,<br />
		reader: myReader<br />
	}),<br />
	columns: [<br />
		{header: 'Compañia', width: 120, sortable: true, dataIndex: 'company'},<br />
		{header: 'Precio', width: 90, sortable: true, dataIndex: 'price'},<br />
		{header: 'Cambio', width: 90, sortable: true, dataIndex: 'change'},<br />
		{header: '% Cambio', width: 90, sortable: true, dataIndex: 'pctChange'},<br />
		{header: 'Último cambio', width: 120, sortable: true,<br />
			renderer: Ext.util.Format.dateRenderer('m/d/Y'),<br />
						dataIndex: 'lastChange'}<br />
	],<br />
	viewConfig: {<br />
		forceFit: true<br />
	},<br />
	renderTo: 'grid',<br />
	title: 'Titulo de la tabla',<br />
	width: 500,<br />
	frame: true<br />
});<br />
</code></p>
<p>Con la clase <strong>Ext.grid.GridPanel</strong> se crean las tablas, es necesario darle la información a desplegar, por medio de la propiedad “store”, las columnas que va a contener, donde a cada columna se le especifica su titulo, su tamaño, si será ordenable y lo más importante, el “dataIndex” que es donde se relaciona la columna con la información en el Lector, la opción renderTo, es el ID del elemento donde se quiere colocar la tabla en el documento.</p>
<p>Pues esto es todo lo necesario para crear una tabla, realmente sencillo y como se puede observar, la tabla se ve muy bien.</p>
<p><strong>Ventanas</strong><br />
Para finalizar con este tutorial voy a mostrar como crear ventanas con toda la funcional necesaria.</p>
<p>Crear ventanas es muy sencillo, simplemente se ahce algo como esto:</p>
<p><code lang="javascript"><br />
var win = new Ext.Window({title:'El titulo',width:500,height:250});<br />
win.show();<br />
</code></p>
<p>La clase <strong>Ext.Window</strong> es la responsable de crear una ventana totalmente configurable, en este ejemplo únicamente se le esta especificando las dimensiones y el título, pero también se puede configurar si se quiere que la ventana no se cierre, o que no se pueda redimensionar y muchas otras cosas mas que recomiendo y se vea el api para poder jugar con estas propiedades.</p>
<p>Es importante mencionar que con el método show se muestra la ventana, de lo contrario no se verá nada.</p>
<p><strong>Conclusión</strong><br />
En este tutorial simplemente he mostrado algo de lo que se puede hacer con esta maravillosa librería, realmente que es sencillo y rápido desarrollar aplicaciones complejas.</p>
<p>Espero que esta corta introducción le pueda servir a mas de uno, y si tienen algún comentario o duda la pueden dejar en el formulario inferior de esta misma página, como parte complementaria al tutorial se puede <a href="http://www.crysfel.com/wp-content/uploads/2008/03/introduccion.zip" title="Ext Js Introducción">descargar los archivos</a> de ejemplo.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/03/24/introduccion-a-ext-js/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Carrusel de imágenes con Mootools1.2</title>
		<link>http://www.crysfel.com/2008/02/13/carrusel-de-imagenes-con-mootools12/</link>
		<comments>http://www.crysfel.com/2008/02/13/carrusel-de-imagenes-con-mootools12/#comments</comments>
		<pubDate>Wed, 13 Feb 2008 18:26:25 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/02/13/carrusel-de-imagenes-con-mootools12/</guid>
		<description><![CDATA[Ya hace rato que salió la nueva versión de mootools (la 1.2beta2), hoy quiero mostrar como escribir una clase con esta nueva versión, es muy similar a la versión anterior, pero algunas cosas cambiaron.
Objetivo
El principal objetivo de este artículo es mostrar algunas buenas prácticas al escribir clases, para que sean reutilizables no solo por el [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Ya hace rato que salió la nueva versión de <a href="http://mootools.net">mootools (la 1.2beta2)</a>, hoy quiero mostrar como escribir una clase con esta nueva versión, es muy similar a la versión anterior, pero algunas cosas cambiaron.</p>
<p><strong>Objetivo</strong><br />
El principal objetivo de este artículo es mostrar algunas buenas prácticas al escribir clases, para que sean reutilizables no solo por el propio autor, sino también por otros desarrolladores, esto hay que tenerlo en mente siempre que escribimos una clase, la clase que se escribirá hará algo asi (En las feeds no se aprecia el efecto debido a que no se ejecuta el javascript):</p>
<p><script type="text/javascript" src="http://www.crysfel.com/wp-content/uploads/2008/02/carrusel.js" ></script></p>
<div id="carruselTutorial2" style="margin-left:30px;background-image:url(http://www.crysfel.com/ejemplos/carrusel/04.jpg);width:420px;height:294px"></div>
<p><script type="text/javascript">$("carruselTutorial2").setStyle("background-image","none"); new Carrusel("carruselTutorial2",{images:["http://www.crysfel.com/ejemplos/carrusel/04.jpg","http://www.crysfel.com/ejemplos/carrusel/05.jpg","http://www.crysfel.com/ejemplos/carrusel/06.jpg","http://www.crysfel.com/ejemplos/carrusel/07.jpg","http://www.crysfel.com/ejemplos/carrusel/08.jpg","http://www.crysfel.com/ejemplos/carrusel/09.jpg","http://www.crysfel.com/ejemplos/carrusel/10.jpg","http://www.crysfel.com/ejemplos/carrusel/11.jpg","http://www.crysfel.com/ejemplos/carrusel/12.jpg","http://www.crysfel.com/ejemplos/carrusel/13.jpg","http://www.crysfel.com/ejemplos/carrusel/14.jpg","http://www.crysfel.com/ejemplos/carrusel/15.jpg","http://www.crysfel.com/ejemplos/carrusel/16.jpg","http://www.crysfel.com/ejemplos/carrusel/17.jpg","http://www.crysfel.com/ejemplos/carrusel/18.jpg"]});</script></p>
<p>Este carrusel de imágenes (slideshow) es idéntico (a nivel visor) al que ya he <a href="http://www.crysfel.com/index.php/2007/05/02/carrusel-de-imagenes/">mostrado anteriormente</a>, solo que esta vez el código estará mucho mas limpio y mejor diseñado, completamente orientado a objetos y podrá ser muy flexible para ser utilizado por algún otro desarrollador.</p>
<p><span id="more-59"></span></p>
<p>Para comenzar hay que <a href="http://mootools.net/download/tags/1-2b2">descargar la librería de mootools (1.2beta2)</a> e importarla a la página:</p>
<p><code lang="html"><br />
<script type="text/javascript" src="mootools-beta-1.2b2.js"></script><br />
</code></p>
<p><strong>Definir una Clase con Mootools</strong><br />
La clase que hará el trabajo se llamará <strong>Carrusel</strong>, y para declararla vasta con hacer lo siguiente.</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({</p>
<p>});<br />
</code></p>
<p><strong>Agregar soporte para eventos y opciones</strong><br />
Generalmente una clase lleva Opciones, Eventos y un constructor, no son obligatorios, pero para reutilizar y distribuirla a otras personas, es mejor pensar a futuro.</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({<br />
	Implements:[Events, Options], //Implementamos eventos y opciones<br />
	options:{</p>
<p>	},<br />
	initialize:function(el,options){ // el constructor</p>
<p>	}<br />
});<br />
</code></p>
<p>Notar que entre cada propiedad o método se separa mediante una coma simple &#8220;,&#8221;, esto debido al estandar de JSON para javascript.</p>
<p>Para dar soporte de Eventos a la clase hay que implementar la clase Events, al igual que la clase Options si se quiere que la clase sea capas de manejar opciones de una manera sencilla. Este punto en especifico es algo que cambió en esta versión, anteriormente era diferente la manera de implementar clases, ahora esta mucho mas claro y entendible.</p>
<p>Lo siguiente es definir las propiedades (opciones) que la clase tendrá. Tomando en cuenta que es un carrusel de imágenes, tendremos entonces imágenes, sus dimensiones y control sobre el tiempo del efecto de transición y el tiempo a entre cada una.</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({<br />
	Implements:[Events, Options],<br />
	options:{<br />
		images:[],<br />
		width: 420,<br />
		height: 294,<br />
		durationFx:1000,<br />
		durationDelay: 3000 //3 segundos<br />
	},<br />
	initialize:function(el,options){<br />
		this.setOptions(options || {});<br />
	}<br />
});<br />
</code></p>
<p>Es importante notar que el constructor esta recibiendo dos parámetros, un elemento y opciones.</p>
<p>Las opciones funcionan de la siguiente manera, inicialmente se declaran con los valores por default, en este caso images es un arreglo vacío, width vale 420 y así con las demás, en caso de que en el constructor no se le pasen opciones, entonces las opciones por default serán usadas, este comportamiento se logra gracias a la función this.setOptions, que es la encargada de sobrescribir las opciones por default.</p>
<p>Dentro del constructor de la clase se pueden poner llamadas a otras funciones de la misma clase y hacer cualquier otra cosa, en este caso, voy a crear dos propiedades de clase y dos métodos, por ahora.</p>
<p><code lang="javascript"><br />
initialize:function(el,options){<br />
	this.setOptions(options || {});<br />
	this.el = $(el);<br />
	this.id = this.el.get('id');<br />
	this.build();<br />
	this.start();<br />
}<br />
</code></p>
<p>Hasta aquí únicamente he creado la propiedad this.el, que es la que guardará una referencia al elemento que se recibe, la propiedad this.id, es el identificador del elemento, esto lo hago por conveniencia, pues mas adelante se hará uso de este varias veces, el método build es el responsable de crear la estructura del visor de imágenes, ósea el html necesario, el método start es el encargado de iniciar la animación.</p>
<p>A continuación voy a mostrar en pseudos código lo que el método build hará.</p>
<p><code lang="javascript"><br />
build:function(){<br />
	//1.- Crear un div contenedor e inyectarlo dentro del elemento principal.<br />
	//2.- Crear un div para la imagen1 e inyectarlo al contenedor anterior<br />
	//3.- Crear un div para la imagen2 e inyectarlo al contenedor anterior<br />
	//4.- Crear las los efectos sobre los divs que contenedores de las imagenes<br />
	//5.- Iniciar con opacidad al 0%<br />
}<br />
</code></p>
<p>El div del punto uno es necesario, pues es posible que el donde se aloje el carrusel sea otro div posicionado absoluto o flotante, mediante este primer div contenedor nos aseguramos que el carrusel se pueda desplegar correctamente en cualquier lugar.</p>
<p>Una vez claro lo que se hará, codificarlo con mootools es muy sencillo, para crear los divs se utiliza la clase Element, y para los efectos la clase Fx.Tween, el código del método queda de la siguiente manera.</p>
<p><code lang="javascript"><br />
build:function(){<br />
	//1.- Crear un div contenedor e inyectarlo dentro del elemento principal.<br />
	var content = new Element('div',{id:this.id+'_content',styles:{position:'relative',width:this.options.width+'px',height:this.options.height+'px'}}).inject(this.el);<br />
	//2.- Crear un div para la imagen1 e inyectarlo al contenedor anterior<br />
	var img1 = new Element('div',{id:this.id+'_img1',styles:{width:'100%',height:'100%'}}).inject(content);<br />
	//3.- Crear un div para la imagen2 e inyectarlo al contenedor anterior<br />
	var img2 = new Element('div',{id:this.id+'_img2',styles:{position:'absolute',width:this.options.width+'px',height:this.options.height+'px',top:0,left:0}}).inject(content);<br />
	//4.- Crear las los efectos sobre los divs que contenedores de las imagenes<br />
	this.imgFx1 = new Fx.Tween(img1, 'opacity',{<br />
					duration:this.options.durationFx,<br />
					onComplete:function(){<br />
					this.nextImage();<br />
				}.bind(this)<br />
			});<br />
	this.imgFx2 = new Fx.Tween(img2, 'opacity',{duration:this.options.durationFx});<br />
	//5.- Iniciar con opacidad al 0%<br />
	this.imgFx1.set(0);<br />
	this.imgFx2.set(0);<br />
}<br />
</code></p>
<p>Lo mas interesante para comentar, es que en el punto numero cuatro, no solo se creó el efecto sobre la imagen uno, si no que también se agregó un evento, onComplete, este evento se dispara cuando el efecto sobre la imagen uno ha terminado, entonces la única instrucción aquí es cambiar a la siguiente imagen, el cual es otro método de la clase que mas adelante explicaré. Si eres observador al evento onComplete se le agregó también un bind(this) ,esto es de suma importancia, pues con esta instrucción es posible hacer referencia a la misma clase desde el evento, de no agregar esta instrucción el evento no sabría en que contexto buscar el método nextImage().</p>
<p>El siguiente método a implementar es el start, el cual es el encargado de iniciar con la animación. El pseudo código es el siguiente.</p>
<p><code lang="javascript"><br />
start:function(){<br />
	//1.- Revisar si hay imagenes para poder comenzar el carrusel<br />
	//2.- Disparar el evento onStart<br />
	//3.- Solicitar imagen<br />
	//4.- Hacer la trancision inicial<br />
	//5.- Crear un temporizador para ejecutar la transición periodicamente<br />
}<br />
</code></p>
<p>El código de lo anterior es el siguiente.</p>
<p><code lang="javascript"><br />
start:function(){<br />
	//1.- Revisar si hay imagenes para poder comenzar el carrusel<br />
	if(this.options.images.length==0)<br />
		return;<br />
	//2.- Disparar el evento onStart<br />
	this.fireEvent('onStart');<br />
	this.index = -1;<br />
	this.isImg1OnTop = false;<br />
	//3.- Solicitar imagen<br />
	this.nextImage();<br />
	//4.- Hacer la trancision inicial<br />
	this.transition();<br />
	//5.- Crear un temporizador para ejecutar la transición periodicamente<br />
	this.timer = this.transition.periodical(this.options.durationDelay,this);<br />
}<br />
</code></p>
<p>Es importante mencionan lo que sucede en la instrucción numero dos, para disparar el evento es necesario implementar la clase Events, la cual importamos al principio, this.fireEvent permite disparar eventos, en este caso se dispara el evento cuando se inicia la animación, estos eventos son provistos por los programadores que utilicen esta clase en algún futuro o por nosotros mismo, esto es muy útil si queremos reutilizar esta clase, añadiéndole comportamientos extras cuando sucedan los eventos, es por eso que siempre que se escribe una clase se debiera pensar en agregar eventos, personalmente siempre lo hago y me ha resultado de gran ayuda en el futuro.</p>
<p>En el método start  esta haciendo una llamada al método nextImage, este método es el responsable de establecer la imagen al contendor correspondiente, verificando que al término de las imágenes inicie nuevamente desde la imagen número uno, esta función también es invocada cuando termina el efecto de la transición sobre la imagen uno, esto se especifico en la función build, en pseudo código esto es:</p>
<p><code lang="javascript"><br />
nextImage: function(){<br />
	//1.- Se incrementa el contador<br />
	//2.- Se verifica la dimension del arreglo de imagenes, si llego al limite iniciar desde el principio<br />
	//3.- Se verifica si la imagen uno esta actualmente viendose, de esta forma se sabe a donde posicionar la siguietne imagen<br />
}<br />
</code></p>
<p>El código de lo anterior es el siguiente:</p>
<p><code lang="javascript"><br />
nextImage: function(){<br />
	//1.- Se incrementa el contador<br />
	this.index++;<br />
	//2.- Se verifica la dimension del arreglo de imagenes, si llego al limite iniciar desde el principio<br />
	if(this.index>=this.options.images.length)<br />
		this.index = 0;<br />
	//3.- Se verifica si la imagen uno esta actualmente viendose, de esta forma se sabe a donde posicionar la siguietne imagen<br />
	if(this.isImg1OnTop)<br />
		$(this.id+'_img2').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
	else<br />
		$(this.id+'_img1').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
}<br />
</code></p>
<p>El método start también esta llamando a la función transition, la responsabilidad del  método transition es realizar el efecto sobre los contenedores de la imágenes, esto es muy sencillo:</p>
<p><code lang="javascript"><br />
transition:function(){<br />
	this.fireEvent('onTransition');<br />
	this.imgFx1.start(this.isImg1OnTop?0:1);<br />
	this.imgFx2.start(this.isImg1OnTop?1:0);<br />
	this.isImg1OnTop = !this.isImg1OnTop;<br />
}<br />
</code></p>
<p>Lo único que se esta haciendo aquí es disparar el evento onTransition, e iniciando el desvanecido de 0 a 100 por ciento, dependiendo de imagen uno.</p>
<p>Por último se crearán algunos métodos para ser utilizados por otros desarrolladores o por nosotros mismos en otras circunstancias, primeramente un método que detenga al carrusel, otros método para controlar las imágenes, estas pueden provenir de una llamada AJAX o de cualquier otro lugar.</p>
<p><code lang="javascript"><br />
stop:function(){<br />
	this.fireEvent('onStop');<br />
	$clear(this.timer);<br />
}</p>
<p>newImages:function(images){<br />
	this.options.images = images;<br />
},<br />
addImages:function(images){<br />
	this.options.images.merge(images);<br />
},<br />
addImage:function(image){<br />
	this.addImages([image]);<br />
},<br />
deleteImages:function(){<br />
	this.stop();<br />
	this.options.images.empty();<br />
}<br />
</code></p>
<p><strong>Utilizar el carrusel o slideshow</strong><br />
Para utilizar el carrusel hay que crear instancias de esta clase, la forma más básica de su uso es:</p>
<p><code lang="javascript"><br />
//Utilizando las propiedades por default.<br />
var car1 = new Carrusel('carrusel1',{images:['images/12.jpg','images/09.jpg','images/05.jpg']});</p>
<p>//Usando los métodos para agregar imagenes<br />
var car3 = new Carrusel('carrusel3');<br />
car3.addImages(['images/14.jpg','images/11.jpg','images/06.jpg']);<br />
car3.addImage('images/10.jpg');<br />
car3.addImage('images/15.jpg');<br />
car3.start();</p>
<p>//Modificando todas las propiedades<br />
var car4 = new Carrusel('carrusel4',{<br />
			durationDelay:7000,<br />
			durationFx:1500,<br />
			width: 500,<br />
			height: 280,<br />
			images:['images/08.jpg','images/06.jpg','images/13.jpg'],<br />
			onStart:function(){console.debug('comenzando...')},<br />
			onTransition:function(){console.debug('haciendo la transición')}<br />
	});<br />
</code></p>
<p>Hay que recordar que deben existir los elementos en el documento para que funcione correctamente, con esto me refiero a que el HTML debe contener algo como esto para cada instancia del carrusel:</p>
<p><code lang="html"></p>
<div id="carrusel1">
</div>
<p></code></p>
<p>El código completo de la clase <strong>carrusel.js</strong> es el siguiente:</p>
<p><code lang="javascript"><br />
var Carrusel = new Class({<br />
	Implements:[Events, Options],<br />
	options:{<br />
		images:[],<br />
		width: 420,<br />
		height: 294,<br />
		durationFx:1000,<br />
		durationDelay: 3000 //3 segundos<br />
	},<br />
	initialize:function(el,options){<br />
		this.setOptions(options || {});<br />
		this.el = $(el);<br />
		this.id = this.el.get('id');<br />
		this.build();<br />
		this.start();<br />
	},<br />
	build:function(){<br />
		//1.- Crear un div contenedor e inyectarlo dentro del elemento principal.<br />
		var content = new Element('div',{id:this.id+'_content',styles:{position:'relative',width:this.options.width+'px',height:this.options.height+'px'}}).inject(this.el);<br />
		//2.- Crear un div para la imagen1 e inyectarlo al contenedor anterior<br />
		var img1 = new Element('div',{id:this.id+'_img1',styles:{width:'100%',height:'100%'}}).inject(content);<br />
		//3.- Crear un div para la imagen2 e inyectarlo al contenedor anterior<br />
		var img2 = new Element('div',{id:this.id+'_img2',styles:{position:'absolute',width:this.options.width+'px',height:this.options.height+'px',top:0,left:0}}).inject(content);<br />
		//4.- Crear las los efectos sobre los divs que contenedores de las imagenes<br />
		this.imgFx1 = new Fx.Tween(img1, 'opacity',{<br />
						duration:this.options.durationFx,<br />
						onComplete:function(){<br />
						this.nextImage();<br />
					}.bind(this)<br />
				});<br />
		this.imgFx2 = new Fx.Tween(img2, 'opacity',{duration:this.options.durationFx});<br />
		//5.- Iniciar con opacidad al 0%<br />
		this.imgFx1.set(0);<br />
		this.imgFx2.set(0);<br />
	},<br />
	start:function(){<br />
		//1.- Revisar si hay imagenes para poder comenzar el carrusel<br />
		if(this.options.images.length==0)<br />
			return;<br />
		//2.- Disparar el evento onStart<br />
		this.fireEvent('onStart');<br />
		this.index = -1;<br />
		this.isImg1OnTop = false;<br />
		//3.- Solicitar imagen<br />
		this.nextImage();<br />
		//4.- Hacer la trancision inicial<br />
		this.transition();<br />
		//5.- Crear un temporizador para ejecutar la transición periodicamente<br />
		this.timer = this.transition.periodical(this.options.durationDelay,this);<br />
	},<br />
	stop:function(){<br />
		this.fireEvent('onStop');<br />
		$clear(this.timer);<br />
	},<br />
	transition:function(){<br />
		this.fireEvent('onTransition');<br />
		this.imgFx1.start(this.isImg1OnTop?0:1);<br />
		this.imgFx2.start(this.isImg1OnTop?1:0);<br />
		this.isImg1OnTop = !this.isImg1OnTop;<br />
	},<br />
	nextImage: function(){<br />
		//1.- Se incrementa el contador<br />
		this.index++;<br />
		//2.- Se verifica la dimension del arreglo de imagenes, si llego al limite iniciar desde el principio<br />
		if(this.index>=this.options.images.length)<br />
			this.index = 0;<br />
		//3.- Se verifica si la imagen uno esta actualmente viendose, de esta forma se sabe a donde posicionar la siguietne imagen<br />
		if(this.isImg1OnTop)<br />
			$(this.id+'_img2').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
		else<br />
			$(this.id+'_img1').setStyle('background-image','url('+this.options.images[this.index]+')');<br />
	},<br />
	newImages:function(images){<br />
		this.options.images = images;<br />
	},<br />
	addImages:function(images){<br />
		this.options.images.merge(images);<br />
	},<br />
	addImage:function(image){<br />
		this.addImages([image]);<br />
	},<br />
	deleteImages:function(){<br />
		this.stop();<br />
		this.options.images.empty();<br />
	}<br />
});<br />
</code></p>
<p>El código del documento HTML que lo invoca es:</p>
<p><code lang="html"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
        "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"><br />
<head><br />
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1;" /></p>
<p><script type="text/javascript" src="mootools-beta-1.2b2.js"></script><br />
<script type="text/javascript" src="carrusel.js"></script><br />
<script type="text/javascript"></p>
<p>window.addEvent('domready', function() {
	var car = new Carrusel('carrusel');
	car.addImages(['images/14.jpg','images/11.jpg','images/06.jpg']);
	car.addImage('images/10.jpg');
	car.addImage('images/15.jpg');
	car.start();
});
</script><br />
</head><br />
<body></p>
<div id="carrusel">
</div>
<p></body><br />
</html><br />
</code></p>
<p><strong>Conclusión</strong><br />
Si lo has notado, para escribir esta clase se han creado varios métodos, cada uno con una responsabilidad especifica, la clase esta muy entendible y fácil de utilizar, esto es lo que se debe tener en cuanta cuando se escriben clases.</p>
<p>Espero que este tutorial sea de utilidad para mas de uno, saludos.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/02/13/carrusel-de-imagenes-con-mootools12/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Generar reporte de una colección de beans con JasperReport</title>
		<link>http://www.crysfel.com/2008/01/21/generar-reporte-de-una-coleccion-de-beans-con-jasperreport/</link>
		<comments>http://www.crysfel.com/2008/01/21/generar-reporte-de-una-coleccion-de-beans-con-jasperreport/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 18:26:04 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/01/21/generar-reporte-de-una-coleccion-de-beans-con-jasperreport/</guid>
		<description><![CDATA[El día de hoy quiero continuar con el tutorial de JasperReport, he explicado una introducción a la estructura principal del reporte, el paso de  parámetros al reporte y como llenar un reporte desde una base de datos incluyendo el Query dentro del jrxml, en esta ocasión explicaré como llenar un reporte por medio de [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El día de hoy quiero continuar con el tutorial de JasperReport, he explicado <a href="http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport">una introducción</a> a la estructura principal del reporte, el <a href="http://www.crysfel.com/index.php/2007/10/01/enviar-parametros-a-un-reporte-en-jasperreport">paso de  parámetros</a> al reporte y como llenar un reporte <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">desde una base de datos</a> incluyendo el Query dentro del jrxml, en esta ocasión explicaré como llenar un reporte por medio de una colección de objetos VO o DTO, como mejor los conozcas.</p>
<p><strong>Objetivos.</strong></p>
<ol>
<li>Cómo poner acentos y eñes dentro del reporte jrxml.</li>
<li>Poner una imagen en formato gif.</li>
<li>Generar la fecha actual del sistema y desplegarla en el reporte con un formato legible.</li>
<li>Pasarle la información al reporte por medio de una colección de beans.</li>
<li>Cómo poner títulos a las columnas de la información desplegada.</li>
<li>Realizar un reporte <a href="http://www.crysfel.com/wp-content/uploads/2008/01/plantilla.pdf">como este</a>.</li>
</ol>
<p>Una vez definidos los objetivos se puede apreciar el alcance de este tutorial y así decidir si al lector le conviene continuar con la lectura de este tutorial.</p>
<p><span id="more-55"></span></p>
<p><strong>Cómo poner acentos y eñes.</strong><br />
Lo primero es definir la cabecera del archivo jrxml, y dentro de este especificarle el encode a utilizar dentro del documento, generalmente el encode por de facto es UTF8, pero este encode no soporta los caracteres extendidos, que es donde se encuentran los acentuados y la eñe, es por eso que si no ponemos el encode correcto, al compilar el reporte obtendremos un error, para evitar esto, es necesario indicar que el encode a utilizar sea ISO-8859-1, el cual contiene los caracteres necesarios para el español.</p>
<p><code lang="xml"><br />
<?xml version="1.0" encoding="ISO-8859-1"  ?><br />
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"<br />
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"><br />
<!--======================================================================================== --><br />
<!--===================================== Por Crysfel Villa==================================== --><br />
<!--======================================================================================== --><br />
</code></p>
<p><strong>Paso de parámetros e información.</strong><br />
Lo siguiente es pasarle algunos parámetros para desplegar el titulo, y el subtitulo, además de declararse las Fields de la información a desplegar en el reporte.</p>
<p><code lang="xml"><br />
<jasperReport<br />
		 name="plantilla"<br />
		 pageWidth="595"<br />
		 pageHeight="842"<br />
		 leftMargin="20"<br />
		 rightMargin="20"<br />
		 topMargin="20"<br />
		 bottomMargin="20"></p>
<parameter name="P_TITULO" class="java.lang.String"/>
<parameter name="P_SUBTITULO" class="java.lang.String"/>
<parameter name="LOGO_URL" class="java.lang.String"/>
<p>	<field name="universidad" class="java.lang.String"/><br />
	<field name="rector" class="java.lang.String"/><br />
	<field name="direccion" class="java.lang.String"/><br />
	<field name="alumnos" class="java.lang.Integer"/><br />
</jasperReport><br />
</code></p>
<p>A diferencia del <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a>, únicamente se le ha suprimido el Query que consultaba la base de datos, esto es por que ahora la información se le pasará directamente desde Java por medio de una colección de DTOs (Data Transfer Object).</p>
<p>Más adelante explicaré mas a detalle el paso de información, por ahora basta con declarar la información a desplegar en la parte del detail.</p>
<p><strong>Poner una imagen en formato gif.</strong><br />
En esta sección se definirá el background y la cabecera del documento, en el <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a> explique cómo hacerlo, el día de hoy será exactamente igual con la diferencia de  que en lugar de pasarle una imagen JPG se le pasará una imagen GIF, además de que las medidas y posiciones son diferentes, todo esto escrito en código es:</p>
<p><code lang="xml"><br />
<background><br />
	<band height="67"><br />
		<image><br />
			<reportElement<br />
				x="430"<br />
				y="0"<br />
				width="100"<br />
				height="67"/><br />
			<imageExpression class="java.lang.String"><![CDATA[$P{LOGO_URL}]]&gt;</imageExpression><br />
		</image><br />
	</band><br />
</background><br />
<title><br />
	<band height="90"><br />
		<textField><br />
			<reportElement<br />
				x="0"<br />
				y="40"<br />
				width="530"<br />
				height="30"/><br />
			<textElement><br />
				<font pdfFontName="Helvetica-Bold" size="20" isBold="true"/><br />
			</textElement><br />
		<textFieldExpression   class="java.lang.String"><![CDATA[$P{P_TITULO}]]&gt;</textFieldExpression><br />
		</textField></p>
<line direction="TopDown">
			<reportElement<br />
				x="0"<br />
				y="69"<br />
				width="530"<br />
				height="0"<br />
				key="line"/><br />
			<graphicElement stretchType="NoStretch"/>
		</line>
		<textField><br />
			<reportElement<br />
				x="0"<br />
				y="70"<br />
				width="250"<br />
				height="20"<br />
				key="textField"/><br />
			<textElement><br />
				<font pdfFontName="Helvetica-Bold" size="10"/><br />
			</textElement><br />
		<textFieldExpression   class="java.lang.String"><![CDATA[$P{P_SUBTITULO}]]&gt;</textFieldExpression><br />
		</textField><br />
		<textField pattern="EEEEE dd MMMMM yyyy"><br />
			<reportElement<br />
				x="260"<br />
				y="70"<br />
				width="270"<br />
				height="20"<br />
				key="textField"/><br />
			<textElement textAlignment="Right"><br />
				<font pdfFontName="Helvetica-Bold" size="10"/><br />
			</textElement><br />
		<textFieldExpression   class="java.util.Date"><![CDATA[new java.util.Date()]]&gt;</textFieldExpression><br />
		</textField><br />
	</band><br />
</title><br />
</code></p>
<p>Hasta aquí no hay nada nuevo, excepto que en el campo donde se despliega la fecha, en lugar de sacarla de la base de datos como en el <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a>, ahora se generará directamente en el reporte, esto es muy sencillo de hacer, únicamente hay que crear una instancia de la clase Date dentro de la expresión del campo:</p>
<p><code lang="java"><br />
new java.util.Date()<br />
</code></p>
<p>El formato es exactamente igual al tutorial anterior.</p>
<p><strong>Poner títulos a las columnas.</strong><br />
Anteriormente no se le había agregado cabeceras a las columnas de la información, pero si había mencionado <a href="http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport">en la introducción</a> que esto es posible, a continuación se muestra cómo por medio de la sección <strong>&lt;columnHeader&gt;</strong> se puede realizar.</p>
<p><code lang="xml"></p>
<columnHeader>
	<band height="20"><br />
		<staticText><br />
			<reportElement x="0" y="0" width="200" height="13" key="staticText"/><br />
			<text><![CDATA[Universidad]]&gt;</text><br />
		</staticText><br />
		<staticText><br />
			<reportElement x="205" y="0" width="150" height="13"/><br />
			<text><![CDATA[Rector]]&gt;</text><br />
		</staticText><br />
		<staticText><br />
			<reportElement x="360" y="0" width="150" height="13"/><br />
			<text><![CDATA[Dirección]]&gt;</text><br />
		</staticText><br />
		<staticText><br />
			<reportElement x="490" y="0" width="100" height="13"/><br />
			<text><![CDATA[Alumnos]]&gt;</text><br />
		</staticText><br />
	</band><br />
</columnHeader>
</code></p>
<p>Si te das cuenta, esta sección no tiene nada especial que no se haya cubierto en los tutoriales anteriores, simplemente son textos estáticos distribuidos en forma linear, es aquí donde se ha necesitado poner acentos, los cuales son correctamente soportados gracias a que se ha especificado el encoding correcto al inicio del documento.</p>
<p><strong>Desplegar la información principal.</strong><br />
Esta es la sección principal del reporte, las columnas donde se muestra la información. En el <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a> explicaba que esta sección es iterada sobre el data source provisto, anteriormente la consulta SQL generaba una colección de información regresada por la base de datos, en esta ocasión la colección se le pasará desde Java. Al diseñar el reporte esto no tiene ninguna implicación, simplemente se acomodan los campos en las posiciones deseadas, todo esto exactamente igual al <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a>, pero con diferente información a desplegar.</p>
<p><code lang="xml"><br />
<detail><br />
	<band height="15"><br />
		<textField><br />
			<reportElement x="0" y="0" width="200" height="13"/><br />
			<textFieldExpression class="java.lang.String"><br />
				<![CDATA[$F{universidad}]]&gt;<br />
			</textFieldExpression><br />
		</textField><br />
		<textField><br />
			<reportElement x="205" y="0" width="150" height="13"/><br />
			<textFieldExpression class="java.lang.String"><br />
				<![CDATA[$F{rector}]]&gt;<br />
			</textFieldExpression><br />
		</textField><br />
		<textField><br />
			<reportElement x="360" y="0" width="150" height="13"/><br />
			<textFieldExpression class="java.lang.String"><br />
				<![CDATA[$F{direccion}]]&gt;<br />
			</textFieldExpression><br />
		</textField><br />
		<textField><br />
			<reportElement x="515" y="0" width="20" height="13"/><br />
			<textFieldExpression class="java.lang.Integer"><br />
				<![CDATA[$F{alumnos}]]&gt;<br />
			</textFieldExpression><br />
		</textField><br />
	</band><br />
</detail><br />
</code></p>
<p><strong>El reporte completo.</strong><br />
Esto es todo en cuanto al diseño del reporte, todo ha sido semejante por no decir igual al reporte del <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a>, únicamente cambiamos el encoding para que aceptara acentos, se le agregó una nueva sección al reporte para desplegar los titulos de las columnas, la fecha se ha generado directamente en el reporte y se suprimió la consulta SQL a la base de dato, el reporte completo es el siguiente.</p>
<p><code lang="xml"><br />
<?xml version="1.0" encoding="ISO-8859-1"  ?><br />
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"<br />
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"><br />
<!--======================================================================================== --><br />
<!--===================================== Por Crysfel Villa==================================== --><br />
<!--======================================================================================== --><br />
<jasperReport<br />
		 name="plantilla"<br />
		 pageWidth="595"<br />
		 pageHeight="842"<br />
		 leftMargin="20"<br />
		 rightMargin="20"<br />
		 topMargin="20"<br />
		 bottomMargin="20"></p>
<parameter name="P_TITULO" class="java.lang.String"/>
<parameter name="P_SUBTITULO" class="java.lang.String"/>
<parameter name="LOGO_URL" class="java.lang.String"/>
<p>	<field name="universidad" class="java.lang.String"/><br />
	<field name="rector" class="java.lang.String"/><br />
	<field name="direccion" class="java.lang.String"/><br />
	<field name="alumnos" class="java.lang.Integer"/></p>
<p>		<background><br />
			<band height="67"><br />
				<image><br />
					<reportElement<br />
						x="430"<br />
						y="0"<br />
						width="100"<br />
						height="67"/><br />
					<imageExpression class="java.lang.String"><![CDATA[$P{LOGO_URL}]]&gt;</imageExpression><br />
				</image><br />
			</band><br />
		</background><br />
		<title><br />
			<band height="90"><br />
				<textField><br />
					<reportElement<br />
						x="0"<br />
						y="40"<br />
						width="530"<br />
						height="30"/><br />
					<textElement><br />
						<font pdfFontName="Helvetica-Bold" size="20" isBold="true"/><br />
					</textElement><br />
				<textFieldExpression   class="java.lang.String"><![CDATA[$P{P_TITULO}]]&gt;</textFieldExpression><br />
				</textField></p>
<line direction="TopDown">
					<reportElement<br />
						x="0"<br />
						y="69"<br />
						width="530"<br />
						height="0"<br />
						key="line"/><br />
					<graphicElement stretchType="NoStretch"/>
				</line>
				<textField><br />
					<reportElement<br />
						x="0"<br />
						y="70"<br />
						width="250"<br />
						height="20"<br />
						key="textField"/><br />
					<textElement><br />
						<font pdfFontName="Helvetica-Bold" size="10"/><br />
					</textElement><br />
				<textFieldExpression   class="java.lang.String"><![CDATA[$P{P_SUBTITULO}]]&gt;</textFieldExpression><br />
				</textField><br />
				<textField pattern="EEEEE dd MMMMM yyyy"><br />
					<reportElement<br />
						x="260"<br />
						y="70"<br />
						width="270"<br />
						height="20"<br />
						key="textField"/><br />
					<textElement textAlignment="Right"><br />
						<font pdfFontName="Helvetica-Bold" size="10"/><br />
					</textElement><br />
				<textFieldExpression   class="java.util.Date"><![CDATA[new java.util.Date()]]&gt;</textFieldExpression><br />
				</textField><br />
			</band><br />
		</title></p>
<columnHeader>
			<band height="20"><br />
				<staticText><br />
					<reportElement x="0" y="0" width="200" height="13" key="staticText"/><br />
					<text><![CDATA[Universidad]]&gt;</text><br />
				</staticText><br />
				<staticText><br />
					<reportElement x="205" y="0" width="150" height="13"/><br />
					<text><![CDATA[Rector]]&gt;</text><br />
				</staticText><br />
				<staticText><br />
					<reportElement x="360" y="0" width="150" height="13"/><br />
					<text><![CDATA[Dirección]]&gt;</text><br />
				</staticText><br />
				<staticText><br />
					<reportElement x="490" y="0" width="100" height="13"/><br />
					<text><![CDATA[Alumnos]]&gt;</text><br />
				</staticText><br />
			</band><br />
		</columnHeader>
		<detail><br />
			<band height="15"><br />
				<textField><br />
					<reportElement x="0" y="0" width="200" height="13"/><br />
					<textFieldExpression class="java.lang.String"><br />
						<![CDATA[$F{universidad}]]&gt;<br />
					</textFieldExpression><br />
				</textField><br />
				<textField><br />
					<reportElement x="205" y="0" width="150" height="13"/><br />
					<textFieldExpression class="java.lang.String"><br />
						<![CDATA[$F{rector}]]&gt;<br />
					</textFieldExpression><br />
				</textField><br />
				<textField><br />
					<reportElement x="360" y="0" width="150" height="13"/><br />
					<textFieldExpression class="java.lang.String"><br />
						<![CDATA[$F{direccion}]]&gt;<br />
					</textFieldExpression><br />
				</textField><br />
				<textField><br />
					<reportElement x="515" y="0" width="20" height="13"/><br />
					<textFieldExpression class="java.lang.Integer"><br />
						<![CDATA[$F{alumnos}]]&gt;<br />
					</textFieldExpression><br />
				</textField><br />
			</band><br />
		</detail></p>
<p></jasperReport><br />
</code></p>
<p>Ahora viene la parte interesante en Java, la cual cambiará muy poco conforme al <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a>.</p>
<p><strong>Generar el reporte con Java.</strong><br />
Para generar el reporte son necesarios cuatro pasos, muy sencillos por cierto. El paso número uno es llenar el data source con la información a enviar, el paso dos compilar el reporte, paso tres llenarlo con la información y parámetros necesarios, paso cuatro exportar el reporte al formato deseado, en este caso pdf.</p>
<p><code lang="java"><br />
package pruebas;<br />
/**<br />
 * Generar un reporte con Jasper Report<br />
 * Por Crysfel Villa Roman<br />
 * 21/01/2008<br />
 *<br />
 * */<br />
import java.util.ArrayList;<br />
import java.util.Collection;<br />
import java.util.HashMap;<br />
import java.util.Map;</p>
<p>import net.sf.jasperreports.engine.JasperCompileManager;<br />
import net.sf.jasperreports.engine.JasperExportManager;<br />
import net.sf.jasperreports.engine.JasperFillManager;<br />
import net.sf.jasperreports.engine.JasperPrint;<br />
import net.sf.jasperreports.engine.JasperReport;<br />
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;</p>
<p>public class JasperReport4{<br />
  public static void main(String[] args){<br />
	String reportName = "plantilla";<br />
	JRBeanCollectionDataSource dataSource;<br />
	JasperReport jasperReport;<br />
    JasperPrint jasperPrint;<br />
    Map pars = new HashMap();<br />
    pars.put("LOGO_URL", "logo.gif");<br />
    pars.put("P_TITULO", "Reporte de universidades inscritas");<br />
    pars.put("P_SUBTITULO", "Región Nor-Este");<br />
    try{<br />
    	//1-Llenar el datasource con la informacion de la base de datos o de donde este, en este caso "hardcode"<br />
    	Collection lista = populateData();<br />
    	dataSource = new JRBeanCollectionDataSource(lista);</p>
<p>    	//2-Compilamos el archivo XML y lo cargamos en memoria<br />
        jasperReport = JasperCompileManager.compileReport(<br />
        		reportName+".jrxml");</p>
<p>        //3-Llenamos el reporte con la información de la coleccion y parámetros necesarios para la consulta<br />
        jasperPrint = JasperFillManager.fillReport(<br />
            jasperReport, pars, dataSource);</p>
<p>        //4-Exportamos el reporte a pdf y lo guardamos en disco<br />
        JasperExportManager.exportReportToPdfFile(<br />
            jasperPrint, reportName+".pdf");</p>
<p>        System.out.println("Done!");<br />
    }catch (Exception e){<br />
      System.out.println(e);<br />
      e.printStackTrace();<br />
    }<br />
  }<br />
  private static Collection populateData(){<br />
	  Collection list = new ArrayList();<br />
	  list.add(new Universidad("Universidad de Montemorelos","Dr. Oscar Castillo","Montemorelos NL.",new Integer(4800)));<br />
	  list.add(new Universidad("Tecnológico de Monterrey","Dr. Jair Acosta","Monterrey NL.",new Integer(10956)));<br />
	  list.add(new Universidad("Universidad Regiomontana","Dr. Meliza Orduñez","Monterrey NL.",new Integer(5200)));<br />
	  list.add(new Universidad("Universidad Autónoma de México","Dr. Carlos Medina","Mexico DF.",new Integer(15700)));<br />
	  list.add(new Universidad("Instituto Politécnico Nacional","Dr. Manuel Obrador","México DF.",new Integer(16380)));<br />
	  list.add(new Universidad("Universidad del Valle de México","Dr. Héctor Solano","México DF.",new Integer(6280)));<br />
	  return list;<br />
  }<br />
}<br />
</code></p>
<p>Lo mas importante a resaltar aquí es la clase <strong>net.sf.jasperreports.engine.data.JRBeanCollectionDataSource</strong> la cual es la encargada de entregar la información al reporte. Esta clase se instancia con una colección de Objetos DTO. En este caso el objeto es Universidad, que contiene las mismas propiedades que el reporte desplegará con sus respectivos getters y setters.</p>
<p>Para ejemplo se ha hardcodeado la información en el método populateData, en la vida real esto no se hace, este método debiera ser implementado de acuerdo a las necesidades del desarrollador, ya sea consultando una base de datos, un webservice, un archivo de texto, etc.</p>
<p>A continuación el bean necesario para llenar el reporte.</p>
<p><code lang="java"><br />
package pruebas;</p>
<p>public class Universidad {<br />
	private String universidad;<br />
	private String rector;<br />
	private String direccion;<br />
	private Integer alumnos;</p>
<p>	//Obligatorio tener un constructor sin parametros.<br />
	public Universidad(){</p>
<p>	}<br />
	//Constructor util para setear las propiedades inicialmente.<br />
	public Universidad(String universidad,String rector,String direccion,Integer alumnos){<br />
		this.universidad = universidad;<br />
		this.rector = rector;<br />
		this.direccion = direccion;<br />
		this.alumnos = alumnos;<br />
	}</p>
<p>	public Integer getAlumnos() {<br />
		return alumnos;<br />
	}</p>
<p>	public void setAlumnos(Integer alumnos) {<br />
		this.alumnos = alumnos;<br />
	}</p>
<p>	public String getDireccion() {<br />
		return direccion;<br />
	}</p>
<p>	public void setDireccion(String direccion) {<br />
		this.direccion = direccion;<br />
	}</p>
<p>	public String getRector() {<br />
		return rector;<br />
	}</p>
<p>	public void setRector(String rector) {<br />
		this.rector = rector;<br />
	}</p>
<p>	public String getUniversidad() {<br />
		return universidad;<br />
	}</p>
<p>	public void setUniversidad(String universidad) {<br />
		this.universidad = universidad;<br />
	}</p>
<p>}<br />
</code></p>
<p>Lo más importante aquí es que las propiedades deben corresponder a los campos declarados en el reporte, de esta manera el motor de JasperReports puede relacionarlas y desplegar la información.</p>
<p>El código es muy claro y sencillo, si se siguen los cuatro pasos no se tendrá problema para generar el reporte, al igual que en los tutoriales anteriores voy a poner el proyecto para eclipse, con el ejemplo, para <a href="http://www.crysfel.com/wp-content/uploads/2008/01/jasperreportbean.rar">ser descargado</a>.</p>
<p>Po último quiero dar una disculpa por referirme tanto al <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a>, pero tanto este como el <a href="http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/">tutorial anterior</a> son muy semejantes. <img src='http://www.crysfel.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Saludos.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/01/21/generar-reporte-de-una-coleccion-de-beans-con-jasperreport/feed/</wfw:commentRss>
		<slash:comments>47</slash:comments>
		</item>
		<item>
		<title>Generar reporte desde una Base de datos en JasperReport</title>
		<link>http://www.crysfel.com/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/</link>
		<comments>http://www.crysfel.com/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 00:17:16 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/</guid>
		<description><![CDATA[En este tutorial voy a explicar como generar un reporte en PDF obteniendo la información de una base de datos, si eres realmente nuevo manejando Jasper Reports, te sugiero darle una leída a la introducción y al paso de parámetros.
El reporte que se generará en este tutorial contendrá un listado de facultades que pertenecen a [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>En este tutorial voy a explicar como generar un reporte en PDF obteniendo la información de una base de datos, si eres realmente nuevo manejando Jasper Reports, te sugiero darle una leída a <a href="http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport">la introducción</a> y al <a href="http://www.crysfel.com/index.php/2007/10/01/enviar-parametros-a-un-reporte-en-jasperreport">paso de parámetros</a>.</p>
<p>El reporte que se generará en este tutorial contendrá un listado de facultades que pertenecen a una determinada universidad, esta información sacada de una base de datos.</p>
<p>La base de datos a utilizar es MySQL 5.0.45, así que es necesario agregar al classpath de tu proyecto el <a href="http://www.mysql.com/products/connector/j/">MySQL Conector</a>, junto con todas las librerías necesarias (mencionadas en <a href="http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport">la introducción</a>).</p>
<p>Una vez hecho esto, ha comenzar a codificar el JRXML, primero hay que crear el documento y pasarle dos parámetros, el primero es el id de la universidad que queremos generar el reporte, y el segundo parámetro es la url donde esta la imagen del logotipo de la universidad, hasta ahora tenemos.</p>
<p><code lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"  ?><br />
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"><br />
<jasperReport<br />
		 name="plantilla"<br />
		 pageWidth="595"<br />
		 pageHeight="842"<br />
		 leftMargin="20"<br />
		 rightMargin="20"<br />
		 topMargin="20"<br />
		 bottomMargin="20"></p>
<parameter name="P_ID_UNIVERSIDAD" class="java.lang.String"/>
<parameter name="LOGO_URL" class="java.lang.String"/>
<p></jasperReport><br />
</code></p>
<p>La estructura de la base de datos es muy simple, consta de dos tablas, una se llama Universidades y la otra se llama Facultades, la tabla Universidades solo tiene tres campos, el id, el nombre de la universidad y el domicilio, la tabla facultades contiene cinco campos, el id, facultad, director, total de alumnos y una relación a la tabla universidades, a continuación muestro el SQL de la base de datos.</p>
<p><span id="more-51"></span></p>
<p><code lang="sql"><br />
--<br />
-- Base de datos: `test`<br />
--</p>
<p>-- --------------------------------------------------------</p>
<p>--<br />
-- Estructura de tabla para la tabla `facultades`<br />
--</p>
<p>CREATE TABLE `facultades` (<br />
  `id_facultad` int(10) unsigned NOT NULL auto_increment,<br />
  `id_universidad` int(10) unsigned NOT NULL,<br />
  `facultad` varchar(200) NOT NULL,<br />
  `director` varchar(200) NOT NULL,<br />
  `alumnos` int(11) NOT NULL,<br />
  PRIMARY KEY  (`id_facultad`),<br />
  KEY `id_universidad` (`id_universidad`)<br />
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;</p>
<p>--<br />
-- Volcar la base de datos para la tabla `facultades`<br />
--</p>
<p>INSERT INTO `facultades` VALUES (1, 1, 'Facultad de Ingeniería y Tecnología', 'Pedro Mejia', 251);<br />
INSERT INTO `facultades` VALUES (2, 1, 'Facultad de Artes y Comunicación', 'Imelda Torrez', 193);<br />
INSERT INTO `facultades` VALUES (3, 1, 'Facultad de Ciencias de la Salud', 'Oscar Ochoa', 428);<br />
INSERT INTO `facultades` VALUES (4, 1, 'Facultad de Educación', 'Lorena Mena', 173);<br />
INSERT INTO `facultades` VALUES (5, 1, 'Facultad de Ciencias Sociales', 'Alfonso Reyes', 95);<br />
INSERT INTO `facultades` VALUES (6, 1, 'Facultad de Teología', 'Emanuel Perez', 162);<br />
INSERT INTO `facultades` VALUES (7, 2, 'Facultad de Comunicacion', 'Hector Solano', 320);<br />
INSERT INTO `facultades` VALUES (8, 2, 'Facultad de Diseño', 'Sergio Monrroy', 245);<br />
INSERT INTO `facultades` VALUES (9, 2, 'Facultad de Salud', 'Juana Salazar', 562);</p>
<p>-- --------------------------------------------------------</p>
<p>--<br />
-- Estructura de tabla para la tabla `universidades`<br />
--</p>
<p>CREATE TABLE `universidades` (<br />
  `id_universidad` int(10) unsigned NOT NULL auto_increment,<br />
  `nombre` varchar(200) NOT NULL,<br />
  `domicilio` varchar(250) NOT NULL,<br />
  PRIMARY KEY  (`id_universidad`)<br />
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;</p>
<p>--<br />
-- Volcar la base de datos para la tabla `universidades`<br />
--</p>
<p>INSERT INTO `universidades` VALUES (1, 'Universidad de Montemorelos', 'Montemorelos NL MX');<br />
INSERT INTO `universidades` VALUES (2, 'Tecnológico de Monterrey', 'Monterrey NL MX');<br />
INSERT INTO `universidades` VALUES (3, 'Universidad del Valle de Mexico', 'Mexico DF MX');<br />
INSERT INTO `universidades` VALUES (4, 'Universidad Regiomontana', 'Monterrey NL MX');</p>
<p>--<br />
-- Filtros para las tablas descargadas (dump)<br />
--</p>
<p>--<br />
-- Filtros para la tabla `facultades`<br />
--<br />
ALTER TABLE `facultades`<br />
  ADD CONSTRAINT `facultades_ibfk_1` FOREIGN KEY (`id_universidad`) REFERENCES `universidades` (`id_universidad`) ON DELETE CASCADE ON UPDATE CASCADE;<br />
</code></p>
<p>El siguiente paso es hacer el Query con el que se llenará la información, en este caso será el siguiente.</p>
<p><code lang="sql"><br />
SELECT U.nombre AS universidad, U.domicilio, CURDATE( ) AS fecha, F.facultad, F.director, F.alumnos<br />
FROM facultades F, universidades U<br />
WHERE U.id_universidad = F.id_universidad<br />
AND U.id_universidad =1<br />
</code></p>
<p>He sacado la fecha del sistema para mostrar como dar formato a una fecha en JasperReport. Ahora hay que introducir el Query al reporte y pasarle el parámetro necesario para que podamos sacar dinámicamente, desde Java, la universidad que queramos.</p>
<p><code lang="xml"><br />
<queryString><![CDATA[<br />
		SELECT  U.nombre AS universidad, U.domicilio, CURDATE() AS fecha, F.facultad, F.director, F.alumnos<br />
		FROM facultades F, universidades U<br />
		WHERE U.id_universidad = F.id_universidad<br />
		AND U.id_universidad = $P{P_ID_UNIVERSIDAD}]]&gt;<br />
</queryString></p>
<p><field name="universidad" class="java.lang.String"/><br />
<field name="domicilio" class="java.lang.String"/><br />
<field name="fecha" class="java.util.Date"/><br />
<field name="facultad" class="java.lang.String"/><br />
<field name="director" class="java.lang.String"/><br />
<field name="alumnos" class="java.lang.Integer"/><br />
</code></p>
<p>La etiqueta <queryString/> es la que almacena el Query que se ejecutará cuando el reporte sea mandado a llenar desde Java. Algo importante a mencionar es que se han creado varias <strong>field</strong> (campos), uno para cada campo regresado por el Query, el <strong>name</strong> de cada campo <strong>debe coincidir</strong> con los <strong>capos o alias devueltos por el Query</strong>, de esta manera se puede accesar a la información y colocarla en el reporte.</p>
<p>Como he mencionado en <a href="http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport">la introducción</a> hay varias secciones en un reporte, y una de ellas es el background, hasta ahora no he mencionado nada sobre esta sección, pero como su nombre lo indica, esta sección es el fondo del documento, aquí se puede poner la plantilla de la empresa, o cualquier cosa, en este caso se pondrá una imagen que es el logotipo de la universidad, todo esto resumido en código queda de la siguiente manera.</p>
<p><code lang="xml"><br />
<background><br />
	<band height="41"><br />
		<image><br />
			<reportElement<br />
				x="500"<br />
				y="0"<br />
				width="33"<br />
				height="38"/><br />
			<imageExpression class="java.lang.String"><![CDATA[$P{LOGO_URL}]]&gt;</imageExpression><br />
		</image><br />
	</band><br />
</background><br />
</code></p>
<p>Para poner una imagen se utiliza la etiqueta <strong>&lt;image&gt;</strong> y la url se le pasa mediante el parámetro <strong>$P{LOGO_URL}</strong>.</p>
<p>La siguiente sección es el titulo del documento, aquí se pondra con letras grandes el nombre de la universidad, el domicilio y la fecha en que se ha generado el reporte, además de una línea divisoria, esto se hace de la siguiente manera.</p>
<p><code lang="xml"><br />
<title><br />
	<band height="70"><br />
		<textField><br />
			<reportElement<br />
				x="0"<br />
				y="20"<br />
				width="530"<br />
				height="30"/><br />
			<textElement><br />
				<font pdfFontName="Helvetica-Bold" size="20" isBold="true"/><br />
			</textElement><br />
		<textFieldExpression   class="java.lang.String"><![CDATA[$F{universidad}]]&gt;</textFieldExpression><br />
		</textField></p>
<line direction="TopDown">
			<reportElement<br />
				x="0"<br />
				y="49"<br />
				width="530"<br />
				height="0"<br />
				key="line"/><br />
			<graphicElement stretchType="NoStretch"/>
		</line>
		<textField><br />
			<reportElement<br />
				x="0"<br />
				y="50"<br />
				width="250"<br />
				height="20"<br />
				key="textField"/><br />
			<textElement><br />
				<font pdfFontName="Helvetica-Bold" size="10"/><br />
			</textElement><br />
		<textFieldExpression   class="java.lang.String"><![CDATA[$F{domicilio}]]&gt;</textFieldExpression><br />
		</textField><br />
		<textField pattern="EEEEE dd MMMMM yyyy"><br />
			<reportElement<br />
				x="260"<br />
				y="50"<br />
				width="270"<br />
				height="20"<br />
				key="textField"/><br />
			<textElement textAlignment="Right"><br />
				<font pdfFontName="Helvetica-Bold" size="10"/><br />
			</textElement><br />
		<textFieldExpression   class="java.util.Date"><![CDATA[$F{fecha}]]&gt;</textFieldExpression><br />
		</textField><br />
	</band><br />
</title><br />
</code></p>
<p>No me voy a detener a explicar la parte de la interface pues esto lo he explicado en <a href="http://www.crysfel.com/index.php/2007/10/01/enviar-parametros-a-un-reporte-en-jasperreport">el paso de parámetros a un reporte</a>, lo que si hay que tomar en cuenta es que a diferencia del tutorial anterior, ahora, en lugar de imprimir parámetros se esta imprimiendo lo que proviene de la base de datos, mediante <strong>$F{universidad}</strong>, mediante el operador <strong>$F{}</strong> se accesa a los campos declarados en el Query, únicamente se escribe dentro de las llaves el nombre del campo a acceder.</p>
<p>Otra diferencia a notar es que al textfield de la fecha se le agrego una propiedad <strong>pattern=&#8221;EEEEE dd MMMMM yyyy&#8221;</strong>, este patrón se puede cambiar al gusto, es posible poner algo como &#8220;dd/MM/yyyy&#8221; para desplegar la fecha en formato &#8220;21/10/2008&#8243;.</p>
<p>Ahora la última parte interesante de este tutorial es la sección “detail”. Es aquí donde se desplegará la información del reporte, esta queda de la siguiente manera.</p>
<p><code lang="xml"><br />
<detail><br />
	<band height="15"><br />
		<textField><br />
			<reportElement x="0" y="0" width="200" height="13"/><br />
			<textFieldExpression class="java.lang.String"><br />
			<![CDATA[$F{facultad}]]&gt;<br />
			</textFieldExpression><br />
		</textField><br />
		<textField><br />
			<reportElement x="205" y="0" width="200" height="13"/><br />
			<textFieldExpression class="java.lang.String"><br />
				<![CDATA[$F{director}]]&gt;<br />
			</textFieldExpression><br />
		</textField><br />
		<textField><br />
			<reportElement x="410" y="0" width="20" height="13"/><br />
			<textFieldExpression class="java.lang.Integer"><br />
				<![CDATA[$F{alumnos}]]&gt;<br />
			</textFieldExpression><br />
		</textField><br />
	</band><br />
</detail><br />
</code></p>
<p>Como se puede ver, solo se han declarado tres textfields, y se ha impreso en ellas lo que proviene de la base de datos, esta sección es diferente a todas las demás, pues esta sección itera el resultset (en este caso) o bien un listado de beans enviado desde Java.</p>
<p>Ya esta listo el reporte, que al final queda de la siguiente manera.</p>
<p><code lang="xml"><br />
<?xml version="1.0" encoding="UTF-8"  ?><br />
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"<br />
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"><br />
<!--======================================================================================== --><br />
<!--===================================== Por Crysfel Villa==================================== --><br />
<!--======================================================================================== --><br />
<jasperReport<br />
		 name="plantilla"<br />
		 pageWidth="595"<br />
		 pageHeight="842"<br />
		 leftMargin="20"<br />
		 rightMargin="20"<br />
		 topMargin="20"<br />
		 bottomMargin="20"></p>
<parameter name="P_ID_UNIVERSIDAD" class="java.lang.String"/>
<parameter name="LOGO_URL" class="java.lang.String"/>
<p>	<queryString><![CDATA[<br />
		SELECT  U.nombre AS universidad, U.domicilio, CURDATE() AS fecha, F.facultad, F.director, F.alumnos<br />
		FROM facultades F, universidades U<br />
		WHERE U.id_universidad = F.id_universidad<br />
		AND U.id_universidad = $P{P_ID_UNIVERSIDAD}]]&gt;<br />
	</queryString></p>
<p>	<field name="universidad" class="java.lang.String"/><br />
	<field name="domicilio" class="java.lang.String"/><br />
	<field name="fecha" class="java.util.Date"/><br />
	<field name="facultad" class="java.lang.String"/><br />
	<field name="director" class="java.lang.String"/><br />
	<field name="alumnos" class="java.lang.Integer"/></p>
<p>		<background><br />
			<band height="41"><br />
				<image><br />
					<reportElement<br />
						x="500"<br />
						y="0"<br />
						width="33"<br />
						height="38"/><br />
					<imageExpression class="java.lang.String"><![CDATA[$P{LOGO_URL}]]&gt;</imageExpression><br />
				</image><br />
			</band><br />
		</background><br />
		<title><br />
			<band height="70"><br />
				<textField><br />
					<reportElement<br />
						x="0"<br />
						y="20"<br />
						width="530"<br />
						height="30"/><br />
					<textElement><br />
						<font pdfFontName="Helvetica-Bold" size="20" isBold="true"/><br />
					</textElement><br />
				<textFieldExpression   class="java.lang.String"><![CDATA[$F{universidad}]]&gt;</textFieldExpression><br />
				</textField></p>
<line direction="TopDown">
					<reportElement<br />
						x="0"<br />
						y="49"<br />
						width="530"<br />
						height="0"<br />
						key="line"/><br />
					<graphicElement stretchType="NoStretch"/>
				</line>
				<textField><br />
					<reportElement<br />
						x="0"<br />
						y="50"<br />
						width="250"<br />
						height="20"<br />
						key="textField"/><br />
					<textElement><br />
						<font pdfFontName="Helvetica-Bold" size="10"/><br />
					</textElement><br />
				<textFieldExpression   class="java.lang.String"><![CDATA[$F{domicilio}]]&gt;</textFieldExpression><br />
				</textField><br />
				<textField pattern="EEEEE dd MMMMM yyyy"><br />
					<reportElement<br />
						x="260"<br />
						y="50"<br />
						width="270"<br />
						height="20"<br />
						key="textField"/><br />
					<textElement textAlignment="Right"><br />
						<font pdfFontName="Helvetica-Bold" size="10"/><br />
					</textElement><br />
				<textFieldExpression   class="java.util.Date"><![CDATA[$F{fecha}]]&gt;</textFieldExpression><br />
				</textField><br />
			</band><br />
		</title></p>
<p>		<detail><br />
			<band height="15"><br />
				<textField><br />
					<reportElement x="0" y="0" width="200" height="13"/><br />
					<textFieldExpression class="java.lang.String"><br />
						<![CDATA[$F{facultad}]]&gt;<br />
					</textFieldExpression><br />
				</textField><br />
				<textField><br />
					<reportElement x="205" y="0" width="200" height="13"/><br />
					<textFieldExpression class="java.lang.String"><br />
						<![CDATA[$F{director}]]&gt;<br />
					</textFieldExpression><br />
				</textField><br />
				<textField><br />
					<reportElement x="410" y="0" width="20" height="13"/><br />
					<textFieldExpression class="java.lang.Integer"><br />
						<![CDATA[$F{alumnos}]]&gt;<br />
					</textFieldExpression><br />
				</textField><br />
			</band><br />
		</detail></p>
<p></jasperReport><br />
</code></p>
<p>Lo siguiente es compilar el jrxml y generar el pdf mediante java, esto es muy sencillo y se logra con muy pocas lineas de código.</p>
<p><code lang="java"><br />
package pruebas;<br />
/**<br />
 * Generar un reporte con Jasper Report<br />
 * Por Crysfel Villa Roman<br />
 * 14/01/2008<br />
 *<br />
 * */<br />
import java.sql.Connection;<br />
import java.sql.DriverManager;<br />
import java.util.HashMap;<br />
import java.util.Map;</p>
<p>import net.sf.jasperreports.engine.JREmptyDataSource;<br />
import net.sf.jasperreports.engine.JasperCompileManager;<br />
import net.sf.jasperreports.engine.JasperExportManager;<br />
import net.sf.jasperreports.engine.JasperFillManager;<br />
import net.sf.jasperreports.engine.JasperPrint;<br />
import net.sf.jasperreports.engine.JasperReport;</p>
<p>public class JasperReport2{<br />
  public static void main(String[] args){<br />
	String reportName = "plantilla";<br />
	JasperReport jasperReport;<br />
    JasperPrint jasperPrint;<br />
    Map pars = new HashMap();<br />
    pars.put("LOGO_URL", "logo.jpg");<br />
    pars.put("P_ID_UNIVERSIDAD", "1");<br />
    try{<br />
    	//1-Se hace la conexion a la Base de Datos<br />
    	Class.forName("com.mysql.jdbc.Driver");<br />
    	Connection conn = DriverManager.getConnection ("jdbc:mysql://localhost:3306/test?user=root&#038;password=la_password_del_servidor");</p>
<p>    	//2-Compilamos el archivo XML y lo cargamos en memoria<br />
        jasperReport = JasperCompileManager.compileReport(<br />
        		reportName+".jrxml");</p>
<p>        //3-Llenamos el reporte con la información (de la DB) y parámetros necesarios para la consulta<br />
        jasperPrint = JasperFillManager.fillReport(<br />
            jasperReport, pars, conn);</p>
<p>        //4-Exportamos el reporte a pdf y lo guardamos en disco<br />
        JasperExportManager.exportReportToPdfFile(<br />
            jasperPrint, reportName+".pdf");</p>
<p>        //5-Cerrar la conexion<br />
        conn.close();</p>
<p>        System.out.println("Done!");<br />
    }catch (Exception e){<br />
      System.out.println(e);<br />
      e.printStackTrace();<br />
    }<br />
  }<br />
}<br />
</code></p>
<p>Primero es necesario conectarse a la base de datos, puede ser cualquier base de datos, pero en este ejemplo es MySQL.<br />
El segundo paso es compilar el reporte.<br />
El tercer paso es llenar el reporte con la información de la base de datos y pasarle los parámetros necesarios.<br />
El cuarto paso es exportarlo al formato deseado.<br />
Por ultimo se cierra la conexión a la base de datos.</p>
<p>A diferencia de los tutoriales anteriores en este voy a poner el proyecto configurado con las librerías y códigos necesarios, para que lo instales en el eclipse y lo puedas ejecutar, esto por que en los tutoriales pasados algunas personas no pudieron completar el tutorial, el proyecto lo puedes <a href='http://www.crysfel.com/wp-content/uploads/2008/01/jasperreportdb.rar' title='jasperreportdb.rar'>descargar desde aqui</a>.</p>
<p>Saludos.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2008/01/14/generar-reporte-desde-una-base-de-datos-en-jasperreport/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Drag and Drop con mootools</title>
		<link>http://www.crysfel.com/2007/10/31/drag-and-drop-con-mootools/</link>
		<comments>http://www.crysfel.com/2007/10/31/drag-and-drop-con-mootools/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 23:46:20 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/10/31/drag-and-drop-con-mootools/</guid>
		<description><![CDATA[El día de hoy quiero mostrar como realizar un Drag and Drop utilizando mootools, el ejemplo será sencillo pero se muestran los eventos necesarios para realizar algo más complejo. El ejemplo siguiente muestra lo que se planea realizar, arrastra la carpeta de la izquierda sobre cualquiera de los botes azules.









var drops = $$("#cubos .drop");
var clon;
$("mover").addEvent("mousedown",function(event){
	event [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El día de hoy quiero mostrar como realizar un Drag and Drop utilizando mootools, el ejemplo será sencillo pero se muestran los eventos necesarios para realizar algo más complejo. El ejemplo siguiente muestra lo que se planea realizar, arrastra la carpeta de la izquierda sobre cualquiera de los botes azules.</p>
<div id="mover" style="width:64px;height:64px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/folder.png);"></div>
<div id="cubos" style="width:400px;margin:0px 100px">
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div class="drop" style="float:left;margin:3px;width:128px;height:128px;background-image:url(http://www.crysfel.com/wp-content/uploads/2007/10/botebacio.png);"></div>
<div style="clear:both;"></div>
</div>
<p><script type="text/javascript">
var drops = $$("#cubos .drop");
var clon;
$("mover").addEvent("mousedown",function(event){
	event = new Event(event).stop();
	if(!$chk(clon)) clon = this.clone();
	clon.setStyles(this.getCoordinates());
	clon.inject(document.body);
clon.setStyle("z-index",500);
clon.setStyle("opacity",0.7);
	clon.makeDraggable({droppables:drops}).start(event);
	clon.addEvent("emptydrop",function(){
		//if($chk(clon)){ clon.remove(); clon= null;}
	});
});
drops.setStyle("opacity",0.7);
drops.each(function(drop){
	var fx = new Fx.Styles(drop, {duration:300, wait:false});
	drop.addEvent("drop",function(){
		if($chk(clon)){ clon.remove(); clon= null;}
		this.setStyle("background-image","url(http://www.crysfel.com/wp-content/uploads/2007/10/botelleno.png)");
	});
	drop.addEvent("over",function(){
		fx.start({"opacity":1});
	});
	drop.addEvent("leave",function(){
		fx.start({"opacity":0.7});
	});
});
</script></p>
<p>Hacer esto es muy sencillo, antes que nada hay que <a href="http://mootools.net/download">descargar la ultima versión de mootools</a> (mootools-release-1.11.js actualmente), luego de esto la importamos al documento así:</p>
<p><code lang="html"><br />
<script type="text/javascript" src="mootools-release-1.11.js"></script><br />
</code></p>
<p>El siguiente paso es crear el objeto que se arrastrara y los botecitos donde se soltará la carpeta, el HTML quedará de la siguiente manera.</p>
<p><code lang="html"></p>
<div id="mover"></div>
<div id="cubos">
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
</div>
<p></code></p>
<p>Ahora mediante CSS acomodamos al tamaño correcto y le ponemos las imágenes respectivas.</p>
<p><span id="more-41"></span></p>
<p><code lang="css"><br />
#mover{<br />
	width:64px;<br />
	height:64px;<br />
	background-image:url(folder.png);<br />
}<br />
#cubos{<br />
	width:400px;<br />
	margin:100px auto;<br />
}<br />
.drop{<br />
	float:left;<br />
	margin:3px;<br />
	width:128px;<br />
	height:128px;<br />
	background-image:url(boteBacio.png);<br />
}<br />
</code></p>
<p>Una vez lista la interfase, viene lo divertido, pues es hora de programar las acciones y eventos a realizar.</p>
<p>Mootools tiene una forma muy sencilla de realizar el Drag and Drop, simplemente al elemento que se hace “dragable” se le asignan los elementos que serán “dropables” para este elemento mediante un arreglo.</p>
<p>Con esto en mente tomamos todos los elementos que contengan la clase “drop”, para esto simplemente utilizamos la función doble dólar y le pasamos la expresión que necesitamos.</p>
<p><code lang="javascript"><br />
var drops = $$('#cubos .drop');<br />
var clon;<br />
</code></p>
<p>Hasta aquí contamos con un arreglo de elementos, además de que se ha creado una variable llamada clon, la cual no contiene nada por ahora, esta variable clon lo que contendrá es una copia del elemento mover y se le modificará su propiedad de la transparencia, todo esto se realizará cuando se le presiona el Mouse sobre el elemento mover.</p>
<p>El pseudo código es el siguiente:</p>
<p><code lang="javascript"><br />
$('mover').addEvent('mousedown',function(event){<br />
	//detenemos la propagación del evento<br />
	//si no existe una instancia del clon, se copia el elemento mover<br />
	//asignamos las mismas coordenadas al clon del objeto mover<br />
	//agregamos el clon al dom<br />
	//le asignamos una opacidad al clon del 70%<br />
	//hacemos al clon dragable e iniciamos el evento manualmente<br />
	//asignamos el evento emptydrop al clon, el cual se ejecuta cuando<br />
	      //se ha soltado el clon fuera de los elementos dropables, de esta manera<br />
	      //podemos desaparecer al clon cuando se suelta en un lugar no deseado.<br />
}});<br />
</code></p>
<p>Esto en javascript se escribe de la siguiente manera:</p>
<p><code lang="javascript"><br />
$('mover').addEvent('mousedown',function(event){<br />
	event = new Event(event).stop();<br />
	if(!$chk(clon)) clon = this.clone();<br />
	clon.setStyles(this.getCoordinates());<br />
	clon.inject(document.body);<br />
	clon.setStyle('opacity',0.7);<br />
	clon.makeDraggable({droppables:drops}).start(event);<br />
	clon.addEvent('emptydrop',function(){<br />
		if($chk(clon)){ clon.remove(); clon= null;}<br />
	});<br />
});<br />
</code></p>
<p>Lo único importante para comentar, es prestar atención a la función <strong>makeDraggable</strong>, pues esta es la responsable de que los elementos se puedan arrastrar en el documento, además, dentro de las opciones que se le pasan esta la de <strong>droppables</strong>, la cual es el arreglo de elementos en los que puede ser soltado el elemento que estamos arrastrando.</p>
<p>Lo que sigue es programar los eventos para los elementos dropables, los cuales son tres, el <strong>over</strong>, que se ejecuta cuando el elemento que se esta arrastrando esta sobre el elemento en cuestión, el <strong>leave</strong>, que se ejecuta cada vez que el elemento que se esta arrastrando sale del elemento en cuestión, y el mas importante, el <strong>drop</strong> se ejecuta cuando el elemento que se esta arrastrando es soltado sobre el elemento en cuestión.</p>
<p>Con esto en mente codificamos lo siguiente</p>
<p><code lang="javascript"><br />
drops.setStyle('opacity',0.7);<br />
drops.each(function(drop){<br />
	var fx = new Fx.Styles(drop, {duration:300, wait:false});<br />
	drop.addEvent('drop',function(){<br />
		if($chk(clon)){ clon.remove(); clon= null;}<br />
		this.setStyle('background-image','url(boteLleno.png)');<br />
	});<br />
	drop.addEvent('over',function(){<br />
		fx.start({'opacity':1});<br />
	});<br />
	drop.addEvent('leave',function(){<br />
		fx.start({'opacity':0.7});<br />
	});<br />
});<br />
</code></p>
<p>Primero se ponen con opacidad en 70%, luego se itera el arreglo y a cada elemento se le asigna los eventos de los que he hablado anteriormente (drop, over, leave), en los eventos leave y over, únicamente se cambia la opacidad mediante una transición, esto es gracias a la clase Fx.Styles, y en el evento drop se verifica que exista una instancia del clon, de ser así se elimina, luego se cambia la imagen del bote vacío por el bote lleno.</p>
<p>Pues esto es todo, realmente sencillo, espero que todo este claro, a continuación pongo el código completo del ejemplo, simplemente copia y pega.</p>
<p><code lang="html"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es"><br />
<head><br />
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></p>
<p><script type="text/javascript" src="mootools-release-1.11.js"></script></p>
<style type="text/css">
html,body{
	text-align:center;
}
#mover{
	width:64px;
	height:64px;
	background-image:url(folder.png);
}
#cubos{
	width:400px;
	margin:100px auto;
}
.drop{
	float:left;
	margin:3px;
	width:128px;
	height:128px;
	background-image:url(boteBacio.png);
}
</style>
<p></head></p>
<p><body></p>
<div id="mover"></div>
<div id="cubos">
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
<div class="drop"></div>
</div>
<p><script type="text/javascript">
var drops = $$('#cubos .drop');
var clon;</p>
<p>$('mover').addEvent('mousedown',function(event){
	event = new Event(event).stop();
	if(!$chk(clon)) clon = this.clone();
	clon.setStyles(this.getCoordinates());
	clon.inject(document.body);
	clon.setStyle('opacity',0.7);
	clon.makeDraggable({droppables:drops}).start(event);
	clon.addEvent('emptydrop',function(){
		if($chk(clon)){ clon.remove(); clon= null;}
	});
});</p>
<p>drops.setStyle('opacity',0.7);
drops.each(function(drop){
	var fx = new Fx.Styles(drop, {duration:300, wait:false});
	drop.addEvent('drop',function(){
		if($chk(clon)){ clon.remove(); clon= null;}
		this.setStyle('background-image','url(boteLleno.png)');
	});
	drop.addEvent('over',function(){
		fx.start({'opacity':1});
	});
	drop.addEvent('leave',function(){
		fx.start({'opacity':0.7});
	});
});
</script><br />
</body><br />
</html><br />
</code></p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/10/31/drag-and-drop-con-mootools/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Enviar parámetros a un reporte en JasperReport</title>
		<link>http://www.crysfel.com/2007/10/01/enviar-parametros-a-un-reporte-en-jasperreport/</link>
		<comments>http://www.crysfel.com/2007/10/01/enviar-parametros-a-un-reporte-en-jasperreport/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 22:43:01 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/10/01/enviar-parametros-a-un-reporte-en-jasperreport/</guid>
		<description><![CDATA[Hoy quiero continuar el tema de generar reportes pdf por medio de JasperReports, este tutorial es mas avanzado que el anterior, así que te sugiero leer la introducción en caso de que seas realmente nuevo con esta herramienta.
Goals
Hoy tratare el tema de paso de parámetros al reporte, y se definiran algunos conceptos claves, al igual [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>Hoy quiero continuar el tema de generar reportes pdf por medio de JasperReports, este tutorial es mas avanzado que el anterior, así que te sugiero leer <a href="http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport/">la introducción</a> en caso de que seas realmente nuevo con esta herramienta.</p>
<p><strong>Goals</strong><br />
Hoy tratare el tema de paso de parámetros al reporte, y se definiran algunos conceptos claves, al igual que se hará un plantilla donde se mostrara como dar formato a texto entre otras cosas mas.</p>
<p>Para comenzar es necesario poner el enviroment adecuado, ya sabes, agregar al classpath las librerías requeridas (Señaladas en <a href="http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport/">la introducción</a>), luego de esto creamos un archivo de texto llamado <strong>plantilla.jrxml</strong> y nos disponemos a diseñar la plantilla por medio de xml.</p>
<p><strong>Preparando el papel</strong><br />
Para este tutorial se va a realizar un reporte que muestre los alumnos de una carrera x de una universidad z, no voy a pasarle la información de los alumnos, solo la información necesaria para generar una plantilla, El primer paso es agregar la cabecera y configurar el nodo principal.</p>
<p><span id="more-40"></span></p>
<p><code lang="xml"><br />
<?xml version="1.0"?><br />
<!DOCTYPE jasperReport<br />
  PUBLIC "-//JasperReports//DTD Report Design//EN"<br />
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"></p>
<p><jasperReport name="Plantilla"<br />
         pageWidth="595"<br />
         pageHeight="842"<br />
         leftMargin="20"<br />
         rightMargin="20"<br />
         topMargin="20"<br />
         bottomMargin="20"></p>
<p></jasperReport><br />
</code></p>
<p>Si te das cuenta, se le han especificado algunas propiedades, tales como el ancho, el largo y los márgenes de la pagina, estos datos corresponden a una hoja tamaño carta, los márgenes los puedes poner al gusto, dependiendo tus necesidades.</p>
<p><strong>Los parametros</strong><br />
Ahora viene una de las partes mas importantes de este tutorial, y es que continuación se define dentro de la plantilla los parámetros a utilizar, hay que aclarar que los parámetros no es el contenido principal del reporte, simplemente es información útil para mostrar en el reporte, por ejemplo la fecha en que se genera el reporte, o el periodo que se esta desplegando en el reporte, el autor o cosas semejantes, son parámetros importantes del reporte, pero no la información principal del reporte, con esto en cuenta se definen los parámetros a utilizar.</p>
<p><code lang="xml"></p>
<parameter name="P_INSTITUCION" class="java.lang.String"/>
<parameter name="P_FACULTAD" class="java.lang.String"/>
<parameter name="P_CARRERA" class="java.lang.String"/>
</code></p>
<p>Como puedes ver se utiliza la etiqueta <strong>&lt;parameter /&gt;</strong> la cual tiene dos propiedades, <strong>name</strong> que es el nombre o identificador con la que se hará referencia, y <strong>el tipo de dato</strong> que es, en este caso String, es importante mencionar que se debe escribir el paquete exacto donde se encuentra la clase.</p>
<p><strong>La cabecera</strong><br />
Para la cabecera se mostrara el nombre de la institución en letras grandes y sobresalientes, se dibujara una línea horizontal debajo del nombre de la institución, se mostrara la facultad y la carrera. Todo esto lo pondremos dentro de la sección <strong>&lt;title/&gt;</strong> ya que esta únicamente se muestra una vez en el reporte, si existiese mas de una página, esto se muestra solo en la primera.</p>
<p><code lang="xml"><br />
<title><br />
  	<band height="50"><br />
	<!-- AQUI DECLARAMOS EL CONTENIDO --><br />
</band><br />
</title><br />
</code></p>
<p>El único detalle a comentar es que se ha declarado la propiedad height de &#8220;50&#8243;, esto significa que todo el contenido debe ser menor o igual a 50 pixeles, es importante tener en cuenta este dato y no superarlo con el contenido, de lo contrario tendremos un error a la hora de compilar el jrxml.</p>
<p>Como el texto será dinámico, pues desde nuestra aplicación le pasaremos la información, utilizaremos un <strong>textField</strong>, declarándolo de esta manera.</p>
<p><code lang="xml"><br />
<textField><br />
  <reportElement x="0" y="0" width="530" height="30" /><br />
  <textElement><br />
	<font pdfFontName="Helvetica-Bold" size="20" isBold="true"/><br />
  </textElement><br />
  <textFieldExpression class="java.lang.String"><br />
  	<![CDATA[$P{P_INSTITUCION}]]&gt;<br />
  </textFieldExpression><br />
</textField><br />
</code></p>
<p>El código esta más que entendible, primero se especifica las coordenadas y dimensiones del textField, opcionalmente se da formato a la tipografía del textField mediante el bloque<strong> &lt;textElement&gt; </strong>por último la parte más importante, la expresión que contendrá el textField <strong>&lt;textFieldExpression&gt;</strong>, es importante mencionar que se debe especificar la clase que contendrá esta expresión, en este caso es un String, dentro de CDATA se puede concatenar inclusive varios parámetros, en este caso solo estamos poniendo el parámetro P_INSTITUCION.</p>
<p>Una cosa mas que conviene mencionar es que para poder acceder a los parámetros se hace mediante $P{NOMBRE_DEL_PARAMETRO} dende se sustituye el nombre del parámetro que se quiera accesar.</p>
<p>Es el turno de hacer una línea, es muy sencillo, simplemente hacemos lo siguiente.</p>
<p><code lang="xml"></p>
<line direction="TopDown">
  <reportElement x="0" y="29" width="530" height="0" />
</line>
</code></p>
<p>Aquí solo se declara la linea mediante la etiqueta<strong> &lt;line&gt;</strong> luego le especificamos las coordenadas y dimensiones donde estará posicionada.</p>
<p>Para los otros dos parámetros se hace exactamente igual que el anterior, con la diferencia que se le cambian las coordenadas, dimensiones, formato de letra y pasarle el parámetro correcto.</p>
<p>Al final el jrxml debe quedar algo asi:</p>
<p><code lang="xml"><br />
<?xml version="1.0"?><br />
<!DOCTYPE jasperReport<br />
  PUBLIC "-//JasperReports//DTD Report Design//EN"<br />
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"><br />
<jasperReport name="plantilla"<br />
         pageWidth="595"<br />
         pageHeight="842"<br />
         leftMargin="20"<br />
         rightMargin="20"<br />
         topMargin="20"<br />
         bottomMargin="20"></p>
<parameter name="P_INSTITUCION" class="java.lang.String"/>
<parameter name="P_FACULTAD" class="java.lang.String"/>
<parameter name="P_CARRERA" class="java.lang.String"/>
<p>  <title><br />
  	<band height="50"><br />
  	  <textField><br />
		<reportElement x="0" y="0" width="530" height="30" /><br />
		  <textElement><br />
			<font pdfFontName="Helvetica-Bold" size="20" isBold="true"/><br />
		  </textElement><br />
		  <textFieldExpression class="java.lang.String"><br />
		  	<![CDATA[$P{P_INSTITUCION}]]&gt;<br />
		  </textFieldExpression><br />
	  </textField></p>
<line direction="TopDown">
		<reportElement x="0" y="29" width="530" height="0" />
	  </line>
	  <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" ><br />
		<reportElement x="0" y="30" width="250" height="20" /><br />
		  <textElement><br />
			<font pdfFontName="Helvetica-Bold" size="10" /><br />
		  </textElement><br />
		  <textFieldExpression class="java.lang.String"><br />
		  	<![CDATA[$P{P_FACULTAD}]]&gt;<br />
		  </textFieldExpression><br />
	  </textField><br />
	  <textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" ><br />
		<reportElement x="260" y="30" width="270" height="20" /><br />
		  <textElement  textAlignment="Right"><br />
			<font pdfFontName="Helvetica-Bold" size="10" /><br />
		  </textElement><br />
		  <textFieldExpression class="java.lang.String"><br />
		  	<![CDATA[$P{P_CARRERA}]]&gt;<br />
		  </textFieldExpression><br />
	  </textField><br />
  	</band><br />
  </title><br />
  <detail><br />
    <band height="200"></p>
<p>    </band><br />
  </detail><br />
</jasperReport><br />
</code></p>
<p>Una vez diseñado el reporte se necesita compilar y generar el archivo jasper, luego se  le pasan los parámetros y se exporta al formato deseado, en este caso se exportara a PDF.</p>
<p>El código necesario para realizar lo anterior es muy sencillo, es el siguiente.</p>
<p><code lang="java"><br />
package pruebas;</p>
<p>import java.util.HashMap;<br />
import java.util.Map;</p>
<p>import net.sf.jasperreports.engine.JREmptyDataSource;<br />
import net.sf.jasperreports.engine.JRException;<br />
import net.sf.jasperreports.engine.JasperCompileManager;<br />
import net.sf.jasperreports.engine.JasperExportManager;<br />
import net.sf.jasperreports.engine.JasperFillManager;<br />
import net.sf.jasperreports.engine.JasperPrint;</p>
<p>public class JasperReport2{<br />
  public static void main(String[] args){</p>
<p>    try{<br />
    	//1. Se compila el reporte<br />
    	JasperCompileManager.compileReportToFile("plantilla.jrxml");</p>
<p>    	//2. Se llena el reporte con la informacion necesaria<br />
    	Map pars = new HashMap();<br />
    	pars.put("P_INSTITUCION", "Universidad de Montemorelos");<br />
    	pars.put("P_FACULTAD", "Facultad de Ingeniería Tecnología");<br />
    	pars.put("P_CARRERA", "Ingeniería en Sistemas Computacionales");</p>
<p>    	JasperPrint jasperPrint = JasperFillManager.fillReport(<br />
    			"plantilla.jasper", pars, new JREmptyDataSource());</p>
<p>    	//3. Se exporta a PDF<br />
    	JasperExportManager.exportReportToPdfFile(<br />
    	          jasperPrint, "plantilla.pdf");</p>
<p>    	System.out.println("Done!");<br />
    }<br />
    catch (JRException e)<br />
    {<br />
      e.printStackTrace();<br />
    }<br />
  }</p>
<p>}<br />
</code></p>
<p>Si te has dado cuenta, en el punto numero dos, se ha creado un HashMap, donde como llave contiene el nombre del parámetro, esto es muy importante, especificarle correctamente el nombre, de lo contrario no sucederá nada.</p>
<p>Pues bien, esto ha sido todo por hoy, creo que con esto queda claro como pasar parámetros a un reporte.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/10/01/enviar-parametros-a-un-reporte-en-jasperreport/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Ordenar una lista (Drag And Drop)</title>
		<link>http://www.crysfel.com/2007/07/12/ordenar-una-lista-drag-and-drop/</link>
		<comments>http://www.crysfel.com/2007/07/12/ordenar-una-lista-drag-and-drop/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 23:32:16 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/07/12/ordenar-una-lista-drag-and-drop/</guid>
		<description><![CDATA[El tutorial del día de hoy consta de realizar una lista de imágenes sorteable, en otras palabras, voy a mostrar como poder ordenar una lista de imágenes, con mootools esto es extremadamente sencillo, a continuación se muestra un ejemplo del tutorial terminado.









 var lista2 = new Sortables($("ordenarLista"));
 function getOrdenLista2(){
 	alert(lista2.serialize(function(el){
			return el.id.substring(el.id.indexOf("_")+1)
		})
	);
 }


Que de beneficio tiene [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El tutorial del día de hoy consta de realizar una lista de imágenes sorteable, en otras palabras, voy a mostrar como poder ordenar una lista de imágenes, con mootools esto es extremadamente sencillo, a continuación se muestra un ejemplo del tutorial terminado.</p>
<div style="margin:0px 50px">
<ul id="ordenarLista">
<li id="id_10"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux1.png" alt="Tux" /></li>
<li id="id_15"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux2.png" alt="Tux" /></li>
<li id="id_18"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux3.png" alt="Tux" /></li>
<li id="id_20"><img src="http://www.crysfel.com/common/ejemplos/ordenarLista/tux4.png" alt="Tux" /></li>
</ul>
<input type="button" onclick="getOrdenLista2()" value="Mostrar orden" style="width:auto" />
<script type="text/javascript">
 var lista2 = new Sortables($("ordenarLista"));
 function getOrdenLista2(){
 	alert(lista2.serialize(function(el){
			return el.id.substring(el.id.indexOf("_")+1)
		})
	);
 }
</script>
</div>
<p>Que de beneficio tiene esto, pues imagínate que tienes en tu base de datos imágenes de productos de una tienda de aparatos electrónicos, y para cada aparato tienes una serie de imágenes, las cuales deben tener un orden, si las fuiste metiendo en orden pues que padre no, pero ¿que sucede si te equivocas? O si quieres que los usuarios mismos puedan elegir el orden en que aparezcan las imágenes, fácil, creas un campo en la tabla de imágenes donde introduzcas el orden de las imágenes, haces un Query trayéndolas ordenadas ascendentemente por medio de ese campo, pero para que los usuarios las ordenes debes ponerles una interfase fácil, pues si les pones una cajita y que ellos mismos introduzcan el numero de orden, para cada imagen, ¡imagínate! Muchos errores se ocasionaría, para estos casos es que es útil esta interfase, y a continuación muestro como hacerla.</p>
<p><span id="more-35"></span></p>
<p>Primero bajamos la <a href="http://mootools.net/download">librería de moootols</a>, donde únicamente seleccionamos en la sección de <strong>plugins</strong>, la clase <strong>Sortables</strong> inmediatamente se seleccionan automáticamente todas sus dependencias, luego descargamos el archivo.</p>
<p>Lo importas a tu documento</p>
<p><code lang="javascript"><br />
<script type="text/javascript" src="mootools.v1.11.js"></script><br />
</code></p>
<p>Ahora lo siguiente es crear la lista de los elementos a ordenar, la cual puede quedar de la siguiente manera.</p>
<p><code lang="html"></p>
<ul id="lista1">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>
<p></code></p>
<p>Ahora se crea una instancia de la clase Sortable pasándole como parámetro la lista que se quiere ordenar, esto quedaría de la siguiente manera.</p>
<p><code lang="javascript"><br />
var lista1 = new Sortables($('lista1'));<br />
</code></p>
<p>Con esa simple instrucción ya se puede comenzar a ordenar la lista dando clic sobre el elemento y desplazándolo hacia arriba o debajo de la lista.</p>
<p>Ahora, lo siguiente es poder obtener los valores de la lista resultante después de la ordenación, para eso hacemos una función y la invocamos en el lugar donde necesitemos saber dicho dato.</p>
<p><code lang="javascript"><br />
function getOrdenLista1(){</p>
<p> 	alert(lista1.serialize());</p>
<p> }<br />
</code></p>
<p>El método serialize se encarga de regresarnos un arreglo de cómo es que se encuentran ordenados los ítems, en un principio automáticamente enumera los ítems de 0-n, en forma ascendente, al ejecutar este método regresa el estado actual de los índices.</p>
<p>Ahora mostrare otro ejemplo, el de imágenes, y tomando en cuenta el ID proveniente de una base de datos y de esta manera recoger los IDs en el orden que se hallan modificado por el usuario, para esto usaremos la siguiente lista.</p>
<p><code lang="html"></p>
<ul id="lista2">
<li id="id_10"><img src="images/tux1.png" alt="Tux" /></li>
<li id="id_15"><img src="images/tux2.png" alt="Tux" /></li>
<li id="id_18"><img src="images/tux3.png" alt="Tux" /></li>
<li id="id_20"><img src="images/tux4.png" alt="Tux" /></li>
</ul>
<p></code></p>
<p>Si te has dado cuenta le he agregado un ID a cada <strong>&lt;li&gt;</strong> de la lista a ordenar, como valor le he puesto id_n donde n es el id de la imagen en la base de datos, es importante mencionar que es necesario ponerle un prefijo al numero id de la base de datos, esto por que no podemos declarar un ID en XHTML de tipo numérico, forzosamente tiene que ser una palabra, con esto en mente se crea la instancia de la clase Sortable para esta lista.</p>
<p><code lang="javascript"><br />
var lista2 = new Sortables($('lista2'));<br />
</code></p>
<p>El siguiente paso es crear la función que regresara el arreglo de IDs después de cada ordenación que se haga, para esto usaremos el mismo método que se utilizo anteriormente, solo que con una pequeña diferencia.</p>
<p><code lang="javascript"><br />
 function getOrdenLista2(){<br />
 	alert(lista2.serialize(function(el){<br />
			return el.id.substring(el.id.indexOf('_')+1)<br />
		})<br />
	);<br />
 }<br />
</code></p>
<p>La única diferencia es que se le esta pasando como parámetro una función, la cual remplazara a la función default, con esta función nosotros tomamos el ID de cada elemento y le quitamos el prefijo, regresando así solo el ID correspondiente de cada imagen con la base de datos.</p>
<p>Pues si, eso ha sido todo, ¿fácil verdad? Bueno, lo siguiente seria enviar mediante AJAX la lista ordenada al servidor y guardarla en la base de datos, para utilizar AJAX te sugiero leer  <a href="http://www.crysfel.com/index.php/2007/05/08/peticiones-post-con-ajax/">Peticiones Post con Ajax</a> en este mismo blog.</p>
<p>Aquí esta el código completo de este tutorial.</p>
<p><code lang="javascript"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
        "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"><br />
<head><br />
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1;" /></p>
<p><script type="text/javascript" src="mootools.v1.11.js"></script><br />
</head><br />
<body></p>
<ul id="lista1">
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
<li>item 4</li>
</ul>
<ul id="lista2">
<li id="id_10"><img src="images/tux1.png" alt="Tux" /></li>
<li id="id_8"><img src="images/tux2.png" alt="Tux" /></li>
<li id="id_25"><img src="images/tux3.png" alt="Tux" /></li>
<li id="id_13"><img src="images/tux4.png" alt="Tux" /></li>
</ul>
<input type="button" onclick="getOrdenLista2()" value="Inspec" />
<p><script type="text/javascript">
 var lista1 = new Sortables($('lista1'));
 function getOrdenLista1(){
 	alert(lista1.serialize());
 }</p>
<p> var lista2 = new Sortables($('lista2'));
 function getOrdenLista2(){
 	alert(lista2.serialize(function(el){
			return el.id.substring(el.id.indexOf('_')+1)
		})
	);
 }</p>
<p></script><br />
</body><br />
</html><br />
</code></p>
<p>Hasta la próxima!</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/07/12/ordenar-una-lista-drag-and-drop/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Visor de imagenes</title>
		<link>http://www.crysfel.com/2007/07/11/visor-de-imagenes/</link>
		<comments>http://www.crysfel.com/2007/07/11/visor-de-imagenes/#comments</comments>
		<pubDate>Wed, 11 Jul 2007 20:42:46 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/07/11/visor-de-imagenes/</guid>
		<description><![CDATA[El día de hoy quiero mostrar como hacer un visor de imágenes, con esta interfase es suficiente para realizar una galería, claro esta que esto es solo la GUI, el backend dependerá de las necesidades de cada proyecto en especifico.
Para que te des una idea de lo que mostrare en este tutorial, puedes ver el [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<p>El día de hoy quiero mostrar como hacer un visor de imágenes, con esta interfase es suficiente para realizar una galería, claro esta que esto es solo la GUI, el backend dependerá de las necesidades de cada proyecto en especifico.</p>
<p>Para que te des una idea de lo que mostrare en este tutorial, puedes ver el siguiente ejemplo.<br />
<script type="text/javascript" src="http://www.crysfel.com/common/ejemplos/visor/visor.js"></script><br />
<script type="text/javascript">
var visor = new VisorImagenes();
window.addEvent("domready", function(){
	visor.constructor();
});
</script><br />
<a href="http://www.crysfel.com/common/img/visor/01.jpg" onClick="visor.aparece(this.href,'Foto ganadora en National Geographic 2006'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/01.jpg" alt="imagen1" style="border:0px;margin:5px; 0px" /></a><a href="http://www.crysfel.com/common/img/visor/02.jpg" onClick="visor.aparece(this.href,'Sonrrisa sincera'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/02.jpg" alt="imagen2" style="border:0px;margin:5px 35px;" /></a><br />
<a href="http://www.crysfel.com/common/img/visor/03.jpg" onClick="visor.aparece(this.href,'Tranquilidad absoluta'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/03.jpg" alt="imagen3" style="border:0px;margin:5px;" /></a><a href="http://www.crysfel.com/common/img/visor/04.jpg" onClick="visor.aparece(this.href,'Camino al cielo'); return false;"><img src="http://www.crysfel.com/common/ejemplos/visor/tns/04.jpg" alt="imagen4" style="border:0px;margin:5px 10px;" /></a></p>
<p>¿Interesante no?, realizarlo es muy sencillo, así que para comenzar es necesario descargar la última <a href="http://mootools.net/download">versión de mootools (v1.11)</a> e importarla a tu documento, pues es indispensable para este tutorial.</p>
<p><span id="more-34"></span></p>
<p><code lang="javascript"><br />
<script type="text/javascript" src="mootools.v1.11.js"></script><br />
</code></p>
<p>Ahora bien,  lo primero es crear una clase (VisorImagenes), la cual contiene los métodos y propiedades necesarios para visualizar las imágenes.</p>
<p><code lang="javascript"><br />
function VisorImagenes(){<br />
	this.file;<br />
	this.img;</p>
<p>	//Crear la estructura visual<br />
	this.constructor = function(){}</p>
<p>	//Mostrar el visor<br />
	this.aparece = function(f,t){}</p>
<p>	//Cargar la imagen a mostrar<br />
	this.cargaImagen = function(){}</p>
<p>	//Redimensionar el contenedor de la imagen<br />
	this.redimensionar = function(){}<br />
}<br />
</code></p>
<p>Hasta este punto solo cree la estructura de la clase, esto es una especie de prototipo con el fin de visualizar cada paso de este tutorial, file es la url donde se encuentra la imagen a mostrar, img es una referencia al nodo donde se encuentra la imagen en el documento, y los métodos creo que es suficiente el comentario de estos en el código.</p>
<p>Una vez claros en la construcción de esta aplicación es hora de crear la estructura visual, para esto es necesario crear los elementos y agregárselos al body como hijos,aclaro una vez mas que este método simplemente hace la estructura del visor de imágenes al igual que el CSS necesario, a continuación se muestra el pseudo código del método y mas adelante se codifica.</p>
<p><code lang="javascript"><br />
this.constructor = function(){<br />
	//Crear el nodo principal cvrVisor (
<div>)<br />
	//Crear el nodo  para el fondo obscuro (
<div>)<br />
	//Crear el nodo contenedor de la imagen y el texto (
<div>)<br />
	//Crear el nodo de salida del visor (<a>)<br />
	//Crear el nodo para la imagen (<img>)<br />
	//Crear el nodo para el texto (
<p>)<br />
	//Asignar coordenadas centrales al contenedor de la imagen y texto<br />
	//Hacer las asignaciones de los nodos creados anteriormente<br />
	//Agregar el arbol que creamos anteriormente al body del documento<br />
}<br />
</code></p>
<p>Primeramente hay que crear el elemento principal, asignándole como id cvrVisor, su función es agrupar todos los elementos necesarios, sus dimensiones son todo el ancho de la pantalla y todo el largo también, esto que he comentado se resume en</p>
<p><code lang="javascript"><br />
var panel = new Element('div', {<br />
		'styles': {<br />
		'position': 'absolute',<br />
		'top':'0px',<br />
		'left':'0px',<br />
		'width': '100%',<br />
		'height':  window.getScrollHeight()+'px'<br />
	},<br />
	id:'cvrVisor'<br />
});<br />
</code></p>
<p>La clase <strong>Element</strong> crea un nodo o elemento XHTML y lo pone en memoria, es importante señalar que no esta dentro del DOM todavía, simplemente es un nodo perdido en la memoria, es por eso que hacemos una referencia a este con la variable panel, como primer parámetro en el constructor se pasa el elemento XHTML que quieres crear, en este caso un div, el segundo argumento o parámetro es un objeto con propiedades, en este objeto se le pueden pasar eventos, estilos, el ID que le queramos asignar, entre muchas cosas mas, claro esta que estos parámetros son opcionales, si quieres saber mas al respecto te recomiendo darle un vistazo a la http://docs.mootools.net/Native/Element.js documentación en mootools. Lo unico que hicimos anteriormente fue crear una capa con ID cvrVisor, que ocupa toda la pantalla, este elemento es el padre de todos los elementos que continúan.</p>
<p>Siguiendo con el pseudo código es hora de hacer el fondo de color negro que es del mismo tamaño del elemento anterior, la relación se hará mas adelante, por ahora solo se crea en memoria y se guarda la referencia en la variable fondo, no comentare sobre el CSS aplicado pues este tutorial no es sobre CSS, si tienes conocimientos sobre CSS entenderás el porque de esto, si no pues solo te queda creerme por fe o googlear un poco.</p>
<p><code lang="javascript"><br />
var fondo = new Element('div', {<br />
		'styles': {<br />
		'position': 'relative',<br />
		'width': '100%',<br />
		'height': '100%',<br />
		'background-color': '#000'<br />
	},<br />
	'id':'cvrFondo'<br />
});<br />
</code></p>
<p>Ahora se crea el elemento que contiene la imagen y el texto, inicialmente será de 100&#215;100, color blanco y contendrá como fondo una imagen centrada de el cargador, esto con el fin de mostrar al usuario que la imagen se esta cargando, cuando la imagen aparece el cargador queda oculto.</p>
<p><code lang="javascript"><br />
var cont = new Element('div', {<br />
	'styles': {<br />
		'position': 'absolute',<br />
		'top': '0px',<br />
		'left':  '0px',<br />
		'width': '100px',<br />
		'height':  '100px',<br />
		'background-color': '#fff',<br />
		'padding': '5px',<br />
		'background-image': 'url(cargador.gif)',<br />
		'background-repeat': 'no-repeat',<br />
		'background-position': 'center'<br />
	},<br />
	'id':'cvrContenedor'<br />
});<br />
</code></p>
<p>Es hora de crear el botón de salida, lo interesante aquí es que ahora agregamos un evento, se trata de cuando se de clic sobre el link, este desaparezca lentamente el fondo y el visor, además de que por medio de CSS se ha posicionado sobre toda la pantalla este botón de salida, al final se le agrega el texto ‘salir’.</p>
<p><code lang="javascript"><br />
var salir = new Element('a', {<br />
	'title':'Clic para salir',<br />
	'styles': {<br />
		'display': 'block',<br />
		'width': '99.9%',<br />
		'height':  '99.8%'<br />
	},<br />
	'events': {<br />
		'click': function(){<br />
			new Fx.Style($('cvrFondo'), 'opacity',{duration:500,onComplete:function(){$('cvrVisor').style.display = "none";}}).start(0.7,0);<br />
			return false;<br />
		}<br />
	}<br />
});<br />
salir.setText('Salir');<br />
</code></p>
<p>Se crea la imagen, esto no tiene nada especial, solo comentar que no se le esta poniendo el recurso, pues se le asignara dinamicante dependiendo de la imagen que se quiera mostrar.</p>
<p><code lang="javascript"><br />
var img = new Element('img', {<br />
	'styles': {<br />
		'margin': '0px'<br />
	},<br />
	'id':'cvrImagen'<br />
});<br />
</code></p>
<p>Por ultimo se crea el contenedor del texto, el cual contendrá la descripción de la imagen mostrada.</p>
<p><code lang="javascript"><br />
var p = new Element('p', {<br />
	'styles': {<br />
		'margin': '0px',<br />
		'padding': '0px'<br />
	},<br />
	'id':'cvrDescripcion'<br />
});<br />
</code></p>
<p>Ya tenemos todos los elementos necesarios en memoria, pero no los hemos asignado al DOM, así que los siguientes pasos son relacionar los elementos que se han creado y asignárselos al DOM, en este caso como hijos del body, el código esta comentado para mejor entendimiento.</p>
<p><code lang="javascript"><br />
//Se le asigna 70% de opacidad al fondo y se posiciona en el centro de la pantalla<br />
new Fx.Style(fondo, 'opacity').set(0);<br />
cont.style.top = window.getScrollTop() + window.getHeight()/2 - 50 - 15 +"px";<br />
cont.style.left = window.getWidth()/2 - 50 + "px";</p>
<p>// Se agrega la imagen y el texto al contendor de estos<br />
cont.appendChild(img);<br />
cont.appendChild(p);</p>
<p>//Se le agrega el boton salir al fondo<br />
fondo.appendChild(salir);</p>
<p>//Se agrega el fondo y el contenedor de la imagen y texto al visor<br />
panel.appendChild(fondo);<br />
panel.appendChild(cont);</p>
<p>//Se desaparece el visor, esto da como consecuencia<br />
//que todos sus hijos desaparezcan con el<br />
panel.style.display = 'none';</p>
<p>//Se agrega al DOM, en este caso al body<br />
document.body.appendChild(panel);<br />
</code></p>
<p>Hasta este punto ya esta en el DOM la estructura necesaria para el visor, esta estructura es semejante a esto</p>
<p><code lang="html"></p>
<div id="cvrVisor" style="position: absolute; top: 0px; left: 0px; width: 100%; height: 837px; display: none;">
<div id="cvrFondo" style="position: relative; width: 100%; height: 100%; background-color: rgb(0, 0, 0); visibility: hidden; opacity: 0;">
		<a style="display: block; width: 99.9%; height: 99.8%;" href="#">Salir</a>
	</div>
<div id="cvrContenedor" style="padding: 5px; position: absolute; top: 146px; left: 664px; width: 335px; height: 525px; background-color: rgb(255, 255, 255); background-image: url(cargador.gif); background-repeat: no-repeat; background-position: center;">
		<img id="cvrImagen" title="Imagen" style="visibility: visible;"/></p>
<p id="cvrDescripcion" style="margin: 0px; padding: 0px;">
</p></div>
</div>
<p></code></p>
<p>Se ha logrado lo que se buscaba, pues ay tenemos listo los elementos necesarios, ahora es necesario programar los efectos respectivos, lo que sigue ahora es programar el método aparece, de la clase que definimos anteriormente, este método recibe dos parámetros, la url de la imagen a cargar, y la descripción de la misma, el siguiente es el pseudo código de lo que se codificara.</p>
<p><code lang="javascript"><br />
this.aparece = function(f,t){<br />
	//Se asigna a la variable file la url actual<br />
	//Se pone visible el visor de imágenes<br />
	//Se hace la animación de fade in<br />
	//Se asigna la descripción al elemento<br />
	//Se carga la imagen<br />
}<br />
</code></p>
<p>Esto, codificado, queda de la siguiente manera</p>
<p><code lang="javascript"><br />
this.aparece = function(f,t){<br />
	this.file = f;<br />
	$('cvrVisor').style.display = 'block';<br />
	var f = new Fx.Style('cvrFondo', 'opacity',{duration:500});<br />
	f.set(0);<br />
	f.start(0,0.7);<br />
	$('cvrDescripcion').setText(t);<br />
	this.cargaImagen();<br />
}<br />
</code></p>
<p>Lo único interesante es notar que la le estamos asignando 500 milisegundos a la animación, esta animación se la estamos aplicando al elemento con ID cvrFondo, la opacidad va de 0 a 0.7, esto es el 70% de la opacidad, la función cargaIMagen se describe a continuación.</p>
<p><code lang="javascript"><br />
this.cargaImagen = function(){<br />
	$('cvrImagen').style.visibility = 'hidden';<br />
	img = new Asset.image(this.file, {id: 'cvrImagen', title:'Imagen', onload: this.redimensionar});<br />
}<br />
</code></p>
<p>Lo que se esta haciendo aquí es ocultar la imagen, al hacer esto es posible ver el cargador en el fondo del contenedor, después cargamos la imagen con la clase Asset, la cual mediante el método image indica cuando ha terminado la carga, de esta manera cuando termine la carga se dispara el método redimensionar el cual analizaremos con mas detalle por se un poco mas interesante.</p>
<p><code lang="javascript"><br />
this.redimensionar = function(){<br />
	//Se remplaza la nueva imagen por la anterior<br />
	$('cvrImagen').replaceWith(img);<br />
	//Se oculta para hacer la animacion de redimension<br />
	$('cvrImagen').style.visibility = 'hidden';</p>
<p>	//Se crea la animacion sobre el elemento cvrContenedor,<br />
//al termino se hace visible la imagen<br />
	var efecto = new Fx.Styles('cvrContenedor', {duration: 500,transition: Fx.Transitions.linear,onComplete: function(){$('cvrImagen').style.visibility = 'visible';}});</p>
<p>	//Se inicia la animacion, modificando las siguientes propiedades<br />
	efecto.start({<br />
	    	'width': img.getSize().size.x,<br />
	    	'height': img.getSize().size.y + 25,<br />
	    	'top': window.getScrollTop() + window.getHeight()/2 - img.getSize().size.y/2 - 15,<br />
		'left': window.getWidth()/2 - img.getSize().size.x/2<br />
	});<br />
}<br />
</code></p>
<p>Lo interésate aquí, es que podemos modificar mas de una propiedad de los elementos al mismo tiempo, para eso se utiliza la Styles, a diferencia de la clase Style, esta puede modificar simultáneamente las propiedades que se le definan, en este caso se modificaron cuatro propiedades, el ancho, alto, coordenada en x y coordenada en y, para saber las nuevas posiciones y tamaños, es necesario saber las dimensiones de la nueva imagen, para esto simplemente accedamos mediante img.getSize().size.x para el width, donde img es la referencia al nodo que se ha cargado recientemente, el cual contiene esa información, de la misma manera para el height cambiando únicamente x por y, una vez que se saben las dimensiones de la imagen, se puede calcular fácilmente las coordenadas donde debe quedar centrada, para esto es necesario saber el ancho de la pantalla del usuario, así como el alto, luego unas simples restas de la mitad de todos los datos y listo, el contenedor queda en el centro de la pantalla.</p>
<p>Por ultimo se tiene que crear una instancia de esta clase.</p>
<p><code lang="javascript"><br />
var visor = new VisorImagenes();</p>
<p>window.addEvent('domready', function(){<br />
	visor.constructor();<br />
});<br />
</code></p>
<p>Lo que se esta haciendo aquí, es crear la instancia, y luego agregar un evento, este evento se dispara cuando el DOM esta listo, es decir que ya se puede comenzar a trabajar con el, esto es muy util pues no se tiene que esperar a que se carguen todas las imágenes del sitio para comenzar a trabajar, al momento de dispararse el evento, lo que se hace es ejecutar el metodo constructor de la clase VisorImagenes.</p>
<p>Para mostrar una imagen es necesario poner dentro de un boton o un link una llamada al metodo aparecer, con sus respectivos datos.</p>
<p><code lang="javascript"><br />
<a href="01.jpg" onClick="visor.aparece(this.href,'Foto ganadora en National Geographic 2006'); return false;">imagen 1</a><br />
<a href="02.jpg" onClick="visor.aparece(this.href,'Sonrrisa sincera'); return false;">imagen 2</a><br />
<a href="03.jpg" onClick="visor.aparece(this.href,'Tranquilidad absoluta'); return false;">imagen 3</a><br />
<a href="04.jpg" onClick="visor.aparece(this.href,'Camino al cielo'); return false;">imagen 4</a><br />
</code></p>
<p>Si te has dado cuenta, los links son accesibles aún si el usuario tiene desactivado el javascript, la única diferencia es que nuestro visor de imágenes no funcionara, pero se vera la imagen de todas formas.</p>
<p>A continuación expongo el código completo para que copies y pegues en un documento html <img src='http://www.crysfel.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><code lang="javascript"><br />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"<br />
        "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd"></p>
<p><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es"><br />
<head><br />
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1;" /></p>
<p>	<script type="text/javascript" src="mootools.v1.11.js"></script></p>
<style type="text/css">
html,body{
	margin:0px;
	padding:0px;
	align:center;
	height:100%;
	background-color:#ddd;
}
#frame{
	margin:0px auto;
	padding:0px;
	width:800px;
	min-height:100%;
	align:left;
	background-color:#fff;
}</p>
<p>*html frame{
	height:100%;
}</p>
</style>
<p><script type="text/javascript"></p>
<p>var visor = new VisorImagenes();</p>
<p>window.addEvent('domready', function(){
	visor.constructor();
});</p>
<p>function VisorImagenes(){
	this.file;
	this.img;</p>
<p>	this.constructor = function(){
		var panel = new Element('div', {
			'styles': {
				'position': 'absolute',
				'top':'0px',
				'left':'0px',
				'width': '100%',
				'height':  window.getScrollHeight()+'px'
			},
			id:'cvrVisor'
		});</p>
<p>		var fondo = new Element('div', {
			'styles': {
				'position': 'relative',
				'width': '100%',
				'height': '100%',
				'background-color': '#000'
			},
			'id':'cvrFondo'
		});</p>
<p>		var cont = new Element('div', {
			'styles': {
				'position': 'absolute',
				'top': '0px',
				'left':  '0px',
				'width': '100px',
				'height':  '100px',
				'background-color': '#fff',
				'padding': '5px',
				'background-image': 'url(cargador.gif)',
				'background-repeat': 'no-repeat',
				'background-position': 'center'
			},
			'id':'cvrContenedor'
		});
		var salir = new Element('a', {
			'title': 'Click para salir',
			'styles': {
				'display': 'block',
				'width': '99.9%',
				'height':  '99.8%'
			},
			'events': {
				'click': function(){
					new Fx.Style($('cvrFondo'), 'opacity',{duration:500,onComplete:function(){$('cvrVisor').style.display = "none";}}).start(0.7,0);
					return false;
				}
			}
		});
		salir.setText('Salir');
		var img = new Element('img', {
			'styles': {
				'margin': '0px'
			},
			'id':'cvrImagen'
		});</p>
<p>		var p = new Element('p', {
			'styles': {
				'margin': '0px',
				'padding': '0px'
			},
			'id':'cvrDescripcion'
		});
		new Fx.Style(fondo, 'opacity').set(0);</p>
<p>		cont.style.top = window.getScrollTop() + window.getHeight()/2 - 50 - 15 +"px";
		cont.style.left = window.getWidth()/2 - 50 + "px";</p>
<p>		cont.appendChild(img);
		cont.appendChild(p);
		fondo.appendChild(salir);
		panel.appendChild(fondo);
		panel.appendChild(cont);
		panel.style.display = 'none';
		document.body.appendChild(panel);
	}</p>
<p>	this.aparece = function(f,t){
		this.file = f;
		$('cvrVisor').style.display = 'block';
		var f = new Fx.Style('cvrFondo', 'opacity',{duration:500});
		f.set(0);
		f.start(0,0.7);
		$('cvrDescripcion').setText(t);
		this.cargaImagen();
	}</p>
<p>	this.cargaImagen = function(){
		$('cvrImagen').style.visibility = 'hidden';
		img = new Asset.image(this.file, {id: 'cvrImagen', title:'Imagen', onload: this.redimensionar});
	}</p>
<p>	this.redimensionar = function(){
		$('cvrImagen').replaceWith(img);
		$('cvrImagen').style.visibility = 'hidden';</p>
<p>		var efecto = new Fx.Styles('cvrContenedor', {duration: 500,transition: Fx.Transitions.linear,onComplete: function(){$('cvrImagen').style.visibility = 'visible';}});
		efecto.start({
		    	'width': img.getSize().size.x,
		    	'height': img.getSize().size.y + 25,
		    	'top': window.getScrollTop() + window.getHeight()/2 - img.getSize().size.y/2 - 15,
			'left': window.getWidth()/2 - img.getSize().size.x/2
		});
	}</p>
<p>}</p>
<p></script><br />
</head><br />
<body></p>
<div id="frame">
<p>		<a href="01.jpg" onClick="visor.aparece(this.href,'Foto ganadora en National Geographic 2006'); return false;">imagen 1</a><br />
		<a href="02.jpg" onClick="visor.aparece(this.href,'Sonrrisa sincera'); return false;">imagen 2</a><br />
		<a href="03.jpg" onClick="visor.aparece(this.href,'Tranquilidad absoluta'); return false;">imagen 3</a><br />
		<a href="04.jpg" onClick="visor.aparece(this.href,'Camino al cielo'); return false;">imagen 4</a></p>
</div>
<p></body><br />
</html><br />
</code></p>
<p>Pues bien, esto ha sido todo, espero pueda servirte, actualmente planeo realizar un plugin para wordpress y de esta manera poder integrar una galería de imágenes, esto para un proyecto que estoy desarrollando.</p>
<p>Antes de terminar quiero agradecer al <a href="http://flickr.com/photos/ichaka/">chaka</a> por proporcionar las imágenes de muestra <img src='http://www.crysfel.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Hasta la próxima!!</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/07/11/visor-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Introducción a JasperReport</title>
		<link>http://www.crysfel.com/2007/06/19/introduccion-a-jasperreport/</link>
		<comments>http://www.crysfel.com/2007/06/19/introduccion-a-jasperreport/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 00:48:50 +0000</pubDate>
		<dc:creator>Crysfel</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tutoriales]]></category>

		<guid isPermaLink="false">http://www.crysfel.com/index.php/2007/06/19/introduccion-a-jasperreport/</guid>
		<description><![CDATA[
En estos últimos días he estado jugando un poco con JasperReports, y de verdad que es muy sencillo hacer reportes, lo más dificultoso, es el encontrar documentación, los ejemplos que hay en Internet no están muy claros, y no abarcan todo lo que uno necesita saber, es por eso que me dediqué a realizar una [...]


No related posts.

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<div style="float:left;margin:0px 10px 0px 0px;"><img src="http://www.crysfel.com/common/img/jsr1.gif" alt="JasperReport" title="JasperReport" /></div>
<p>En estos últimos días he estado jugando un poco con JasperReports, y de verdad que es muy sencillo hacer reportes, lo más dificultoso, es el encontrar documentación, los ejemplos que hay en Internet no están muy claros, y no abarcan todo lo que uno necesita saber, es por eso que me dediqué a realizar una búsqueda exhaustiva con respecto al tema.</p>
<p>En esta entrada, voy a explicar los conceptos básicos para hacer reportes, no voy a profundizar en todas las opciones, pretendo hacerlo más adelante, quiero presentar a grandes rasgos el proceso para generar un reporte en pdf.</p>
<p>Para comenzar es necesario descargar la última versión de esta herramienta, directamente desde la página del proyecto <a href="http://www.jasperforge.org/">http://www.jasperforge.org/</a> para poder descargar es necesario registrarse en el sitio, así que regístrate rápidamente, luego en la página principal encontrarás varios proyectos, el primero de la lista es JasperReports, da clic sobre el link que dice downloads, descarga la última versión (1.3.4 es la actual), luego de esto aparecen archivos, algunos JARS, y un zip, el que tienes que descargar es el *-proyect.zip, de aproximadamente 35 MG.</p>
<p><span id="more-29"></span></p>
<p>Una vez que termine la descarga, descomprime el archivo, aquí hay varias carpetas, la que nos interesa es la que dice lib y dist, de la carpeta dist, sacamos el jar de jasperReport, creas un proyecto nuevo, en eclipse, netbeans, etc. creas una carpeta lib en tu nuevo proyecto, y pegas el jar, ahora copia los siguientes jars de la carpeta lib de jasperReports a la carpeta lib de tu proyecto.</p>
<p><strong>bsh-1.x.x.jar<br />
itext-1.x.x.jar<br />
commons-digester.jar<br />
commons-collections.jar<br />
commons-login-1.x.x.jar<br />
commons-beanutils.jar<br />
commons-javaflow-20060411.jar</strong></p>
<p>Es de suma importancia que copies todas estas librerías, y las agregues al classpath, de lo contrario el compilador te marcará errores pidiendo las librerías.</p>
<p>Una vez ya tengas en el classpath todas las librerías, vamos a crear nuestro primer reporte, uno muy sencillo, todavía no voy a mostrar como pasarle datos ni parámetros, el ejemplo de hoy solo imprimirá el hola mundo.</p>
<p>Para crear reportes el procedimiento es el siguiente, primero necesitas diseñar el reporte, esto lo haces con XML, es muy sencillo pues es semejante a diseñar una página XHTML, funciona manera semejante, una vez tengas listo el diseño del reporte lo guardas con extensión .jrxml, después necesitas compilar el XML y generar un archivo *.jasper, la compilación se hace una sola vez, luego ya que tienes el fichero.jasper, este lo cargas a memoria y le mandas los parámetros e información que quieres desplegar (Si es necesario), lo exportas al formato deseado y lo escribes en el disco.</p>
<p>Pues bien, eso es todo el procedimiento, sencillo no? la verdad es que en unas pocas líneas de código Java, haces todo el proceso. Una vez teniendo en mente el procedimiento completo, comencemos con el primer paso, el cual es diseñar el reporte en XML. Primero creamos un archivo llamado primerReporte.jrxml, luego escribes el siguiente código.</p>
<p><code lang="xml"><br />
<?xml version="1.0"?><br />
<!DOCTYPE jasperReport<br />
  PUBLIC "-//JasperReports//DTD Report Design//EN"<br />
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"><br />
</code></p>
<p>Esta es la cabecera del documento, aquí no hay mucho que explicar, simplemente que todos los reportes que diseñemos tienen que llevar esta cabecera.</p>
<p><code lang="xml"><br />
<jasperReport name="primer_reporte"></p>
<p></jasperReport><br />
</code></p>
<p>Este es el nodo principal del documento y es obligatorio, dentro de este va toda la información que queramos desplegar, dividido en las siguiente secciones.</p>
<p><strong>&lt;background&gt;</strong> &#8211; En esta seccion se puede poner cualquier cosa que quieras que aparesca por debajo de todas las otras seccion, esta sección es el fondo del documento.<br />
<strong>&lt;title&gt; </strong>- El contenido de esta sección será impreso solo una vez al principio del reporte, como su nombre lo dice es el título que el reporte tendrá.<br />
<strong>&lt;pageHeader&gt;</strong> &#8211; Esta sección será impresa en cada página que el reporte contenga, es la cabecera del reporte.<br />
<strong>&lt;columnHeader&gt;</strong> &#8211; Esta sección se utiliza para poner la cabecera de la sección &#8220;detail&#8221;, en otras palabras el titulo de la información desplegada en el &#8220;detail&#8221;.<br />
<strong>&lt;detail&gt;</strong> &#8211; En esta sección es donde se colocan la información a desplegar del reporte, es el cuerpo principal del reporte, generalmente en esta sección se despliegan tablas.<br />
<strong>&lt;pageFooter&gt;</strong> &#8211; Esta sección el pie de página y es impresa al final de cada página del reporte, aquí puedes poner el número de página o alguna otra información.</p>
<p>Dentro de estas secciones es que se ponen etiquetas estáticas, dinámicas, líneas, imágenes, etc. es importante mencionar que todas estas secciones contienen la etiqueta <strong>&lt;band&gt;</strong>, que es donde la información está contenida, es obligatoria solo cuando necesitas ponerle contenidos a cualquiera de las cuatro secciones anteriores.</p>
<p> Suficiente teoría por ahora, es hora de seguir diseñando el reporte, para este caso dije que sólo imprimiría &#8220;Hola mundo&#8221; en el reporte, así que sólo voy a ocupar la sección detail, poner un texto estático especificándole las medidas y posición donde estará, el código final quedará así.</p>
<p><code lang="xml"><br />
<?xml version="1.0"?><br />
<!DOCTYPE jasperReport<br />
  PUBLIC "-//JasperReports//DTD Report Design//EN"<br />
  "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd"><br />
<jasperReport name="primer_reporte"></p>
<p>  <detail><br />
    <band height="20"><br />
      <staticText><br />
        <reportElement x="180" y="0" width="200" height="20"/><br />
        <text><![CDATA[Hola Mundo! soy Crysfel]]&gt;</text><br />
      </staticText><br />
    </band><br />
  </detail><br />
</jasperReport><br />
</code></p>
<p>Aquí no hay mucho que comentar, excepto que el band debe tener especificado el alto que será, en este caso 20 (Las medidas son en píxeles), y que los objetos que contenga dentro de este, no deben superar esta medida, de lo contrario el compilador nos marcará un error, hasta este punto solo esta imprimiendo un texto estático, puedes hacer pruebas agregándole más textos y posicionándoles en lugares diferentes, no olvides que el height de los objetos, no deben superar los 20px que declaramos al band.</p>
<p>Una vez esta listo el diseño del reporte y guardado  como primerReporte.jrxml es necesario crear una clase que continué con el procedimiento, el código de dicha clase es el siguiente.</p>
<p><code lang="java"><br />
public class JasperReports1<br />
{<br />
  public static void main(String[] args)<br />
  {<br />
    JasperReport jasperReport;<br />
    JasperPrint jasperPrint;<br />
    try<br />
    {<br />
            //1-Compilamos el archivo XML y lo cargamos en memoria<br />
      jasperReport = JasperCompileManager.compileReport(<br />
          "primerReporte.jrxml");</p>
<p>               //2-Llenamos el reporte con la información y parámetros necesarios (En este caso nada)<br />
      jasperPrint = JasperFillManager.fillReport(<br />
          jasperReport, new HashMap(), new JREmptyDataSource());</p>
<p>               //3-Exportamos el reporte a pdf y lo guardamos en disco<br />
      JasperExportManager.exportReportToPdfFile(<br />
          jasperPrint, "holaMundo.pdf");<br />
    }<br />
    catch (JRException e)<br />
    {<br />
      e.printStackTrace();<br />
    }<br />
  }</p>
<p>}<br />
</code></p>
<p>Como puedes ver, el procedimiento es muy sencillo, primero compilamos el jrxml, para aplicaciones reales, esto lo haces solo una vez, y generas un archivo jasper, en esta ocasión no lo estoy generando, eso lo explicaré mas a detalle en futuras entradas, por ahora en el paso 1 se compila y se mantiene en memoria, en el paso 2 se le pasan tres parámetros a la función fillReport, el cual es el reporte, un HashMap con los parámetros y no se le pasa información, por ahora no le estamos pasando nada, en futuras entradas hablaré al respecto, este es solo una introducción, por último, en el paso 3 se exporta a pdf y se guarda en disco como holaMundo.pdf.</p>
<p>Solo basta correr la aplicación y ver los resultados, si has seguido los pasos al pie de la letra, no tendrás errores, al compilar el jrxml tarda un poco, pero es normal, es por eso que repito otra vez, que solo se hace una sola vez y se guarda el archivo compilado con extensión .jasper, en este caso no lo hacemos, pero sigue pendiente en este blog pues hablaré al respecto en un futuro no muy lejano.</p>
<p><strong>Update 17 Enero 2008</strong><br />
Para facilitar el tutorial, ahora voy a proporcionar el <a href="http://www.crysfel.com/wp-content/uploads/2008/01/jasperreport1.rar" title="Descargar Codigo del Tutorial">código fuente</a> para que lo puedas ver funcionando, es un proyecto configurado para eclipse.</p>


<p>No related posts.</p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.crysfel.com/2007/06/19/introduccion-a-jasperreport/feed/</wfw:commentRss>
		<slash:comments>68</slash:comments>
		</item>
	</channel>
</rss>
