Erro na venda

Ola pessoal, gostaria da ajuda de võcês para resolver este problema:

Tenho uma classe chamada VendaBean que busca no meu banco de dados os seguintes campos das tabelas vendas e item_venda:

private Integer codigo; private Integer codigo_item; private Integer clientes_codigo; private Integer usuarios_codigo; private Integer produtos_codigo; private Integer vendas_codigo; private Date data_venda; private Double valor_total; private Float quantidade_vendida; private Double valor_item;

E tenho uma outra VendaControl, que contem o metodo cadastrar venda :

public void cadastrarVenda(VendasBean venda){ try { Connection ExConn = banco.conecta(); String sSql = "INSERT INTO VENDAS (USUARIOS_CODIGO, CLIENTES_CODIGO, DATA_VENDA) VALUES(?,?,?)"; String sSql2 = "INSERT INTO ITEM_VENDA (PRODUTOS_CODIGO, VENDAS_CODIGO, QUANTIDADE_VENDIDA, VALOR_ITEM, VALOR_TOTAL) VALUES(?,?,?,?)"; PreparedStatement stm = ExConn.prepareStatement(sSql); stm.setInt(1, venda.getUsuarios_codigo()); stm.setInt(2, venda.getProdutos_codigo()); stm.setInt(3, venda.getClientes_codigo()); stm.setInt(4, venda.getVendas_codigo()); stm.setDate(5, venda.getData_venda()); stm.setDouble(6, venda.getValor_total()); stm.setFloat(7, venda.getQuantidade_vendida()); stm.setDouble(8, venda.getValor_item()); stm.executeUpdate(); banco.desconecta(); } catch (Exception ex) { ex.printStackTrace(); } }

Tenho tambem uma classe principal que chama o método cadastrar venda:

[code]private void cadastrarVenda(){

    if (venda.size() == 0){
        JOptionPane.showMessageDialog(this, "Inclua pelo menos um produto!");
    }else{       
        try {
            VendasControl vc = new VendasControl();
            VendasBean venda = new VendasBean();
            SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
            java.util.Date d = new java.util.Date();
            Date data = Date.valueOf(formato.format(d));
            
                venda.setClientes_codigo(clientes.get(cbClientes.getSelectedIndex()).getCodigo());
                venda.setUsuarios_codigo(usuarios.get(cbUsuarios.getSelectedIndex()).getCodigo());
                venda.setProdutos_codigo(produtos.get(cbProdutos.getSelectedIndex()).getCodigo());
                venda.setVendas_codigo(venda.getVendas_codigo());
                venda.setData_venda(data);
                venda.setValor_total(total);
                vc.cadastrarVenda(venda);
                JOptionPane.showMessageDialog(this, "Venda cadastrada com sucesso!"); 
             
           
            
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(this, "Erro ao cadastrar Venda!");
        } 
        venda.clear();
        cleartmVendas();
    }
}[/code]

Quando realizo uma venda esta gerando este erro que eu nao consegui solucionar:

java.lang.NullPointerException
at sisvenda.vendas.VendasControl.cadastrarVenda(VendasControl.java:95)
at sisvenda.RegistrarVenda.cadastrarVenda(RegistrarVenda.java:313)
at sisvenda.RegistrarVenda.btFinalizarActionPerformed(RegistrarVenda.java:292)
at sisvenda.RegistrarVenda.access$100(RegistrarVenda.java:30)
at sisvenda.RegistrarVenda$2.actionPerformed(RegistrarVenda.java:158)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6263)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
at java.awt.Component.processEvent(Component.java:6028)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4630)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
at java.awt.Container.dispatchEventImpl(Container.java:2085)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4460)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Me ajudem, por favor…

Pous ta osso esse seu esquema, vou tentar:

Seu no cadastrarVenda(VendaBean venda) o PreparedStatement usa a sSql q tem apenas 3 parametros.

A sSql2 ta la só voando.

Em baixo vc seta 8 parametros, sendo que só tem 3 (USUARIOS_CODIGO, CLIENTES_CODIGO, DATA_VENDA).

Os itens deveriam ir em outro PreparedStatement e dentro de um for (pq em teoria devem ser um array)

Precisa ver se sua conexão não está com erro e retornando nulo tbm

Cara olha essa linha 6 do teu codigo:

PreparedStatement stm = ExConn.prepareStatement(sSql); 

Voce tah preparando um statement com 3 parametros segundo a tua string sSql. Acho que voce QUIS criar um segundo statement que recebe a tua segunda consulta (sSql2).

…blz, até ai nada que o heroijapa jah nao tenha dito…

O que eu queria dizer mesmo era pra voce corrigir esse teu banco.desconecta…Isso de colocar pra desconectar dentro do bloco try ta “cagando o pau” e é uma pessima pratica de programacao…tipo suponha que voce tenha uma excessao sql(o que nao é muito incomum) antes de executar esse banco.desconecta() como fica? Tu vai deixar conexao aberta pra nada…pra isso existe o finally…coloca essa tua desconexao dentro de um finally que voce vai ter menos problemas…Ai dentro do finally vc coloca um outro try catch pra capturar excessoes relativas a desconexao.

Outra coisa nao muito legal sao esses nomes de variáveis com “_”…voce pode simplesmente usar o padrao e deixar isso tudo junto e pra cada nova palavra voce coloca a primeira letra maiúscula…isso nao é um erro grave como o desconectar mas ajuda na hora de voce usar expressoes regulares por exemplo…voce tem sempre que pensar em modificacoes que possam ocorrer no seu codigo. Se voce nao pensar nisso, as facilidades do Java nao servirão de nada.

Outra coisa estranha que achei nesse negocio foi que teu objeto tem 10 atributos, as tuas duas tabelas, pelo que pude perceber pelos “Inserts” tem 7 parametros e voce tentou passar OITO parametros pro seu statement…resumindo: tem mt coisa estranha aí cara…

Sou iniciante na linguagem java e não entendi a resposta de voces, por isso tem jeito de postarem um exemplo de como inserir dados nas duas tabellas oa mesmo tempo, quando realiza uma venda

[code]public void cadastrarVenda(VendasBean venda){
try {
Connection ExConn = banco.conecta();
String sSql = “INSERT INTO VENDAS (USUARIOS_CODIGO, CLIENTES_CODIGO, DATA_VENDA) VALUES(?,?,?)”;
String sSql2 = “INSERT INTO ITEM_VENDA (PRODUTOS_CODIGO, VENDAS_CODIGO, QUANTIDADE_VENDIDA, VALOR_ITEM, VALOR_TOTAL) VALUES(?,?,?,?,?)”;
//Faz consultas em “Vendas”
PreparedStatement stmVendas = ExConn.prepareStatement(sSql);
//Faz consultas em “Item_Venda”
PreparedStatement stmItemVenda = ExConn.prepareStatement(sSql2);

            //Insere em "Vendas"
            stmVendas.setInt(1,venda.getUsuarios_codigo());
            stmVendas.setInt(2, venda.getClientes_codigo());                     
            stmVendas.setDate(3,venda.getData_venda());

            //Insere em "Itens_Venda"
            stmItemVenda.setInt(1,venda.getProdutos_codigo());
            stmItemVenda.setInt(2, venda.getVendas_codigo());  
            stmItemVenda.setFloat(3, venda.getQuantidade_vendida());     
            stmItemVenda.setDouble(4, venda.getValor_item()); 
            stmItemVenda.setDouble(5, venda.getValor_total()); 	

    } 
    catch (Exception ex) {
        ex.printStackTrace();
    }
    finally{
             try{
                  banco.desconecta();
             }
             catch(Exception E){
                   E.printStackTrace();
             }
    }
}[/code]

Pronto olha aí que acho que ja da pra entender…

Ola carlos.e.a, entendi o codigo e acrescentei no projeto, mas agora esta gerando este erro:

Erro ao fechar conexão com banco!!!null
Conexão efetuada com sucesso!!
Erro ao fechar conexão com banco!!!null
Conexão efetuada com sucesso!!
java.lang.NullPointerException
        at sisvenda.vendas.VendasControl.cadastrarVenda(VendasControl.java:103)
        at sisvenda.RegistrarVenda.cadastrarVenda(RegistrarVenda.java:318)
        at sisvenda.RegistrarVenda.btFinalizarActionPerformed(RegistrarVenda.java:292)
        at sisvenda.RegistrarVenda.access$100(RegistrarVenda.java:30)
        at sisvenda.RegistrarVenda$2.actionPerformed(RegistrarVenda.java:158)
        at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
        at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
        at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
        at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
        at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
        at java.awt.Component.processMouseEvent(Component.java:6263)
        at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
        at java.awt.Component.processEvent(Component.java:6028)
        at java.awt.Container.processEvent(Container.java:2041)
        at java.awt.Component.dispatchEventImpl(Component.java:4630)
        at java.awt.Container.dispatchEventImpl(Container.java:2099)
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574)
        at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238)
        at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168)
        at java.awt.Container.dispatchEventImpl(Container.java:2085)
        at java.awt.Window.dispatchEventImpl(Window.java:2478)
Erro ao fechar conexão com banco!!!null
        at java.awt.Component.dispatchEvent(Component.java:4460)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
EXECUTADO COM SUCESSO (tempo total: 22 segundos)[/code]

Aqui vou postar os meus codigo para que vcs possam me ajudar:

Classe VendaBean:
 [code]   private Integer Codigo;
             private Integer CodigoItem;
             private Integer ClientesCodigo;
             private Integer UsuariosCodigo;
             private Integer ProdutosCodigo;
             private Integer VendasCodigo;
             private Date DataVenda;
             private Double ValorTotal;
             private Float QuantidadeVendida;
             private Double ValorItem;

Classe VendaControl:

 public void cadastrarVenda(VendasBean venda){   
        try {   
                Connection ExConn = banco.conecta();   
                String sSql =  "INSERT INTO VENDAS (UsuariosCodigo, ClientesCodigo, DataVenda)  VALUES(?,?,?)";   
                String sSql2 = "INSERT INTO ITEM_VENDA (ProdutosCodigo, VendasCodigo, QuantidadeVendida, ValorItem, ValorTotal)  VALUES(?,?,?,?,?)";   
                 //Faz consultas em "Vendas"   
                PreparedStatement stmVendas = ExConn.prepareStatement(sSql);     
                //Faz consultas em "Item_Venda"   
                PreparedStatement stmItemVenda = ExConn.prepareStatement(sSql2);       
     
                //Insere em "Vendas"   
                stmVendas.setInt(1,venda.getUsuariosCodigo());   
                stmVendas.setInt(2, venda.getClientesCodigo());                       
                stmVendas.setDate(3,venda.getDataVenda());   
  
                //Insere em "Itens_Venda"   
                stmItemVenda.setInt(1,venda.getProdutosCodigo());   
                stmItemVenda.setInt(2, venda.getVendasCodigo());     
                stmItemVenda.setFloat(3, venda.getQuantidadeVendida());       
                stmItemVenda.setDouble(4, venda.getValorItem());   
                stmItemVenda.setDouble(5, venda.getValorTotal());     
  
        }   
        catch (Exception ex) {   
            ex.printStackTrace();   
        }   
        finally{   
                 try{   
                      banco.desconecta();   
                 }   
                 catch(Exception E){   
                       E.printStackTrace();   
                 }   
        }   
    }  

Classe RegistrarVenda:

public class RegistrarVenda extends javax.swing.JFrame {
    
    DefaultTableModel tmVendas = new DefaultTableModel(null, new String[] {"Usuario","Produto","Quantidade","Valor"});
    List<ClienteBean> clientes;
    List<ProdutoBean> produtos;
    List<UsuarioBean> usuarios;
   // ListSelectionModel lsmClientes;
    List<VendasBean> venda = new ArrayList<VendasBean>();
    double total = 0;


    /** Creates new form RegistrarVenda */
    public RegistrarVenda() {
        initComponents();
        listarClientes();
        listarProdutos();
        listarUsuarios();
    }
    
    private void listarProdutos(){
        ProdutoControl prd = new ProdutoControl();
        produtos = prd.listarProdutos("%%");
        cbProdutos.removeAllItems();
        for (int i = 0; i < produtos.size(); i++){
            cbProdutos.addItem(produtos.get(i).getNome());
        }
    }
    
    private void listarClientes(){
        ClienteControl cli = new ClienteControl();
        cbClientes.setSelectedItem(" ");
        clientes = cli.listarClientes("%%");
        cbClientes.removeAllItems();
        for (int i = 0; i < clientes.size(); i++){
            cbClientes.addItem(clientes.get(i).getNome());
        }
    }
    
    private void listarUsuarios(){
        UsuarioControl uc = new UsuarioControl();
        usuarios = uc.listarUsuarios("%%");
        cbUsuarios.removeAllItems();
        for (int i = 0; i < usuarios.size(); i++){
            cbUsuarios.addItem(usuarios.get(i).getLogin());
        }
    }

   private void btCancelarActionPerformed(java.awt.event.ActionEvent evt) {                                           
        cancelarVenda();
    }                                          

    private void cancelarVenda(){
        while (tmVendas.getRowCount() > 0){
            tmVendas.removeRow(0);
        }
        total = 0;
        ftfTotal.setValue(0);
        venda.clear();
        this.dispose();
    }
    
    private void btFinalizarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        cadastrarVenda();
        
    }                                           

    private void cadastrarVenda(){
        Float quantidade = null;
        Double valor = null;
        
        if (venda.size() == 0){
            JOptionPane.showMessageDialog(this, "Inclua pelo menos um produto!");
        }else{       
            try {
                VendasControl vc = new VendasControl();
                VendasBean venda = new VendasBean();
                SimpleDateFormat formato = new SimpleDateFormat("yyyy-MM-dd");
                java.util.Date d = new java.util.Date();
                Date data = Date.valueOf(formato.format(d));
                    venda.setClientesCodigo(clientes.get(cbClientes.getSelectedIndex()).getCodigo());
                    venda.setUsuariosCodigo(usuarios.get(cbUsuarios.getSelectedIndex()).getCodigo());
                    venda.setProdutosCodigo(produtos.get(cbProdutos.getSelectedIndex()).getCodigo());
                    venda.setVendasCodigo(venda.getVendasCodigo());
                    venda.setQuantidadeVendida(quantidade);
                    venda.setValorItem(valor);
                    venda.setValorTotal(total);
                    venda.setDataVenda(data);
                   
                    vc.cadastrarVenda(venda);
                    JOptionPane.showMessageDialog(this, "Venda cadastrada com sucesso!"); 
         } catch (Exception ex) {
                JOptionPane.showMessageDialog(this, "Erro ao cadastrar Venda!");
            } 
            venda.clear();
            cleartmVendas();
        }
    }
    
          
    private void btIncluirActionPerformed(java.awt.event.ActionEvent evt) {                                          
        incluirProduto();
    }                                         
    
    private void incluirProduto(){
        if (verificarQuantidade()){
            VendasBean vb = new VendasBean();
            vb.setClientesCodigo(clientes.get(cbClientes.getSelectedIndex()).getCodigo());
            vb.setUsuariosCodigo(usuarios.get(cbUsuarios.getSelectedIndex()).getCodigo());
            vb.setProdutosCodigo(produtos.get(cbProdutos.getSelectedIndex()).getCodigo());
            vb.setQuantidadeVendida(Float.parseFloat(String.valueOf(ftfQuantidade.getValue())));
            venda.add(vb);
            String produto = produtos.get(cbProdutos.getSelectedIndex()).getNome();
            String cliente = clientes.get(cbClientes.getSelectedIndex()).getNome();
            String usuario = usuarios.get(cbUsuarios.getSelectedIndex()).getLogin();
            String quantidade = String.valueOf(ftfQuantidade.getValue());
            String valor = String.valueOf(produtos.get(cbProdutos.getSelectedIndex()).getValorItem() * Float.parseFloat(quantidade));
            String [] campos = new String [] {usuario, produto, quantidade, valor};
            tmVendas.addRow(campos);
            total += Double.parseDouble(valor);
            ftfTotal.setValue(total);
            
        } else {
            JOptionPane.showMessageDialog(this, "Quantidade inválida!");
            ftfQuantidade.requestFocus();
        }
    }
    
    private void cleartmVendas(){
        int rowsCount = tmVendas.getRowCount();
        for(int i = 0; i < rowsCount; i++){
            tmVendas.removeRow(0);
        }
        ftfTotal.setText("");
    }
    
    private boolean verificarQuantidade(){
        try {
            if (Integer.parseInt(String.valueOf(ftfQuantidade.getValue())) > 0){
                return true;
            }
        } catch (NumberFormatException ex) {
            ex.printStackTrace();
        }
        return false;
    }
    
    private String formatValue(String value) {
		value = value.replace('.', ',');
		if (value.charAt(value.length() - 2) == ',') {
			value = value + "0";
		}
		if (value.indexOf(",") != value.length() - 3) {
			value = value.substring(0, value.indexOf(",") + 2);
		}
		return value;
	}
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new RegistrarVenda().setVisible(true);
            }
        });
    }

Me ajudem, por favor…

Cara como voce pode ver tah dando problema nessa tua classe banco nos métodos conecta e desconecta…esses teus metodos tao com algum erro de logica…Voce tah direcionando direito na hora de chamar Class.forName() E DriverManager.getConnection()? Se voce tiver direcionando o getConnection pro lugar errado tua aplicacao está toda comprometida e eu acho que esse é o caso…voce jah tentou fazer uma consulta simples pra ver se essa tua conexao realmente tah achando o banco?

Pq como voce pode ver ele fica exibindo que nao conseguiu conectar depois que a conexao foi estabelecida…mas o problema maior é esse teu PointerNullException…

Tu tah esquecendo de inicializar alguma referencia nesses teus objetos…

Outra coisa: esse teu codigo tah mt confuso…O nome das variáveis nao é nada esclarecedor, tem Array e Objeto único com o mesmo nome(como por exemplo ‘venda’). Com isso fica muito dificil encontrar erros…Outra, eu nao sei o que tem dentro do teu Objeto vendaBean, enfim tah dificil idenficar erro aí cara…Mas a priori é alguma refencia nao inicializada…

Oi,

Olhei por cima,não sei se comentou que banco está usando,é uma informação importante… :wink:

Se quiser baixar esse projeto e da uma olhada ,talvez ajude…

http://www.guj.com.br/java/213716-gerar-parcelas-#1088651