Intentando hacerme a la costumbre de escribir lo que me pasa (siempre le puede servir a alguien), hoy voy a resumir un problema que tuve escribiendo un reporte con jasper.
Creando un reporte tuve que utilizar una tabla para mostrar el detalle de un java bean que usé como datasource. El datasource tenía los resultados en un list.
El componente table muestra el listado con una línea por cada elemento de la lista. En muchos casos, el bean podría considerarse el maestro y el listado los detalles, lo que haría que este comportamiento fuera el necesitado. En mi caso, aunque correcto el concepto de maestro con sus detalles, los detalles se deben mostrar como columnas, es decir, los resultados deben mostrarse traspuestos. Para esto, está el componente crosstab de jasper.
Configurando el componente utilizando ireport, es obligatorio seleccionar alguno de los valores de los objetos del list como agrupador por fila, y otro por columna. Mi caso, no requiere y no tiene agrupación por fila, pero ireport no me permite dejar este ítem sin seleccionar.
Entonces, recordé que ireport no es más que una interfaz para jrxml, y decidí dejar (por un rato) la comodidad de ireport y ver el código del jrxml para ver cómo puedo resolver mi problema.
Así encontré que las secciones de interés de mi reporte son éstas:
1. Aqui se define el dataset para la tabla
<subDataset name="Table Dataset 1">
<field name="nombrePrueba" class="java.lang.String">
<fieldDescription><![CDATA[nombrePrueba]]></fieldDescription>
</field>
<field name="valorResultado" class="java.math.BigDecimal">
<fieldDescription><![CDATA[valorResultado]]></fieldDescription>
</field>
</subDataset>
2. Aqui, se crea la tabla, donde puntajesList es el listado de objetos que tienen la estructura definida en 1, es decir, un atributo String y uno BigDecimal:
<crosstabDataset>
<dataset>
<datasetRun subDataset="Table Dataset 1">
<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{puntajesList})]]></dataSourceExpression>
</datasetRun>
</dataset>
</crosstabDataset>
3. Como el componente crosstab debe tener una agrupación tanto por fila como por columna, entonces, el grupo por fila (el que no necesito) lo edito para que quede:
<rowGroup name="valorResultado" width="5">
<bucket>
<bucketExpression class="java.lang.String"><![CDATA[]]></bucketExpression>
</bucket>
....
Así, el componente crosstab aún tiene una agrupación por fila, pero la agrupación no existe.
Este es solo un workaround cuando se sabe que los resultados del crosstab solo tendrán una fila.