Não consigo contar quantos registros tenho na minha tabela

Olá pessoal!

Antes de abrir este tópico procurei muito na internet e inclusive aqui no GUJ como contar quantos registros tenho na minha tabela.

Tentei usar o ResultSet.getFechSize() e ResultSet.getRow() e mesmo assim não obtive o resultado esperado.

Na minha classe chamada Logica, tenho um metodo que se chama VerificaBoleto, a ideia deste método é: pegar a data do sistema, depois eu acrescento mais 10 dias sobre essa data. Eu faço uma select no meu banco pegando somente a coluna dataVencimento e uso o comando BETWEEN, pois quero pegar todos os registros que estão entre a data do boleto e a data futura (data atual + 10 dias). A ação do botão verificar é de ver quantos boletos estão pra vencer no prazo de 10 dias. É aí que surge meu problema (e acho que tem outros no meu código, rs). Eu não consigo pegar a quantidade de registro que tem no meu banco. Podem me ajudar?

Classe Logica:

Variáveis:

private Connection conexao;
private PreparedStatement pst = null;
private ResultSet rs = null;
private String sql = null;
public ResultSet verif;
public int qtd;
public Date novaData = new Date();
public Date dataSistema = new Date();
public long diferenca;

public void VerificarBoleto() throws ClassNotFoundException
{
    conector();
    //PEGA A DATA ATUAL DO SISTEMA
    
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.format(dataSistema);
    
    //PEGA A DATA ATUAL DO SISTEMA E ACRESCENTE MAIS 10 DIAS.
    Calendar c = Calendar.getInstance();
    c.setTime(dataSistema);
    c.add(Calendar.DAY_OF_MONTH, 10);
    novaData = c.getTime();
    
    diferenca = (dataSistema.getTime() - novaData.getTime()) / (1000*60*60*24);
    
    sql = "SELECT COUNT(dataVencimento) FROM boletos WHERE dataVencimento BETWEEN ? AND ?";
    
    try
    {
        pst = conexao.prepareStatement(sql);
        pst.setString(1, String.valueOf(dataSistema));
        pst.setString(2, String.valueOf(novaData));
        
        pst.execute();
        
        qtd = rs.getFetchSize();
        
    }
    catch(Exception e)
    {
        
    }

}

E evento de click no botão Verificar:

try{
        Logica log = new Logica();
        conexao = ModuloConexao.conector();
        if(log.qtd > 0)
        {
            log.VerificarBoleto();
            JOptionPane.showMessageDialog(null, "Você tem "+log.qtd+" a vencer no prazo de 10 dias!");
        }
        else
        {
            JOptionPane.showMessageDialog(null, "Você tem "+log.qtd+" a vencer no prazo de 10 dias!");
        }
        
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }

Eu acho que tem erro em minha query onde está o BETWEEN e também não consigo contar a quantidade de registro que tenho em meu banco.

Oi Hygor,

Após ler seu código, a impressao que tive é que você foi jogando coisas lá, sem saber bem o que faziam.

Por exemplo, para que está usando a variável “sdf”? ou a variável “diferenca”?

Repare que em seu código, em nenhum lugar você coloca algo na variável “rs”, como você espera ler alguma coisa dela?

Uma outra dica geral, sempre declare as variáveis o mais perto possível de onde for usar, ao invés de deixarem todas no topo da classe. Só de fazer isso pode te eliminar um monte de dor de cabeça.

As variáveis são publicas amigo, não conseguiria declará-las dentro do meu método. Eu fiz tanto teste que acabei deixando tudo do jeito que tava (mal organizado e sem lógica). Mas concordo com você que deixei super desorganizado postando aqui e sem lógica.

  • A variável diferença declarei para poder guardar o valor inteiro que seria me gerado a onde seria feito a data atual - a data futura.
  • O format sdf seria pra formatar as datas.

Alguém sabe me dizer como consigo fazer essa contagem? Em C# eu fiz esse mesmo sistema mas em Java tá meio complicado até porque tô começando a estudar Java.

Up. Alguem pode me ajudar, pessoal? :confused:

Galera? UP.

Tente mudar seu SQL para algo como:

sql = "SELECT COUNT(1) as TOTAL FROM boletos WHERE dataVencimento BETWEEN ? AND ?";

E para pegar a quantidade, você precisa pegar o total do ResultSet. Algo assim:

rs.first();
// qtd = rs.getFetchSize(); // não precisa mais
qtd = rs.getInt("TOTAL"); // o total contém a quantidade de registros.

Obs: estou levando em consideração que o resto está certo/coerente: a conexão com o banco funciona, a primeira data é maior que a segunda, o banco que você está usando suporta COUNT(1) (ou count(*) ), etc.

Abraço.

Mas o que se refere a este total entre aspas duplas?

Esse total na SQL ?

Sim, tudo está funcionando… no form load eu coloquei uns Labels com as datas e com a diferença delas e isso está OK. O que está me regaçando mesmo é saber a quantidade de registros eu tenho.

Vou tentar aqui…

Não consegui, TerraSkill.

Ainda me retorna 0. Fiz da mesma forma que você postou e nada…

De qualquer forma, obrigado. Alguma ideia? Alguém mais?

Bom dia pessoal. UP.

UP cavalinho.

Bom, consegui resolver meu problema.

Segue o código caso alguém precise algum dia:

public void registros()
{
String sql = "SELECT COUNT(*) FROM Boletos WHERE dataVencimento BETWEEN ? AND ? ";

    //PEGA A DATA ATUAL DO SISTEMA E FORMATA
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    sdf.format(dataSistema);
    
    //PEGA A DATA ATUAL DO SISTEMA E ACRESCENTE MAIS 10 DIAS.
    Calendar c = Calendar.getInstance();
    c.setTime(dataSistema);
    c.add(Calendar.DAY_OF_MONTH, 10);
    novaData = c.getTime();
    
    //VARIÁVEL DIFERENÇA GUARDA A DIFERENCA ENTRE A DATA DO SISTEMA E A NOVADATA.
    diferenca = (dataSistema.getTime() - novaData.getTime()) / (1000*60*60*24);
    
    try
    {
        pst = conexao.prepareStatement(sql);
        pst.setString(1, String.valueOf(sdf.format(dataSistema)));
        pst.setString(2, String.valueOf(sdf.format(novaData)));
        rs = pst.executeQuery();
        rs.next();
        qtd = rs.getInt(1);
        JOptionPane.showMessageDialog(null, "Quantidade de registros no banco: " + qtd);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

Funcionando redondo! Mas galera, uma dúvida: esse método está em uma classe que se chama Logica. Mas eu queria apresentar o resultado da variável qtd (que é a variável responsável por quantos boletos tem em aberto no sistema) na minha view de boleto. Se eu faço isso na view de boleto me retorna 0, segue:

jLabel1.setText(String.valueOf(log.qtd));

Porque ele me retorna 0 sendo que dentro do meu método, se eu faço: JOptionPane.showMessageDialog(null, "Boletos em aberto: "+qtd);

Ele me retorna o valor exato que tem no banco.

Sabem me dizer o porque?