25/03/2010, 11:33
|
| | Fecha de Ingreso: marzo-2010
Mensajes: 15
Antigüedad: 14 años, 7 meses Puntos: 0 | |
Respuesta: Jasper Report. Reporte con filas de colores alternos Hola a todos de nuevo.
Despues de pensar un poco he resuelto el problema de mostrar un reporte con filas de colores alternos.
Supongo que el que lee esto ya ha realizado algunos reportes. Con el siguiente link es suficiente:
[URL="http://javatutoriales.blogspot.com/2009/02/creacion-de-reportes-con-jasperrepots-y.html"]http://javatutoriales.blogspot.com/2009/02/creacion-de-reportes-con-jasperrepots-y.html[/URL]
Quiero postear la solución para por si a alguien le hace falta y por si alguien tiene otra solución más elegante.
En mi caso tenia que crear un reporte sencillo con dos columnas Nombre y Descripcion.
Normalmente se hacen dos fields en la banda detail $F{nombre} y $F{descripcion} pero lo que hice fue crear 4 campos
$F{nombre0} y $F{descripcion0}
y despues otros dos fields debajo de estos:
$F{nombre1} y $F{descripcion1}
La idea es que los fields 0 muestren los campos pares y los fields 1 muestren los impares.
Ademas de esto pongo un frame en los campos 0 del color de las filas pares y le pongo el color que quiero que tengan dichas filas. Por supuesto este frame debe quedar detras de los fields.
Hago lo mismo con los fields 1 con el color de las filas impares.
Despues de esto solo tengo que modificar ligeramente el JRDataSource encargado de proporcionar datos al reporte. Para mi caso:
public class RolDataSource implements JRDataSource
{
private List<Rol> roles = null;
private int indiceActual = -1;
public RolDataSource(List<Rol> roles)
{
this.roles = roles;
}
@Override
public Object getFieldValue(JRField field) throws JRException
{
if ((field.getName().equals("nombre0")) && ((indiceActual % 2) == 0))
{
return roles.get(indiceActual).getRolnombre();
}
if ((field.getName().equals("nombre1")) && ((indiceActual % 2) == 1))
{
return roles.get(indiceActual).getRolnombre();
}
if ((field.getName().equals("descripcion0")) && ((indiceActual % 2) == 0))
{
return roles.get(indiceActual).getRoldesc();
}
if ((field.getName().equals("descripcion1")) && ((indiceActual % 2) == 1))
{
return roles.get(indiceActual).getRoldesc();
}
return null;
}
@Override
public boolean next() throws JRException
{
indiceActual++;
return indiceActual < roles.size();
}
}
Note como el valor del field ${nombre0} se devuelve solo si el indice actual es par
lo mismo para los otros campos.
En otro caso devuelvo null.
Hasta aqui todo bien pero si trato de mostrar el formulario apareceran dos filas por cada fila real del reporte que se quiere. Estos valores nulos se mostraran.
Para esto modifico el Print When Value de cada field para mostrarse solamente cuando el valor no es nulo.
Para los frames tambien es necesario modificar el Print When Value pues ellos deben ocultarse cuando los fields respectivos (o uno de ellos) son nulos.
Esto se hace con el codigo: new Boolean(${field} != null);
Tambien debemos activar el checkbox de Remove Line When blank de cada field.
Hecho esto se mostrara el reporte con las filas de colores alternos.
Espero que resulte util a alguien. Y si tienen otra idea posteen.
Saludos:
Alberto.
Última edición por alberto7D9; 25/03/2010 a las 11:42 |