Ajuda (passar sql por parametro ) ao ireports {RESOLVIDO}

15 respostas
L
Caros amigos, alguem nao teria um metodo para que eu pudesse parassar por parametro o sql ao ireports? ja teste um milhao de tutoriais e nao estou conseguindo. tipo assim eu queria em um textfield digitar o numero da "nota" e mandar imprimi-la em um botao. Preciso terminar meu projeto de estagio urgente.
public void relat_nota() {
  try 
  {
      con.conecta();
      con.executeSQL("SELECT * FROM produtosvenda, notaf WHERE nf_numero=vend_codigonotaf AND vend_codigonotaf="
                     +tf_numerodanota.getText());
      JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
      JasperPrint jasperPrint = JasperFillManager.fillReport(
      "/Estoque/relatorio/rel_nota.jasper/", new HashMap(), jrRS);
      
        JasperViewer.viewReport(jasperPrint);
      
       JasperViewer.viewReport(jasperPrint, false);   
       HashMap parameters = new HashMap();     
       parameters.put("tf_numerodanota", tf_numerodanota); 
       //map.put("tf_numerodanota", tf_numerodanota);
   
      
  } catch (Exception erro){
             JOptionPane.showMessageDialog(null,"deu erro ="+erro);
   }
}

Ja no ireports coloquei assim a query:

SELECT * FROM produtosvenda, notaf WHERE nf_numero=vend_codigonotaf AND vend_codigonotaf='tf_numerodanota'
ele me tras todos os campos mas na hora q compilo ele dis "The document has no pages".

obviamente ao digitar no text field do meu formulario ele teria que trazer especificamente a nota que quero. mas continua trazendo TUDO.

SE ALGUEM PUDER ME ENSINAR FICAREI ETERNAMENTE GRATO.

15 Respostas

F

Bem pelo que eu vi rapidamente o erro está aqui

parameters.put("tf_numerodanota", tf_numerodanota);

tf_numerodanota não é o seu JTextField? Vc está jogando o JTextField inteiro como parametro??? :shock: :shock:

Tenta isso:

parameters.put("tf_numerodanota", tf_numerodanota.getText());

Qualquer coisa posta o resultado.

OBS.: Declarou o parâmetro no XML do IReport???

V
Vc não irá conseguir assim, o ireport não tem nada a ver com a sua aplicação, só o arquivo .jasper vc não pode passar essa instrução no ireport:
SELECT * FROM produtosvenda, notaf WHERE nf_numero=vend_codigonotaf AND vend_codigonotaf='tf_numerodanota'

Ele não está conseguindo achar as condições por causa do textfield que é dá aplicação, seu eu intendi foi isso, vc tem que fazer o seguinte, selecionar todos os dados lá no ireport, as condições vc terá que fazer dentro dá propria aplicação no método que chama o relatório.

public void  report() {
    
try{
conexao con_relatorio; //sua classe de conexão
       String sql = "select * from produtosvenda, notaf where nf_numero=vend_codigonotaf and vend_codigonotaf='"+tf_numerodanota.getText+"'";//o get aqui tb não estava do jeito certo
        con_relatorio.conecta();
        con_relatorio.execultesql(sql);
        JRResultSetDataSource jrRS = new JRResultSetDataSource(con_relatorio.resultset);
        JasperPrint jasperPrint = JasperFillManager.fillReport (
        "C:/desenvolvimento/meujasper.jasper", new HashMap(), jrRS);
        JasperViewer.viewReport(jasperPrint, false);
    }
catch (Exception erro){
    JOptionPane.showMessageDialog(null, "Erro ao Lançar Relatório "+erro);
}
}
}

tenta aii, posta qualquer coisa, segue bem esse método e o que eu te flei, que irá conseguir

L

caro amigo vinciusgundim

refis o codigo do jeito que voce me disse , mas nesse trecho

String sql = "select * from produtosvenda, notaf where nf_numero=vend_codigonotaf and vend_codigonotaf='"+tf_numerodanota.getText+"'";//o get aqui tb não estava do jeito certo

da um errinho falando q nao achou a “variable getText” dai tentei colocar “getText()” mas mesmo assim nao deu.
lembrando q la no sql do jasper eu coloquei conforme solicitado por vc: “select * from produtosvenda, notaf;”
qdo compilo a aplicacao e coloco o numero desejado ainda retorna todos os itens tipo a primeira nota mas com todos os valores e campos do banco…

agradeco desde ja pela ajuda dos AMIGOS… :slight_smile:

F

Já criou alguma aplicação com passagem de parâmetros no IReport???

Os dados contindos nos relatórios não sãos os mesmos do qual vc cria o .jasper utilizadando o modelo no IReport. A consulta que vc cria lá é exatamente para vc montar um modelo. Não tem nada a ver com os dados que realmente estarão no relatório final.

Logo e repito (PELA APLICAÇÃO) você lança os dados no .jasper e ele encaixará a cada campo em seu lugar preparado no modelo. Se fosse o caso, vc teria de criar um modelo para cada tipo de relatório sendo que 2 modelos fosse exatamente iguais e que só mudassem o título.

Vc pode mudar as condições no WHERE do select da aplicação. E assim responder os dados que vc quer naquele relatório e mudar o título com um parâmetro. E vc ao invés de usar 2 modelos, usa apenas 1 que realiza a mesma coisa.

E olha o seu HashMap está como Default. Não existe passagem de parâmetros no modelo em que vc criou. O problema referido é àquele a qual estou dizendo. No parâmetro ele está lançando o JTextField e no caso para o parâmetro é o getText() que faz importancia.

Tenta esse código:

public void gerarRelatorioTotalizadoLoja(Date dataInicial, Date dataFinal) {
		try {
			con.conecta();
      con.executeSQL("SELECT * FROM produtosvenda, notaf WHERE nf_numero=vend_codigonotaf AND vend_codigonotaf="
                     +tf_numerodanota.getText());

		JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);

		Map<String, String> parameters = new HashMap<String, String>();
			
		parameters.put("tf_numerodanota", Integer.valueOf(tf_numerodanota.getText())); 

		JasperFillManager.fillReportToFile(
			"/Estoque/relatorio/rel_nota.jasper", parameters, jrRS);

		JasperViewer.viewReport("/Estoque/relatorio/rel_nota.jrprint",
			false, false);

		// Não se esqueça de fazer a desconexão com o Banco	
		//desconectar();

			File file = new File("/Estoque/relatorio/rel_nota.jrprint");
			file.delete();			
		} catch (Exception erro) {
			JOptionPane.showMessageDialog(null,"deu erro ="+erro);
		// Não se esqueça de fazer a desconexão com o Banco	
		//desconectar();
		}
	}
V

Faz o seguinte monte essa String sql novamente, String sql = "select * from produtosvenda, notaf where nf_numero=vend_codigonotaf and vend_codigonotaf='"+textfild.getText()+"'";//coloque o nome do seu campo de texto.
e aiii vc me diz se deu certo ou não, se não mande todo o seu metodo, que está chamando o relatório que irei olhar…

T++

L

Eis que estou utilizando …

import java.io.IOException;

import java.io.StringReader;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.HashMap;

import javax.swing.text.BadLocationException;

import javax.swing.text.rtf.RTFEditorKit;
import net.sf.jasperreports.engine.JRException;

import net.sf.jasperreports.engine.JRResultSetDataSource;

import net.sf.jasperreports.engine.JasperCompileManager;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.view.JasperViewer;

import net.sf.jasperreports.engine.JasperPrintManager;

public class releeee {

private ResultSet rs = null;
public String relatw;

//--------- recebe a conexao geral ---------------------
public java.sql.Connection conex;

public releeee(java.sql.Connection cong) {

//--------- conexao do banco de dados ------------------
conex = cong;

//--------- consulta sql -------------------------------
String selectw = “Select * from tabela”;

//--------- nome do relatorio.jasper -------------------
relatw = “Relatorio.jasper”;

try {
        Statement statement = conex.createStatement();
        rs = statement.executeQuery(selectw);  //"select Nome, CProduto, Unidade from esprodutos"

		JRResultSetDataSource jrRS = new JRResultSetDataSource(rs);

		JasperPrint jasperPrint = JasperFillManager.fillReport(
			relatw, new HashMap(), jrRS);
		
		JasperViewer.viewReport(jasperPrint, false);   			//  OK  - visualizar a pagina
// OU

//	JasperPrintManager.printPage(jasperPrint, 0, false);    //  OK  - direto para impressora

}

catch (Exception e) {

System.err.println("Problemas de conexao com o banco de dados… ");

e.printStackTrace();

}

}

}

/*

  • estando conectado ao banco de dados, vc tranfere-a, (podendo ser um pool de conexao)

  • para chamar o relatorio faz assim:

releeee abre = new releeee(minha_conexao);
*/

M

amigo vou postar exatamente como faço na minha aplicação...ja apanhei muito ...o primeiro código é o botao que tem na minha aplicação pra gerar e chamar o relatorio....o segundo é o código la no ireport ok..

try {
                con.executeSQL("SELECT * FROM tbl_venda, tbl_lancamento WHERE tbl_venda.serial_codigo_venda='"
                        + lbTxCodigo.getText() + "'and tbl_venda.varchar_orcaped_venda= 'COTAÇÃO' AND tbl_lancamento.serial_codigo_venda='" + lbTxCodigo.getText() + "'");
                //con.rs.next();
                JRResultSetDataSource jr = new JRResultSetDataSource(con.rs);
                HashMap parametro = new HashMap();
                parametro.put("CODIGO_LABEL", lbTxCodigo.getText());
                JasperPrint jp = JasperFillManager.fillReport("./compras.jasper", parametro, jr);
                JasperViewer.viewReport(jp, false);

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

e aqui é o select que passei la no jasper ireport....

<queryString><![CDATA[SELECT
     tbl_venda."varchar_cliente_venda" AS tbl_venda_varchar_cliente_venda,
     tbl_venda."varchar_orcaped_venda" AS tbl_venda_varchar_orcaped_venda,
     tbl_venda."double_totalvenda_venda" AS tbl_venda_double_totalvenda_venda,
     tbl_venda."date_data_venda" AS tbl_venda_date_data_venda,
     tbl_lancamento."varchar_produto_lancamento" AS tbl_lancamento_varchar_produto_lancamento,
     tbl_lancamento."double_valorunitvista_lancamento" AS tbl_lancamento_double_valorunitvista_lancamento,
     tbl_lancamento."numeric_qtde_lancamento" AS tbl_lancamento_numeric_qtde_lancamento,
     tbl_lancamento."double_totalitemvista_lancamento" AS tbl_lancamento_double_totalitemvista_lancamento
FROM
     "public"."tbl_venda" tbl_venda INNER JOIN "public"."tbl_lancamento" tbl_lancamento ON tbl_venda."serial_codigo_venda" = tbl_lancamento."serial_codigo_venda"]]></queryString>

	<field name="tbl_venda_varchar_cliente_venda" class="java.lang.String"/>
	<field name="tbl_venda_varchar_orcaped_venda" class="java.lang.String"/>
	<field name="tbl_venda_double_totalvenda_venda" class="java.lang.Double"/>
	<field name="tbl_venda_date_data_venda" class="java.sql.Date"/>
	<field name="tbl_lancamento_varchar_produto_lancamento" class="java.lang.String"/>
	<field name="tbl_lancamento_double_valorunitvista_lancamento" class="java.lang.Double"/>
	<field name="tbl_lancamento_numeric_qtde_lancamento" class="java.math.BigDecimal"/>
	<field name="tbl_lancamento_double_totalitemvista_lancamento" class="java.lang.Double"/>

qualquer coisa da um to que ai que a gente se vira

L

Ufaaaa ate que enfim deu certo… apos a ajuda e as dicas do companheiros acima…

muito obrigado a todos e em especial ao vinicius gumdim… Consegui desvendafr mais esse misterio do java. rsrsrsrs

um grande abraco a todos e se alguem precisar ou tiver a mesma dificuldade que tive manda msg particular que mostro como foi feito…

valeu galeraaaa!!!

M

leandro.augusto:
Ufaaaa ate que enfim deu certo… apos a ajuda e as dicas do companheiros acima…

muito obrigado a todos e em especial ao vinicius gumdim… Consegui desvendafr mais esse misterio do java. rsrsrsrs

um grande abraco a todos e se alguem precisar ou tiver a mesma dificuldade que tive manda msg particular que mostro como foi feito…

valeu galeraaaa!!!


cara, posta ai…pra gente ter …pois quando alguem procurar no google sobre o jasper ireport, se tópico aparecerá com as idéias do companheiro e com a sua finalizada e criteriosa por ti.

L

Ta na mao!!!!

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.view.JasperViewer;
/**



// aqui vai o método 

public void  report() {
try{
        //****SE O JTEXTFIELD FOR DIFERENTE DE VAZIO, ELE ATRIBUI A SEGUINTE QUERY PARA A VARIÁVEL SQL****//
    if (!jtf_relatorio_cdv.getText().equals("")){
     sql = "select * from vendas where cod = '"+jtf_relatorio_cdv.getText()+"'";
    }
    else {
     sql = "select * from vendas";
    }
        con_relatorio.conecta();
        con_relatorio.execultesql(sql);
        JRResultSetDataSource jrRS = new JRResultSetDataSource(con_relatorio.resultset);
        JasperPrint jasperPrint = JasperFillManager.fillReport (
        "c:/projeto/relatorio.jasper", new HashMap(), jrRS);
        JasperViewer.viewReport(jasperPrint, false);
    }
catch (Exception erro){
    JOptionPane.showMessageDialog(null, "Erro ao Lançar Relatório "+erro);
}
}
}
L

Parabens Leandro

Assim conseguimos vencer os obstáculos …

V

É isso ai Leandroo…

Valeu kra qualquer coisa estamos ai…!

T++ Deus abençoi

L

valeu galera… voces sao parceros!!! 1 um grande abraço!!!

R

Olá galera!

Estava olhando o tópico e estou com um problema parecido com o do amigo.
gostaria de saber se tem como criar um relatório e no aplicativo o usuario digitar a pesquisa para gerar o relatório.

Fiz um relatório e criei um parametro CODIGO_SAIDA, exemplo where saida_cab.COD_SAIDA_CAB = $P(CODIGO_SAIDA) isto dentro do ireporter

Até aqui beleza pois consigo gerar o relatório onde ele pede pra mim digitar o codigo e assim gera o relatório.

mas quando entro no aplicativo ele me retorna a msg dizendo que o documento não possui pagina

na aplicação está assim:

try {

java.sql.Connection con = new ConexaoMsql().getConnection();

HashMap parametros = new HashMap();

parametros.put(CODIGO_SAIDA,(1));// aqui funciona pois já está configurando o parametro e ele me tras a pagina referente a saida pelo codigo

JasperPrint jp = JasperFillManager.fillReport("/home/tecnico/Modelos/Siscor/Relatórios/RelSaidas.jasper", parametros, con);

JasperViewer jrv = new JasperViewer(jp);

JasperViewer.viewReport(jp, false);
} catch (Exception e) {
        e.printStackTrace();
    }

O que eu gostaria é deixar no aplicativo como aparece dentro do ireporter uma tela onde o usuario digitaria o parametro para ele gerar o relatório.

Fico no aguardo e agradeço por enquanto…

L

Bom dia …

entao caro amigo ribeiro…

da uma olhadinha nesse trecho de codigo abaixo :

public void  report() {
try{
        //****SE O JTEXTFIELD FOR DIFERENTE DE VAZIO, ELE ATRIBUI A SEGUINTE QUERY PARA A VARIÁVEL SQL****//
    if (!tf_datainicial.getText().equals("")){

       sql = "select * from produtosvenda, notaf where nf_numero = vend_codigonotaf and nf_datavenda between'"+tf_datainicial.getText()+"'and'"+tf_datafinal.getText()+"'";

    }
    else {
     sql = "select * from produtosvenda, notaf";
    }
        con_relatorio.conecta();
              sql = "select * from produtosvenda, notaf where nf_numero = vend_codigonotaf and nf_datavenda between'"+tf_datainicial.getText()+"'and'"+tf_datafinal.getText()+"'";
       con_relatorio.executeSQL(sql);
        JRResultSetDataSource jrRS = new JRResultSetDataSource(con_relatorio.resultset);
        JasperPrint jasperPrint = JasperFillManager.fillReport (
        "/Estoque/relatorio/rel_geral_vendas.jasper/", new HashMap(), jrRS);
        JasperViewer.viewReport(jasperPrint, false);
    }
catch (Exception erro){
    JOptionPane.showMessageDialog(null, "Erro ao Lançar Relatório ");
}
}

Eu agora utilizo dessa forma… assim vomo foi passado pelos amigos do forum aqui…

pelo que entendi o que vc disse:"O que eu gostaria é deixar no aplicativo como aparece dentro do ireporter uma tela onde o usuario digitaria o parametro para ele gerar o relatório.

"
Eu digito em um text field e o metodo coloco em um botao que ira chamar meu relatorio com o “dado” especifoco que coloquei no meu Textfield.
Abrasss e ate…

Criado 14 de junho de 2010
Ultima resposta 15 de nov. de 2010
Respostas 15
Participantes 6