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!
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();
}
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 é só uma consulta, não há 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!
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? 
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();
[quote=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? 
[/quote]
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!
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?
:oops:
saqueii…ehehe…pzé…não tinha me ligado ontem quando postei…descuulpa!! Origada pela atenção!!
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?
[quote=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());
}
}
[/quote]
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!
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…
[quote=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…[/quote]
Ah, sim… É que, como não tenho o seu código, fica difícil de entender o que tá sendo feito!
hehe
aaaaahahaha…
eu que criei ele acho difícil de entender…imagino vc!!
Valeu!!!
Abração!