Chamar Relatório (ireport) com Subrelatório em Java. [RESOLVIDO]

Ola pessoal …

Hj tenho um relatório (ireport) que tem como base de dados um arquivo XML, funciona normal.

Mas agora precisei acrescentar um sub relatório nele, quando testo ele no ireport, funciona legal, mas quando chamo ele pela minha classe java, só o ralatório principal vem normal, mas os dados do sub relatório não vem, vem em branco…

Sera que estou esquecendo de declarar algo ou é alguma configuração do ireport ??

Segue minha classe java que uso para chamar meu relatório

package danfe;

[code]/**
*

  • @author Administrador
    */
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.HashMap;
    import net.sf.jasperreports.engine.JRException;
    import net.sf.jasperreports.engine.JasperFillManager;
    import net.sf.jasperreports.engine.JasperPrint;
    import net.sf.jasperreports.engine.data.JRXmlDataSource;
    import net.sf.jasperreports.view.JasperViewer;

public class Danfe {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws FileNotFoundException, IOException, JRException {
    try {
                             
             //Caminho do arquivo Danfe 
             String   relatorio = ("J:/RP-GRF/NFE-KM/ESTAB-01/EXECUTAVEIS/DANFE.jasper");
            //Configurando a classe JRXmlDataSource que apontara o caminho do  nosso XML de dados e sua pesquisa XPath geral

             JRXmlDataSource xml = new JRXmlDataSource("J:/RP-GRF/NFE-KM/ESTAB-01/XML/NOTA-  PROC.xml", "/nfeProc/NFe/infNFe/det");
            /*Gerando o relatorio (Filling) informando o caminho do relatorio, os parametros         (neste caso nenhum paramentro esta sendo passado ao relatorio, por isso o HashMap esta vazio)         e o objeto JRXmlDataSource configurado)*/
           JasperPrint jp = JasperFillManager.fillReport(relatorio, new HashMap(), xml);
            //Utilizando o JasperView, uma classe desktop do jasper para visualização dos relatorios
           JasperViewer.viewReport(jp, false);

        }

    } catch (JRException e) {
        e.printStackTrace();
    }


}

}[/code]

Qualquer ajuda é bem vinda !!
Abraços…

Boa noite,

Se você fez o relatório com subreport no formato que o IReport gera ele provavelmente deve ter adicionado $P{SUBREPORT_DIR} + “report1_subreport1.jasper” ou algo assim na propriedade Subreport expression do subreport. Isso que dizer que você precisa passar como parâmetro na hora de executar o relatório no Java o caminho onde está o subReport.

Map<String, String> params = new HashMap<String, String>();
params.put(“SUBREPORT_DIR”, caminho);

JasperPrint jp = JasperFillManager.fillReport(relatorio, params, xml);

Caso não seja esse o problema poderia detalhar melhor o que ocorre?

Edson Martins

Olá Edson…

Acredito que seja esse mesmo meu problema, mas não tinha idéia de como fazer isso, pois é meu primeiro projeto com Ireport.

Mas ficou uma duvida, talvez de iniciante rsrs.

Quando vc diz Map<String, String> params = new HashMap<String, String>(); , no lugar da String teria que vir algum valor ou agum outro parametro referente aos campos que estou chamando no sub relatório ??

Para ver se ajuda um pouco mais, no meu Ireport ficou assim:

Subreport Expression = $P{SUBREPORT_DIR} + “DANFE_subreport1.jasper”

Parameters Map Expression = $P{SUBREPORT_DIR}

Connection Expression = $P{REPORT_CONNECTION}

Pois fiz assim e ele continua vindo sem os dados do sub relatótio.

Abraços e valeu por enquanto .

Bom dia,

Entre no IReport no relatório principal e clique no subReport. Veja se ele tem uma propriedade SubReportExpression. Se tiver nessa propriedade está o nome do parâmetro que vc precisa passar ao executar no java.
O nome do parâmetro vc vai adicionar no HashMap dessa forma:

Map<String, String> params = new HashMap<String, String>();
params.put(“COLOQUE AQUI O NOME DO PARAMETRO”, COLOQUE AQUI O CAMINHO ONDE ESTÁ O SUBREPORT);

E na sequência chame o relatório passando o “params”:

JasperPrint jp = JasperFillManager.fillReport(relatorio, params, xml);

Edson Martins

Bom dia Edson …

Cara fiz como vc disse coloquei tudo certinho, mas ainda esta trazendo só o relatório principal sem as informações do sub relatorio.

olha só :

[code] //Caminho do arquivo Danfe
relatorio = (“J:/RP-GRF/NFE-KM/ESTAB-01/EXECUTAVEIS/DANFE.jasper”);

            //Configurando a classe JRXmlDataSource que apontara o caminho do  nosso XML de dados e sua pesquisa XPath geral
            JRXmlDataSource xml = new JRXmlDataSource("J:/RP-GRF/NFE-KM/ESTAB-01/XML/NOTA-     PROC.xml", "/nfeProc/NFe/infNFe/det");


            Map<String, String> params = new HashMap<String, String>();
            params.put("$P{SUBREPORT_DIR}", "J:/RP-GRF/NFE-KM/ESTAB-01/EXECUTAVEIS/");

            /*Gerando o relatorio (Filling) informando o caminho do relatorio*/    
            JasperPrint jp = JasperFillManager.fillReport(relatorio,params, xml);
          
            //Utilizando o JasperView, uma classe desktop do jasper para visualização dos relatorios
            JasperViewer.viewReport(jp, false);[/code]

Eu estava pensando o seguinte, como eu estou buscando informções de um XML, no relatório master eu tenho que informar o caminho do XML e da minha pesquisa XPath geral

JRXmlDataSource xml = new JRXmlDataSource("J:/RP-GRF/NFE-KM/ESTAB-01/XML/NOTA-     PROC.xml", "/nfeProc/NFe/infNFe/det");

E meu sub relatório usa o mesmo xml, mas a consulta Xpath Geral é diferente, será que não preciso declarar ele também ??

$P{} quer dizer que isso é uma expressão no Relatório.

Coloque apenas
params.put(“SUBREPORT_DIR”, “J:/RP-GRF/NFE-KM/ESTAB-01/EXECUTAVEIS/”);

Edson

Olá Edson…

Também ja tinha feito como vc disse e tabém não tive nenhum resultado, eu continuo achando que esta faltando alguma configuração no ireport.

Será que vc se importa de testar ai, seu lhe enviar os arquivos??

Abraços até mais

Boa tarde,

Pode mandar para edsonmartins2005@gmail.com. Assim que der eu já olho.

Depois postamos aqui a solução.

Edson Martins

Bom dia…

Gostaria de saber c vc recebeu os arquivos ??

Pois ainda não consegui resolver meu problema.

Abraços…

Bom dia,

Recebi sim. Adicionei vc no msn mas até agora não recebi sua confirmação.

Edson Martins

Fala galera…

Graças a ajuda do nosso colega Edson, consegui chamar meu sub-relatório com a base de dados em XML.

Bem de inicio era aquilo que eu imaginava falta um pouco de conhecimento na ferramenta ireport, para saber onde e como passar os parâmetros necessários.

Bem vamos La…

1° Depois que vc adicionou p subreport no relatório principal, selecione o mesmo.

2° Vá em Subreport Properties.

3° Em Subreport expression deve estar mais ou menos assim “DANFE_subreport.jasper”, que é o nome do executável do seu subrelatorio.

4° Em Expression Class tem que estar em Java.lang.String.

5° Em Connection Type selecionar: Use a datasource Expression

6° Em Data Source Expression colocar assim : ((net.sf.jasperreports.engine.data.JRXmlDataSource)$P{REPORT_DATA_SOURCE}).dataSource(“Aqui é o endereço do xphat principal de consulta do seu subrelatório.”)

8° Classe Java para chamar o relatório com o sub-reltório:

[code]import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRXmlDataSource;
import net.sf.jasperreports.view.JasperViewer;

public class Danfe {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) throws FileNotFoundException, IOException {

try {
String relatorio =("Caminho do relatorio Principal . jasper ");
//Configurando a classe JRXmlDataSource que apontara o caminho do nosso XML de dados e sua pesquisa XPath geral
JRXmlDataSource xml = new JRXmlDataSource(“J:/RP-GRF/NFE/ESTAB-02/XML/NOTA.xml”, “/NFe/infNFe/det”);
//Passando parametro para o subreport, informando o endereço do mesmo.
Map<String, Object> params = new HashMap<String, Object>();
params.put(“SUBREPORT_DIR”,“J:/RP-GRF/NFE/ESTAB-02/EXECUTAVEIS/”);

JasperPrint jp = JasperFillManager.fillReport(relatorio, new HashMap(), xml);

//Utilizando o JasperView, uma classe desktop do jasper para visualização dos relatórios
JasperViewer.viewReport(jp, false);

} catch (JRException e) {
e.printStackTrace();
}
}
}[/code]

Bem espero ter ficado claro, e também que ajude a todos.

agradeço mais uma vez a ajuda do nosso Colega EdsonMartins, que foi fundamental para a solução desse problema.

Qualquer duvida estamos ai .

Abraços.