Subreports não renderiza - iReport

7 respostas
DirceuSobrinho

Olá.

Estou tentando gerar um relatorio que contem um subreport, e dentro do subreport outros subreports(a principio ainda nao estou fazendo os subs dentro dos subs).

estou obtendo os dados do relatorio atraves de uma coleção(List); e dentro de cada elemento da coleção tem outra lista que deve ser a base de dados do subrelatorio.

O problema que estou tendo, é que: o relatorio é gerado sem exibir o subrelatorio. (apesar da coleção está populada, acho que o subreport nãio está conseguindo obter os seus dados)

Como eu fiz os relatórios:

  1. criei o relatório principal no iReport, adicionei os CAMPOS SIMPLES, e um campo PROGRAMASDETRABALHO que se referencia a uma lista do objeto principal e esse campo deverá popular o subreport
  2. adicionei o subrelatorio através EDITAR->INSERIR ELEMENTO -> SUBRELATORIO
  3. selecionei a opção: Usuando um relatorio já existente (anteriormente fiz o relatorio do subreport), em seguida, marquei a opção UTILIZANDO UMA EXPRESSÃO JRDATASOURCE, e preenchi com a expressão $F{programasTrabalho} criada no item 1. E deixei marcado: Armazenar nome do diretorio em um parametro $P{SUBREPORT_DIR} + …

após a criação do subreport, dou um duplo clique no mesmo e obtenho os seguintes campos preenchidos:

  • SUBRELATORIO: usar a conexão do relátorio $P{REPORT_CONNECTION}
  • Sub-Relátorio (outro): $P{SUBREPORT_DIR} + “programa.jasper”

pronto, foi assim que criei os relatorios e o sub (É preciso fazer algo mais no ireport?)

agora o processo de geração do relátorio:

String pathArquivo = servletContext.getRealPath("/rel/planejamento.jasper");
                  String pathDiretorio = servletContext.getRealPath("/rel/");  
	         
	          //parametros  
	          Map<String, Object> parametros = new HashMap<String, Object>();  
	          parametros.put("SUBREPORT_DIR", pathDiretorio+"/");
	          
	          //lista contendo o conteúdo dos relatórios
	          List<PlanejamentoOrcamentario> lista = getPlanejamentosOrcamentarios();
	         	          
	          JRDataSource jrds = new JRBeanCollectionDataSource(lista);
	            
	          try {  
	             if(lista !=null && lista.size() > 0){                 
	                JasperPrint print = JasperFillManager.fillReport(pathArquivo, parametros, jrds);  
	               byte[] bytes = JasperExportManager.exportReportToPdf(print);                 
	                writeBytesAsAttachedTextFile(bytes, "PlanejamentoOrçamentário.pdf");                 
	             }                             
	          } catch (Exception e) {  
	             e.printStackTrace();
	          }

OBS. Os objetos PlanejamentoOrcamentario possui o metodo getProgramasTrabalho() que retorna list() populada que deverá preencher o subreport!
a unica associação do atributo programasTrabalho de PlanejamentoOrçamentario com o relatorio é somente na criação de um campo programasTrabalho do tipo objeto, isso no ireport? ou tem mais alguma associação no método de geração do relatorio?

Att. Dirceu Sobrinho

7 Respostas

felipecaparelli

O que geralmente causa essa ausência de renderização dos subreports é a falta de passagem dos parametros necessários para o subreport a partir do report que o contém.

Para verificar isso, selecione o subreport dentro do report (caso esteja utilizando o iReport) e clicando com o botão direito vá em Propriedades.

Depois selecione a aba Sub-Relatório (Outro) e verifique se os parametros necessários de serem ‘vazados’ para o subreport estão presentes nesta listagem.

Espero que isso já ajude.

DirceuSobrinho

na aba sub-Relatórios (Outro) só tem apenas a expressão de sub-relatorio: $P{SUBREPORT_DIR} + “programa.jasper”

não tenho nenhum paramentros declarado.

preciso declarar algum? a principio não vejo necessidade de passar parametros nesse subrelatorio, apenas do datasource

felipecaparelli

Você só precisa declarar esses parametros caso dentro do subreport você os utilize para algum fim. Ainda mais se estiver utilizando algum para verificar se o mesmo deve ser impresso. Outro fator que pode estar interferindo é o de o datasource que você acreita estar passando não esteja sendo realmente passado para o subreport.
Se você puder de alguma forma colocar o código do jasper ai ajuda.

DirceuSobrinho

codigo do jasper

<?xml version="1.0" encoding="UTF-8"  ?>
<!-- Created with iReport - A designer for JasperReports -->
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport
		 name="planejamento"
		 columnCount="1"
		 printOrder="Vertical"
		 orientation="Portrait"
		 pageWidth="595"
		 pageHeight="842"
		 columnWidth="535"
		 columnSpacing="0"
		 leftMargin="30"
		 rightMargin="30"
		 topMargin="20"
		 bottomMargin="20"
		 whenNoDataType="NoPages"
		 isTitleNewPage="false"
		 isSummaryNewPage="false">
	<property name="ireport.scriptlethandling" value="2" />
	<property name="ireport.encoding" value="UTF-8" />
	<import value="java.util.*" />
	<import value="net.sf.jasperreports.engine.*" />
	<import value="net.sf.jasperreports.engine.data.*" />

	<parameter name="SUBREPORT_DIR" isForPrompting="true" class="java.lang.String">
		<defaultValueExpression ><![CDATA[".\\"]]></defaultValueExpression>
	</parameter>
	<parameter name="IMAGEM_DIR" isForPrompting="false" class="java.lang.String"/>

	<field name="unidadeOrcamentaria" class="java.lang.Object"/>
	<field name="unidadeGestora" class="java.lang.Object"/>
	<field name="programasTrabalho" class="java.lang.Object"/>
	<field name="ano" class="java.lang.Integer"/>

		<background>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</background>
		<title>
			<band height="50"  isSplitAllowed="true" >
				<staticText>
					<reportElement
						x="40"
						y="9"
						width="469"
						height="31"
						key="staticText-4"/>
					<box></box>
					<textElement textAlignment="Center" verticalAlignment="Middle">
						<font pdfFontName="Helvetica-Bold" size="14" isBold="true"/>
					</textElement>
				<text><![CDATA[Relatório de Planejamento Orçamentário ]]></text>
				</staticText>
				<image  evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="10"
						y="9"
						width="61"
						height="34"
						key="image-1"/>
					<box></box>
					<graphicElement stretchType="NoStretch"/>
					<imageExpression class="java.lang.String"><![CDATA[$P{IMAGEM_DIR}]]></imageExpression>
				</image>
			</band>
		</title>
		<pageHeader>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</pageHeader>
		<columnHeader>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</columnHeader>
		<detail>
			<band height="147"  isSplitAllowed="true" >
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="136"
						y="5"
						width="168"
						height="17"
						key="textField-1"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA[""+$F{unidadeOrcamentaria}]]></textFieldExpression>
				</textField>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="136"
						y="22"
						width="160"
						height="14"
						key="textField-2"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.String"><![CDATA[""+$F{unidadeGestora}]]></textFieldExpression>
				</textField>
				<textField isStretchWithOverflow="false" isBlankWhenNull="false" evaluationTime="Now" hyperlinkType="None"  hyperlinkTarget="Self" >
					<reportElement
						x="136"
						y="39"
						width="165"
						height="20"
						key="textField-3"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<textFieldExpression   class="java.lang.Integer"><![CDATA[$F{ano}]]></textFieldExpression>
				</textField>
				<staticText>
					<reportElement
						x="10"
						y="5"
						width="158"
						height="19"
						key="staticText-1"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<text><![CDATA[Unidade Orçamentária:]]></text>
				</staticText>
				<staticText>
					<reportElement
						x="10"
						y="22"
						width="158"
						height="15"
						key="staticText-2"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<text><![CDATA[Unidade Gestora:]]></text>
				</staticText>
				<staticText>
					<reportElement
						x="10"
						y="39"
						width="113"
						height="15"
						key="staticText-3"/>
					<box></box>
					<textElement>
						<font/>
					</textElement>
				<text><![CDATA[Ano:]]></text>
				</staticText>
				<subreport  isUsingCache="true">
					<reportElement
						mode="Transparent"
						x="10"
						y="56"
						width="519"
						height="89"
						key="subreport-1"/>
					<subreportExpression  class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "programas.jasper"]]></subreportExpression>
				</subreport>
			</band>
		</detail>
		<columnFooter>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</columnFooter>
		<pageFooter>
			<band height="0"  isSplitAllowed="true" >
			</band>
		</pageFooter>
		<summary>
			<band height="50"  isSplitAllowed="true" >
			</band>
		</summary>
</jasperReport>
felipecaparelli

Pelo que pude notar, olhando com mais calma, na linha 07 parametros.put(“SUBREPORT_DIR”, pathDiretorio+"/"); você não passou o arquivo do subreport, apenas o diretório.

Verifique se foi isso mesmo.

DirceuSobrinho

o problema não é a linha 07.

a linha 07 deve receber só o diretorio mesmo.

pois no jasper eu defino para concatenar diretorio passado como parametro com o nome do arquivo que ja foi declado no ireport como pode ser ver a baixo:

mas mesmo assim alterei a linha 07 adicionando o nome do arquivo jasper.
ai obtive o seguinte error:

net.sf.jasperreports.engine.JRException: Could not load object from location : C:\workspace-sesau.metadata.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\SESAU1\rel/programas.jasperprogramas.jasper

infelizmente não é isso =/

felipecaparelli

De que forma você está gerando o arquivo .jasper? direto pelo iReport ou está gerando um objeto JasperReport via código com a classe:
JasperCompileManager.compileReport(“arquivo.jrxml”); Dependendo da forma você pode estar criando somente o .jasper do Report e não do SubReport.

Eu sugiro que como forma de teste vc criar um outro report de forma bem simples e introduzir um subreport com dados texto sem muita coisa, para ver se não é algum problema com o arquivo ou algo assim. As vezes deixamos passar essas coisinhas.

Criado 24 de março de 2009
Ultima resposta 30 de mar. de 2009
Respostas 7
Participantes 2