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

13 respostas
A

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();        
    }
N

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!

A

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:

A

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();
N

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!

A

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?

A

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

N

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?

A

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…

N

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!

A

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…

N

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

A

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