table.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent arg0) {
try
{
System.out.println("UPDATE financeiro SET valor_entrada ='"+table.getModel().getValueAt(table.getSelectedRow(),0 )+"',valor_total ='"+table.getModel().getValueAt(table.getSelectedRow(), 1)+"',parcelas='"+table.getModel().getValueAt(table.getSelectedRow(), 2)+"',observacao ='"+table.getModel().getValueAt(table.getSelectedRow(),3 )+"',valor_parcela ='"+table.getModel().getValueAt(table.getSelectedRow(),4 )+"' '"+"' WHERE rc_aluno='"+t2.getText()+"' ");
comando.executeUpdate("UPDATE financeiro SET valor_entrada ='"+table.getModel().getValueAt(table.getSelectedRow(),0 )+"',valor_total ='"+table.getModel().getValueAt(table.getSelectedRow(), 1)+"',parcelas='"+table.getModel().getValueAt(table.getSelectedRow(), 2)+"',observacao ='"+table.getModel().getValueAt(table.getSelectedRow(),3 )+"',valor_parcela ='"+table.getModel().getValueAt(table.getSelectedRow(),4 )+"' '"+"' WHERE rc_aluno='"+t2.getText()+"' ");
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null, "Problema ao alterar dados!");
e.printStackTrace();
}
}
});
Alterar jtable[Quase resolvido =( ]
29 Respostas
Eu acho que o seu problema pode estar no valor que está usando para selecionar quais registros serão atualizados. Você garante que rc_aluno é único para cada aluno? Se não for, o UPDATE será executado para todos os registros para o qual a cláusula where retorne true. Pegue o SQL que está sendo gerado no console e copie a cláusula where para um select e veja se apenas um registro é retornado.
Além disso, existem uma série de otimizações que você pode fazer no seu código que facilitaria muito a leitura e a manutenção, como:
- usar um StringBuilder para construir sua consulta (e fazê-lo somente uma vez, usando a mesma String para o system.out e o executeUpdate)
- usar um PreparedStatement para evitar problemas de SQLInjection, tem um artigo aqui sobre isso.
obrigada pelas dicas visola
e pelo artigo tmbm
em relação as perguntas sim o rc_aluno é unico
porque esta fazendo num pintln?, pra executar uma query voce deve usar uma string.
olá super_swinger,
eu estou usando o println apenas para verificar se estava pesquisando de forma correta,apenas para teste
mas o que eu realmente gostaria de saber é como não alterar todos os itens da coluna no banco e sim apenas o que for alterado na tabela
Só para esclarecer, o que você queria era atualizar apenas a coluna do registro que o usuário atualizou na tabela? Você já está atualizando apenas um registro, mas pelo SQL que está gerando está atualizando várias colunas, é esse o seu problema?
Se for, poderia usar um switch usando o getColumn do evento, para saber qual coluna foi alterada, acho que algo do tipo:
StringBuilder sql = new StringBuilder("UPDATE financeiro SET ");
switch (evento.getColumn()) {
case 0:
sql.append("valor_entrada = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),0 ));
sql.append("'");
break;
case 1:
... // um case para cada coluna
}
sql.append(" WHERE rc_aluno='");
sql.append(t2.getText());
sql.append("'");
String update = sql.toString();
System.out.println(update);
comando.executeUpdate(update);
ola visola,
obrigada pelas explicações consegui resolver o problema usando switch conforme voce havia me explicado!!
obrigada
=]
table.getModel().addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent arg0) {
StringBuilder sql = new StringBuilder("UPDATE nota SET ");
switch (arg0.getColumn()) {
case 0:
sql.append("nota = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),2 ));
sql.append("'");
break;
case 1:
sql.append("atividade = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),3 ));
sql.append("'");
break;
case 2:
sql.append("observacao = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),4 ));
sql.append("'");
break;
}
sql.append(" WHERE rc_aluno='");
sql.append(t0.getText());
sql.append("'");
String update = sql.toString();
System.out.println(update);
try {
comando.executeUpdate(update);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ocorre este erro
UPDATE nota SET WHERE rc_aluno='5'
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE rc_aluno='5'' at line 1
dai o campo que quero trocar não aparece no cod sql=( fica vazio
troquei os cases de lugares mas realmente só funciona o case 2
=(
pq?tipo não deveria funcionar todos os cases de acordo com a linha selecionada na tabela?
ja chequiei as colunas e parecem estar corretas…
o que posso fazer para arrumar isto?
obg
Nota e atividade são colunas que aceitam qual tipo de parâmetro? Numérico ou literal (varchar, char, text)?
ola drsmachado,
Nota e atividade são colunas que aceitam parametros do tipo literal (varchar)
=]
Faz um println da variável sql nos cases 0 e 1 e posta aqui, pra vermos o que o banco tá recebendo, bele?
Nossa, quanto trabalho. Será pq algumas pessoas insistem em usar o DefaultTableModel?
bem o print do case 0 fica assim
e logo abaixo o erro
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE rc_aluno='5'' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
at com.mysql.jdbc.Util.getInstance(Util.java:384)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3566)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3498)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2562)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1664)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1583)
at telaVisualizacaoDeNotas$9.tableChanged(telaVisualizacaoDeNotas.java:572)
...
dai o case 1 fica assim
e abaixo ocorre o mesmo erro acima
pq os campos das colunas ficam vazios?
obg
Ok,
UPDATE nota SET WHERE
Tá aqui o erro.
Set o que?
O MySQL não sabe qual coluna preencher com o novo valor, este é o erro de sintaxe.
Parece que os trechos
sql.append("nota = '");
e
sql.append("atividade = '");
não estão funcionando.
Faça um teste, concatenando com o bom e velho
sql += "nota = '";
ok mas como eu faço para arrrumar isto,tipo pq so aparece ascolunas no case 2?
obg
Você pode trocar para
sql.concat("nota = '");
drsmachado
bah naum sei o q fiz errado mas agora da erro nos 3 cases tipo
eu tentei assim
case 2:
sql.toString().concat("nota = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),2 ));
sql.append("'");
System.out.println("nota = '"+table.getModel().getValueAt(table.getSelectedRow(),2 )+"'");
break;
deixando os outros cases iguais mas deu erro de sintaxe no cod mysql em todos os cases e eles apareceram vazios tmbm,dai usei o sql.toString().concat("observacao = '"); //case 0
sql.toString().concat("atividade = '");//case 1
mas continua dando erro de sintaxe =(
o q fiz errado?
obg
Como está ficando a string, depois de concatenada?
No mesmo formato?
no print continua vazio o campo q deveria aparecer a coluna
foi isto q tu perguntaste?
naum sei se isto vai ajudar a descobrir o erro mas coloquei o case 1 como case 3 tipo copiei exatamente a mesma coisa e funcionou
não entendi pq ?e dai o print no case 3 ficou
tipo agora so funciona o case 2 e 3!
barbaridade!!
Exatamente.
Muito estranho isto.
Faz o seguinte, pode ser problema com o StringBuilder, altera a variável sql para String mesmo e testa.
Você debugou o código? Pela saída, parece que não está passando pelo case 0 nem 1.
Coloca um default nesse case aí para ver se ele está passando por lá:
switch ... {
// ...
default:
System.out.println(arg0.getColumn());
}
ok visola,
obrigada
mas olha so alem disto tm um outro probleminha tipo quand eu altero um valor na minha jtable eu altero no banco mas ele altera desordenadamente eu acho que a unica maneira de controlar isto seria usando o id mas como?
obg
visola
este system não aparece nada
=(
tipo eu usei akele cod antes dos cases,coloquei no lugar errado?
obg
Somente nos cases 0 e 1 apresenta problema?
tipo para tentar alterar de acordo com o id eu tentei fazer algo mais ou menos assim
resultado = comando.executeQuery("select Id,atividade from nota where rc_aluno='"+ t0.getText() +"'");
while(resultado.next())
{
key[0][q]=resultado.getObject(1).toString();
key[1][q]=resultado.getObject(2).toString();
q++;
}
antes de selecionar os itens do banco para aparecer na jtable
dai apos os cases fiz o seguinte
for(int i=0;i<key.length;i++)
{
if(key[i][i]!=null || key[0][i]!=null || key[1][i]!=null)
{
sql.append("and Id='");
sql.append(key[i][0]);
sql.append("'");
sql.append(" and atividade='");
sql.append(key[i][1]);
sql.append("'");
}
}
só que naum da certo pq ele acaba alterando tudo por causa do for como eu faço para relacionar o id do vetor key com as colunas da jtable?
obg
sim drsmachado,
so os cases 0 e 1 que dão problema os outros funcionam,mas pq sera neh?
case 0:
sql.append("nota = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),2 ));
sql.append("'");
break;
case 1:
sql.append("atividade = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),3 ));
sql.append("'");
break;
case 2:
sql.append("observacao = '");
sql.append(table.getModel().getValueAt(table.getSelectedRow(),4 ));
sql.append("'");
break;
Já verificou se o parâmetro que você passa entra no switch?
Pois, quando checamos os cases 0, 1 e 2, nada há de errado.
Provavelmente o arg0.getColumn esteja trazendo valores maiores que 1…