Fazer soma de coluna num BD e exibir em um JTextArea

7 respostas
T

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;
     }

7 Respostas

marcosharbs

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);  
        }  
         
    }
samirrolemberg

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.

// 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
        }
         
    }
T
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.
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;    
     }
samirrolemberg

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.

=)

T

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.

T

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
//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;

    }
T

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

// 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
        }
        
    }

Classe RelatoriosAction

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);
}
}
CLASSE RelatoriosDao
// 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;

    }
Criado 21 de outubro de 2011
Ultima resposta 29 de nov. de 2011
Respostas 7
Participantes 3