Eu preciso preencher uma crosstab do meu relatório com uma subdataset, já que os dados do preenchimento se encontram em outra datasource, diferente do relatório principal. Eu criei o subdataset e os fields que eu quero que apareçam na crosstab dentro do subdataset.
Depois eu fui em “Crosstab data” -> “Dataset run” -> “Sub dataset” e selecionei o dataset que eu tinha criado. Selecionei ainda em “Connection/Datasource expression” a opção “Use datasource expression” (já que meu datasource é uma coleção do tipo JRBeanCollectionDataSource) e coloquei como valor “P{REPORT_DATA_SOURCE}”.
Quando tento exibir o relatório no iReport, não aparecem os dados na crosstab, aparece só uma página vazia. Já usando JasperFillManager no código Java, o relatório também fica vazio.
Alguém teria alguma sugestão sobre o que possa estar acontecendo?
O JRBeanCollectionDataSource é bastante flexível e simples de usar, mas possui algumas limitações: quando se cria um conexão desse tipo no iReport, não é uma conexão real que é criada, mas uma expressão do tipo “P{REPORT_DATA_SOURCE}”. Sendo assim, não é possível utiliza-la integralmente no subdataset, pois esse tipo de estrutura só se beneficia de conexões reais com o banco de dados e consultas do tipo SQL.
A minha solução foi usar o JRBeanCollectionDataSource para retornar listas dos objetos reais de que precisava para preencher a crosstab. Já o subdataset, usei apenas para conter os fields reais e criar a crosstab. Na crosstab, usei o subdataset como conexão e usei de novo a opção “Use datasource expression”, só que dessa vez passando o field com a lista de objetos, como expressão. Ficou algo como “new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listaDeDados})”.