[RESOLVIDO] O que há de errado com este método?

7 respostas
D

Boa noite a todos.

Estou fazendo no Net Beans um sistema de controle de estoque de material.
Ele possui as tabelas Material, Requisição, entre outras…

Quando crio uma requisição, informo em uma tela GUI quais os materiais solcitados e suas quantidades.

Quando vou concluir (fechar) uma requisição, na tabela Material os saldos dos materiais solicitados devem ser atualizados. E é aí que estou tendo dificuldades.

Eis a rotina que estou usando, com comentários após as linhas de código mais importantes. Caso não entendam algo, me respondam que eu explico melhor, ou envio o programa completo compactado para vcs darem uma olhada.

public boolean AtualizarSaldos(){
        try {
        
            sql = "select * from estoque.requisicao, estoque.material where (fechada=0) and"
                    +" (estoque.material.id = estoque.requisicao.material);";
            /*
             * O campo "fechada" pertence à tabela estoque.Requisicao, e diz se uma requisição foi 
             * concluída (fechada = 1) ou não (fechada = 0).
             * A query diz que devem ser selecionados os códigos de material iguais nas tabelas 
             * Requisição e Material, cuja requisição ainda esteja aberta.
             */
            
            rs = stm.executeQuery(sql);
           
            while (rs.next()) {
                aux = rs.getInt("saldo") - rs.getInt("quantidade");
                System.out.println(aux);
                /* 
                 * O campo "saldo" pertence à tabela Material e o campo "Quantidade" pertence à
                 * tabela Requisição.
                 * A variável inteira "aux" subtrai o saldo atual do material da quantidade
                 * solicitada na requisição, ou seja, diz qual será o novo saldo do material.
                 */
                
                sql = "update estoque.material set saldo = '"+ aux +"' where estoque.material.id = " + rs.getInt("material");
                try {
                    stm.executeUpdate(sql);
                } catch (SQLException ex) {
                    System.out.println("pane na alteração do item");
                }
                /*
                 * Tudo que esta query faz é selecionar, na tabela Material, os materiais que estavam 
                 * na requisição e atualizar o saldo de cada um deles (variável aux).
                 */
                
            }
        }catch(Exception e){
            System.out.println("PANE GERAL");
            return false;
        }

        return true;
    }

O problema deste código acima é que ele funciona SOMENTE NA PRIMEIRA ITERAÇÃO DO WHILE, ou seja, somente o saldo do primeiro material da requisição é atualizado na tabela Material. Após a primeira iteração, ele pula para o Exception “PANE GERAL”.

PORÉM… se eu retirar do código a query que atualiza os saldos dos materiais, a rotina funciona perfeitamente, tanto que na linha “…println(aux)”, ele faz cada iteração while e me mostra, a cada iteração, o saldo atualizado de cada um dos materiais que constavam na requisição, o que não acontece se a query continuar ali, pois ele me mostra somente o saldo do primeiro material e causa a exceção.

Sim, antes que vcs me digam para colocar essa query em um método separado, tentei fazer e o problema persiste. O problema estaria na query então?

Um outro teste que fiz foi tirar a condição (where…) da query de atualizar o saldo, e o efeito foi o seguinte:
TODOS OS MATERIAIS da tabela Material (INCLUINDO OS QUE NEM ESTAVAM NA REQUISIÇÃO) tiveram seus saldos atualizados com o saldo DO PRIMEIRO MATERIAL, ou seja, todos ficaram com saldos iguais. Hilário mas verdade.

Estou criando o sistema no NetBeans 7.0.1 e criando as tabelas no MySQL Workbench 5.2 CE.

Caso não seja possível resolvermos aqui no fórum, posso mandar o programa compactado em anexo.

7 Respostas

R

Em vez desse ‘pane geral’ coloque um e.printStackTrace() e coloque aqui o erro que ta dando.

D

mostra a mensagem
“Operation not allowed after ResultSet closed”

R

mostra como ta criando a connection e o statement

D
public Requisicoes(acessoBanco ab) {
        this.ab = ab;
        con = ab.getCon();
        try {
            stm = con.createStatement();
        } catch (SQLException ex) {
            Logger.getLogger(Requisicoes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

PS… a bateria do meu note tá acabando, talvez só veja a resposta em casa, mas depois eu vejo e tento seguir o que for instruído. Qualquer coisa peço socorro.

pmlm

Não podes usar a mesma Statement

D

Funcionou! Criei e declarei outra statement, depois usei ela nessa query e ele atualizou certinho!
Obrigado a todos que ajudaram!

rogelgarcia

Além disso… tem outros erros:

acessoBanco - Nome de classe com letra minuscula
AtualizarSaldos - Nome de método com letra maiúscula

Criado 8 de novembro de 2011
Ultima resposta 8 de nov. de 2011
Respostas 7
Participantes 4