IReport - Subrelatorios

6 respostas
rodrigobraz

olá!

estou tentando usar mais de um subreport, mas somente os dados do primeiro subreport aparecem no relatório!

se eu trocar de posição, os dados do outro que nao aparecia, aparece no relatório =/

estou usando conexão por objetos (JRDataSource).

eu não sei se isso é uma limitação do jasper ou se depende de alguma configuração para poder usar mais de um subreport…

alguém sabe?

vlw

6 Respostas

Paezani

é pra funcionar sim!!!
Vc está passando os parametros do primeiro subrelatório pra o segundo?

Pode ser que seja isso!

rodrigobraz

não.

eu passo os parâmetros dos subreports para o relatório principal.

os subreports coloquei na aba details do relatório principal.

estou chamando o viewer assim:

String master = C:\Java\iReport-3.0.0\relatorios\Contrato_.jasper;

String coobrigados = C:\Java\iReport-3.0.0\relatorios\Coobrigados.jasper;

String intervenientes = C:\Java\iReport-3.0.0\relatorios\Intervenientes.jasper;

String produtos = C:\Java\iReport-3.0.0\relatorios\Produtos.jasper;

String titulos = C:\Java\iReport-3.0.0\relatorios\Vencimentos.jasper;
Map param = new HashMap();
    param.put("pathSubRelCoobrigados", coobrigados );
    param.put("pathSubRelProdutos", produtos );
    param.put("pathSubRelIntervenientes", intervenientes );
    param.put("pathSubRelVencimentos", titulos );

    ContratoDataSource cds = new ContratoDataSource(campanha);

    JasperPrint print = JasperFillManager.fillReport(
                master,
                param,
                cds );

    JasperViewer jasper = new JasperViewer( print, true );
    jasper.setVisible( true );

neste “ContratoDataSource”, dentro do método “getFieldValue(JRField field)”, faço a chamada para os dados dos subreports assim:

else if ( ListaVencimentos”.equals( field.getName() ) ) {

valor = new TitulosDataSource( campanha.getLstTitulos() );

}

else if ( ListaProdutos”.equals( field.getName() ) ) {

valor = new ProdutosDataSource( campanha.getLstProdutos() );

}

else if ( ListaCoobrigados”.equals( field.getName() ) ) {

valor = new CoobrigadosDataSource( campanha.getLstCoobrigados() );

}

else if ( ListaIntervenientes”.equals( field.getName() ) ) {

valor = new IntervenientesDataSource( campanha.getLstIntervenientes() );

}

…

o estranho é q somente o primeiro subreport mostra os dados…

se eu trocar de posição, o que não mostrava passa a mostrar os valores…

TheKill

[quote=rodrigobraz]

else if ( "ListaVencimentos".equals( field.getName() ) ) { valor = new TitulosDataSource( campanha.getLstTitulos() ); } else if ( "ListaProdutos".equals( field.getName() ) ) { valor = new ProdutosDataSource( campanha.getLstProdutos() ); } else if ( "ListaCoobrigados".equals( field.getName() ) ) { valor = new CoobrigadosDataSource( campanha.getLstCoobrigados() ); } else if ( "ListaIntervenientes".equals( field.getName() ) ) { valor = new IntervenientesDataSource( campanha.getLstIntervenientes() ); }

Amigo uma pergunta, esse field é igual para todos os 4 IF´s ???

Esta tratando de valores diferentes com o mesmo field??

rodrigobraz

sim.

ele vai jogando os valores nos campos do relatório.

public class ContratoDataSource implements JRDataSource {

    private Campanha campanha;
    private int count = 0;

    public ContratoDataSource( Campanha campanha ) {
        this.campanha = campanha;
    }

    @Override
    public boolean next() throws JRException {
        return ++count == 1;
    }

    @Override
    public Object getFieldValue(JRField field) throws JRException {
        Object valor = null;

        ContratoCampanha contrato = campanha.getContrato();

        if ( "MunicipioForo".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getMunicipioForo() : "-";
        }
        else if ( "IdDoctoContrato".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getIdDoctoContrato() : "-";
        }
        else if ( "DtEmissao".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getDataEmissao() : "-";
        }
        else if ( "NomeCooperado".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getNomeCooperado() : "-";
        }
        else if ( "IdCooperado".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getIdCooperado() : 0;
        }
        else if ( "RgCooperado".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getRgCooperado() : "-";
        }
        else if ( "CpfCooperado".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getCpfCooperado() : "-";
        }
        else if ( "NomeCampanha".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getNomeCampanha() : "-";
        }
        else if ( "VlrTotal".equals( field.getName() ) ) {
            valor = contrato != null ? contrato.getValorTotal() : "-";
        }

        else if ( "ListaVencimentos".equals( field.getName() ) ) {
            valor = new TitulosDataSource( campanha.getLstTitulos() );
        }
        else if ( "ListaProdutos".equals( field.getName() ) ) {
            valor = new ProdutosDataSource( campanha.getLstProdutos() );
        }
        else if ( "ListaCoobrigados".equals( field.getName() ) ) {
            valor = new CoobrigadosDataSource( campanha.getLstCoobrigados() );
        }
        else if ( "ListaIntervenientes".equals( field.getName() ) ) {
            valor = new IntervenientesDataSource( campanha.getLstIntervenientes() );
        }
        
        else {
            valor = "";
        }

        return valor;
    }

}
rodrigobraz

consegui resolver…

na propriedade “Tipo de Aumento” dos subreports estava selecionado a opção “relativo ao objeto mais alto”.

troquei para “não aumentar” e funcionou =]

TheKill

Legal entao hehehe ^^

Criado 28 de outubro de 2009
Ultima resposta 28 de out. de 2009
Respostas 6
Participantes 3