[Resolvido] Problema para passar parametros para iReport

Galera, estou querendo gerar um contrato com o iReport, de maneira simples e fácil, de modo que os dados da pessoa (sejam passados diretamente de variáveis e não do banco) são enviados para o ireport via parâmetro.

Bom, o problema é que para passar parâmetros para o iReport, o parâmetro deve estar setado o valor Key, só que essa opção só fica acessível se jogo o parâmetro para dentro do design do relatório, mas estou querendo fazer algo assim:

"LOCADOR: " + $P{nomeLocador} + ", "+$P{estadoCivilLocador} + " portador da cédula de identidade R.G. "+ $P{rgLocador} + " e CPF/MF " + $P{cpfLocador} + "\nLOCATÁRIO: " + $P{nomeLocatario} + ", " + $P{estadoCivilLocatario} + ", portador da cédula de identidade R.G. " + $P{rgLocatario} + " e CPF/MF " + $P{cpfLocatario} +

Ao fazer essa sequência dentro de um TextField, eu não tenho acesso aos parâmetros sendo assim não sendo possível setar o valor Key deles.
Uma maneira que sei que daria certo, seria de montar pedaço por pedaço, jogar um parâmetro, depois um texto, depois outro parâmetro, mas ai o texto não ficaria “formatado com espaços necessários dos parâmetros”.
Será que daria para passar o valor dos parâmetros pelo valor do name deles??
Há outra maneira mais fácil que isso que quero fazer também?

Não sei se expliquei bem, mas qualquer coisa posso explicar novamente se precisar.

Muito obrigado desde já :smiley:

Depois que fui ver o problema que estava dando era de Encoding, e não de parametros.

Mancada minha :lol:

Vlw galera.

marlonfa

Por favor, peguei a sua explicação sobre design e key do IReport e como estou fazendo o meu primeiro relatório pelo IReport estou cheio de duvidas e espero que vc ou alguem do GUJ
possa me ajudar. O meu problema é que estou tentando imprimir um relatório parecido com uma Nota Fiscal que tem dois parametros(Inteiros) e não consigo sair da mensagem que ele da quando estou emitindo. Mensagem=O documento não contem paginas e vou mostrar a sequencia do meu programa para ver se alguem me ajuda.
Muito obrigado.

1. O Botão de chamada do relatório: quando chamo sempre dá a mensagem que o Documento não contem paginas, é como se ele não fosse no design do IReport para pegar o Select.

    private void jBImprimirNFActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // TODO add your handling code here:
        if (txtId.getText().equals("")|| (txtId.getText().equals("0"))){
            msg = " Codigo de Contas a Receber é Obrigotório para Relatório!";
            mensagemErro(msg);
            txtId.requestFocus();
            check_OK=false;
            return;
        }
       CtaReceberDao dao= null;
        try {
            dao = new CtaReceberDao();
        } catch (SQLException e) {
            Logger.getLogger(jFOs.class.getName()).log(Level.SEVERE, null, e);
        }
        try {
            listaAreceber = (ArrayList<ContasReceber>) (dao.findbyfiltrochaves(Integer.parseInt(txtIdOs.getText()), Integer.parseInt(txtId.getText()), identificador));
   
            java.sql.Connection con = jdbc.ConnectionFactory.getConnection(
                    "jdbc:postgresql://localhost:5432/Labo",
                    "postgres",
                    "admin9090");
            
                HashMap parametros = new HashMap();
                parametros.put("Os",Integer.parseInt(txtIdOs.getText()));
                parametros.put(" Nota",Integer.parseInt(txtId.getText()));
                
            System.out.println(" parametros="+parametros);
// Esse print de parametros está mostrando os dois parametros separados por virgula.
// Essas parte com barras são as tentativas que fiz atraves de estudo da internet.
//            JasperDesign design;   
            try {
                //            design = JasperManager.loadXmlDesign("src/fontes/Relatorios/" + "rptNf.jrxml"); Este loadXML não sei como fazer? e ele não reconhece
//            JasperReport jr = JasperCompileManager.compileReport("src/fontes/Relatorios/rptNf.jrxml");
//            JasperPrint jp;
//                jp = JasperFillManager.fillReport(jr, parametros, con);
             JasperPrint jp = JasperFillManager.fillReport("src/fontes/Relatorios/rptNf.jasper", parametros, con);
               JasperExportManager.exportReportToPdfFile(jp, "Notafiscal.pdf");
              JasperViewer jrv = new JasperViewer(jp, false);
              jrv.setVisible(true);
            } catch (JRException ex) {
                Logger.getLogger(jIFContasReceber.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null," Erro em Printer!");
            }
      } catch (SQLException ex) {
            Logger.getLogger(jFOs.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null," Erro em Geração do Relatório - CtaReceber!");
        }
        try {
            dao.closeConnection();
          System.out.println(" passou fechamento do relatorio");
        } catch (SQLException e) {
            Logger.getLogger(jFOs.class.getName()).log(Level.SEVERE, null, e);
        }

    }                                            

[b]2. O meu Select do design do Ireport. Quando retiro os parametros e o Where ele imprime todos os registros sem problema.[/b]
SELECT
     dentista."id" AS iddentista,
     dentista."nome" AS nomedentista,
     dentista."cnpjcpf" AS cnpjcpf,
     dentista."endereco" AS enderecodentista,
     dentista."bairro" AS bairro,
     dentista."cidade" AS cidade,
     dentista."uf" AS dentista_uf,
     dentista."cep" AS dentista_cep,
     dentista."numero" AS dentista_numero,
     paciente."id" AS idpaciente,
     paciente."nome" AS nomepaciente,
     protese."id" AS idprotese,
     protese."nome" AS protese_nome,
     os."iddentista" AS os_iddentista,
     os."idpaciente" AS os_idpaciente,
     os."id" AS os_id,
     fichas."idos" AS fichas_idos,
     fichas."id" AS fichas_id,
     fichas."idprotese" AS fichas_idprotese,
     fichas."preco" AS fichas_preco,
     fichas."quantidade" AS qtde,
     fichas."valor" AS fichas_valor,
     ctareceber."idos" AS idosctareceber,
     ctareceber."id" AS ctareceber_id,
     ctareceber."valorprevisto" AS valorprevisto,
     ctareceber."ano" AS ano,
     ctareceber."mes" AS mes,
     ctareceber."valorcredito" AS valorcredito,
     ctareceber."valordebito" AS valordebito,
     dentista."fone" AS fone,
     fichas."situacao" AS fichas_situacao
FROM
     "public"."dentista" dentista INNER JOIN "public"."os" os ON dentista."id" = os."iddentista"
     INNER JOIN "public"."paciente" paciente ON os."idpaciente" = paciente."id"
     INNER JOIN "public"."fichas" fichas ON os."id" = fichas."idos"
     INNER JOIN "public"."ctareceber" ctareceber ON os."id" = ctareceber."idos"
     INNER JOIN "public"."protese" protese ON fichas."idprotese" = protese."id"
WHERE
     (ctareceber."idos" = $P{numOs})
     and (ctareceber."id" = $P{numNota})
     and (fichas."situacao" = 'CONCLUIDA')

Bom, vamos lá, vc ta usando quais bandas no ireport?
Title, page header, colum header, detail??

Essa msg de não tem páginas, é pq o seu detail está nulo. (O campo detail é preenchido com uma query) ou seja, se vc ta usando uma query ela não está voltando nenhum dado do banco, caso não esteja usando nenhuma query, como foi no meu caso, vc pode retirar o detail do seu report e procura na opção do seu report o campo: When no data e coloque a opção para mostrar tudo menos o detail.

Ve ai q resultado vc terá e posta ai pra gente, vlw

marlonfa
[b]
O meu problema não é igual ao seu, pois o q vc falou me alertou para algo na configuração do IReport. Fui lá e relamente o jasper compile não estava configurado. Configurei para o projeto e ele mostrou a nota fiscal no java, mas, com todos os itens. Lá dentro do ireport existe as condições mas, ele não filtrou e nem pediu os parametros que dentro do IReport quando faço os testes ele me pede o numero da nota e o numero da Os e sai certinho somente com um item. Pode ser alguma configuração entre o java e o IReport em relação a parametros. vou postar novamente meu codigo.

  1. Botão Imprimir[/b]
    private void jBImprimirNFActionPerformed(java.awt.event.ActionEvent evt) {                                             
        // TODO add your handling code here:
        if (txtId.getText().equals("")|| (txtId.getText().equals("0"))){
            msg = " Codigo da Os e da Nota Fiscal é Obrigotório para o Relatório!";
            mensagemErro(msg);
            txtId.requestFocus();
            check_OK=false;
            return;
        }
        try {
            java.sql.Connection con = jdbc.ConnectionFactory.getConnection(
                    "jdbc:postgresql://localhost:5432/Labo",
                    "postgres",
                    "admin9090");
            
                HashMap parametros = new HashMap();
                parametros.put("Os",Integer.parseInt(txtIdOs.getText()));
                parametros.put(" Nota",Integer.parseInt(txtId.getText()));
                
            System.out.println(" parametros="+parametros); // o parametro está sendo passado certinho conforme numero 3 abaixo.
//            JasperDesign design;   
            try {
                //            design = JasperManager.loadXmlDesign("src/fontes/Relatorios/" + "rptNf.jrxml");
//            JasperReport jr = JasperCompileManager.compileReport("src/fontes/Relatorios/rptNf.jrxml");
//            JasperPrint jp;
//                jp = JasperFillManager.fillReport(jr, parametros, con);
             JasperPrint jp = JasperFillManager.fillReport("src/fontes/Relatorios/rptNf.jasper", parametros, con);
               JasperExportManager.exportReportToPdfFile(jp, "Notafiscal.pdf");
              JasperViewer jrv = new JasperViewer(jp, false);
              jrv.setVisible(true);
            } catch (JRException ex) {
                Logger.getLogger(jIFContasReceber.class.getName()).log(Level.SEVERE, null, ex);
                JOptionPane.showMessageDialog(null," Faltando algo. Erro em Printer!");
            }
/* solicitar pdf no modo antigo
  JRPdfExporter jpe = new JRPdfExporter();    
    String pdfFile = "../Relatorios/RelatorioCliente.pdf";   
    jpe.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, pdfFile);    
    jpe.setParameter(JRExporterParameter.JASPER_PRINT, print);    
    jpe.exportReport();  */              
        } catch (SQLException e) {
            Logger.getLogger(jFOs.class.getName()).log(Level.SEVERE, null, e);
            JOptionPane.showMessageDialog(null," Erro de conexão com o Banco!");
        }

    }  
[b]2. Query no IReport funcionando com e sem parametros. Me traz a Nota somente com um item que é o certo.[/b]
SELECT
     dentista."id" AS iddentista,
     dentista."nome" AS nomedentista,
     dentista."cnpjcpf" AS cnpjcpf,
     dentista."endereco" AS enderecodentista,
     dentista."bairro" AS bairro,
     dentista."cidade" AS cidade,
     dentista."uf" AS dentista_uf,
     dentista."cep" AS dentista_cep,
     dentista."numero" AS dentista_numero,
     paciente."id" AS idpaciente,
     paciente."nome" AS nomepaciente,
     protese."id" AS idprotese,
     protese."nome" AS protese_nome,
     os."iddentista" AS os_iddentista,
     os."idpaciente" AS os_idpaciente,
     os."id" AS os_id,
     fichas."idos" AS fichas_idos,
     fichas."id" AS fichas_id,
     fichas."idprotese" AS fichas_idprotese,
     fichas."preco" AS fichas_preco,
     fichas."quantidade" AS qtde,
     fichas."valor" AS fichas_valor,
     ctareceber."idos" AS idosctareceber,
     ctareceber."id" AS ctareceber_id,
     ctareceber."valorprevisto" AS valorprevisto,
     ctareceber."ano" AS ano,
     ctareceber."mes" AS mes,
     ctareceber."valorcredito" AS valorcredito,
     ctareceber."valordebito" AS valordebito,
     dentista."fone" AS fone,
     fichas."situacao" AS fichas_situacao
FROM
     "public"."dentista" dentista INNER JOIN "public"."os" os ON dentista."id" = os."iddentista"
     INNER JOIN "public"."paciente" paciente ON os."idpaciente" = paciente."id"
     INNER JOIN "public"."fichas" fichas ON os."id" = fichas."idos"
     INNER JOIN "public"."ctareceber" ctareceber ON os."id" = ctareceber."idos"
     INNER JOIN "public"."protese" protese ON fichas."idprotese" = protese."id"
WHERE
     (ctareceber."idos" = $P{numOs})
     and (ctareceber."id" = $P{numNota})
     and (fichas."situacao" = 'CONCLUIDA')
 
[b]3.Saida da IDE do Netbeans setando os parametros que estou enviando pelo java.[/b]
parametros={Os=4,  Nota=2}
log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment).
log4j:WARN Please initialize the log4j system properly.
CONSTRUÍDO COM SUCESSO (tempo total: 36 segundos)                                         

O seus parâmetros no ireport estão com esses nomes:

“Os” e " Nota"?

parametros.put("Os",Integer.parseInt(txtIdOs.getText()));  
parametros.put(" Nota",Integer.parseInt(txtId.getText())); 

Não sei se você colou certo aqui ou não, mas me parece que seu segundo parâmetro tem um espaço antes do Nota, e confere se realmente no seu ireport, o nome do seu parâmetro, está idêntico aos que você colocou no map.

Posta ai depois, vlw

marlonfa

Validei o q vc tinha apontado do espaço entre o campo numOs e numNota e tirei o espaço. Rodei novamente e ele me traz o relatório da Nota só que me traz o primeiro registro do banco e todos os itens do banco.
Peguei o SQL do ireport e coloquei na query do Postgres. Mudei os parametros pelo numeros da OS e NOta e funcionou certinho, me trouxe um registro com a Os numero 4 e a Nota numero 2 com um item.
Acho que o problema está entre a interface java e o IReport. Minha versão é do java é 7.3 e o IReport é 4.5

Outra coisa quando rodo dentro do IReport ele me pede os parametros definidos certinhos como inteiros e me traz a nota que estou solicitando no caso Os 4 e Nota 2. Esperava que quando fosse para o java ele me pedisse tb os parametros que estão dentro do IReport, pois setei o prompt dos parametros pra isso. Nao era pra ele fazer isso. Só que ele me mostra a nota direto e sempre o primeiro registro.

obrigado pela sua ajuda.

Então, acontece q o preview do jasper ele gera esses prompt para vc digitar pq ele reconhece que vc criou parâmetros, isso eh feito para vc poder interagir com o sistema do ireport diretamente, sem precisar usar códigos, como disse antes, para passar parâmetros para o ireport (jasper) vc deve utilizar um Map, assim como vc acabou utilizando. Então vamos tentar o seguinte agora:

1- Cole aqui o erro que aparece no seu Console qdo roda o código dentro da sua IDE
2- Abra o iReport, na esquerda da tela mostra uma lista com tudo oq vc tem no seu relatório, procura pelo item Parameters, clica nele, e ele irá listar todos os parametros que vc tem, provavelmente os que vc criou fica lá pra baixo, selecione o parametro Os e nas propriedades dele que aparece no canto direito da sua Tela, confirma se o campo Name dele está realmente como Os que vc digitou lá no parametros.put(“Os”, ).
3- Selecionado seu parametro, lá nas propriedades dele, procure o campo Expression Class, provavelmente estará com java.lang.String, que é o padrão, caso você já tenha mudado para java.lang.Integer então está certo, pois no seu map, vc está passando um Integer.
4- Sua bibliteoca do jasper é qual versão? (A biblioteca que está sendo usada pelo seu NetBeans ou Eclipse), a versão dessa biblioteca tem que ser a mesma versão do arquivo gerado pelo iReport, então lá no iReport vai em: Ferramentas -> Opções -> iReport -> Aba General -> Aba Compatibility -> e em Set Compatibility coloque a versão da biblioteca do seu jasper.

Se tudo isso que te disse já estava feito, o jeito é ver qual erro aparece pra você, ou então me enviar o seu jrxml para analisar.

vlw

marlonfa

Resolvido.
1- Não aparece erro nenhum. Parece que é problema de versão. Com a sua dica fui lá em opçoes ireport compatibidade e alterrei para versão 4.5 e estava Last Version e resolveu o problema. Parece que quando instalei a versão do plugins do IReport 4.7 ela veio com algum bug ou uma versão 4.5 pq quando fui lá e troquei pra versão 4.5 o relatorio de nota funcionou direitinho, mas não solicitou os parametros.

O Relatório de Nota Fiscal está blz. neste caso eu não preciso que aparece esses parametros pq eles estão implicito quando chamo o Relatório.
Agora o q faço em relação a versão que instalei a IReport 4.7?
Como fazer para desinstalar esta versão e instalar novamente a versão 4.5 e não desinstalar o Netbeans IDE?
O que vc me aconselha? Vc usa a versão 4.5 do IReport, qual a versão melhor para fazer meu trabalho?

Estou com outro relatório que fiz para testar, e ele tb não solicita os parametros de datas, ele emite o relatorio direto, mas ele precisa solicitar esses parametros.
Por acaso, estou com uma duvida sobre esse relatorio, quando a gente manda os parametros de datainicial e datafinal, essas datas tem que ir com dd/MM/yyyyy ou yyyy/MM/dd?
Estou enviando com YYYY/MM/DD.

No mais muito obrigado pela sua ajuda, me ajudou muito a conhecer mais o IReport.

Bom, vamos lá, vc usa windows ou linux?

Se for windows tem dois tipos de instalações do iReport, uma que é instalação para o windows mesmo, e outra vc só baixa o arquivo zip e roda ele diretamente sem instalações. Se for linux vc baixa o zip e roda ele direto tb, sem precisar instalar. Estava usando a versão 5.04 mas essa semana saiu a versão 5.1, porém a biblioteca do jasper ainda era para versão 5.04, ou seja, se vc baixar a versão 5.1 la nas opções de compilação não terá versão 5.1, terá somente versão 5.04, então configure assim, vou postar os links para você:

Baixe ai os arquivos:

Baixe o arquivo:

Bom, após baixar o jasperreports-5.1.0-project.zip procure pela pasta lib e copie os seguintes jar’s para o seu projeto:

  • commons-beanutils-1.8.0.jar
  • commons-collections-2.1.1.jar
  • commons-digester-2.1.jar
  • commons-logging-1.1.1.jar
  • iText-2.1.7.js2.jar
    E o próprio: jasperreports-5.1.0.jar que você baixou separado.

Bom, é assim que estou usado, caso de alguma exceção do tipo classnotfoundexception, é só ver qual classe ele acusa de não ter e procurar naquela pasta lib o jar correspondente.

Qto a data, qdo vc usa o preview do iReport, lá vc digita a data assim: yyyy/MM/dd, já no java vc poderá passar a data assim: dd/MM/yyyyy

Qualquer coisa só postar novamente, abraços.

marlonfa

Fiz o que vc mandou baixei os arquivos só que antes de instalar deixe explicar como é minha instalação. Instalei o IReport com os plugins do Netbeans onde a ferramenta fica adicionada a propria ide do netbeans. Esses arquivos que baixei dessa versão quando instalar vai ficar separada da Ide do Netbeans?
Gostaria de instalar do mesmo jeito com os plugins do netbeans para essa versão, será que existe? vou procurar mais pra ver se encontro.
Queria sua opinião sobre isso que relatei. Grato mais uma vez.

Na minha opinião qto mais vc se liberta da IDE melhor é. Imagina se vc tiver que migrar tudo para o eclipse? Ou uma versão do netbeans q não é a versão que vc usa? Ai vc ficará na mão.
Acho q vc deveria aprender a usar as coisas sem depender da IDE.

Bom, minha opinião é claro.