Ajuda com Software Java e MySQL

2 respostas
viniciusfaleiro

Boa noite!
Sou iniciante em Java e estou desenvolvendo meu primeiro programa. Porém, cheguei num momento em que não consigo mais desenvolver e chegar no objetivo do software. Esse software basicamente consiste em cadastro e geração de relatórios.
Resumindo, estou com problemas na hora de excluir um registro do meu sistema.
Meu software faz cadastro de registros em uma tabela no MySql do seguinte modo:
id Nome Telefone IdCentroCusto
1 Jorge Fernando 15-99876-4857 500
2 Rafael Brugnara 15-9586-9999 345
3 Bruno Caetano 21-9857-3555 788
4 …

Essa tabela é listada em uma JTable para o usuário, e desenvolvi um esquema onde o usuário dá dois cliques em uma linha da tabela (ex: clicou na linha 3, o sistema faz uma query utilizando o valor dessa linha para encontrar o id e retornar o registro) e altera esse registro abrindo um JFrame com os dados da linha que o usuárioi clicou.
Eu utilizo o swing para o usuário poder fazer novos cadastros nessa tabela, alterações exclusoes. Porém, o campo id é de autoencremento e quando o usuário quer excluir o registro, acontece esse problema que vou explicar.
Por exemplo, o usuário quer excluir a linha 3. OK, meu sistema vai lá e exclui a linha 3 e reconstrói a table para o usuário, que ficaria assim:
1 Jorge Fernando 15-99876-4857 500
2 Rafael Brugnara 15-9586-9999 345
4 …

A JTable ficaria assim também quando fosse listada:
1 Jorge Fernando 15-99876-4857 500
2 Rafael Brugnara 15-9586-9999 345
4 …

porem, se a pessoa agora clicar no registro que marca id 4 na JTable, ele na verdade fará ima query da linha 3 (Select * From _ Where id=3) e essa linha não existe mais na minha tabela do SQL pq o usuário deletou. Ou seja, a linha 3 que ele clicou nao existe mais, gerando uma exception.

Eu pensei em uma solucáo para o problema que seria manipular o campo autuencremento, porém eu nao conheço nenhum comando no SQL que eu possa setar o valor do autoencremento, por exemplo: o autoencremento está em 1, 2 , 3 , 4. Ok como eu faço se eu quiser do 4 setar para 25 por exemplo? dai ele continuar 25,26,27? Isso resolveria meu problema, pois eu poderia renumar os ids e manipular a tabela.

Estou postando aqui pois talvez eu esteja fazendo de um jeito muito complicado, se puderem me informar um modo mais fácil ou um jeito de resolver esse problema eu agradeceria!

Desde já, agradeço

2 Respostas

maquiavelbona

viniciusfaleiro:
Boa noite!
Sou iniciante em Java e estou desenvolvendo meu primeiro programa. Porém, cheguei num momento em que não consigo mais desenvolver e chegar no objetivo do software. Esse software basicamente consiste em cadastro e geração de relatórios.
Resumindo, estou com problemas na hora de excluir um registro do meu sistema.
Meu software faz cadastro de registros em uma tabela no MySql do seguinte modo:
id Nome Telefone IdCentroCusto
1 Jorge Fernando 15-99876-4857 500
2 Rafael Brugnara 15-9586-9999 345
3 Bruno Caetano 21-9857-3555 788
4 …

Essa tabela é listada em uma JTable para o usuário, e desenvolvi um esquema onde o usuário dá dois cliques em uma linha da tabela (ex: clicou na linha 3, o sistema faz uma query utilizando o valor dessa linha para encontrar o id e retornar o registro) e altera esse registro abrindo um JFrame com os dados da linha que o usuárioi clicou.
Eu utilizo o swing para o usuário poder fazer novos cadastros nessa tabela, alterações exclusoes. Porém, o campo id é de autoencremento e quando o usuário quer excluir o registro, acontece esse problema que vou explicar.
Por exemplo, o usuário quer excluir a linha 3. OK, meu sistema vai lá e exclui a linha 3 e reconstrói a table para o usuário, que ficaria assim:
1 Jorge Fernando 15-99876-4857 500
2 Rafael Brugnara 15-9586-9999 345
4 …

A JTable ficaria assim também quando fosse listada:
1 Jorge Fernando 15-99876-4857 500
2 Rafael Brugnara 15-9586-9999 345
4 …

porem, se a pessoa agora clicar no registro que marca id 4 na JTable, ele na verdade fará ima query da linha 3 (Select * From _ Where id=3) e essa linha não existe mais na minha tabela do SQL pq o usuário deletou. Ou seja, a linha 3 que ele clicou nao existe mais, gerando uma exception.


Você está trabalhando com ids de uma maneira fraca. No banco o id não vai mudar, então a sua linha TEM que manter o mesmo id. Não faça pela linha clicada e sim pela campo X associado a essa linha. Estás jogando fora mais de 20 anos de desenvolvimento de banco de dados para trocar por id=posição da linha.

Não dá - até dá, mas espero que não haja nenhum DBA Mysql para me chutar a cabeça e vai complicar mais ainda - e espero que desista dessa idéia. Você precisa que os ids sejam fortes? ID é uma coisa única, não é “reutilizável”. Excluiu o 3, perdeu-se. Já pensou se você usasse ligações com tabelas, você excluísse um id mas não seus relacionamentos e na próxima inserção, os relacionamentos iriam aparecer do nada. Faça como eu disse, não use como chave de exclusão a linha que você clicou e sim o id associado a ela.

Até!

Linkel

Amigão, concordo com o brother maquiavelbona
Mas vou tentar te explicar o porque realmente.
Com certeza você pode fazer o que quiser com seus campos auto-increment; revalorar, setor mínimo, setar máximo, setar partida, etc… Porém isso não pode ser feito alheiamente em tempo de execução. É tarefa de DBA em momento oportuno, onde seja preciso.
Como o brother lhe falou você precisa associar um campo único, ou vários campos que, juntos, tenham resultado único para então fazer sua consulta.
Por exemplo:
Você tem um cadastro de clientes. Se você listar os clientes cadastrados na jTable, na seguinte ordem: Codigo, Nome; você pode associar o campo código capturado da linha clicada duplamente para então fazer a consulta retornando os valores desejados.
Segue um exemplo para essa aplicação (leia os comentários):

// método implementado no evento ouvinte do click do mouse... private void consultarDadosCompletosCliente() { // armazena a linha clicada... int linhaClicada = jTableClientes.getSelectedRow(): conexao.conectar(); try { Statement stmt = conexao.con.createStatement(); // deleta o registro admitido ao critério... stmt.executeUpdate("DELETE FROM Clientes WHERE codigoCli = "+ jTableClientes.getValueAt(linhaClicada, 0)); // o "0" indica a primeira célula da linha clicada, // que, nesse caso, é o código do cliente... stmt.close(); } catch(SQLException e) { e.printStackTrace(); } conexao.desconectar(); }
Pronto! Sem segredos!
Essa é a forma correta para se fazer o que você deseja.
Não invente gambiarras para banco de dados.
O sucesso de um sistema de informação, seja aplicação desktop ou web, está diretamente ligado à capacidade que ele tem de iteirar ao banco de dados com a maior eficiência possível.
Um abraço!

Criado 22 de março de 2008
Ultima resposta 23 de mar. de 2008
Respostas 2
Participantes 3