Como salvar valor de soma de uma coluna do sql em uma variável?

16 respostas Resolvido
java
A

A ideia é a seguinte, fazer um “select sum(cxGeral) from caixa” e essa consulta ser salva em uma variável para depois ser exibida em um jFormattedTextField. Na JFrame que isso ocorrerá, ao abrir ela pesquisa e carrega todos os dados da tabela caixa em uma jTable e isso está funcionando perfeitamente. Criei dois métodos, um para carregar todos os dados ao abrir a Frame e outro para exibir alguns dados por data.

A bronca é que não consigo, nem sei como faz esse método com o ‘sum’. Tentei algumas coisas mas nada retornou da classe de conexão, o máximo foi retornar um null e outra vez um true.

A classe de conexão é essa:

import java.sql.*;

import javax.swing.JOptionPane;
public class ConectaBanco {

public Statement stm;

public ResultSet rs;

private String driver = com.mysql.jdbc.Driver;

private String caminho = jdbc:mysql://localhost:3306/planilhasintetica”;

private String usuario = root;

private String senha = preopac-333;

public Connection conn;
public void conexao(){
    try {
        System.setProperty("jdbc.Drivers", driver);
        conn = DriverManager.getConnection(caminho, usuario, senha);
        JOptionPane.showMessageDialog(null,"Conectado com sucesso!");
    } catch (SQLException ex) {
        
        JOptionPane.showMessageDialog(null,"Erro de conexão!\n Erro: " +ex.getMessage());
    }
}

public void executaSQL(String sql){
    try {
        stm = conn.createStatement(rs.TYPE_SCROLL_INSENSITIVE,rs.CONCUR_READ_ONLY);
        rs = stm.executeQuery(sql);
    } catch (SQLException ex) {
        //Logger.getLogger(ConectaBanco.class.getName()).log(Level.SEVERE, null, ex);
    }
    
}

public void desconecta(){
    try {
        conn.close();
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null,"Erro ao desconectar!\n Erro: " +ex.getMessage());
    }
}

}

Alguém me dá uma luz com esse método, já pesquisei e falhei em todas as tentativas.

16 Respostas

R

Ué, mas você não percorre o o ResultSet, como você espera que o resultado apareça na interface ?

A

Não entendi rmendes08.

Essa é minha primeira aplicação, nas férias da universidade estou estudando e travei aí.
Como eu faço isso?

R

Hmm, agora que eu reparei, você disponibiliza o ResultSet como uma variável pública … :sweat:

Bom, o ResultSet é o objeto que retorna para você os resultados da query (ele é um proxy para o cursor aberto lá no SGBD). Para saber porque você não obtém o resultado que você quer, você precisa postar como este ResultSet está sendo consumido. Além disso, o mais importante você não postou, que é a query executada. Se você não obtém o resultado desejado, o primeiro teste que você tem que fazer é executar a query diretamente no banco de dados e conferir se o resultado é aquele desejado.

E

Olha Alexandre, não sou nenhum perito em JAVA mas nesse caso você tem um metodo que executa uma SQL e não tem nenhum retorno, e se houver dados a serem retornados? Você poderia melhorar a assinatura desse método retornando um Resultset, e com ele vocÊ recupera os dados.
Por exemplo, exclusivamente nesse seu caso:

public Resultset getTotalCaixas() {
    // todo o codigo de conexao aqui, estou omitindo trys e catch
    this.rs = stm.executeQuery("select sum(cxGeral) AS soma from caixa");
    return rs;
}

Na hora que você puxar, você definiu via sql que a soma da coluna vira com o nome soma (as soma).
Dessa maneira basta puxar ele com: rs.getLong(“soma”);

Veja se te ajuda

E

Ops!
Um profissional já respondeu ai!
kkkkkkkkkkkkkk

A
Então meus caros.

Na JFrame, o método que eu fiz foi assim:

public void preencherxtField() {

String sql = select sum(cxGeral) from caixa;

try {

conecta.executaSQL(sql);

conecta.rs.first();

jFormattedTextFieldTotal.setText(String.valueOf(conecta.rs.getFloat(soma)));

} catch (SQLException ex) {

Logger.getLogger(RelatorioCaixa.class.getName()).log(Level.SEVERE, null, ex);

}
}

Na Field mostra a palavra true…

A

rmmendes08, na pesquisa no slq, com esse comando ele me dá o valor correto.

E

No SQL você adicionou o “as soma”. O campo cxGeral é numerico?
Se quiser pegar a quantidade de registros é COUNT a soma da coluna é SUM

String sql = "select sum(cxGeral) as soma from caixa";

R

Veja só, na query você não nomeou a soma:

"select sum(cxGeral) from caixa"

mas ao tentar recuperar o campo do ResultSet você pede o campo “soma”:

conecta.rs.getFloat("soma")

veja só, não tem como o ResultSet “adivinha” que “soma” é o resultado de uma soma, você tem que fazer isso explicitamente. Você tem duas alternativas aqui:

1 acrescenter um alias na query:

select sum(cxGeral) as soma from caixa

2 Ou usar a posição numérica do campo:

conecta.rs.getFloat(1)

A

esleysanches, a tabela caixa tem uma coluna cxGeral
Exemplo:
cxId cxDescricao cxGeral
1 lançamento 1 10.50
2 lançamento 2 10.00

Essa pesquisa no mysql retorna o valor correto: 10.50.
Esse resultado que queria trazer para uma variável ou a TextField

E
Solucao aceita

Ok, no seu método:

public void preencherxtField() {
    String sql = "select sum(cxGeral) as soma from caixa";
    try {
        conecta.executaSQL(sql);
        conecta.rs.next()
        jFormattedTextFieldTotal.setText(String.valueOf(conecta.rs.getFloat("soma")));
    } catch (SQLException ex) {
        Logger.getLogger(RelatorioCaixa.class.getName()).log(Level.SEVERE, null, ex);
    }
}
A

esleysanches e rmendes08, consegui!

Quero dizer, vocês conseguiram e eu entendi como resolver isso.
:slightly_smiling:

Muito Obrigado. :slightly_smiling:

E

Opa, blz!
Precisou … Gritou!

Agora que você conseguiu vou te dar uma dica que se eu tivesse dito no começo vc talvez não iria gostar ou não iria entender.
Normalmente quando se trabalhamos com JDBC (nesse seu caso) utilizamos classes chamadas de DAO’s (Data Access Objects), todos os tipos de códigos e solicitações em SQL devem estar nelas para que o código seja mais fácil de se manter.
Atributos devem ser sempre private e utilizar Getters e Setters.

Parece complicado mesmo no começo, mas quando separar a classe verá que a utilização é como pedir para mamãe. Mãe cadastra esse cliente aqui(Clientex), mãe remove esse cliente aqui(ClienteY)

Me passa seu email que eu envio um exemplo simples de projeto apenas com cadastro de nome e telefone, apenas com Inserir, Remover e Listar, tente implementar você o Alterar e um método que busque o contato pela sua id.

Abraços

A

Opa. Já tinha visto sobre esse DAO, mas nem liguei pra saber como era.
Manda o exemplo que vou ver e hoje mesmo começo a ler a respeito dessa classe DAO. Muito Obrigado esleysanches. :slight_smile:

A

Esqueci de mandar o endereço de email. [email removido] :slight_smile:

R

Já ouviu falar de Github ? Se ainda não, crie uma conta agora mesmo. Nessa busca você tem vários exemplos de como implementar DAO’s:

Criado 22 de janeiro de 2016
Ultima resposta 26 de jan. de 2016
Respostas 16
Participantes 3