Bom dia, estou com um problema que não estou conseguindo resolver. O problema é o seguinte: Eu quero pegar o valor da linha que eu selecionei na coluna 2, somar com o campo 3 do meu banco de dados e fazer um update no mesmo campo 3. Sendo assim valorselecionado+valorcampo3 = o que eu quero, que é o que vai voltar pro campo 3. Segue o código. Gostaria que me alertassem do que estou fazendo de errado.
publicvoidatualizabanco(){Stringsql="Select * from estoque where id=?";Stringsql1="Update estoque set qtd=? where id=?";try{pst=conexao.prepareStatement(sql);pst.setString(1,campoid.getText());rs=pst.executeQuery();if(rs.next()){}intsoma;intqtd=Integer.parseInt(rs.getString(3));intlinhaSelecionada=jTable1.getSelectedRow();intcoluna=2;intvalorSelecionado=(Integer)jTable1.getValueAt(linhaSelecionada,coluna);soma=qtd+valorSelecionado;pst=conexao.prepareStatement(sql1);pst.setString(1,Integer.toString(soma));pst.setString(2,campoid.getText());pst.executeUpdate();}catch(Exceptione){thrownewRuntimeException(e);}}
Pode até não ter, mas que if vazio tá errado, isso eu te garanto kk não faz sentido algum ele ser vazio. É como se lêssemos: " se rs.next() resultar true, não faça nada ". Qual a lógica de você ver se existe algo no ResultSet e não fazer nada com ele?
L
Luiz_Henrique22
Tudo bem, a gente ta aqui pra aprender kkk
smatt
Com certeza kkk até eu também estou, mas é bem lógico o if vazio ser um erro. Tente dessa forma:
ArrayIndexOutOfBounds ocorre quando quer acessar uma posição inexistente de um vetor
Na classe VendaProd, linha 135 que está ocorrendo o erro. O que tem nessa linha?
L
Luiz_Henrique22
throw new RuntimeException(e);
L
Luiz_Henrique22
Cara o problema está nesse método aí mesmo. Algo não estou acertando.
rodriguesabner
Faz o teste básico pra ver se ta pegando o valor da tabela mesmo, pode colocar esse código isolado mesmo, sem conexão. Você vai clicar na tabela e apertar em um botão e ele tem que mostrar o resultado
O resultado acima é CERTEZA que funciona, depois é só você pegar o resultado e fazer o SELECT com o banco.
privateintget_result(){intqtd;try{conecta.executaSQL("select * from tabela where id='"+campoid.getText()+"'");conecta.rs.first();qtd=conecta.rs.getInt("qtd");}catch(SQLExceptions){s.printStackTrace();}returnqtd;}publicupdate_database(){.......}
L
Luiz_Henrique22
Bom dia, ficou assim e continua a mesma coisa, dando o mesmo erro.
privateintget_table_result(){intresultado;Stringlinha=""+jTable1.getValueAt(jTable1.getSelectedRow(),1);intvalor=Integer.parseInt(linha);resultado=valor+get_result();returnresultado;}privateintget_result(){Stringsql="Select * from estoque where id=?";intqtd=0;try{pst=conexao.prepareStatement(sql);pst.setString(1,campoid.getText());rs=pst.executeQuery();while(rs.next()){qtd=Integer.parseInt(rs.getString(3));}}catch(Exceptione){thrownewRuntimeException(e);}returnqtd;}publicvoidatualizabanco(){Stringsql1="Update estoque set qtd=? where id=?";try{pst=conexao.prepareStatement(sql1);pst.setString(1,Integer.toString(get_table_result()));pst.setString(2,campoid.getText());pst.executeUpdate();}catch(Exceptione){thrownewRuntimeException(e);}}
rodriguesabner
Você tá clicando na tabela antes?
L
Luiz_Henrique22
Sim
L
Luiz_Henrique22
Esse erro não faz sentido.
rodriguesabner
Qual método você tá chamando depois de clicar na tabela?
get_table_result() e get_result() é interessante você colocar quando clicar na tabela.
Já o atualizabanco() você pode colocar quando clicar no botão.
L
Luiz_Henrique22
Acho que não tem a ver com isso não, os métodos já estão sendo chamados no atualizabanco(), não é preciso colocar para quando clicar na tabela. Observe, eu tenho esse código para diminuir do meu banco o que eu adiciono na tabela, é quase a mesma coisa e funciona, esse que a gente está tentando não está funcionando.
publicvoidconsultaproduto(){Stringsql="Select * from estoque where id=?";try{pst=conexao.prepareStatement(sql);pst.setString(1,campoid.getText());rs=pst.executeQuery();while(rs.next()){intqtd=Integer.parseInt(rs.getString(3));doublesoma=0;for(inti=0;i<jTable1.getRowCount();i++){intvalorAux=(int)jTable1.getValueAt(i,2);soma+=valorAux+1;}if(campoqtd.getText()==rs.getString(3)+1){JOptionPane.showMessageDialog(null,"Não temos esta quantidade em estoque, a quantidade do produto é: "+qtd,"Atenção!",JOptionPane.WARNING_MESSAGE);}else{if(soma<=qtd){adiciona();Stringsql1="Update estoque set qtd=? where id=?";try{intqtd1=Integer.parseInt(campoqtd.getText());intsubtracao=qtd-qtd1;pst=conexao.prepareStatement(sql1);pst.setString(1,Integer.toString(subtracao));pst.setString(2,campoid.getText());pst.executeUpdate();}catch(Exceptione){thrownewRuntimeException(e);}}else{JOptionPane.showMessageDialog(null,"Não temos esta quantidade em estoque, a quantidade do produto é: "+qtd,"Atenção!",JOptionPane.WARNING_MESSAGE);}}}}catch(Exceptione){JOptionPane.showMessageDialog(null,"Erro ao calcular Total Produtos: "+e.getMessage());}}
e o erro é sempre o mesmo java.lang.ArrayIndexOutOfBoundsException: -1
smatt
Isso daí é um catch. Por acaso este catch é o try-catch que você acessa o BD ou conecta ao BD? Mande o try-catch completo que ocorre este erro por gentileza.
L
Luiz_Henrique22
nenhum dos 2, esse catch é de outro método onde eu chamo o atualizabanco(), esse método onde está dando erro, é o que remove a linha e faz a subtração, jogando o valor para uma textfield, estou chamando o atualizabanco(), nele pois quero que quando remova a linha, o valor adicionado volte para o banco.