Selecionar apenas um registro da tabela no relatorio ireport.[RESOLVIDO]

Ola amigos, estou com outro problema.
Quando executo a minha aplicação, o relatorio que criei no ireport, pega todos os registros e os coloca um em cada pagina, eu gostaria de saber como fazer para selecionar apenas um determinado registro. Por exemplo, quero que apareça no relatorio apenas os dados do credor cujo o numero do registro seja 1000.
Minha tabela tem os seguintes campos:

favorecido
cnpj/cpf
data
valor
numero_pag (este aqui recebe a numeração automatica e é o que preciso que seja a referencia do relatorio)

No ireport criei um formulario que busca na minha tabela pagamentos, estes campos supra citados, só que ele mostra todos os registros, um em cada pagina, eu quero que ele mostre somente o favorecido, cnpj/cpf, data, valor do numero_pag 1000 por exemplo, como faço isso?
Usei a seguinte query no sql:

SELECT
favorecido
cnpj/cpf
data
valor
numero_pag

FROM
pagamentos

Andei lendo que tenho que colocar uma cláusula WHERE e definir parâmetros, mas como sou meio leigo no assunto, não sei como fazer.
E tambem na classe java, no netbeans que segue abaixo, tambem não sei o que fazer.

package Relatorios;

import Utilitarios.Conexao;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

public class TedCaixa{

Conexao con = new Conexao();

public TedCaixa(){

try
{
con.conecta();
con.executeSQL(“select * from pagamentos”);
JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
JasperReport report = (JasperReport) JRLoader.loadObject(“tedcaixa.jasper”);
JasperPrint relatorio = JasperFillManager.fillReport(report, new HashMap(), jrRS);
JasperViewer viewer = new JasperViewer(relatorio,false);
viewer.setTitle(“Relatório de Pagamentos”);
viewer.setVisible(true);
viewer.show();

}

catch (Exception erro)
{
JOptionPane.showMessageDialog(null, " Relatorio não localizado " + erro);

}
}

public static void main (String args[])
{
TedCaixa app = new TedCaixa();

}
}

Está funcionando direitinho, só falta mesmo me pedir pra selecionar o numero_pag desejado e imprimir somente o registro correspondente a este numero_pag.
Aguardo a ajuda de vcs, um abraço a todos.

SELECT * FROM pagamentos WHERE numero_pag = 100

essa consulta retorna somente o registro de numero 100

Ok, mas eu quero que o programa me pergunte qual registro eu quero, ao invés de eu ja deixar na query, como vc fez acima, no lugar do 100, tenho que por um parametro, como faço?. Obrigado

Tópicos com título em maiúsculo serão deletados!

Sou novo aqui, não sabia.
Porque não pode ser tudo com letra maiúscula? Gostaria muito de saber

Oi sammarino1975. Desculpa o atraso na chegada.

Nos fóruns em geral(não só aqui) o pessoal costuma evitar o uso de maiúsculas porque fica parecendo que você tá gritando, entende? Sugiro que edite o título do post para não tê-lo deletado como avisou o outro colega aí.

Agora sobre o seu problema aí com critério no relatório, isso é simples, mas tem umas etapas pra seguir.

Obs.: exemplo montado a partir da versão 4.0.0, mas funciona em anteriores do mesmo jeito.

Comece definindo um parâmetro no seu relatório. Você pode usar a janela Report Inspector (fica do lado esquerdo). Se ela não estiver aberta, vá em Janela → Report Inspector.

Dê um botão direito em Parameters e selecione Adicionar Parameter. Foi criado parameter1. Com ele selecionado, veja as propriedades. É interessante alterar o nome dele. Vou usar como exemplo P_CODIGO. Pode alterar o Parameter Class se quiser, mas pra começo pode deixar como String que funcionará. Desmarque a opção “Use as a prompt”. Como “Default Value Expression” coloque “1000” (com aspas, se tiver deixado o Parameter Class como String).

Agora você vai inserir esse parâmetro no select do relatório. Como você usa passar o select via código na aplicação, sua alteração acontecerá aqui: onde estiver

con.executeSQL("select * from pagamentos"); 

você vai colocar:

com.executeSQL("SELECT  favorecido, cnpj/cpf, data, valor, numero_pag FROM pagamentos where numero_pag = $P{P_CODIGO}");

Em seguida precisa criar um objeto para guardar o parâmetro. Acrescente essa linha:

HashMap parametro = new HashMap(); parametro.put("P_CODIGO", txtCodigo.getText());

Aqui estou sugerindo que na tela onde você chama o teu relatório há um jTextField chamado txtCodigo. Você está pegando o valor dele e passando ao objeto parametro através do método put e está dizendo que esse valor vai para o parâmetro chamado P_CODIGO. Um relatório pode ter quantos parâmetros quiser.

Para finalizar, basta alterar essa linha:

JasperPrint relatorio = JasperFillManager.fillReport(report, new HashMap(), jrRS);

para

JasperPrint relatorio = JasperFillManager.fillReport(report, parametro, jrRS);

Vou te mandar por MP também, se o tópico for excluído você recebe de outro jeito

Obrigado meu amigo, vou tentar fazer.
Tenho outra duvida. No sql do ireport, la no relatorio, eu tenho que mudar algo?

Hummm… cara… então você ainda tem algo confuso aí, e eu tava mesmo achando estranho.
Se você tem o select lá no seu relatório, aí mudam as coisas, porque você não precisa escrevê-lo também na aplicação. A instrução que está entre aspas nessa linha é exatamente como tem que ficar no seu relatório:

com.executeSQL("SELECT  favorecido, cnpj/cpf, data, valor, numero_pag FROM pagamentos where numero_pag = $P{P_CODIGO}");

E pra ir mais direto ao assunto, o seu código muda. Agora vai ficar assim:

package Relatorios;

import Utilitarios.Conexao;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;


public class TedCaixa{

Conexao con = new Conexao();


public TedCaixa(){

try
{
con.conecta();

/* estas duas linhas saem. Você não precisa passar o resultado do select para o relatório se o select já estiver lá dentro dele.
  con.executeSQL("select * from pagamentos");
  JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
*/

HashMap parametro = new HashMap();  // criando objeto para armazenar parâmetro
parametro.put("P_CODIGO", txtCodigo.getText()); // definindo o nome e o valor do parâmetro
JasperReport report = (JasperReport) JRLoader.loadObject("tedcaixa.jasper");

// JasperPrint relatorio = JasperFillManager.fillReport(report, new HashMap(), jrRS); essa linha será substituída pela outra abaixo:

JasperPrint relatorio = JasperFillManager.fillReport(report, parametro, con.conecta()) // essa linha vai dar certo se esse método conecta() estiver retornando um objeto do tipo Connection
JasperViewer viewer = new JasperViewer(relatorio,false);
viewer.setTitle("Relatório de Pagamentos");
viewer.setVisible(true);
viewer.show();

}

catch (Exception erro)
{
JOptionPane.showMessageDialog(null, " Relatorio não localizado " + erro);

}
}

public static void main (String args[])
{
TedCaixa app = new TedCaixa();

}
}   

Oi meu amigo, fiz como vc passou, mas esta dando erro em duas linhas do codigo no Netbeans, quando fica sublinhado de vermelho e com uma bolinha vermelha a esquerda, dê uma olhada, está marcado em negrito só o que aparece sublinhado:

O primeiro tf_pag, diz:
cannot find symbol
symbol: variable tf_pag
location: class Relatorios.Teste

o segundo fillReport, diz:
cannot find symbol
symbol: method fillReport(net.sf.jasperreports.engine.JasperReport,java.util.HashMap,boolean)
location: class net.sf.jasperreports.engine.JasperFillManager

package Relatorios;

import Utilitarios.Conexao;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

public class Teste{

Conexao con = new Conexao();

public Teste(){

try
{
con.conecta();

HashMap parametro = new HashMap(); // criando objeto para armazenar parâmetro
parametro.put(“P_CODIGO”, tf_pag.getText()); // definindo o nome e o valor do parâmetro
JasperReport report = (JasperReport) JRLoader.loadObject(“C:/Pagamentos/relatorios/teste.jasper”);

JasperPrint relatorio = JasperFillManager.fillReport(report, parametro, con.conecta());
JasperViewer viewer = new JasperViewer(relatorio,false);
viewer.setTitle(“Relatório de Pagamentos”);
viewer.setVisible(true);
viewer.show();

}

catch (Exception erro)
{
JOptionPane.showMessageDialog(null, " Relatorio não localizado " + erro);

}
}

public static void main (String args[])
{
Teste app = new Teste();

}
}

Mas quando mando executar esta classe, executa normalmente, mas continua pegando todos os dados da tabela e colocando um em cada pagina, gerando umas 5 paginas de relatorio, não está me perguntando qual registro eu quero imprimir.

E quando tento executar o formulario que chama a classe acima atraves do botao Teste deste formulario onde tem um campo de texto tf_pag, que busca na tabela o numero_pag, aparece o erro abaixo:

Relatorio nao localizado java.lang.RuntimeException: Uncompilable source code

e não aparece mais nada.

Obs: Criei um relatorio com o ireport e dei o nome de teste.jasper, ele está funcionando, dentro do ireport, corretamente, me pedindo pra escolher o numero do pag que quero imprimir atraves de uma janelinha que pede pra colocar o paramentro, ai eu coloco o numero do pag e ele gera apenas aquele registro. Coloquei o parametro P_CODIGO neste relatorio e a query dele é

select
numero_pag,
debitar,
favorecido,
cpf_cnpj,
banco,
numero_banco,
agencia,
conta_corrente,
valor,
extenso,
empenho
from
pagamentos
where
numero_pag = $P{P_CODIGO}

Depois criei um Arquivo java vazio, onde colei o codigo que vc me passou, este ai acima, fiz as alterações para teste mas dá os erros acima. E esta classe é chamada no botao Teste do formulario Escolhe Pagamento, onde coloquei o seguinte codigo pra chamar a classe: new Relatorios.Teste();

Outra coisa, fiz este formulario Escolhe Pagamento, onde coloquei 4 botões, cada um chama um relatorio especifico atraves do codigo: new Relatorios.nomedorelatorio();
Será que isto esta correto?
No caso, o campo tf_pag fica neste formulario e não na classe do relatorio que ele chama.
Aguardo resposta, e mais uma vez peço desculpas por tomar seu tempo e agradeço a sua atenção comigo.

A respeito do erro do campo tf_pag que se encontra no formulario escolhe pagamento, eu mudei a linha de codigo:

parametro.put(“P_CODIGO”, tf_pag.getText());

para

parametro.put(“P_CODIGO”, Formularios.EscolhePagamento.tf_pag.getText());

Ai me dizia que o acesso deste campo era privado, fui la no formulario e mudei em propriedades, de privado para public static, ai o erro sumiu da classe nesta linha, mas continua dando um erro quando clico no botao Teste, que chama a classe do relatorio Teste, aparece assim:

Relatorio nao localizado java.lang.RuntimeException: Uncompilable source code

Isso que eu fiz mudou alguma coisa?

Fiz outra coisa que sumiu com o outro erro:

mudei o codigo assim:

package Relatorios;

import Utilitarios.Conexao;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

public class Teste{

Conexao con = new Conexao();

public Teste(){

try
{
//con.executeSQL("select * from pagamentos");
con.conecta();

HashMap parametro = new HashMap();  // criando objeto para armazenar parâmetro

parametro.put("P_CODIGO", Formularios.EscolhePagamento.tf_pag.getText()); // definindo o nome e o valor do parâmetro
JasperReport report = (JasperReport) JRLoader.loadObject("C:/Pagamentos/relatorios/teste.jasper");
[b]JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);[/b]
JasperPrint relatorio = JasperFillManager.fillReport(report, parametro, [b]jrRS[/b]); // essa linha vai dar certo se esse método conecta() estiver retornando um objeto do tipo Connection
JasperViewer viewer = new JasperViewer(relatorio,false);
viewer.setTitle("Relatório de Pagamentos");
viewer.setVisible(true);
viewer.show();
}

catch (Exception erro)
{
JOptionPane.showMessageDialog(null, " Relatorio não localizado " + erro);
}

}

public static void main (String args[])
{
Teste app = new Teste();
}
}

Agora a classe não executa sozinha,da o seguinte erro: Relatorio nao localizado java.lang.NullPointerException, mas quando chamo ela do formulario Escolhe Pagamento, pelo botao Teste, aparece que o relatorio nao contem paginas e abre o relatorio em branco.
Será que resolveu alguma coisa eu colocar JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset); de novo?

A ordem das linhas esta correta? Talves esteja trocando algo, fiz o teste e coloquei a linha:

con.executeSQL(“select * from pagamentos”);

apos

con.conecta();
e me retornou o relatorio so que do mesmo jeito, um registro em cada pagina, ele nao esta pegando o texto do campo tf_pag e usando como paramentro de seleção.

Oi de novo, estou tentando de varias maneiras fazer isto dar certo.
Agora coloquei a sql na classe de novo:

con.executeSQL("select * from pagamentos where numero_pag= " Formularios.EscolhePagamento.tf_pag.getText());

aparece que falta um operador. O que é?

É isto que eu quero que ele faça, selecione todos os campos da tabela pagamentos onde o numero_pag seja igual o que tem dentro do campo tf_pag no formulario Escolhe Pagamento. O que estou escrevendo de errado nesta linha?

Obrigado.

Olá.

Nesta linha exatamente está faltando o operador para concatenar as strings. Mude para:

con.executeSQL("select * from pagamentos where numero_pag= " + Formularios.EscolhePagamento.tf_pag.getText()); 

Ainda vou olhar com calma suas mensagens anteriores pra ver se descubro o que é.

[quote=sammarino1975]Fiz outra coisa que sumiu com o outro erro:

mudei o codigo assim:

package Relatorios;

import Utilitarios.Conexao;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

public class Teste{

Conexao con = new Conexao();

public Teste(){

try
{
//con.executeSQL("select * from pagamentos");
con.conecta();

HashMap parametro = new HashMap();  // criando objeto para armazenar parâmetro

parametro.put("P_CODIGO", Formularios.EscolhePagamento.tf_pag.getText()); // definindo o nome e o valor do parâmetro
JasperReport report = (JasperReport) JRLoader.loadObject("C:/Pagamentos/relatorios/teste.jasper");
[b]JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);[/b]
JasperPrint relatorio = JasperFillManager.fillReport(report, parametro, [b]jrRS[/b]); // essa linha vai dar certo se esse método conecta() estiver retornando um objeto do tipo Connection
JasperViewer viewer = new JasperViewer(relatorio,false);
viewer.setTitle("Relatório de Pagamentos");
viewer.setVisible(true);
viewer.show();
}

catch (Exception erro)
{
JOptionPane.showMessageDialog(null, " Relatorio não localizado " + erro);
}

}

public static void main (String args[])
{
Teste app = new Teste();
}
}

Agora a classe não executa sozinha,da o seguinte erro: Relatorio nao localizado java.lang.NullPointerException, mas quando chamo ela do formulario Escolhe Pagamento, pelo botao Teste, aparece que o relatorio nao contem paginas e abre o relatorio em branco.
Será que resolveu alguma coisa eu colocar JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset); de novo?

A ordem das linhas esta correta? Talves esteja trocando algo, fiz o teste e coloquei a linha:

con.executeSQL(“select * from pagamentos”);

apos

con.conecta();
e me retornou o relatorio so que do mesmo jeito, um registro em cada pagina, ele nao esta pegando o texto do campo tf_pag e usando como paramentro de seleção.[/quote]

Aqui ele retornaria todos os registros mesmo, porque o select foi executado sem filtro nenhum nessa linha:

con.executeSQL("select * from pagamentos");

O código que te postei teria funcionado. Haveria pontos chave, sem dúvida. Um deles é que você passasse um objeto Connection nessa linha conforme havia comentado:

JasperPrint relatorio = JasperFillManager.fillReport(report, parametro, con.conecta()); // essa linha vai dar certo se esse método conecta() estiver retornando um objeto do tipo Connection

Mas pelo jeito esse método conecta() te retorna um boolean.

Eu não uso JRResultSetDataSource. Não estou afirmando que seja errado, mas pra mim funciona chamar o relatório, passar o(s) parâmetro(s) que ele precisa e visualizar o resultado. A instrução SQL está dentro do relatório e não na aplicação

Oi Ademilton, consegui, graças a sua ajuda, resolver o problema, só estava faltando o operador + e tudo deu certo, 100% funcionando.
O programa não me pergunta qual pag eu quero imprimir, mas imprime o numero que eu colocar no campo Numero do Pag do formulário Escolhe Pagamento. Perfeito.
Não sei nem como te agradecer, pois não teria conseguido sem vc.
Continue assim, atencioso com as pessoas que entendem menos do assunto que vc só tende a crescer mais e mais.
Obrigado mesmo.
Até a próxima.

Segue o código. Talvez possa servir para outra pessoa.

package Relatorios;

import Utilitarios.Conexao;
import java.util.HashMap;
import javax.swing.JOptionPane;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.view.JasperViewer;

public class AutCaixa{

Conexao con = new Conexao();

public AutCaixa(){

try
{

con.conecta();
con.executeSQL("select * from pagamentos where numero_pag= " + Formularios.EscolhePagamento.tf_pag.getText());
HashMap parametro = new HashMap();
parametro.put("P_CODIGO", Formularios.EscolhePagamento.tf_pag.getText());
JRResultSetDataSource jrRS = new JRResultSetDataSource(con.resultset);
JasperReport report = (JasperReport) JRLoader.loadObject("C:/Pagamentos/relatorios/autcaixa.jasper");
JasperPrint relatorio = JasperFillManager.fillReport(report, parametro, jrRS); 
JasperViewer viewer = new JasperViewer(relatorio,false);
viewer.setTitle("Relatório de Pagamentos");
viewer.setVisible(true);
viewer.show();
}

catch (Exception erro)
{
JOptionPane.showMessageDialog(null, " Relatorio não localizado " + erro);
}

}

public static void main (String args[])
{
AutCaixa app = new AutCaixa();
}
}

Obrigado mais uma vez.