Modelos, Vistas y Controladores en Ext JS 4

Cuando desarrollamos aplicaciones de gran escala es de suma importancia definir una buena arquitectura, dividir nuestro código en capas nos permite tener un mejor control sobre el mismo así como facilitarnos el mantenimiento en un futuro. Ext 4 nos permite implementar de una forma sencilla el patrón MVC para organizar nuestro código y separandolo en capas delegando resposabilidades específicas en cada una de ellas.

Los Modelos

Un modelo de datos nos permite definir y abstraer las propiedades de una entidad, en Ext JS usamos los modelos para llenar una colección para luego desplegar la información en un widget por ejemplo un Grid, View, Combobox o algún otro. Es importante mencionar que en la capa del modelo solo modelamos la información que usaremos en las otras dos capas, aquí no definimos ni widgets ni tampoco eventos para agregar interacción con el usuario. Para definir un modelo lo hacemos de la siguiente manera:

Ext.define("Bleext.movies.model.Movie",{
	extend		: "Ext.data.Model",
	fields		: [
		{name:"title",type:"string"},
		{name:"tns",type:"string"},
		{name:"url",type:"string"},
{name:"author",type:"string"},
		{name:"duration",type:"float"},
		{name:"releaseDate",type:"date",formatDate:"Y-m-d"},
		{name:"description",type:"string"}
	]
});

Primeramente debemos extender de la clase “Ext.data.model”, esta clase nos da la funcionalidad necesaria para definir los modelos que usaremos en nuestra aplicación. La clase que hemos creado contiene el campo “fields” que es un arreglo con los campos que contendrá este modelo, en este caso una película contiene título, url, tns, autor, duración, duración, fecha de salida y descripción. Un último punto a considerar es que debemos guardar el archivo dentro de la ruta “Bleext/movies/model/” con el nombre “Movie.js”, esto para que pueda sercargado dinámicamente con el Loader. Como parte de la capa de datos vamos a definir aquí el “store” que almacenará los modelos para luego ser usados en un grid, para definir un store lo hacemos de la siguiente manera:

Ext.define("Bleext.movies.store.Movies",{
	extend		: "Ext.data.Store",
	model		: "Bleext.movies.model.Movie",
	
	proxy		: {
		url		: "services/movies.json"
		reader	: {
			type	: "json",
			root	: "data"
		}
	}
});

En primer lugar extendemos de la clase “Ext.data.Store” que es la clase que nos permite almacenar los los modelos y manipularlos de una manera sencilla. En segundo lugar le asignamos el modelo “Movie”, de esta manera le asociamos los objetos que manejara este store llamado “Movies”. Tercer paso definimos el proxy y le asignamos un reader para que interprete JSON, ahí podemos definir algunas otras configuraciones. Esta clase la guardamos en la ruta “Bleext/movies/store” y el archivo llamado “Movies.js”, por ahora hemos terminado con la capa de datos. Si has notado el store ha definido una “url” que apunta a “services/movies.json”, este servicio debería consultar algún sitio como youtube o vimeo para sacer la información a desplegar y regresar un JSON como el siguiente:

{
	"data"	: [
		{"title":"A History of the Sky","author":"Ken Murphy","releaseDate":"2011-11-15","tns":"http://b.vimeocdn.com/ts/216/862/216862163_200.jpg","duration":4.52,"url":"http://player.vimeo.com/video/32095756","description":"This is a year-long time-lapse study of the sky. A camera installed on the roof of the Exploratorium museum in San Francisco captured an image of the sky every 10 secobnds. From these images, I created a mosaic of time-lapse movies, each showing a single day. The days are arranged in chronological order. My intent was to reveal the patterns of light and weather over the course of a year."},
		{"title":"the raid on zuccotti park","author":"Casey Neistat","releaseDate":"2011-11-17","url":"http://player.vimeo.com/video/32215878","duration":3.32,"tns":"http://b.vimeocdn.com/ts/217/760/217760559_200.jpg","description":"My office isn't far from Zuccotti Park and when I heard it was being cleared I went down with my camera. I ended up filming for 18 hours until the Park was reopened at 6pm on November 15, 2011. The police presence was overwhelming, more than I've ever seen - more than during the blackout, more than the days after September 11th."},
		{"title":"Black Ocean","author":"Zelig Sound: Composition & Sound","releaseDate":"2011-11-18","tns":"http://b.vimeocdn.com/ts/218/080/218080637_200.jpg","duration":2.34,"url":"http://player.vimeo.com/video/32256774","description":"We were asked to create some excellent intricate sound design and score for this very beautiful visual journey through Black Ocean's ecosystem. We used some very interesting and unique sound tools when creating this piece. The result is very detailed, subtle and reserved."}
	]
}
Las Vistas

En Ext JS las vistas son los componentes o widget, por ejemplo un grid, un formulario y todo aquello que se renderiza en la pantalla, es importante mencionar que aquí no debemos definir ningún listener ni agregar alguna clase de interacción con el usuario, simplemente definimos la vista de nuestra aplicación. Para este ejemplo crearemos un grid que desplegará la información que contiene el Store que definimos anteriormente:

Ext.define("Bleext.movies.view.MoviesGrid",{
	extend		: "Ext.grid.Panel",
	
	store		: "Bleext.movies.store.Movies",
	border		: false,

	initComponent	: function() {
		var me = this;
		
		me.columns = [
			{header:"Image",dataIndex:"tns",width:100,renderer:me.showImage},
			{header:"Title",dataIndex:"title",width:180},
			{header:"Author",dataIndex:"author",flex:1},
			{header:"Release date",dataIndex:"releaseDate",flex:1},
			{header:"Duration",dataIndex:"duration",width:60}
		];
        
		me.callParent();
	},
	
	showImage		: function(value,record){
		return '';
	}
});

Primero extendemos de la clase “Ext.grid.Panel” asignandole el store que estará usando para llenar la información de los rows, también se define un renderer en la columna “Image” para desplegar la imagen asociada al video. No olvidar seguir las convenciones para crear el archivo “MoviesGrid.js” que alojará el código anterior. Además de crear el grid, voy a crear una ventana que contenga al grid anterior, el código para generar la ventana es el siguiente:

Ext.define("Bleext.movies.view.MoviesWindow",{
	extend		: "Ext.window.Window",
	
	layout		: "fit",
	title		: "Movies",
	width		: 550,
	height		: 350,

initComponent	: function(){
		var me = this;
		
		me.items = Ext.create("Bleext.movies.view.MoviesGrid");
		
		me.callParent();
	}
});

La clase anterior extiende de “Ext.window.Window” y únicamente añade el grid de películas que ya habíamos creado. Es importante resaltar que el código de las vistas anteriores no tienen ningún listener o interacción con el usuario, son simples componentes que podrían ser usados en cualquier lugar de nuestra aplicación donde requiramos desplegar un grid de películas o bien una ventana conteniendo el grid.

ExtJS 4 MVC example

Grid en ventana

El controlador

Una vez que tenemos definidos nuestros modelos en la capada de datos y nuestros componentes en la capa de las vistas necesitamos agregar la interacción y funcionalidad, esto lo hacemos en la capa del controlador. El siguiente código muestra el controlador que une todas las piezas.

Ext.define("Bleext.movies.controller.Movies",{
	extend		: "Ext.app.Controller",	// Step 1
	models		: ["Bleext.movies.model.Movie"],	// Step 2
	stores		: ["Bleext.movies.store.Movies"],
	views		: [
		"Bleext.movies.view.MoviesWindow",
		"Bleext.movies.view.MoviesGrid"
	],

	init	: function() {	// Step 3
		var me = this;
		
		me.control({	// Step 4
			"window gridpanel"	: {	//Step 5
				itemclick	: me.showMovie	//Step 6
			}
		});
	},
	
	showMovie	: function(grid,record){
		Ext.Msg.alert("Alert","Now playing: '"+record.get("title")+"'");
	}
});

En el código anterior hay muchas cosas por explicar, así que vamos por partes. En el paso uno la clase extiende de “Ext.app.Controller”, esta clase nos proporciona algunos métodos para poder agregar listeners a los componentes de una manera sencilla, también define el método “init”. En el paso dos importamos todas las clases que usaremos para este módulo, los modelos, los stores y las vistas implicadas para que todo funcione correctamente. En el paso tres sobre escribimos el método “init” que es ejecutado automáticamente cuando se crea el controlador, aquí deberíamos definir todo aquello que necesitemos, es importante mencionar que cuando se ejecuta este método todavía no se han renderizado los componentes. El paso cuatro es muy importante, es aquí donde mediante el método “control” definimos los listeners y agregamos la interacción necesario para los componentes que tenemos ya definidos, este método internamente registra los selectores con sus respectivos eventos y listeners en el “bus de eventos” el cual es un objeto por el cual todos los eventos que generan los componentes tienen que pasar, más adelante hablaré a detalle al respecto ya que vale la pena conocerlo. En el paso cinco definimos los selectores, estos selectores son como los de CSS y nos sirven para seleccionar componentes de una manera muy sencilla usando por debajo el “Ext.ComponentQuery” un componente que sin duda dedicaré un tutorial para hablar a detalle sobre él. Mi consejo es que seas lo más específico posible al definir los selectores para que no tengas problemas de conflictos cuando tu aplicación crezca, la búsqueda de los componentes se hace por su “alias” o “xtype”, también podemos usar propiedades y algunos otros comodines. En el paso seis le indicamos al componente seleccionado cual es el evento que queremos escuchar, en este caso será el “itemclick” que se dispara cuando el usuario da click sobre una fila, a este evento le asignamos una función que se ejecutará cada vez que se dispare el evento “itemclick”. La función “showMovie” únicamente muestra un alerta, aquí podríamos hacer cualquier otra cosa que queramos ejecutar cuando el usuario da click en una fila, por ejemplo abrir una ventana donde reproduzca el video y muestre más información o lo que se nos ocurra.

ExtJS 4 MVC example

Listeners desde el controller

Creando la aplicación

Hasta ahora hemos definido el módulo de “movies”, para poderlo ejecutar necesitamos agregarlo a la aplicación, en proyectos reales lo ideal sería ir cargando los módulos bajo demanda, en el Bleextop así sucede pero para este ejemplo cargaremos el módulo desde el inicio de la aplicación. En un archivo llamado “myapp.js” hubicado dentro de la carpeta “js” escribiremos el siguiente código:

Ext.Loader.setConfig({
enabled	: true,
	paths	: {
		Bleext	: "js/Bleext"
	}
});

Ext.application({
	name		: "Bleext",
	appFolder 	: "js/Bleext",
	controllers	: ["Bleext.movies.controller.Movies"],
	launch		: function(){
		
		var win = Ext.create("Bleext.movies.view.MoviesWindow");
		win.show();
	}
});

Si el código anterior se te hace desconocido te recomiendo darle una leida al tutorial donde he hablado acerca de las aplicaciones y del cómo cargar clases dinámicamente. La clase “Ex.app.Application” hereda de “Ext.app.Controller”, por lo tanto para importar el módulo de “movies” simplemente importamos el controller correspondiente y el internamente importará todas las clases necesarias. En la función “launch” creamos una instancia de la clase “window” y luego le hacemos un “show” para poder desplegarla en pantalla. El html donde importamos la libraría de Ext, el CSS y la aplicación sería de la siguiente manera.

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>ExtJS MVC</title>
	<link rel="stylesheet" href="http://extjs.cachefly.net/ext-4.0.2a/resources/css/ext-all.css" type="text/css" media="screen" title="no title" charset="utf-8">
	http://extjs.cachefly.net/ext-4.0.2a/ext-all.js
	
	http://js/myapp.js
</head>
<body>
	
</body>
</html>
Conclusion

Usando el patrón MVC podemos crear una arquitectura fácil de mantener, fácil de administrar y puede crecer cuan grande como queramos siempre definiendo el código necesario en la capa adecuada, los modelos con la información, las vistas con los componentes y los controlers con la interacción que agregaremos a los componentes. En futuros tutoriales veremos más ejemplos de MVC, por ahora sólo quería mostrar los pasos necesarios para poder hacer funcionar nuestra primera aplicación, síguenos en twitter o en nuestra lista de correos para estar pendiente de los nuevos tutoriales y materiales disponibles.

Fuente:

https://quizzpot.com/blog/modelos-vistas-y-controladores-en-ext-js-4

How to use Windows Authentication to SQL Server from a Jasper Server running on Linux

Assumptions: REMOTE_IP is the ip address sql server is bound to port 1433 listening for tcp/ip traffic. And database name is jasper.

Instead of using the plain ole sqljdbc.jar driver to connect to SQL Server, we will utilize a product called jTDS to connect to the SQL Server. This is because it allows JDBC to connect to SQL server using Windows Authentication mode instead of SQL mode.

Steps:

1) Install jasper server 4.5.x

2) Get jTDS 1.2.5 (or whatever is latest should work).

You may have noticed that there are a few DLLs in that jTDS package. Don’t worry! The driver still works in Linux. You just cannot do single-sign on in Linux of course like Windows can.

Extract jtds-*.jar to $jasperserver/apache-tomcat/lib

3) Edit $jasperserver/apache-tomcat/conf/Catalina/localhost/jasperserver.xml and add the following element before </Context>

<Resource name="jdbc/sqlserver"
             auth="Container"
             type="javax.sql.DataSource"
             driverClassName="net.sourceforge.jtds.jdbc.Driver"
             url="jdbc:jtds:sqlserver://REMOTE_HOST:1433;DatabaseName=jasper;useCursors=false;domain=COM;username=Administrator;password=XXXXXXX;user=Administrator"
             user="Administrator"
             password="XXXXXXX"
             maxActive="20"
             maxIdle="20"
             maxWait="60000"
             removeAbandoned="true"
             logAbandoned="true"         
             removeAbandonedTimeout="300"
             validationQuery="SELECT 1"/>

4) Edit $jasperserver/apache-tomcat/webapps/jasperserver/WEB-INF/web.xml and add a new <resource-ref> for the new datasource:

   <resource-ref>
     <description>Connection Description</description>
     <res-ref-name>jdbc/sqlserver</res-ref-name>
     <res-type>javax.sql.DataSource</res-type>
     <res-auth>Container</res-auth>
   </resource-ref>

5) Create a new database name “jasper” and grant read* permissions to the Active Directory account you desire to use.

6) Run this script for test purposes:

create table test (test varchar(50) NULL) 
insert into test values ('1')
insert into test values ('2')
insert into test values ('3')

7) Create a new JSP file $jasperserver/apache-tomcat/webapps/jasperserver/test.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="jdbc/sqlserver">
  select test from test
</sql:query>

<html>
  <head>
    <title>DB Test</title>
  </head>
  <body>
    <h2>Results</h2>

    <c:forEach var="i" items="${rs.rows}">
      Text Message: <c:out value="${i.test}"/><br>
    </c:forEach>
  </body>
</html>

8) Start jasperserver’s tomcat. Login, and test http://localhost:8080/jasperserver/test.jsp

You should see the rows 1, 2 and 3 from the test table.

If it doesn’t work… review the previous steps and see what went wrong.

9) Simply create a jasper server JNDI datasource by going to: Datasources -> New Data source -> Type: JNDI data source. -> JNDI lookup is: /jdbc/sqlserver

Create your tables and test your report.

 

Fuente:

http://stackoverflow.com/questions/11402628/how-to-use-windows-authentication-to-sql-server-from-a-jasper-server-running-on

iReport: añadiendo QRCode a Jasper informa de la manera fácil

Después de probar varias soluciones complicadas para incrustar un código QR en los informes de iReport Jasper, la manera más fácil que he encontrado es la siguiente:

1) Poner Core y JavaSE tarros de ZXing en la ruta de clase (utilizando Herramientas / Opciones / rutas de clases si la compilación a nivel local, o de la propiedad ruta de clases si se utiliza Ant y net.sf.jasperreports.ant.JRAntCompileTask)

2) Añadir una imagen a su informe con los siguientes valores:

  • Clase Expression:
    java.awt.Image
  • Expresión Image:
    com.google.zxing.client.j2se.MatrixToImageWriter.toBufferedImage 
         (nueva 
             300, 300))

    Por supuesto, sustituya $ F {CONTENT_TO_ENCODE} con su contenido real.

3) Compilar el informe y disfrutar!

Fuente:

https://www.colino.net/wordpress/archives/2013/10/09/adding-qrcode-to-jasper-reports-ireport-the-easy-way/

iReport no son capaces de resolver el problema com.google.zxing.qrcode.QRCodeWriter

Descargar y agregar manualemente en el directorio los archivos:

core-2.2.jar

javase-2.2.jar

1. Descargar el paquete jar google ZXing

2. Añadir a ireprot directorio de instalación -> plataforma-> lib

Windows: \Jaspersoft\iReport-4.5.0\platform9\lib

Linux: /jasperreports-server-cp-4.5.0/apache-tomcat/lib

3. iReport Reiniciar.

4. Abordar error

Subreports in IReport

A subreport is a report included inside another report. This allows the creation of very complex layouts with different portions of a single document filled using different data sources and reports.

In this tutorial we want to create an address book printing for each person in the address book the name, the list of phone numbers and the list of email addresses.

The layout we want to obtain is the one in figure 1.

Figure 1 Figure 1

A master report will be used to select the persons from the address book and render the main page and the person details. A first subreport will be used to select the email addresses of each person and render the orange portion. Finally a second subreport will be used to extract the phone numbers and print them (blue portion).

To fill the report, we will use the following database script.

create table PERSONS (    ID int primary key,    NAME varchar(30),    CITY varchar(30) ); insert into PERSONS values(1, ‘ETHAN’, ‘NEW YORK’); insert into PERSONS values(2, ‘CALEB’, ‘SAN FRANCISCO’); insert into PERSONS values(3, ‘WILLIAM’, ‘LONDON’);            create table EMAIL_ADDRESSES (    ID int primary key,    ID_PERSON varchar(30),    EMAIL varchar(100) ); insert into EMAIL_ADDRESSES values(1, 1, ‘ethan@yahoo.com‘); insert into EMAIL_ADDRESSES values(2, 1, ‘ethan@gmail.com‘); insert into EMAIL_ADDRESSES values(3, 2, ‘caleb@yahoo.com‘); insert into EMAIL_ADDRESSES values(4, 2, ‘caleb2@linux.com‘); insert into EMAIL_ADDRESSES values(5, 2, ‘cccleb@jaspersoft.com‘); insert into EMAIL_ADDRESSES values(6, 3, ‘wlm@somedomain.co.uk‘); insert into EMAIL_ADDRESSES values(7, 3, ‘william@someemail.eu‘); insert into EMAIL_ADDRESSES values(8, 3, ‘willy@myemail.org‘);     create table PHONE_NUMBERS (    ID int primary key,    ID_PERSON varchar(30),    PHONE varchar(100) );     insert into PHONE_NUMBERS values(1, 1, ‘1(111) 111-1111’); insert into PHONE_NUMBERS values(2, 1, ‘1(222) 222-2222’); insert into PHONE_NUMBERS values(3, 1, ‘1(333) 333-3333’); insert into PHONE_NUMBERS values(4, 2, ‘1(444) 444-4444’); insert into PHONE_NUMBERS values(5, 3, ‘1(555) 555-5555’); insert into PHONE_NUMBERS values(6, 3, ‘1(666) 666-6666’);

We start from a blank report to create the master report, the one to show the person names. It is a very simple report based on the query:

SELECT * FROM PERSONS;

In the detail band we add the field NAME and CITY. The gray background is obtained using a frame element that contains the two fields.

The line at the bottom of the detail band has the property Position Type set to float, in this way, when we will add the subreports, whatever space the subreport elements will take at run time, the line will move accordingly.

The figure 2 shows the layout of the master report.

Figure 2 Figure 2

Run the report, the result must be similar to the one in figure 3.

Figure 3 Figure 3

The second step is to create the subreport to display the email addresses. Start with a blank report, save it in the same directory as the master, and call it subreport_1.jrxml.

Open the page format dialog (Format → Page format…) and reduce the size of the page to 270 pixels and remove the margins, since they are not useful in a subreport. The height of the report in this case is not very interesting, since it will managed by the master report once this report will be used as subreport.                         

Figure 4 Figure 4

This report will not list all the email addresses read from the table EMAIL_ADDRESSES, but just the ones of the current person in the master. To filter the email addresses, we will use a parameter. In the report inspector right click the Parameters node and select Add Parameter. In the property sheet change the parameter name to ID_PERSON, set the parameter class to java.lang.Integer and set a default value, i.e. 1.

Figure 5 Figure 5

Open the query dialog and paste the query:

SELECT * FROM EMAIL_ADDRESSES WHERE ID_PERSON=$P{ID_PERSON}

The syntax $P{ID_PERSON} allows the use of a parameter inside a query, in this case to filter the result using a where condition.

Close the query dialog and proceed with the report layout (see figure 6).

Figure 6 Figure 6

If you want you can run this report to see the result. Repeat the same steps to create the second subreport to display the phone numbers. Call it subreport_2.jrxml and save it in the same directory as the other two jrxml files. This time the query will be:

SELECT * FROM PHONE_NUMBERS WHERE ID_PERSON=$P{ID_PERSON}

The layout of the second subreport should be similar to the following picture:

Figure 7 Figure 7

It’s time to put all togheter. Go back to the master report and drag from the palette into the detail band the subreport element.

The report wizards pops up. Select the second option (Use an existing report) and select the subreport_1.jrxml (or subreport_1.jasper if you have already tried it).

Figure 8 Figure 8

In the following step use the option “Use the same connection used to fill the master report” (which should be selected by defaut). In this way the database connection will be passed to the subreport to let it execute its SQL query.

Click next. In the next step we can set an expression for the parameter exposed by the subreport. Set it to the field ID. When the report will be executed, the email addresses will be filtered based on the ID of the current report (which is the ID of the person we are processing).

Figure 9

Complete the wizard keeping all the default settings. The new subreport element will be placed inside the detail, adjust its size (the width must be set to 270 pixels) and the position so it can fit in the available space (see figure 10).

Figure 10 Figure 10

Copy and paste the subreport element. The only difference between the two subreport elements is the reference to the jasper file to use as subreport. In the property sheet change the Subreport expression as follow:

$P{SUBREPORT_DIR} + “subreport_2.jasper”

The parameter name (ID_PERSON) is the same in both the subreports, like the way it is passed from the master, so there are no other changes to do. Fix the position of the second subreport to be on the right of the first one.

Figure 11 Figure 11

Finally run the report. The expected result is shown in figure 12.

Figure 12 Figure 12

This tutorial covers just the basics of subreporting in JasperReports. It uses a JDBC connection and staic paths to the subreports. Subreports can be filled with any kind of data source, including XML, a collection of java beans, an empty data source and so on. The subreport is then able to return to the master results of calculations using return values, the jasper file to be used a subreoprt can be loaded dynamically and a subreport can include other subreports, allowing the creation of very complex layouts.

Fuente:http://community.jaspersoft.com/wiki/subreports

Creación de estilos y estilos condicionales en iReport

En esta entrada veremos cómo crear un estilo para un Field específico y cómo crearle condiciones al estilo para que sea aplicable o no.

  • CREAR ESTILO NUEVO

Para crear un nuevo estilo debemos ir al panel Report Inspector en el ítem Styles dar clic derecho -> Add -> Style Reference.

Nuevo estilo

Nuevo estilo

En el panel Properties al tener seleccionado el nuevo estilo le daremos un nombre, en mi caso ‘ColorId’. Acá podríamos modificar las demás propiedades del estilo y luego asignarlo a algún componente dentro de nuestro reporte, pero en este caso lo que haremos será crear condiciones para este estilo.

  • AGREGAR CONDICIONES AL ESTILO

Una vez tenemos nuestro estilo vamos a agregar el primer condicional, para ello, hacemos clic al estilo creado anteriormente y elegimos la opción ‘Add conditional style’.

Agregar estilo condicional

Agregar estilo condicional

De inmediato se creará nuestro primer estilo condicional, ahora debemos crear la condición para que se aplique o no a los elementos que tengan el estilo ‘ColorId’. Para hacer eso debemos hacer clic derecho sobre el estilo condicional y dar clic en Edit Condition.

Editar condición

Editar condición

En la ventana Expression Editor  agregaremos la condición que queremos que se aplique, en este caso evaluaremos si el Field $F{id} es menor a 50, si es así se aplicará el estilo asociado a este Conditional Style. (Los parámetros del estilo condicional se configuran en el panel Properties una vez se seleccione el estilo).

Condición para el estilo

Condición para el estilo

Para este Conditional Style le asigné un background de color amarillo.

Propiedades del conditional style

Propiedades del conditional style

Se pueden agregar tantos Conditional Styles como se desee.

  • ASIGNAR ESTILO AL FIELD

Ahora que ya tenemos nuestro estilo creado junto con un conditional style asociado, solo resta asignar el estilo al field específico, para ello seleccionamos nuestro field $F{id} en el reporte y en el panel Properties para la propiedad ‘Style’ seleccionamos ColorId.

Asignar estilo a field

Asignar estilo a field

De esta forma si damos clic sobre Preview veremos que los id menores de 50 tendrán un fondo de color amarillo:

Preview del reporte

Preview del reporte

Fuente: http://camilo-rodriguez.com/estilos-condicionales-en-field-en-ireport/

Estilos condicionales en iReport

iReport nos da la posibilidad de dar un formato condicional a los diferentes registros resultado de nuestras consultas SQL, el uso más común que se le da es de “distinguir diferentes valores” entre los registros como números impares de color rojo, pares de color azul, números negativos en rojo, positivos en verde, letras mayúsculas en negrilla, nombres subrayados, etc.

Para esta tarea iReport cuenta con la etiqueta <style> donde podremos indicar la condición y el estilo que debe tomar el componente, (un jTextField por ejemplo).

Necesitamos para comprender este post

– iReport 3.7 o superior

– Una base de datos MySQL

– Conocimiento básico de XML

Nivel: Intermedio :)

Tiempo: 15 minutos

Comencemos.

Para este ejemplo se hará uso de una base de datos llamada “dbtest” que consta de una sola tabla “mitabla” o.O

-- 
-- Estructura de tabla para la tabla 'mitabla'
-- 

CREATE TABLE mitabla (
  id bigint(20) NOT NULL auto_increment,
  nombre varchar(100) NOT NULL,
  sexo varchar(1) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

-- 
-- Volcar la base de datos para la tabla 'mitabla'
-- 

INSERT INTO mitabla VALUES (1, 'Alan Brito', 'M');
INSERT INTO mitabla VALUES (2, 'Armando Esteban Quito', 'M');
INSERT INTO mitabla VALUES (3, 'Elsa Lame ', 'F');
INSERT INTO mitabla VALUES (4, 'Guillermo Nigote', 'M');
INSERT INTO mitabla VALUES (5, 'Irma Tando ', 'F');
INSERT INTO mitabla VALUES (6, 'Mónica Galindo ', 'F');
INSERT INTO mitabla VALUES (7, 'Viviana K. Lavuelta ', 'F');
INSERT INTO mitabla VALUES (8, 'Susana Torio ', 'F');
INSERT INTO mitabla VALUES (9, 'Omar Garita', 'M');
INSERT INTO mitabla VALUES (10, 'Flor D. Turra ', 'F');

1. Crea un nuevo reporte en iReport, realiza la conexión a la base de datos y crea el Query con la siguiente instrucción:

SELECT id, nombre, sexo FROM mitabla

2. En el diseñador del reporte, añade dos Text Field y asigna la propiedad “Text Field Expresión” como se ve en la siguiente imagen:

ireport 2013

Hasta este punto es solamente una consulta normal como cualquier otra, ejecuta el PREVIEW para ver algo como esto:

report sample

3. Lo que haremos ahora, sera añadir una condición que nos permita distinguir los registros de hombres y mujeres mediante colores.

Abre el código XML del reporte, segundo botón después de DESIGNER.

Al inicio del código XML, busca la etiqueta <queryString> donde esta la instrucción SQL

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" ... >
 <queryString>
  <![CDATA[SELECT id, nombre, sexo FROM mitabla]]>
 </queryString>
 <field name="id" class="java.lang.Long"/>
 <field name="nombre" class="java.lang.String"/>
 <field name="sexo" class="java.lang.String"/>
 ...

Antes de la etiqueta <queryString>, se añade la etiqueta de estilos <style>…</style>, indicando un nombre para el estilo , por ejemplo “miestilo”, después, dentro esta etiqueta,  se abre la etiqueta <conditionalStyle>…</conditionalStyle> y dentro <conditionExpression>…</conditionExpression> donde se indica la condición para el estilo, se puede añadir más de una condición por estilo.

También se debe añadir la etiqueta <style> dentro de conditionalStyle,  no es la misma etiqueta del principio o.O, en esta etiqueta se indica los cambios de estilo, igualmente, una por condición. Debes tener algo como esto:

 <style name="miestilo" isDefault="false">
  <conditionalStyle>
   <conditionExpression><![CDATA[new Boolean($F{sexo} == "F")]]></conditionExpression>
   <style isDefault="false" style="miestilo" forecolor="#FFFFFF" backcolor="#F60404"/>
  </conditionalStyle>
  <conditionalStyle>
   <conditionExpression><![CDATA[new Boolean($F{sexo} == "M")]]></conditionExpression>
   <style isDefault="false" style="miestilo" forecolor="#FFFFFF" backcolor="#0025DF"/>
  </conditionalStyle>
 </style>
 <queryString>
  <![CDATA[SELECT id, nombre, sexo FROM mitabla]]>
 </queryString>

En este ejemplo, los registros que sean de sexo masculino “M” serán de color azul, los de sexo femenino “F” de color rojo.

4. Ahora que ya creamos nuestros estilo, debemos añadir este al objeto donde lo utilizaremos. En este ejemplo, es en el Text Field “nombre“, buscamos la etiqueta correspondiente en la vista XML de ireport.

<textField>
   <reportElement x="71" y="4" width="261" height="16"/>
   <textElement>
     <font size="12"/>
   </textElement>
   <textFieldExpression class="java.lang.String"><![CDATA[$F{nombre}]]></textFieldExpression>
</textField>

Agregamos style=”nombre de estilo” a la etiqueta reportElement quedando el código de la siguiente manera:

<textField>
   <reportElement style="miestilo" mode="Opaque" x="71" y="4" width="261" height="16"/>
   <textElement>
     <font size="12" isBold="true"/>
   </textElement>
   <textFieldExpression class="java.lang.String"><![CDATA[$F{nombre}]]></textFieldExpression>
</textField>

Terminamos, ejecutamos el preview y debemos tener algo como esto:

report kawaii

El resultado no es muy atractivo :) pero es solo un sencillo ejemplo de lo que podemos hacer con estilos condicionales en iReport🙂.

Descarga el ejemplo del post AQUI.

NOTA POBRE: En este tutorial se implemento el estilo condicional modificando directamente el archivo XML o.O, iReport, permite realizar esto desde “Report Inspector”, “paleta” y “properties”, 100 veces mas sencillo, pero si algo sale mal (Ley de Murphy), es bueno saber donde va cada cosa para poder realizar los cambios cuando sea necesario.

Fuente: http://www.jc-mouse.net/java/estilos-condicionales-en-ireport

Restaurar backups de PostgreSql

Vamos a continuar con las operaciones que deben ser habituales para el mantenimiento de nuestras base de datos.

Hasta ahora ya habíamos visto cómo hacer un backup en Postgresql, y también, cómohacerlo de manera automática.

Vamos ahora a la otra punta del circuito: restaurar una base desde nuestros backups.

El comando que vamos a utilizar (y conocer) es pg_restore.

Si lo aplicara a los ejemplos que antes dí sobre pg_dump, nuestro ejemplo de pg_restore seria el siguiente.

pg_restore -i -h localhost -p 5432 -U postgres -d mibase -v "/home/damian/backups/mibase.backup"

Una vez que lo ejecutemos, se nos pedirá la contraseña del usuario que vamos a usar.

Para conocer los parámetros que podemos pasarle al comando, nada mejor que darse una vuelta por la documentación oficial, ya que hay algún que otro detalle que estaría bueno conocer (y además, porque es buena práctica leer la documentación oficial).

Sobre los parámetros del ejemplo, paso a detallarlos.

  • -i le indica que ignore la versión (entre el comando y la base de datos).
  • -h localhost es el host de nuestro PostgreSql.
  • -p 5432 es la indicación del puerto donde corre el servicio.
  • -U postgres especifica que se usará el usuario postgres para la operación.
  • -d mibase es para que realize la restauración sobre una base de datos en particular, en este caso mibase.
  • -v ejecutará el comando en modo verbose (así podremos ir viendo la salida de cada paso del proceso).
  • /home/damian/backups/mibase.backup es el archivo que usaremos como backup y que queremos ingresar.

Hasta ahora, ya hemos podido realizar backups, automatizarlos, y ahora, ya podremos restaurar nuestras bases de datos desde la consola sin problemas.

Una recomendación para los que estén empezando a conocerse con PostgreSql, es suscribirse a la lista de correo en español.

Es bastante activa, y tiene integrantes ante los cuales hay que sacarse el sombrero, tanto por el conocimiento como por la colaboración que brindan.

Optener Backup de la Base de datos:  pg_dump –host localhost –port 5432 –username “postgres” –format tar –blobs –verbose –file “/home/backups/mibase .backup” “mibase ” 

Fuente: http://www.damianculotta.com.ar/2008/10/14/restaurar-backups-de-postgresql/

Crear un Setup o Instalador en Visual NET 2005

Este articulo le permitira guiarse para crear un instalador o setup para su aplicacion, espero sea de su agrado. En primer lugar vamos a tomar nuestro proyecto al cual le vamos a crear un instalador. En mi caso es un proyecto que permite ver si el equipo esta o no conectado a internet. hay va la funcion por si les hace falta.

clip_image001

 

Ahora vamos a crear nuestro proyecto de instalacion, para esto vamos a archivo y seleccionamos agregar y luego nuevo proyecto.

clip_image002

 

Vemos lapantalla que nos permite agregar un nuevo proyecto, como podemos ver en la parte derecha podemos seleccionar el tipo de proyecto, aqui desplegamos otros tipos de proyectos y en plantillas seleccionamos Asistente para proyectos de instalacion.

clip_image003

 

Abrira una pantalla del asistente que nos guiara por 5 pasos para crear el setup. damos clic en siguiente..

clip_image004

 

En esta ventana vamos a elegir el tipo de instalador si es para una aplicacion windows o web ademas que podemos crear paquetes si es necesario, estos nos permiten que creeemos archivos CAb que son mas pequeños, es decir nos divide el instalador d ela aplicacion por paquetes. Seleccionaremos el primero. Crear un programa de instalacion de una aplcacion windows.

clip_image005

 

El paso tres nos permite seleccionar los resultados de proyecto que vamos adicionar al instalador como es una aplicacion sencilla eligiremos. Resultado principal de (proyecto).

clip_image006

 

En el paso 4 podremos adicionar archivos o elementos adicionales como imagenes, iconos, archivos rtf entre otros,para el ejemplo he seleccionado una imagen para agregar al instalador.

clip_image007

 

Una ves hemos realizado los pasos anteriores corectamente podremos finalizar nuestro asistente en el paso 5 donde nos mostrara un resumen del proyecto de instalacion.

clip_image008

 

Ahora que hemos terminado con el asistente podremos ver que en el Explorador de Soluciones aparece nuestro proyecto de instalacion.

clip_image009

 

Aqui podremos dar clic derecho sobre el proyecto setup y ver en la ventana de propiedades la informacion de nuestro setup. como Autor, Descripcion, addremoveprogramsicon este ultimo nos permite seleccionar un icono y cuando el sistema quede instalado aparecera en Agregar o Quitar programas del panel de control con el icono que identifica la aplicacion esto permite que no nos quede con el icono por defecto del .NET y lo podamos personalizar.

clip_image010

 

Vamos a dar clic derecho al proyecto de instalacion y seleccionamos propiedades.

clip_image011

 

el nos mostrara la siguiente ventana, en ella haremos clic en administrador de configuracion.

clip_image012

 

En esta ventana vemos la configuracion de cada aplicacion, aqui cambiaremos la de nuestro instalador o setup a Release.

clip_image013

 

Ahora volvemos a nuestra ventana de propiedades de mi instalador y hacemos clic en Requisitos previos.

clip_image014

 

Ahora vamos a agregar los requisitos previos que necesita nuestra aplicacion para ejecutarse esto nos permite que podamos agregar complementos a nuestro proyecto como el framework 2.0, sql server express, libreria de crystal reports, windows instaler. Esto para que, cuando instalamos nuestra aplicacion si necesitamos de esos requisitos no nos toque instalarlos uno por uno, esto hace que cuando se ejecute el instalador el evalue si se encuentran instalados los requicitos si no lo estan el automaticamente los instalara. para esto hay 3 formas la pimera es que los descargue del sitio web del proveedor eso quiere decir de microsoft, la segunda y la que uso es que los ejecute donde esta la aplicacion. para esto fue que cambiamos de Debug a Release nuestro proyecto en un paso anterior cuando agreguemos los requisitos y generemos nuevamente el instalador el va a crear o colocar los componentes que selecionamos automaticamente junto al setup. La tercera es que lso descargue de una pagina web que yo le indique.

clip_image015

 

para esta aplicacion y amanera de ejemplo vamos a seleccionar framework 2.0, Crystal reports para framework 2.0, sql server express y windows instaler recordemos que este ultimo es necesario para instalar proyectos msi.

clip_image016

 

Cuando hagamos clic en el proycto de instalacion, en la parte superior apareceran una serie de propiedades que nos son utiles a la hora de configurar nuestro setup o instalador solo en caso de que necesitemos hacer una configuracion mas personalizada ente estas opciones tenemos la de editar la interfaz de usuario.

clip_image017

 

hacemos clic en la opcion editar interfaz de usuario y el nos mostrara un esquema de las ventanas que usa en la instalacion, como por ejemplo pantalla de bienvenida o carpeta de instalacion que es la que nos permite elegir donde queremos que se instale.

clip_image018

 

si queremos agregar una ventana adicional lo podemos hacer nos paramos sobre la parte superior del arbol y le damos clic derecho y agregar nueva ventana. para el ejemplo seleccionaremosla ventana de contrato de licencia. que es la que nos permite cargarle al usuario un contrato de licencia como el de todos los programas que nunca leemos al que le damos si acepto.

clip_image019

 

Estas ventanas igualmente las podemos personalizar es asi como podemos elegir el banner de la ventana, el contrato o el archivo rtf y entre otras propiedades.

clip_image020

 

cabe aclarar que para las imagenes o archivos que manejemos en nuestro instalador tienen que estar agregados a ese proyecto, es decir yo coloque a la ventana anterior un bannerbitmap pero este archivo s lo notan fue el que agregue en los pasos del asistente del instalador. El buscara los archivos que esten dentro del proyecto de instalacion no en otro lugar. Si queremos agregar archivos adicionales haga clic derecho sobre el proyecto y seleccione agregar archivos.

clip_image021

 

Por ultimo tenemos las carpetas de la aplicacion que es donde se instalara y en donde podremos crear accesos como el escritorio, menu inicio y la carpeta de la aplicacion que es donde realmente estan todos los archivos de la aplicacion el .exe o .dll que necesite la aplicacion para ejecutarse. todo esto es configurable.

clip_image022

 

por ultimo damos clic derecho al proyecto y le damos generar. una ves el ha terminado de generar correctamente el instalador. podremos ir a la carpeta de nuestra solucion y ver los archivos en la carpeta release. alli encontraremso un setup un msi y los instaladores de los requisitos.

clip_image023

 

Espero les sea de utilidad!!!

 

Fuente:

http://www.onglasses.net/Default.aspx?id=1265

GMap.NET Tutorial – Maps, markers and polygons

GMap.NETGMap.NET LogoThe following is a tutorial for using the excellent GMap.NET control. This text will explain how to place a map control on a form, how to initialize it to show the coordinates you want, how to add markers to it, and how to add polygons.

Download the GMap.NET library here (the so-called “hot build” from 2013 – the latest stable release is from 2011 and had some problems for me).
(Note that I have another tutorial up on how to add routes to GMap.NET).

Setting up

First, create a new C# Windows Forms project in Visual Studio 2010. In your GMap.NET download, you will find DLLs named GMap.NET.Core.dll and GMap.NET.WindowsForms.dll. Place them in a subfolder of your project, and add a reference to both.

Adding GMap.NET references
This will allow your code to access GMap.NET’s classes. Since GMap.NET is a user control, you can add it to your Toolbox. (Of course, you could simply instantiate the GMapControl from your code without ever adding it to your Toolbox, but then you would miss out on setting the control’s properties conveniently through the Properties panel). To add the control to your Toolbox, right-click the Toolbox and select “Choose Items.”

Adding the GMap control to your Visual Studio Toolbox

You’ll find the required assemblies by clicking Browse… and selecting the GMap.NET.WindowsForms DLL. This should contain the GMapControl. Verify that there’s a check next to this control, and when you click OK, the control should be in your Toolbox and can be dragged to a form.

Adding a GMap to a Windows Form

Now add a new form (your fresh C# Windows Application should already have one) and drag the GMapControl to it. Resize it to your liking and call it “gmap” instead of the cumbersome GMapControl1. The control will display as an empty rectangle:

Adding the GMap Control to a form

With the control selected, open the Properties panel. Apart from the usual Control properties, you’ll find some GMap-specific properties there. Now things will get interesting:

Properties for the GMapControl

I’ll explain some of the properties right away:

  • CanDragMap – If true, the user can drag the map using the right mouse button. You’ll probably want to keep this set to true.
  • MarkersEnabled – If true, any markers that you defined will be shown. If not, they won’t appear. Set this to true for now. If you forget, you may pull your hair out figuring out why your markers don’t appear (I did).
  • PolygonsEnabled – Same story here.
  • ShowTileGridLines – If true, GMap.NET will show tile coordinates on the tiles. Not something for a production environment, but it may help with debugging.
  • Zoom, MinZoom, MaxZoom – The Zoom level for Google Maps is somewhere between 0 (zoomed out to global level) to 18 (zoomed in to street level). Zoom is the current zoom level (5 would be good for country level), while MinZoom and MaxZoom should be set to 0 and 18 respectively if you want users to be able to zoom in and out fully. Zooming is done with the mouse wheel.

All these are interesting switches that allow us to define how the map will be shown and interacted with, but they don’t allow us to set where the map data is coming from. As we will see, this must be done in code. Running the program now will result in a persistently blank rectangle where the map is supposed to go.

Initializing the map

Add an onLoad event to your form, and add the following code to it:

private void Form1_Load(object sender, EventArgs e)
{
  // Initialize map:
  gmap.MapProvider = GMap.NET.MapProviders.BingMapProvider.Instance;
  GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.ServerOnly;
  gmap.SetCurrentPositionByKeywords("Maputo, Mozambique");
}

Now run the program. A map should appear, centered on the city of Maputo, Mozambique. I’ve set the position using key words recognized by the map data provider, but you can also use latitude/longitude if you want:

gmap.Position = new PointLatLng(-25.971684,32.589759);

While running the program, you will notice that the map can be dragged with the right mouse button, and zooming is done with the mouse wheel. If these operations do not work, then check that you’ve set the GMapControl’s properties correctly in the Properties panel – you may have inadvertently turned off dragging, or fixed the zooming level.

Map Providers

The magic of the GMap.NET library is that is doesn’t merely work with Google Maps. There are other map data providers out there, and GMap.NET supports a slew of them while the gory API details are all neatly hidden away from you. In the example above, I’ve used the BingMapProvider, but other useful ones include:

  • CloudMadeMapProvider
  • GoogleMapProvider – map provider for Google Maps; there are street, satellite and hybrid variants
  • OpenCycleMapProvider
  • OpenStreetMapProvider
  • WikiMapiaMapProvider
  • YahooMapProvider

Interestingly, the Google Map provider is (for me, at least), the slowest one. The applications takes a good number of seconds to start, presumably because a connection with Google is being (slowly) made. The Bing Map provider was much faster. But, of course, the data shown will be different so it all depends on your preferences. At the very least, your map code could have fallback providers.

GMap.NET with Yahoo Provider

Yahoo provider

GMap.NET with Open Street Map provider

Open Street Map provider

GMap.NET with Google Maps provider

Google Maps provider

GMap.NET with Bing Maps provider

Bing Maps provider

The magic of GMap.NET goes further still. When we get to showing markers and polygons on a map, we’ll see that GMap.NET hides provider-specific implementation details away behind a common interface. That means that any marker and polygon code you write for GMap.NET will work with any of the providers. Awesome!

Adding markers

Markers are added in layers that are placed on top of your map, called overlays. You can place any number of markers in an overlay, then add that overlay to the map. The overlay can then be hidden en shown as necessary.

Here is a bit of code that adds an overlay called “markers” to the map, with a single marker in it:

GMapOverlay markersOverlay = new GMapOverlay("markers");
GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(-25.966688, 32.580528),
  GMarkerGoogleType.green);
markersOverlay.Markers.Add(marker);
gmap.Overlays.Add(markersOverlay);

Adding a marker to GMap.NET

A Google-type marker on a Bing Map provider

First, the overlay is created. You can give it a name (optionally), which you can use elsewhere to refer to it (or you could just keep a reference to the overlay instance). Next, an instance of GMarkerGoogle is created. It takes two arguments: a location (a PointLatLng instance) and a marker type.

The marker types are a variety of marker images normally available in the Google Maps API (big balloons in many colors, small balloons in many colors, etc.). Or, you can supply an instance of Bitmap with your own image:

GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(-25.966688, 32.580528),
  new Bitmap("c:\\images\\mymarker.png");

The marker is added to the overlay, and finally the overlay is added to the map. These markers (and the GMarkerGoogleType instances) work with any map provider!

Of course, you can create additional markers and add them to your overlay. There’s no limit, except in performance. More markers mean that performance goes down.

Adding polygons

Markers may not always cut it. Sometimes you need to delimit an area of your map. For instance, you may need to indicate where new construction will take place, or who owns which land. Polygons allow you to show just that.

The following code shows how to create another overlay, and add a four-point polygon to it.

GMapOverlay polyOverlay = new GMapOverlay("polygons");
List points = new List();
points.Add(new PointLatLng(-25.969562,32.585789));
points.Add(new PointLatLng(-25.966205,32.588171));
points.Add(new PointLatLng(-25.968134,32.591647));
points.Add(new PointLatLng(-25.971684,32.589759));
GMapPolygon polygon = new GMapPolygon(points, "mypolygon");
polygon.Fill = new SolidBrush(Color.FromArgb(50, Color.Red));
polygon.Stroke = new Pen(Color.Red, 1);
polyOverlay.Polygons.Add(polygon);
gmap.Overlays.Add(polyOverlay);

First, we create a new overlay. Next, we define a list with all the points in the polygon (this is a four-point polygon, but you can just as easily create many more points). Using these points, we create an instance ofGMapPolygon. For good measure, we tell the polygon how to draw itself using a SolidBrush (semitransparent) for the fill, and a thin red Pen for the stroke. Finally, we add the polygon to the overlay, and the overlay to the map.

Tip: don’t forget to add overlays to the map, or they won’t show up.

Adding a GMap.NET polygon

A polygon showing the area covered by Maputo’s Central Hospital

Conclusion

This tutorial should allow you to get started with GMap.NET. Here are some parting tips:

You can use different map providers. Some are faster than others. Also, some show more data than others. Depending on your location, this can make all the difference (Maputo, Mozambique is such as location – Yahoo Maps has almost no data).

When adding markers or polygons to an overlay, don’t forget to add the overlay to the map.

If your markers don’t show up, verify that you have MarkersEnabled set to True in the Properties panel for your GMapControl instance.

GMap.NET requires an internet connection to function properly. However, if no connection is available, you can still use cached information (if available) to show your maps. To do this,  do:

GMap.NET.GMaps.Instance.Mode = GMap.NET.AccessMode.CacheOnly;

Note: there’s more – see GMap.NET Tutorial – Routes to see how to show routes on your maps.

 

Fuente:

http://www.websofia.com/2013/02/gmap-net-tutorial-maps-markers-and-polygons/

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.