Fazer soma de coluna num BD e exibir em um JTextArea

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]