botão/método remover()[RESOLVIDO]

13 respostas
ArianeRebellato

Oi, Boa Noite!!
eu tenho um método para remover itens duma JList e do banco simultaneamente…mas não funciona… :shock:

alguém tem alguma sugestão?

public void remover(Campi c){
        String sql = "DELETE FROM CAMPUS WHERE codigo = " + c.getCodigo();
        bd.conecta();
        try{
            comando = bd.getConexao().createStatement();
            comando.execute(sql);
            comando.close();
        }catch (SQLException e){
            e.printStackTrace();
        }        
        bd.desconecta();        
    }
private void btRemoveCampusActionPerformed(java.awt.event.ActionEvent evt) {                                               
if (cmbCampus.getSelectedIndex() != -1) {
        Campi c = (Campi) cmbCampus.getSelectedItem();
        int resp = JOptionPane.showConfirmDialog(this,"Você deseja exlcuir o campus " + c.getNome()+ " e todos os setores relacionados a ele?","Remoção de Campus", JOptionPane.YES_NO_OPTION);
        if (resp == JOptionPane.YES_OPTION) {
            cDAO.remover(c);
            carregarCampus();
            carregarRamais(c.getCodigo());
            JOptionPane.showMessageDialog(rootPane, "Campus removido com sucesso!");
        }
    }
}

Não sei se isso do código é suficiente para me fazer clara…a primeira parte é da minha classe CampiDAO e a segunda é da minha classe CampiJFrame!!
Obrigada!

13 Respostas

M

Tente fazer assim…

public void remover(Campi c){
        String sql = "DELETE FROM CAMPUS WHERE codigo = ?";
        bd.conecta();
        try{
            PreparedStatement pstmt = bd.getConexao().prepareStatement(sql);
            
            //se codigo é String
            pstmt.setString(1, c.getCodigo()); 
            
            //se codigo é Int
            pstmt.setInt(1, c.getCodigo()); 
           
            pstmt.executeUpdate();
            pstmt.close();
        }catch (SQLException e){
            e.printStackTrace();
        }        
        bd.desconecta();        
    }
Nicolas_Fernandes

E se você remover o objeto em questão do Banco de Dados e depois recarregar a lista de “Campus”, “Campi” ou seja lá como chama sua classe?

Algo do tipo:

DAO:

public void remover(Campi anCampi) throws SQLException
{
   // Nota: O legal é sempre usar setCommit(false) quando você vai realizar operações que podem transgredir a integridade dos dados do BD.
   Connection anConnection = PegaConexaoDeAlgumLugarComCommitFalse();
   String anQuery = "Delete From Campus Where Codigo = ?";
   PreparedStatement anStatement = anConnection.prepareStatement(anQuery);
   anStatement.setInt(1, anCampi.getCodigo());

   anStatement.execute();
   anConnection.commit();

   anStatement.close();
   anConnection.close();
}

public List<Campus> listar(String anCriteria) throws SQLException
{
   // Como é  uma consulta, não  necessidade de "comitar" uma operação.
   Connection anConnection = PegaConexaoDeAlgumLugarComCommitTrue();
   String anQuery = "Select * From Campus";

   PreparedStatement anStatement = anConnection.prepareStatement(anQuery);
   if (anCriteria != null || !anCriteria.equals(""))
   {
       anStatement.setString(1, anCriteria);
   }

   ResultSet anResult = anStatement.executeQuery();
   // Monta seus objetos...
   return listaDeCampus;
}

E na sua View:

private void btRemoveCampusActionPerformed(java.awt.event.ActionEvent evt) 
{                                               
   if (cmbCampus.getSelectedIndex() != -1) 
   {
      Campi anCampi = (Campi) cmbCampus.getSelectedItem();
      int anResposta = JOptionPane.showConfirmDialog(this, String.format("Você deseja excluir o campus %s e todos os setores relacionados a ele?", anCampi.getNome()), Remoção de Campus", JOptionPane.YES_NO_OPTION);
      
      if (anResposta == JOptionPane.YES_OPTION)
      {
         CampiDAO.remover(anCampi);
         cmbCampus.clear();
         cmbCampus.setModel(new DefaultComboBoxModel(CampiDAO.listar(null).toArray()));
         JOptionPane.showMessageDialog(this, "Campus removido com sucesso!");
      }
}

Tenta algo assim e nos dê o reply!
Abraços!

ArianeRebellato

Com alguns ajustes encaixei no meu código…dá o mesmo erro que antes com o meu método…

[color=red]20/10/2010 14:36:22 trabalhoarianemarcia.CampiJFrame btRemoveCampusActionPerformed
SEVERE: null
org.postgresql.util.PSQLException: ERROR: update or delete on table “campus” violates foreign key constraint “ramais_campi_fkey” on table "ramais"
Detalhe: Key (codigo)=(6) is still referenced from table “ramais”.[/color]

eu não vou conseguir deletar pq ‘campi’ é minha chave estrangeira em ‘ramais’? Tu sabe como eu poderia resolver isso? :wink:

ArianeRebellato

a minha intenção inicial foi esta…mas já não deu certo…

int resp = JOptionPane.showConfirmDialog(this,"Você deseja exlcuir o campus " + c.getNome()+ " e todos os setores relacionados a ele?","Remoção de Campus", JOptionPane.YES_NO_OPTION);  
         if (resp == JOptionPane.YES_OPTION) {  
            cDAO.remover(c);  
            carregarCampus();
Nicolas_Fernandes

ArianeRebellato:
Com alguns ajustes encaixei no meu código…dá o mesmo erro que antes com o meu método…

[color=red]20/10/2010 14:36:22 trabalhoarianemarcia.CampiJFrame btRemoveCampusActionPerformed
SEVERE: null
org.postgresql.util.PSQLException: ERROR: update or delete on table “campus” violates foreign key constraint “ramais_campi_fkey” on table "ramais"
Detalhe: Key (codigo)=(6) is still referenced from table “ramais”.[/color]

eu não vou conseguir deletar pq ‘campi’ é minha chave estrangeira em ‘ramais’? Tu sabe como eu poderia resolver isso? :wink:

Bom, vamos lá…
Deveria ter mostrado esse erro desde o começo XD
O que acontece?
Em sua tabela Ramais, você possui uma referência para a tabela Campus, a qual, provavelmente, é NOT NULL. Ou seja, quando você tenta excluir algum campo da tabela Campus, o BD vai “chiar”, pois a tabela Ramais referencia alguma tupla desta. Então, para deletar da tabela Campus, você deve deletar os “filhos” que possuem o registro na tabela Ramais, primeiro. Algo do tipo:

// Classe de serviços para a tabela Campus.
public class CampusServicos
{
   public void removerRegistro(int anCodigo) throws SQLException
   {
      // Busca o objeto Campus que tem o código que você passa por parâmetro...
      Campus anCampus = CampusDAO.buscarRegistro(anCodigo);
      // Busca todos os Ramais que tem esse objeto como referência...
      for (Ramal anRamal : RamalServicos.buscarRamaisDoCampus(anCodigo))
      {
         RamalServicos.removerRegistro(anRamal.getCodigo());
      }

      // E agora sim você pode deletar o registro da tabela Campus, já que não possui nenhuma referência perdida por aí!
      CampusDAO.removerRegistro(anCodigo);
   }
}

Sacou mais ou menos?
Abraços!

ArianeRebellato

Se eu excluo todos os setores antes e eeentããão peço pra excluir o campus dá td certinho…mas enquanto ele está sendo referenciado na outra tabela não pode ser removido…eu até já sabia que o banco se comporta assim…mas não tem uma maneira de corromper isso?

ArianeRebellato

:oops: :smiley: saqueii…ehehe…pzé…não tinha me ligado ontem quando postei…descuulpa!! Origada pela atenção!!

Nicolas_Fernandes

Bom, você pode ‘corromper’ isso através do uso de constraints do Banco. Ao criar sua tabela Campus…

Create Table If Not Exists Campus (
...) On Delete Cascade

Assim, vai deletando os filhos até chegar no pai.
Sacou?

ArianeRebellato

madressitas…Nicolas Fernandes…Muito Obrigada…

ficou assim então…

public void removerRegistro(int codigoCampus) throws SQLException  {  
       
       ArrayList<Campi> codCampi = cDAO.buscar();  
      
       for (Ramais r : rDAO.buscar(codigoCampus)){  
          rDAO.remover(r); 
          removerRegistro(r.getCodigo());  
       }  
   
    }

e no botão…

private void btRemoveCampusActionPerformed(java.awt.event.ActionEvent evt) {                                               
 
    if (cmbCampus.getSelectedIndex() != -1) {
        Campi c = (Campi) cmbCampus.getSelectedItem();
        int resp = JOptionPane.showConfirmDialog(this,"Você deseja exlcuir o campus " + c.getNome()+ " e todos os setores relacionados a ele?","Remoção de Campus", JOptionPane.YES_NO_OPTION);
        if (resp == JOptionPane.YES_OPTION) {
                try {
                    removerRegistro(c.getCodigo());
                    cDAO.remover(c);
                    carregarCampus(); 
                    JOptionPane.showMessageDialog(rootPane, "Campus removido com sucesso!");
                } catch (SQLException ex) {
                    Logger.getLogger(CampiJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
    }
}

:smiley: :smiley: :smiley: :smiley: :smiley: :smiley: :smiley: adoro escrever resolvido no tópico…

Nicolas_Fernandes

ArianeRebellato:
madressitas…Nicolas Fernandes…Muito Obrigada…

ficou assim então…

public void removerRegistro(int codigoCampus) throws SQLException  {  
       
       ArrayList<Campi> codCampi = cDAO.buscar();  
      
       for (Ramais r : rDAO.buscar(codigoCampus)){  
          rDAO.remover(r); 
          removerRegistro(r.getCodigo());  
       }  
   
    }

Quase!
O “removerRegistro” que você chamou deve ser do DAO; se não, fica um método recursivo em um loop infinito!

public void removerRegistro(int codigoCampus) throws SQLException  {  
       
       ArrayList<Campi> codCampi = cDAO.buscar();  
      
       for (Ramais r : rDAO.buscar(codigoCampus)){  
          rDAO.remover(r); 
       }  
       CampusDAO.removerRegistro(codigoCampus);
    }

Abraços!

ArianeRebellato

eu tirei esta primeira linha e funciona de boa…onde está sendo usado o codCampi?

ArrayList<Campi> codCampi = cDAO.buscar();

eu não tenho um CampusDAO…só o CampiDAO cDAO;…o método removerRegistro(int codigoCampus) eu criei no próprio CampiJFrame…é errado?
deu certo…

Nicolas_Fernandes

ArianeRebellato:
eu tirei esta primeira linha e funciona de boa…onde está sendo usado o codCampi?

ArrayList<Campi> codCampi = cDAO.buscar();

eu não tenho um CampusDAO…só o CampiDAO cDAO;…o método removerRegistro(int codigoCampus) eu criei no próprio CampiJFrame…é errado?
deu certo…

Ah, sim… É que, como não tenho o seu código, fica difícil de entender o que tá sendo feito!
hehe

ArianeRebellato

aaaaahahaha…
eu que criei ele acho difícil de entender…imagino vc!!
Valeu!!!

Abração!

Criado 19 de outubro de 2010
Ultima resposta 20 de out. de 2010
Respostas 13
Participantes 3