Problema com loop para devolver estoque

2 respostas
rodolpho.netto

Pessoal, não consigo pensar num loop que pega varios itens dentro de uma tabela com itens de pedido com suas determinadas quantidades e devolve essas quantidades aos seus estoques na tabela de produtos quando o pedido é apagado, não consigo fazer isso, posso ter o mesmo produto varias vezes no pedido com quantidades diferentes, e produtos diferentes com quantidades diferentes, alguem pode me ajudar?

estou tentando assim mas ele da o seguinte erro Erro: Subquery returns more than 1 row

public void cancelarPedido(){
              String id_pedido2 = ednpedido.getText();
              String sql = "SELECT * FROM `item_pedido` WHERE id_pedido = '"+id_pedido2+"'";
              try {
                 con.executeSQL(sql);
            {
                
            }while(con.resultset.next());
             String insere3SQL = "UPDATE produto SET qtd =`qtd`+ (SELECT sum(qtd)FROM item_pedido WHERE id_prod = (SELECT id_prod FROM item_pedido WHERE id_pedido = '"+id_pedido2+"'GROUP BY id_prod)) WHERE id_prod IN ( SELECT id_prod "+
                                  "FROM item_pedido "+
                                  "WHERE id_pedido = '"+id_pedido2+"')";
                try {
                    con.statemente.executeUpdate(insere3SQL);
                }
                catch (SQLException ex) {
                            System.out.println("Erro: "+ex.getMessage());
             }
              
              
              String insere6SQL = "DELETE FROM item_pedido WHERE id_pedido = '"+id_pedido2+"'";
              String insere7SQL = "DELETE FROM pedido WHERE id_pedido = '"+id_pedido2+"'";
            try {
                con.statemente.executeUpdate(insere6SQL);
            }
            catch (SQLException ex) {
                        System.out.println("Erro: "+ex.getMessage());
            }  
            try {
                con.statemente.executeUpdate(insere7SQL);
            }
            catch (SQLException ex) {
                        System.out.println("Erro: "+ex.getMessage());
            }    
        } catch (SQLException ex) {
            Logger.getLogger(cad_pedido.class.getName()).log(Level.SEVERE, null, ex);
        }
  
               cad_pedido.this.dispose();
            }

2 Respostas

A

Aquele update pode ser bem mais simples.

A lógica é: para cada item do pedido, pegue o produto, vá na tabela de produtos e adicione a quantidade (que você já tem no item) de volta ao produto (que também tem em item).

Você dá um SELECT em Item_pedido, mas não faz nada com os valores que tem lá.
Deveria fazer algo assim:

String sql = "SELECT quantidade, id_produto FROM `item_pedido` WHERE id_pedido = ? " ;  
   //dentro do while
   int quantidade = con.resultset.getInt("quantidade");
   int idProduto = con.resultset.getInt("id_produto ");

   sql = "UPDATE produto SET qtd = qtd + " + quantidade  + " WHERE id_produto = " + idProduto;

Agora, fora isso, seu código tem uma série de problemas que podem afetar segurança, consistência, performance, facilidade de manutenção…

Do mais importante para o menos recomendo que faça:

  • Retire esses try-catchs se não tá fazendo nada com eles. (dar System.out.print como como “fazer nada”)
  • Aprenda como utilizar transações no banco de dados/jdbc
  • Aprenda como usar PreparedStatement ao invés de Statement
  • Separar código de negócio, de código de persistência (DAO) e código de interface

Com esses 4 itens já dá pra dar uma boa melhorada nisso aí.

rodolpho.netto

Fiz da forma que voce falou agora recebo o seguinte erro

public void cancelarPedido(){
                String id_pedido2 = ednpedido.getText();
               String sql = "SELECT qtd, id_prod FROM `item_pedido` WHERE id_pedido = '"+id_pedido2+"'"; 
              try {
                 con.executeSQL(sql);
            {
                
            }con.resultset.first();
            while(con.resultset.next());
            int quantidade = con.resultset.getInt("qtd");
             int idProduto = con.resultset.getInt("id_prod");

             sql = "UPDATE produto SET qtd = qtd + '"+quantidade+"' WHERE id_produto = '"+idProduto+"'";
                try {
                    con.statemente.executeUpdate(sql);
                }
                catch (SQLException ex) {
                            System.out.println("Erro: "+ex.getMessage());
             }
                           
              
              String insere6SQL = "DELETE FROM item_pedido WHERE id_pedido = '"+id_pedido2+"'";
              String insere7SQL = "DELETE FROM pedido WHERE id_pedido = '"+id_pedido2+"'";
            try {
                con.statemente.executeUpdate(insere6SQL);
            }
            catch (SQLException ex) {
                        System.out.println("Erro: "+ex.getMessage());
            }  
            try {
                con.statemente.executeUpdate(insere7SQL);
            }
            catch (SQLException ex) {
                        System.out.println("Erro: "+ex.getMessage());
            }    
        } catch (SQLException ex) {
            Logger.getLogger(cad_pedido.class.getName()).log(Level.SEVERE, null, ex);
        }
  
               cad_pedido.this.dispose();
            }
Set 29, 2012 11:36:45 AM yamada3.cad_pedido cancelarPedido
Grave: null
java.sql.SQLException: After end of result set
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:843)
	at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2675)
	at com.mysql.jdbc.ResultSetImpl.getInt(ResultSetImpl.java:2816)
	at yamada3.cad_pedido.cancelarPedido(cad_pedido.java:383)
	at yamada3.cad_pedido.canvenActionPerformed(cad_pedido.java:830)
	at yamada3.cad_pedido.access$500(cad_pedido.java:25)
	at yamada3.cad_pedido$6.actionPerformed(cad_pedido.java:632)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2713)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
	at java.awt.EventQueue.access$000(EventQueue.java:101)
	at java.awt.EventQueue$3.run(EventQueue.java:666)
	at java.awt.EventQueue$3.run(EventQueue.java:664)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:680)
	at java.awt.EventQueue$4.run(EventQueue.java:678)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Criado 27 de setembro de 2012
Ultima resposta 29 de set. de 2012
Respostas 2
Participantes 2