Preciso de ajudar! não sei usar for each![RESOLVIDO]

13 respostas
rafaelpiton

Pessoal não sei o que estou fazendo de errado....

eu recebo um objeto no meu método nota e nessa nota tem uma lista de itens.

Quanto faço o insert na tabela sem os itens...vai beleza.... cria um registro para cada nota na minha tabela de notas......

Quando eu faço um for each para inserir os itens de uma nota..vai beleza tb.....na tabela de itens.

Agora, quando tem mais de uma nota, na tabela de nota vai legal....agora os itens eles inserem os itens da nota 1 + os itens da nota 2 nas duas notas...

galera não sei se fui claro.... segue o código ai....

public void cadastrarNotaEdiVale(NotaFiscal f, NotaFiscal nota) {
        System.out.println("Cadastrando nota...");
        try {
            int codNota = 0;
            int codarquivo = 0;
            int origem = 0;
            int destino = 0;

            Connection con = Conexao.getConexao;
            
            

            String sql = "SELECT SEQCODNOTA.NEXTVAL FROM DUAL";
            PreparedStatement st1 = con.prepareStatement(sql);
            ResultSet rs1 = st1.executeQuery();
            if (rs1.next()) {
                codNota = rs1.getInt(1);
            }
            String sql2 = "SELECT CODEDIARQUIVOS.NEXTVAL FROM DUAL";
            PreparedStatement st2 = con.prepareStatement(sql2);
            ResultSet rs2 = st2.executeQuery();
            if (rs2.next()) {
                codarquivo = rs2.getInt(1);
            }

            String sql5 = " INSERT INTO TNOTAS( COD, " +
                    "TPARTIORIGEM, " +
                    "TPARTIDESTINO," +
                    "NUMERO_NF, " +
                    "SERIE_NF, " +
                    "CGC_FORNECEDOR, " +
                    "CGC_CLIENTE, " +
                    "DATA_EMISSAO, " +
                    "VALOR_ICMS, " +
                    "VALOR_IPI, " +
                    "BASE_IPI, " +
                    "BASE_ICMS, " +
                    "TOTAL_PRODUTOS, " +
                    "TOTAL_NF )" +
                    "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

            PreparedStatement stmt5 = con.prepareStatement(sql5);
            stmt5.setInt(1, codNota);
            stmt5.setInt(3, f.getCodOrigem());
            stmt5.setInt(4, f.getCodDestino());
            stmt5.setString(5, nota.getNumeroNota());
            stmt5.setString(6, nota.getSerieNota());
            stmt5.setString(7, nota.getCnpjFornecedor());
            stmt5.setString(8, nota.getCnpjDestino());
            stmt5.setString(9, new SimpleDateFormat("yyyyMMdd").format(nota.getDataEmissaoNota()));
            stmt5.setString(10, new ConvertDoubleToString().completaValor(nota.getValorICMS()));
            stmt5.setString(11, new ConvertDoubleToString().completaValor(nota.getValorIPI()));
            stmt5.setString(12, new ConvertDoubleToString().completaValor(nota.getBaseIPI()));
            stmt5.setString(13, new ConvertDoubleToString().completaValor(nota.getBaseICMS()));
            stmt5.setString(14, new ConvertDoubleToString().completaValor(nota.getTotaProdutos()));
            stmt5.setString(15, new ConvertDoubleToString().completaValor(nota.getTotalNotaFiscal()));
            stmt5.execute();

            String sql6 = "INSERT INTO TNOTASITENS(COD, " +
                    "TPARTIORIGEM, " +
                    "TPARTIDESTINO," +
                    "CODNOTA," +
                    "QUANTIDADE, " +
                    "VALOR_UNIT, " +
                    "NUMERO_NF, " +
                    "NUMERO_ITEM" +
                    ")VALUES(?,?,?,?,?,?,?,?,?)";
            PreparedStatement stmt6 = con.prepareStatement(sql6);

            for (ItemNota itens : nota.getItens()) {
                stmt6.setInt(1, codNota);
                stmt6.setInt(2, f.getCodOrigem());
                stmt6.setInt(3, f.getCodDestino());
                stmt6.setInt(4, codNota);
                stmt6.setDouble(5, itens.getQuantidade());
                stmt6.setDouble(6, itens.getValorProduto());
                stmt6.setString(7, nota.getNumeroNota());
                stmt6.setString(8, itens.getCodItem());
            stmt6.executeUpdate();
            }

13 Respostas

ViniGodoy

E já tentou usar o depurador? Seu for…each aparentemente está certo.

jokacwb

Quando vc diz mais de uma nota, vc refere-se as duas que o metodo cadastrarNotaEdiVale ta recebendo (NotaFiscal f, NotaFiscal nota)
ou refe-se a mais de uma chamada deste mesmo metodo?

outra coisa, q não tem nada a ver com o problema , mas la no stmt5 faltou atribuir valor
para o item 2 (TPARTIORIGEM)

J

Concordo. Tá mais com cara de erro de lógica do que erro de sintaxe

Você passa duas notas no seu método para fazer o insert de uma só?

Debuga o teu método que eu você vai encontrar o erro.

[]

rafaelpiton

Opa Vini …

vlw pela ajuda…

mas acho que sei o que é… mas ainda não sei resolver…

o problema é quando mando o objeto antes de eu chamar esse método eu seleciono em um outro método e vi agora que ele vem duplicado…

mas ainda não sei o que está errado…tem alguma idéia? vwl…

public List<NotaFiscal> listarNotasPendentes() {


        PreparedStatement stNota = null;
        PreparedStatement stItens = null;

        ResultSet rsNota = null;
        ResultSet rsItens = null;
        Connection conexao = null;


        //cria uma lista de notas
        List<NotaFiscal> listaNotas = new ArrayList<NotaFiscal>();
        List<ItemNota> listaItens = new ArrayList<ItemNota>();

        try {

            conexao = Conexao.getConexao();


         stNota = conexao.prepareStatement("SELECT * FROM TNOTA_HEADER a, TNOTA_TOTAIS b WHERE CONFERIDO = 0 AND a.CODNOTA = b.CODNOTA");


            rsNota = stNota.executeQuery();
           
            while (rsNota.next()) {

                //cria o obejto nota
                NotaFiscal nota = new NotaFiscal();
                //seta os valores do objeto nota

                nota.setCnpjFornecedor(rsNota.getString("CNPJ"));
                nota.setIeFornecedor(rsNota.getString("EMIT_IE"));
                nota.setRazaoSocialFornecedor(rsNota.getString("NOME"));
                nota.setNomeFantasiaFornecedor(rsNota.getString("FANT"));
                nota.setEndFornecedor(rsNota.getString("ENDER"));
                nota.setNrEndFornecedor(rsNota.getString("ENDER_NRO"));
                nota.setBairroFornecedor(rsNota.getString("BAIRRO"));
                nota.setMunicipioFornecedor(rsNota.getString("MUN"));
                nota.setEstadoFornecedor(rsNota.getString("ENDERUF"));
                nota.setCepFornecedor(rsNota.getString("CEP"));
                nota.setCodPaisFornecedor(rsNota.getString("PAIS"));
                nota.setFoneFornecedor(rsNota.getString("FONE"));


                nota.setCodNFE(rsNota.getInt("CODNOTA"));
                nota.setTotaProdutos(rsNota.getDouble("ICMSTOT_VPROD"));
                nota.setTotalNotaFiscal(rsNota.getDouble("ICMSTOT_VNF"));

               
                stItens = conexao.prepareStatement("SELECT * FROM TNOTA_ITENS WHERE CODNFE = '" + rsNota.getInt("CODNOTA") + "'");
                rsItens = stItens.executeQuery();

                while (rsItens.next()) {
                    ItemNota item = new ItemNota();
                    item.setValorProduto(rsItens.getDouble("VPROD"));
                    item.setQuantidade(rsItens.getDouble("QTD"));
                    item.setCodItem(rsItens.getString("CODITEM"));
                    listaItens.add(item);
                }
                nota.setItens(listaItens);
                //e adiciona o objeto nota na lista de notas

                listaNotas.add(nota);
            }

        } catch (Exception ex) {
            ex.printStackTrace();
        
        //retorna uma lista de notas não validadas
        return listaNotas;
    }

cara…ele ta somando todos os itens dos anteriores…tipo
se eu tenho 3 notas…o último tem o valor de todos os itens anteriores…

rafaelpiton

Pessoal escrevi errado nesse método só recebo uma usuário que ai está (NotaFiscal f) e uma nota(NotaFiscal nota)…

acredito ser problema de lógica mesmo…:C

J

Não entendi muito bem, mas acho o problema é

Você cria duas listas, uma de notas e outra de itens.

Na de notas, tá certinho, você adiciona as notas nela. Mas na de itens, você fica adicionando itens nela, independente da nota. Ou seja, a sua lista vai ter TODOS os itens de todas as notas. E como você passa a referência dessa lista para os seus objetos Nota, imagina a bagunça né?

Creio que a solução é dar um new na sua lista de itens quando salvar uma nota diferente. Assim a gente garante que terá apenas uma lista por nota entendeu?

jokacwb

Vc não estava zerando a variavel listaItens a cada nota, veja a alteracao q eu fiz
de forma a inserir os itens direto no objeto nota dispensando a variavel listaItens.

public List<NotaFiscal> listarNotasPendentes() {  
      
      
            PreparedStatement stNota = null;  
            PreparedStatement stItens = null;  
      
            ResultSet rsNota = null;  
            ResultSet rsItens = null;  
            Connection conexao = null;  
      
      
            //cria uma lista de notas  
            List<NotaFiscal> listaNotas = new ArrayList<NotaFiscal>();  
            //List<ItemNota> listaItens = new ArrayList<ItemNota>();  
      
            try {  
      
                conexao = Conexao.getConexao();  
      
      
             stNota = conexao.prepareStatement("SELECT * FROM TNOTA_HEADER a, TNOTA_TOTAIS b WHERE CONFERIDO = 0 AND a.CODNOTA = b.CODNOTA");  
      
      
                rsNota = stNota.executeQuery();  
                 
                while (rsNota.next()) {  
      
                    //cria o obejto nota  
                    NotaFiscal nota = new NotaFiscal();  

                    //seta os valores do objeto nota 
                   
                    nota.setItens( new ArrayList<ItemNota>());
      
                    nota.setCnpjFornecedor(rsNota.getString("CNPJ"));  
                    nota.setIeFornecedor(rsNota.getString("EMIT_IE"));  
                    nota.setRazaoSocialFornecedor(rsNota.getString("NOME"));  
                    nota.setNomeFantasiaFornecedor(rsNota.getString("FANT"));  
                    nota.setEndFornecedor(rsNota.getString("ENDER"));  
                    nota.setNrEndFornecedor(rsNota.getString("ENDER_NRO"));  
                    nota.setBairroFornecedor(rsNota.getString("BAIRRO"));  
                    nota.setMunicipioFornecedor(rsNota.getString("MUN"));  
                    nota.setEstadoFornecedor(rsNota.getString("ENDERUF"));  
                    nota.setCepFornecedor(rsNota.getString("CEP"));  
                    nota.setCodPaisFornecedor(rsNota.getString("PAIS"));  
                    nota.setFoneFornecedor(rsNota.getString("FONE"));  
      
      
                    nota.setCodNFE(rsNota.getInt("CODNOTA"));  
                    nota.setTotaProdutos(rsNota.getDouble("ICMSTOT_VPROD"));  
                    nota.setTotalNotaFiscal(rsNota.getDouble("ICMSTOT_VNF"));  
      
                     
                    stItens = conexao.prepareStatement("SELECT * FROM TNOTA_ITENS WHERE CODNFE = '" + rsNota.getInt("CODNOTA") + "'");  
                    rsItens = stItens.executeQuery();  
      
                    while (rsItens.next()) {  
                        ItemNota item = new ItemNota();  
                        item.setValorProduto(rsItens.getDouble("VPROD"));  
                        item.setQuantidade(rsItens.getDouble("QTD"));  
                        item.setCodItem(rsItens.getString("CODITEM"));  

                        //Adiciona o item direto na nota (sem passar por variavel)
                        nota.getItens().add(item);
                    }  
                    //nota.setItens(listaItens);  
                    //e adiciona o objeto nota na lista de notas  
      
                    listaNotas.add(nota);  
                }  
      
            } catch (Exception ex) {  
                ex.printStackTrace();  
              
            //retorna uma lista de notas não validadas  
            return listaNotas;  
        }
rafaelpiton

javablue:
Não entendi muito bem, mas acho o problema é

Você cria duas listas, uma de notas e outra de itens.

Na de notas, tá certinho, você adiciona as notas nela. Mas na de itens, você fica adicionando itens nela, independente da nota. Ou seja, a sua lista vai ter TODOS os itens de todas as notas. E como você passa a referência dessa lista para os seus objetos Nota, imagina a bagunça né?

Creio que a solução é dar um new na sua lista de itens quando salvar uma nota diferente. Assim a gente garante que terá apenas uma lista por nota entendeu?

Opa…

cara é isso mesmo…

é que quando fiz isso não achei exemplos na net sobre como colocar itens dentro de uma nota…

mas…cara vlw pela ajuda.

fiz o que jokacwb disse e funcionou…vlw mesmo cara…

até a próxima!

rafaelpiton
jokacwb:
Vc não estava zerando a variavel listaItens a cada nota, veja a alteracao q eu fiz de forma a inserir os itens direto no objeto nota dispensando a variavel listaItens.
public List<NotaFiscal> listarNotasPendentes() {  
      
      
            PreparedStatement stNota = null;  
            PreparedStatement stItens = null;  
      
            ResultSet rsNota = null;  
            ResultSet rsItens = null;  
            Connection conexao = null;  
      
      
            //cria uma lista de notas  
            List<NotaFiscal> listaNotas = new ArrayList<NotaFiscal>();  
            //List<ItemNota> listaItens = new ArrayList<ItemNota>();  
      
            try {  
      
                conexao = Conexao.getConexao();  
      
      
             stNota = conexao.prepareStatement("SELECT * FROM TNOTA_HEADER a, TNOTA_TOTAIS b WHERE CONFERIDO = 0 AND a.CODNOTA = b.CODNOTA");  
      
      
                rsNota = stNota.executeQuery();  
                 
                while (rsNota.next()) {  
      
                    //cria o obejto nota  
                    NotaFiscal nota = new NotaFiscal();  

                    //seta os valores do objeto nota 
                   
                    nota.setItens( new ArrayList<ItemNota>());
      
                    nota.setCnpjFornecedor(rsNota.getString("CNPJ"));  
                    nota.setIeFornecedor(rsNota.getString("EMIT_IE"));  
                    nota.setRazaoSocialFornecedor(rsNota.getString("NOME"));  
                    nota.setNomeFantasiaFornecedor(rsNota.getString("FANT"));  
                    nota.setEndFornecedor(rsNota.getString("ENDER"));  
                    nota.setNrEndFornecedor(rsNota.getString("ENDER_NRO"));  
                    nota.setBairroFornecedor(rsNota.getString("BAIRRO"));  
                    nota.setMunicipioFornecedor(rsNota.getString("MUN"));  
                    nota.setEstadoFornecedor(rsNota.getString("ENDERUF"));  
                    nota.setCepFornecedor(rsNota.getString("CEP"));  
                    nota.setCodPaisFornecedor(rsNota.getString("PAIS"));  
                    nota.setFoneFornecedor(rsNota.getString("FONE"));  
      
      
                    nota.setCodNFE(rsNota.getInt("CODNOTA"));  
                    nota.setTotaProdutos(rsNota.getDouble("ICMSTOT_VPROD"));  
                    nota.setTotalNotaFiscal(rsNota.getDouble("ICMSTOT_VNF"));  
      
                     
                    stItens = conexao.prepareStatement("SELECT * FROM TNOTA_ITENS WHERE CODNFE = '" + rsNota.getInt("CODNOTA") + "'");  
                    rsItens = stItens.executeQuery();  
      
                    while (rsItens.next()) {  
                        ItemNota item = new ItemNota();  
                        item.setValorProduto(rsItens.getDouble("VPROD"));  
                        item.setQuantidade(rsItens.getDouble("QTD"));  
                        item.setCodItem(rsItens.getString("CODITEM"));  

                        //Adiciona o item direto na nota (sem passar por variavel)
                        nota.getItens().add(item);
                    }  
                    //nota.setItens(listaItens);  
                    //e adiciona o objeto nota na lista de notas  
      
                    listaNotas.add(nota);  
                }  
      
            } catch (Exception ex) {  
                ex.printStackTrace();  
              
            //retorna uma lista de notas não validadas  
            return listaNotas;  
        }

Cara....Muuuuito obrigado pela ajudar!

funcionou certinho!

eu achei que quando eu recebesse o parâmetro no meu método....a variável estava fazia......

mas vlw mesmo!

Aproveitando.... como faço para receber no meu email os problemas do pessoal do fórum?

se eu puder ajudar.....

abração!

rafaelpiton

Pessoal…

gostaria de saber, se a maneira correta é criar um Resultset e Preparestantement para cada consulta, ou tem como criar um só e depois zerar ele?

jokacwb

Olá, cara vmus fazer o seguinte, para não estender muito este tópico , recomendo que edite o assunto dele colocando o [RESOLVIDO]
e as demais duvidas vc vai abrindo outros posts. Assim o fórum fica mais organizado e fácil para os demais colegas localizarem quando tiverem a mesma duvida.

rafaelpiton

jokacwb:
Olá, cara vmus fazer o seguinte, para não estender muito este tópico , recomendo que edite o assunto dele colocando o [RESOLVIDO]
e as demais duvidas vc vai abrindo outros posts. Assim o fórum fica mais organizado e fácil para os demais colegas localizarem quando tiverem a mesma duvida.

Opa…claro sem problemas!

e vlw pela ajuda novamente!

juceliohv

E como terminou essa historia.

Você abriu um novo topico?

Criado 29 de maio de 2011
Ultima resposta 18 de ago. de 2011
Respostas 13
Participantes 5