[RESOLVIDO] jTable com manipulação de dados. Alguma ajuda?

2 respostas
Rafael_Victor

Ola novamente galera, estou com um problema que ta me matando e eu não consigo resolver, já tentei de tudo ou quase tudo… É o seguinte

Tenho uma lista e uma tabela, a lista contém o nome das disciplinas escolhidas pelo aluno e a tabela tem colunas de janeiro a dezembro. Quero exibir nessa tabela a quantidade de faltas que o aluno teve em determinado mês na linha da disciplina escolhida por ele.

o meu DAO está assim, porém ele retornar todas as faltas do aluno.

public List read(String id){

Connection con = ConnectionFactory.getConnection();
    PreparedStatement stmt = null;
    ResultSet rs = null;
    
    List<Faltas> faltas_l = new ArrayList<>();
    
    try {
        stmt = (PreparedStatement) con.prepareStatement("SELECT * FROM faltas f INNER JOIN alunos a ON f.id_al = a.id_matri WHERE a.id_matri = ?");
        stmt.setString(1, id);
        
        rs = stmt.executeQuery();
        
        while(rs.next()){
            
            Faltas faltas = new Faltas();
            faltas.setId(rs.getInt("id"));
            faltas.setMes(rs.getInt("mes"));
            faltas.setId_disc(rs.getInt("id_disc"));
            
            faltas_l.add(faltas);
        }
        
    } catch (SQLException ex) {
        Logger.getLogger(FaltasDAO.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
        ConnectionFactory.closeConnection((com.mysql.jdbc.Connection) con, stmt);
    }
    
    return faltas_l;
}

2 Respostas

darlan_machado

Você só faz o inner join para comparar ou usa algum atributo de aluno? Pelo que vi, não usa nada de aluno, logo, pode fazer um select direto:

SELECT * FROM faltas f WHERE f.id_al = ?;

Que dará no mesmo.

Quanto a questão de faltas por disciplina, é um tanto complicado, embora você tenha 2 opções:

  • Fazer tantos selects quanto forem as disciplinas
  • Select no banco já trazer a quantidade de faltas agrupadas por disciplina.
  • Fazer select e trazer os dados brutos e processar no java.

O primeiro cenário é o mais simples, mas, não muito performático. Ok, com 3 disciplinas e 40 alunos, mas, e se forem 10 disciplinas e 500 alunos?
O segundo é o cenário mais interessante. Porém, você precisa ter um bom conhecimento em SQL.
O terceiro é o mais fácil, porém, o mais custoso em termos de processamento, pois, você precisa iterar sobre todos os dados repetidas vezes, para calcular quantas faltas possui em cada disciplina.

Rafael_Victor

Boaaa amigo, então, eu fiz da seguinte forma dê uma olhada pra mim e vê em qual das 3 opções ele se encaixa fazendo um grande favor.

Na Classe Principal ficou dessa forma:
qtd_disc() percorre a jList e retorna quantos itens possui, assim o sistema saberá quantas vezes vai ter que executar o for para avançar os id’s da lista em list_id.get(i);

public void readTable(String id){

DefaultTableModel modeloTable = (DefaultTableModel) jTable1.getModel();
    FaltasDAO fdao = new FaltasDAO();
    
    qtd_disci();
    Integer i = 0;
    
    
    for(i = 0; i < j; i++){
        id_d = list_id.get(i);
        
    //Busca faltas do aluno com o ID desejado
    
        for(Faltas f: fdao.read(id, id_d)){
            
            System.out.println("ID Disci Lista: "+id_d+" Mes: "+f.getMes()+" ID Disci Falta:"+f.getId_disc()+" ID Aluno:"+f.getId_al());
           Integer mes = f.getMes();
            if(mes == 1){
                jan++;
            }if(mes == 2){
                fev++;
            }if(mes == 3){
                mar++;
            }if(mes == 4){
                abr++;
            }if(mes == 5){
                mai++;
            }if(mes == 6){
                jun++;
            }if(mes == 7){
                jul++;
            }if(mes == 8){
                ago++;
            }if(mes == 9){
                set++;
            }if(mes == 10){
                out++;
            }if(mes == 11){
                nov++;
            }if(mes == 12){
                dez++;
            }
        }
        modeloTable.addRow(new Object[]{
                    jan,
                    fev,
                    mar,
                    abr,
                    mai,
                    jun,
                    jul,
                    ago,
                    set,
                    out,
                    nov,
                    dez
                       }); 
    zera();
    }

}

A Função zera(); zera todas as variáveis(jan,fev,mar…) ao fim de cada ciclo do for evitando assim que o sistema duplique dados

O meu DAO read() ficou da seguinte forma:

public List read(String id, Integer id_d){

Connection con = ConnectionFactory.getConnection();
    PreparedStatement stmt = null;
    ResultSet rs = null;
    
    List<Faltas> faltas_l = new ArrayList<>();
    
    try {
        stmt = (PreparedStatement) con.prepareStatement("SELECT * FROM faltas f WHERE f.id_al = ? AND f.id_disc = ?");
        stmt.setString(1, id);
        stmt.setInt(2, id_d);
        
        rs = stmt.executeQuery();
        
        while(rs.next()){
            
            Faltas faltas = new Faltas();
            faltas.setId(rs.getInt("id"));
            faltas.setMes(rs.getInt("mes"));
            faltas.setId_disc(rs.getInt("id_disc"));
            faltas.setId_al(rs.getString("id_al"));
            
            faltas_l.add(faltas);
        }
        
    } catch (SQLException ex) {
        Logger.getLogger(FaltasDAO.class.getName()).log(Level.SEVERE, null, ex);
    }finally{
        ConnectionFactory.closeConnection((com.mysql.jdbc.Connection) con, stmt);
    }
    
    return faltas_l;
}

Está funcionando perfeitamente, depois de muito trabalho, fica o código caso alguém tenha o mesmo problema. Abraçosssss

Criado 5 de setembro de 2018
Ultima resposta 6 de set. de 2018
Respostas 2
Participantes 2