Olá pessoal tudo bem? Essa é a primeira vez que estou postando aqui no GUJ por indicação de um amigo. Estou com a seguinte dúvida: Eu tenho uma classe Jframe jT_Relatorios que possui uma área de texto e um botão pesquisar.
Quando eu clicasse nesse botão o programa deveria fazer soma de coluna de uma tabela e retornar essa pesquisa no jTextArea. Só eu não estou conseguindo com que ele retorne o resultado na jtextarea. A consulta SQL está na classe RelatoriosDao mas eu não consigo fazer ela funcionar.
Eu acho que eu tenho de converter o resultado para String, uma vez que os campos no BD estão como float.
-------------------------------------------------------------------------------
Jframe jT_Relatorios
--------------------------------------------------------------------------------
// O botão pesquisar
private void pesquisar(java.awt.event.ActionEvent evt) {
try {
RelatoriosDao dao = new RelatoriosDao();
//Faz a pesquisa
dao.somaprecocompra();
// Seta no JtextArea jTAvisor o resultado da query
jTAvisor.setText(dao.somaprecocompra());
} catch (SQLException ex) {
Logger.getLogger(jT_Relatorios.class.getName()).log(Level.SEVERE, null, ex);
}
}
--------------------------------------------------------------------------------
Classe RelatoriosDao
--------------------------------------------------------------------------------
public String somaprecocompra () throws SQLException{
//Executa a string sql retornando a soma da coluna preco_compra da tabela livros do meu BD
String sql = "SELECT SUM(preco_compra) FROM livros";
String consulta = new String();
//Prepara a conexão
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
// Aqui está a dúvida: eu preciso retornar o resultado da soma aqui para ser exibido no meu jtextarea
consulta=rs.;
stmt.close();
return consulta;
}
Na sua consulta faz o seguinte:
public Integer somaprecocompra () throws SQLException{
String sql = "SELECT SUM(preco_compra) as soma FROM livros";
String consulta = new String();
//Prepara a conexão
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
// Aqui está a dúvida: eu preciso retornar o resultado da soma aqui para ser exibido no meu jtextarea
Integer soma =rs.getInt("soma");
stmt.close();
return soma;
}
e no seu textarea:
// O botão pesquisar
private void pesquisar(java.awt.event.ActionEvent evt) {
try {
RelatoriosDao dao = new RelatoriosDao();
//Faz a pesquisa
//dao.somaprecocompra();
// Seta no JtextArea jTAvisor o resultado da query
jTAvisor.setText(String.valueOf(dao.somaprecocompra()));
} catch (SQLException ex) {
Logger.getLogger(jT_Relatorios.class.getName()).log(Level.SEVERE, null, ex);
}
}
Veja se há um resultado antes. e use o rs.next() pra obter o resultado da linha.
public String somaprecocompra () throws SQLException, Exception{
String resultado = "";
//Executa a string sql retornando a soma da coluna preco_compra da tabela livros do meu BD
String sql = "SELECT SUM(preco_compra) FROM livros";
String consulta = new String();
//Prepara a conexão
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
if(rs.next()){//se há um valor
resultado = //o valor do rs.getString("preco_compra);
}else{// se não há resultado
resultado = "";
}
stmt.close();
return resultado;
}
aqui, você retorna o dado para a tela.
[code]
// O botão pesquisar
private void pesquisar(java.awt.event.ActionEvent evt) {
try {
RelatoriosDao dao = new RelatoriosDao();
//Você está realizando a pesquisa inutilmente aqui. já que ela tem retorno e vc nao armazena em lugar nenhum.
//dao.somaprecocompra();
// Seta no JtextArea jTAvisor o resultado da query
jTAvisor.setText(dao.somaprecocompra());//aqui a pesquisa será realizada primeiro e depois será “setado” o valor no componente
} catch (SQLException ex) {
Logger.getLogger(jT_Relatorios.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex){
ex.printStackTrace();
//use este em conjunto, é sempre bom prever mais de uma possibilidade de erro
}
}[/code]
Olá pessoal, infelizmente não funcionaram nenhum dos códigos postados.
A primeira resposta do marcosharbs retornava um Integer e o meu campo retorna um float com o valor de 10.50 com os valores que eu tenho atualmente no meu BD. Eu cheguei a tentar trocar o Integer por um Float ou um Double mas ainda assim o erro persistiu:
O código que eu usei:
String sql = "SELECT SUM(preco_compra) as soma FROM livros";
String consulta = new String();
//Prepara a conexão
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
// Aqui está a dúvida: eu preciso retornar o resultado da soma aqui para ser exibido no meu jtextarea
Integer soma =rs.getInt("soma");
stmt.close();
return soma;
}
Bem, de qualquer forma ela me retorna o seguinte erro:
22/10/2011 13:04:40 tadeu.forms.jT_Relatorios pesquisar
SEVERE: null
java.sql.SQLException
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2593)
at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2734)
at tadeu.dao.RelatoriosDao.somaprecocompra(RelatoriosDao.java:46)
at tadeu.forms.jT_Relatorios.pesquisar(jT_Relatorios.java:98)
at tadeu.forms.jT_Relatorios.access$100(jT_Relatorios.java:13)
at tadeu.forms.jT_Relatorios$2.actionPerformed(jT_Relatorios.java:49)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
CONSTRUÍDO COM SUCESSO (tempo total: 3 segundos)
A segunda resposta do samirrolemberg eu não entendi bem o que colocar na linha:
resultado = //o valor do rs.getString("preco_compra);
então eu coloquei o como:
resultado = rs.getString("soma");
O mais estranho foi que isso que eu coloquei não me retornou nenhum erro, acho que a consulta foi feita, apenas o resultado não foi exibido.
Eu usei esse código.
[code]public String somaprecocompra () throws SQLException{
String resultado = “”;
//Executa a string sql retornando a soma da coluna preco_compra da tabela livros do meu BD
String sql = “SELECT SUM(preco_compra) FROM livros”;
String consulta = new String();
//Prepara a conexão
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
if(rs.next()){//se há um valor
resultado = rs.getString(“soma”);
}else{// se não há resultado
return “”;
}
stmt.close();
return consulta;
} [/code]
o meu código está certo! rsrsr!
no rs.getString vc retornou “soma”
mas vc devia ter retornado o somatório que vc definiu na sua consulta “preco_compra”.
entao dentro do rs.getXXX(“preco_compra”)
nesse caso se é um valor com ponto flutuante retorne um double.
rs.getDouble("preco_compra");
dentro do parametro do getXXX vc define que campo da consulta o metodo ira procurar um resultado.
supunha uma tabela com os campos:
nome
idade
num select vc faria isso:
select * from tabela
ou isso
select t.nome , t.idade from tabela as t
no rs vc irá fazer o que eu já falei, e para cada campo que vc quiser obter um valor vc usa o valor correspondente a ele:
String nome = rs.getString("t.nome");
Integer idade = rs.getInt("t.idade");
e ai vc vê a melhor forma de retornar os dados.
seja num list, ou numa classe encapsulando tudo com os seus gets e sets.
=)
Olá samirrolemberg, tudo bem? Tentei fazer o que tu me disse usando os métodos get e set (em uma classe separada) mas não consegui retornar o meu resultado na tela.
Como eu posso fazer usando o get e o set, poderia me explicar esta parte um pouco melhor? Valeu pela ajuda.
Olá, consegui resolver o meu problema e deixo aqui o que eu fiz:
FORM RELATORIO
// Botão Pesquisar
private void pesquisar(java.awt.event.ActionEvent evt) {
try {
RelatoriosDao dao = new RelatoriosDao();
// Seta no JtextArea jTAvisor o resultado da query
jTAvisor.setText(dao.gerarelatorio2(""));
} catch (SQLException ex) {
Logger.getLogger(jT_Relatorios.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex){
ex.printStackTrace();
//use este em conjunto, é sempre bom prever mais de uma possibilidade de erro
}
}
CLASSE RELATÓRIOSDAO
[code]
//Método usado para gerar o relatório
public String gerarelatorio2(String volta) throws SQLException {
// String sql
String sql="SELECT SUM(preco_venda) as soma FROM livros";
// Prepara a conexão
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()){
// Gera a String que será impressa no JTextArea
volta = "O total arrecadado foi de R$ " + rs.getString("soma");
// Imprime na tela também
System.out.println(rs.getString("soma"));
}
//Fechando o resultset
rs.close();
//Fecha a conexão
stmt.close();
//Retorna a String para ser impressa
return volta;
}[/code]
Mais uma dúvida: Agora eu queria fazer a soma da coluna numa determinada data. Eu queria fazer a pesquisa inserindo eu mesmo a data que deve ser pesquisada. Eu até consigo inserir a data, mas não consigo exibi-la no meu JTextArea.
FORM JT_Login
[code] // BOTAO PESQUISAR
private void pesquisar(java.awt.event.ActionEvent evt) {
try {
RelatoriosDao dao = new RelatoriosDao();
relact.capturaDatas();
// Seta no JtextArea jTAvisor o resultado da query
jTAvisor.setText(dao.ExibeRelatorio(""));
} catch (SQLException ex) {
Logger.getLogger(jT_Relatorios.class.getName()).log(Level.SEVERE, null, ex);
} catch (Exception ex){
ex.printStackTrace();
//use este em conjunto, é sempre bom prever mais de uma possibilidade de erro
}
} [/code]
Classe RelatoriosAction
[code]public class RelatoriosAction {
// Este daqui é um método que passa a data
//para o formato do banco de dados ano-mes-dia
FormataCampos camp;
// Os campos da form JT_login
private JTextField jTF_dataInicial, jTF_dataFinal;
// construtor da form JT_LOGIN
public RelatoriosAction(JTextField jTF_dataInicial, JTextField jTF_dataFinal) {
this.jTF_dataInicial = jTF_dataInicial;
this.jTF_dataFinal = jTF_dataFinal;
}
// Pega os Jtextfields e envia ao método Valor Comprados
public void capturaDatas() throws SQLException{
RelatoriosBean add = new RelatoriosBean();
add.setData_inicial(camp.formatDate(jTF_dataInicial.getText()));
add.setData_final(camp.formatDate(jTF_dataFinal.getText()));
RelatoriosDao dao = new RelatoriosDao();
dao.valorComprados(add);
}
}[/code]
CLASSE RelatoriosDao
[code] // Pega a data da classe RelatoriosAction e deveria retornar a data ao
//jTExtAreal da classe JT_login
public String valorComprados(RelatoriosBean add) throws SQLException {
String volta = “”;
// String sql
String sql=“SELECT SUM(preco_compra) as soma FROM livros where data_compra>= ? and data_compra<= ?”;
// Prepara a conexão
PreparedStatement stmt = (PreparedStatement) conexao.prepareStatement(sql);
stmt.setString(1, add.getData_inicial());
stmt.setString(2, add.getData_final());
ResultSet rs = stmt.executeQuery();
while (rs.next()){
// Gera a String que será impressa no JTextArea
volta = rs.getString("soma");
// Imprime na tela também e aqui
System.out.println(volta);
}
//Fechando o resultset
rs.close();
//Fecha a conexão
stmt.close();
//Retorna a String para ser impressa
return volta;
}
// Método que pega o método valorComprados e
//deveria retornar o resultado da soma no JTextArea
public String ExibeRelatorio(String relatorio) throws SQLException {
// Aqui é o que eu queria saber como fazer para exibir o relatório
relatorio = “Total de livros vendidos no período”+ valorComprados(null);
return relatorio;
}[/code]