Ajuda com um metodo de verificação

Bom eu estou fazendo um programa de controle de requisições

tenho uma tabela requisições que tem um campos (Ativa) / boolean / 0 = finalizada 1 = ativa.

ao criar uma requisição eu seto para 1 e tenho um metodo que da um select para verificar se ele tem algum registro ativo

String select = "SELECT * from computador_requisicao cr INNER JOIN usuario u ON (u.id_usuario = cr.idusuario) where u.id_usuario ="+Sessao.getInstancia().getUsuario().getId()+" and cr.status=0";
         PreparedStatement stmt2 = con.prepareStatement(select);

mas eu estou com alguns problemas desse modo, se ele tiver algum registro com 0 ele pode ficar inserindo avontade e se ele tiver um registro ativo e outros com 0 ele conseguiria inserir também.

public boolean addReq(Requisicao r) throws SQLException {
         String select = "SELECT * from computador_requisicao cr INNER JOIN usuario u ON (u.id_usuario = cr.idusuario) where u.id_usuario ="+Sessao.getInstancia().getUsuario().getId()+" and cr.status=0";
         PreparedStatement stmt2 = con.prepareStatement(select);
         ResultSet rs = stmt2.executeQuery();
         if (rs.next()){
         String sql = "INSERT INTO computador_requisicao(idusuario,nome,data_requisicao,observacao,status) VALUES("+Sessao.getInstancia().getUsuario().getId()+",?,now(),?,0)";
        try {
             con.setAutoCommit(false);
             PreparedStatement stmt = con.prepareStatement(sql);
             stmt.setString(1, r.getNome());
             stmt.setString(2, r.getMotivo());
             stmt.executeUpdate();
             stmt.close();
            con.commit();
            Alerts alerts = new Alerts();
             alerts.alertReqCadastrado();
         } catch (SQLException ex) {
            con.rollback();
           Alerts alerts = new Alerts();
             alerts.alertUsuarioNCadastrado();
             return false;
         }
         }else{
         Alerts alerts = new Alerts();    
         alerts.reqAberta();
         }
         return true;
     }

Qual é a regra a ser aplicada neste caso?

1 curtida

o seu select sempre tera resultado, por isso ele entra no insert. o teu if(rs.next()) é que esta errado.

troque o select para assim:

String select = "SELECT count(*) from computador_requisicao cr INNER JOIN usuario u ON (u.id_usuario = cr.idusuario) where u.id_usuario ="+Sessao.getInstancia().getUsuario().getId()+" and cr.status=1";
     PreparedStatement stmt2 = con.prepareStatement(select);
     ResultSet rs = stmt2.executeQuery();
     rs.next();
     if (rs.getInt(0) > 0) {
         throw new RequisicaoAtivaException("Existem requisicoes ativas");
     } else {
         //faz o insert
     }

faz tempo que nao trabalho com JDBC nao lembro se é rs.getInt(0) ou rs.getInt(1) mas ai voce testa. hehehehe.

da para deixar mais elegante tambem. nao sei sua experiencia, mas voce pode jogar essa verificacao num metodo.

private boolean existeRequisicaoAtiva() e coloca essa logica la dentro ai ficaria assim

public boolean addReq(Requisicao r) throws SQLException {         
     if (!existeRequisicaoAtiva()){
     String sql = "INSERT INTO computador_requisicao(idusuario,nome,data_requisicao,observacao,status) VALUES("+Sessao.getInstancia().getUsuario().getId()+",?,now(),?,0)";
    try {
         con.setAutoCommit(false);
         PreparedStatement stmt = con.prepareStatement(sql);
         stmt.setString(1, r.getNome());
         stmt.setString(2, r.getMotivo());
         stmt.executeUpdate();
         stmt.close();
        con.commit();
        Alerts alerts = new Alerts();
         alerts.alertReqCadastrado();
     } catch (SQLException ex) {
        con.rollback();
       Alerts alerts = new Alerts();
         alerts.alertUsuarioNCadastrado();
         return false;
     }
     }else{
     Alerts alerts = new Alerts();    
     alerts.reqAberta();
     }
     return true;
 }


 private boolean existeRequisicaoAtiva() {
     String select = "SELECT count(*) from computador_requisicao cr INNER JOIN usuario u ON (u.id_usuario = cr.idusuario) where u.id_usuario ="+Sessao.getInstancia().getUsuario().getId()+" and cr.status=0";
     PreparedStatement stmt2 = con.prepareStatement(select);
     ResultSet rs = stmt2.executeQuery();
     rs.next();
     return rs.getInt(0) > 0 ;
2 curtidas

vlw mano mt obrigado.