Duvida em grava banco

15 respostas
D

eai galera, estou com a seguinte situaçao, tenhu uma tabela onde guardo os dados do pedido e outra com id FK onde armazeno os itens do pedido, ai criei um insert para armazeda os dados do pedido , e outro insert dentro de um laço for para armazena os itens do pedido, mas nao quer roda,

public void gravarOS(Vendas v1) throws SQLException {
    try{
        String sql = "insert into vendadados(operacao, idcliente, totalbruto, totalliquido, idvendedor, idtipovenda, dataemissao, datavcto) values(?,?,?,?,?,?,?,?)";
       
        PreparedStatement stmt = conexao.prepareStatement(sql);
        
        //stmt.setInt(1, p1.getId());
        stmt.setInt(1, v1.getOperacao());
        stmt.setInt(2, v1.getIdcliente());
        stmt.setFloat(3, v1.getTotalbruto());
        stmt.setFloat(4, v1.getTotalliquido());
        stmt.setInt(5, v1.getIdvendedor());
        stmt.setInt(6, v1.getIdtipovenda());
        stmt.setString(7, v1.getDataemissao());
        stmt.setString(8, v1.getDatavecto());
        
        for (int i=0;i<=v1.getMinhaLista().size();i++){
            try{
            String sqlPeca = "insert into vendaitens(idpeca, qtde) values(?,?)";
            PreparedStatement stmtPeca = conexao.prepareStatement(sqlPeca);
            stmtPeca.setInt(1, v1.getMinhaLista().get(i).getId());
            stmtPeca.setFloat(2, v1.getMinhaLista().get(i).getQtde());
            stmtPeca.execute();
            stmtPeca.close();
            }catch (SQLException ex){
            System.out.print(ex);
            }
        }
        JOptionPane.showMessageDialog(null, "salvo com SUcesso!");
        stmt.execute();
        stmt.close();
    }catch (SQLException ex){
        System.out.print(ex);
    }
    }

15 Respostas

magnojg

DaitonJr, qual é o erro?

D

ele nao grava nada no laço FOR q fiz… so grava o primeiro insert

R

Qual a chave primaria (PK) da sua tabela de itens?, pode ser que o erro seja por causa da tentativa de gravacao da chave primaria. Se nao for isto, envie a configuracao das tabelas para uma melhor analise. Abracos

D

vou te enviar agora os codigos das duas tabelas, fiz no postgres

CREATE TABLE vendadados ( id serial NOT NULL, operacao integer, idcliente integer, totalbruto numeric, totalliquido numeric, idvendedor integer, idtipovenda integer, dataemissao character varying(12), datavcto character varying(12), CONSTRAINT vendadados_pkey PRIMARY KEY (id) )

CREATE TABLE vendaitens ( idi integer, idpeca integer, qtde integer, CONSTRAINT vendaitens_idi_fkey FOREIGN KEY (idi) REFERENCES vendadados (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION )

luxu

ele naum esta entrando no FOR…poste o codigo onde fica esse v1.getMinhaLista(), ou vela se ele retorna alguma coisa…

D

aqui esta o BEANS

public class PecaListaVenda {
    private int id;
    private int idPeca;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getIdPeca() {
        return idPeca;
    }

    public void setIdPeca(int idPeca) {
        this.idPeca = idPeca;
    }

    public float getQtde() {
        return qtde;
    }

    public void setQtde(float qtde) {
        this.qtde = qtde;
    }
    private float qtde;
}

AQUI ONDE ELE CARREGA OS ATRIBUTOS

PecaListaVenda pecaVenda =  new PecaListaVenda();
        pecaVenda.setIdPeca(p1.getId());
        pecaVenda.setQtde(qtdeproduto);
              
        pecasListadas.add(pecaVenda);//AQUI EU ADD A pecaVenda dentro do arrayList

AQUI ONDE EU COPIO O ARRAYLIST PARA O V1.GETMINHALISTA

Vendas v1 = new Vendas(); //EU CRIEI UMA CLASSE PRA RECEBER ATRIBUTOS DA VENDA E INICIEI ELE
//OBSERVAÇAO: AQUI NO OBJETO "VENDA" EXISTEM MAIS ATRIBUTOS MAS PUIS SO ESSE Q É O Q VC PEDIU
v1.setMinhaLista(pecasListadas);//AQUI EU SETO A pecasListadas NO MINHA LISTA E MANDO PRA GRAVAR DaoVendas dao = new DaoVendas();
dao.gravarOS(v1);

qualquer duvida me fale

luxu

tem muita coisa estranha, mas vamos começar assim…coloque antes do FOR q naum funfa isso…

System.out.println(v1.getMinhaLista()) so pra ver o q esta vindo desse método, eu axo q vira 0, teste ae!

diegobilhalva

Daiton… cole o erro do Catch para que te ajude. Será mais rápido.

D

blz… vou tenta aqui agora e ja respondo

D

diegobilhalva nao esta dando erro de try catch… nao da erro algum, por isso estou achando mto estranho

D

luxu realemente… ele nao imprime nda… ele so mostra NULL, ele nao entra dentro do for intao neh? o q vc acha?

D

luxu eu fuçando aqui eu descobri, era que quando eu tinha criado o List PecasListada havia um erro pq nao criei ele como um arraylist, so q ele nao pega o id da primeira tabela pra ser chave estrangeira da tabela de itens ? vc pode me dar uma ideia d como fazer isso?

D

galera sao 1:29 da manha… custei mas consegui o queria fazer, so vim msm pra ninguem responder desnecessariamente aqui e ajuda em outra duvida ou assunto, valeu

JhowTroMundo

Poderia postar a solução pra gente saber o que aconteceu =)

D

nao sei se era a forma mais simples de resolver.. mas dpois de tanto pensar em cima disso eu usei um select max(id) na tabela da chave primaria, e com isso eu pegava o ultimo valor gravado e copiava pra tabela da chave estrangeira... qualquer duvida eu esclreço melhor

public void gravarOS(Vendas v1) throws SQLException {
        String sql = "insert into vendadados(operacao, idcliente, totalbruto, totalliquido, idvendedor, idtipovenda, dataemissao, datavcto) values(?,?,?,?,?,?,?,?)";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setInt(1, v1.getOperacao());
        stmt.setInt(2, v1.getIdcliente());
        stmt.setFloat(3, v1.getTotalbruto());
        stmt.setFloat(4, v1.getTotalliquido());
        stmt.setInt(5, v1.getIdvendedor());
        stmt.setInt(6, v1.getIdtipovenda());
        stmt.setString(7, v1.getDataemissao());
        stmt.setString(8, v1.getDatavecto());
        JOptionPane.showMessageDialog(null, "salvo com SUcesso!");
        stmt.execute();
        stmt.close();
       // AQUI EU ACABEI DE GRAVAR O INSERT NA TABELA DA CHAVE PRIMARIA
       //AGORA EU FIZ UM SELECT MTAX ID PRA PEGAR O ULTIMO ID PRA GRAVAR NA OUTRA TABELA DA CHAVE ESTRANGEIRA
       // AI ESSE ID Q O SELECT MAX ME RETORNO EU UTILIZEI ELE PRA POR COMO CHAVE ESTRANGEIRA
        String sqlPegaUltimoID = "SELECT MAX(id) id  FROM vendadados";
        PreparedStatement stmtPegaUltimoID = this.conexao.prepareStatement(sqlPegaUltimoID);
        ResultSet rs = stmtPegaUltimoID.executeQuery();
        
        while(rs.next()){
            List<PecaListaVenda> arraytemp= new ArrayList<PecaListaVenda>();
            arraytemp = (v1.getMinhaLista());
            int tempId = rs.getInt("id");
            System.out.print(tempId);
            //AI AGORA EU PEGUEI O ID(COMO CHAVE ESTRANGEIRA) E A LISTA DE PEÇAS QUE QUERO POR NA OUTRA TABELA E CRIEI UM METODO PRA GRAVA-LOS
            gravarTabelaChaveEstrangeira(tempId, arraytemp );
        }
        
        rs.close();
        stmtPegaUltimoID.close();

    }
    private void gravarTabelaChaveEstrangeira(int tempId, List<PecaListaVenda> arraytemp) throws SQLException {
        for (int i=0;i<=arraytemp.size();i++){

               String sqlPeca = "insert into vendaitens(idi, idpeca, qtde) values(?,?,?)";
               PreparedStatement stmtPeca = conexao.prepareStatement(sqlPeca);
               stmtPeca.setInt(1, tempId);
               stmtPeca.setInt(2, arraytemp.get(i).getIdPeca());
               stmtPeca.setFloat(3, arraytemp.get(i).getQtde());
               stmtPeca.execute();
               stmtPeca.close();

        }
    }
Criado 1 de janeiro de 2011
Ultima resposta 3 de jan. de 2011
Respostas 15
Participantes 6