Ajuda JBoleto [RESOLVIDO]

12 respostas
N

Boa tarde!
Estou tendo algumas dificuldades em gerar boletos com o JBoleto.
Minha duvida é a seguinte:
Preciso gerar um arquivo com 6 seis boletos diferentes, mas qnd coloco dentro do loop só aparece o ultimo boleto que está no banco de dados, segue o código abaixo:

public void processarBoleto(String idAluno){
        // Buscando dados do lancamento
        ResultSet rs;
        String sql;
        JBoleto jBoleto;
        JBoletoBean jBoletoBean;
        try {
            sql = "SELECT * FROM view_lancamentos WHERE aluno='"+idAluno+"'";
            rs  = this.stm.executeQuery(sql);
            rs.next();
            do {
                jBoletoBean = new JBoletoBean();
                jBoletoBean.setDataDocumento(rs.getString("data_processamento"));
                jBoletoBean.setDataProcessamento(rs.getString("data_processamento"));      

                jBoletoBean.setCedente("ESCOLA SANTA TERESINHA");  

                jBoletoBean.setNomeSacado("Teste");
                jBoletoBean.setEnderecoSacado("Rua teste");        
                jBoletoBean.setBairroSacado("XXXX");
                jBoletoBean.setCidadeSacado("Rio de Janeiro");
                jBoletoBean.setUfSacado("RJ");
                jBoletoBean.setCepSacado("22753-501");
                jBoletoBean.setCpfSacado("[telefone removido]");
                jBoletoBean.setCarteira("57");
                jBoletoBean.setLocalPagamento("ATE O VENCIMENTO, PREFERENCIALMENTE NO BANCO REAL ABN AMRO");
                jBoletoBean.setLocalPagamento2("APOS O VENCIMENTO, SOMENTE NO BANCO REAL ABN AMRO");

                Vector descricoes = new Vector();
                descricoes.add("Hospedagem I - teste descricao1 - R$ 39,90");
                descricoes.add("Manutencao - teste ricao2 - R$ 32,90");
                descricoes.add("Sistema - teste ssssde descricao3 - R$ 45,90");
                descricoes.add("Extra - teste de descricao4 - R$ 78,90");
                jBoletoBean.setDescricoes(descricoes);

                jBoletoBean.setInstrucao1("APOS O VENCIMENTO COBRAR MULTA DE 2%");
                jBoletoBean.setInstrucao2("APOS O VENCIMENTO COBRAR R$ 0,50 POR DIA DE ATRASO");
                jBoletoBean.setInstrucao3("Inclusao de mais uma linha");
                jBoletoBean.setInstrucao4("");

                jBoletoBean.setAgencia("0611");
                jBoletoBean.setContaCorrente("7709948");
                jBoletoBean.setDvContaCorrente("5");

                jBoletoBean.setNossoNumero(rs.getString("nosso_numero"),13);
                jBoletoBean.setNoDocumento(rs.getString("lancamento"));
                jBoletoBean.setValorBoleto(rs.getString("valor"));                
                jBoletoBean.setDataVencimento(rs.getString("vencimento"));

                Generator generator = new PDFGenerator(jBoletoBean, JBoleto.BANCO_REAL);
                jBoleto = new JBoleto(generator, jBoletoBean, JBoleto.BANCO_REAL); 
                jBoleto.addBoleto();  
                
            } while (rs.next());
            jBoleto.closeBoleto("real.pdf");
            rs.close();
        }
        catch (SQLException e){
            e.printStackTrace();
        }	
    }

Gera o boleto certinho, mas somente o ultimo do banco de dados, não entendi pq isso acontece, o lógico seria qnd chamasse a função addBoleto(); ele adicione-se uma página na geração do PDF, alguém pode me dar uma luz?

12 Respostas

Bukira_Boy

nielsonrocha:
Boa tarde!
Estou tendo algumas dificuldades em gerar boletos com o JBoleto.
Minha duvida é a seguinte:
Preciso gerar um arquivo com 6 seis boletos diferentes, mas qnd coloco dentro do loop só aparece o ultimo boleto que está no banco de dados, segue o código abaixo:

public void processarBoleto(String idAluno){
        // Buscando dados do lancamento
        ResultSet rs;
        String sql;
        JBoleto jBoleto;
        JBoletoBean jBoletoBean;
        try {
            sql = "SELECT * FROM view_lancamentos WHERE aluno='"+idAluno+"'";
            rs  = this.stm.executeQuery(sql);
            rs.next();
            do {
                jBoletoBean = new JBoletoBean();
                jBoletoBean.setDataDocumento(rs.getString("data_processamento"));
                jBoletoBean.setDataProcessamento(rs.getString("data_processamento"));      

                jBoletoBean.setCedente("ESCOLA SANTA TERESINHA");  

                jBoletoBean.setNomeSacado("Teste");
                jBoletoBean.setEnderecoSacado("Rua teste");        
                jBoletoBean.setBairroSacado("XXXX");
                jBoletoBean.setCidadeSacado("Rio de Janeiro");
                jBoletoBean.setUfSacado("RJ");
                jBoletoBean.setCepSacado("22753-501");
                jBoletoBean.setCpfSacado("[telefone removido]");
                jBoletoBean.setCarteira("57");
                jBoletoBean.setLocalPagamento("ATE O VENCIMENTO, PREFERENCIALMENTE NO BANCO REAL ABN AMRO");
                jBoletoBean.setLocalPagamento2("APOS O VENCIMENTO, SOMENTE NO BANCO REAL ABN AMRO");

                Vector descricoes = new Vector();
                descricoes.add("Hospedagem I - teste descricao1 - R$ 39,90");
                descricoes.add("Manutencao - teste ricao2 - R$ 32,90");
                descricoes.add("Sistema - teste ssssde descricao3 - R$ 45,90");
                descricoes.add("Extra - teste de descricao4 - R$ 78,90");
                jBoletoBean.setDescricoes(descricoes);

                jBoletoBean.setInstrucao1("APOS O VENCIMENTO COBRAR MULTA DE 2%");
                jBoletoBean.setInstrucao2("APOS O VENCIMENTO COBRAR R$ 0,50 POR DIA DE ATRASO");
                jBoletoBean.setInstrucao3("Inclusao de mais uma linha");
                jBoletoBean.setInstrucao4("");

                jBoletoBean.setAgencia("0611");
                jBoletoBean.setContaCorrente("7709948");
                jBoletoBean.setDvContaCorrente("5");

                jBoletoBean.setNossoNumero(rs.getString("nosso_numero"),13);
                jBoletoBean.setNoDocumento(rs.getString("lancamento"));
                jBoletoBean.setValorBoleto(rs.getString("valor"));                
                jBoletoBean.setDataVencimento(rs.getString("vencimento"));

                Generator generator = new PDFGenerator(jBoletoBean, JBoleto.BANCO_REAL);
                jBoleto = new JBoleto(generator, jBoletoBean, JBoleto.BANCO_REAL); 
                jBoleto.addBoleto();  
                
            } while (rs.next());
            jBoleto.closeBoleto("real.pdf");
            rs.close();
        }
        catch (SQLException e){
            e.printStackTrace();
        }	
    }

Gera o boleto certinho, mas somente o ultimo do banco de dados, não entendi pq isso acontece, o lógico seria qnd chamasse a função addBoleto(); ele adicione-se uma página na geração do PDF, alguém pode me dar uma luz?

você não teria que fazer:

while (rs.hasNext());
 os invés de while (rs.next());
?

se bem me lembro rs.next() ele vai iterando o seu resultSet… a não ser que seja diferente para essa biblioteca.

N

ok, vou testar aki pra ver se dá certo. valeu! volto pra confirmar com vc!

Bukira_Boy
substitua
while (rs.next());   
            jBoleto.closeBoleto("real.pdf");   
            rs.close();  
por:
while (rs.hasNext()){   
            jBoleto.closeBoleto("real.pdf");   
            rs.next();
     }
     rs.close();
N
substitua
while (rs.next());   
            jBoleto.closeBoleto("real.pdf");   
            rs.close();  
por:
while (rs.hasNext()){   
            jBoleto.closeBoleto("real.pdf");   
            rs.next();
     }
     rs.close();

se eu colocar assim vai gerar vários arquivos real.pdf, ele vai sobrepor e vai gerar somente o ultimo boleto. lembrando que o meu loop é do-while não somente while, pq eu preciso que ele seja executado pelo menos uma vez. mas vou mudar o metedo next() por hasNext(); pra ver se muda alguma coisa.

fabianofrizzo

Olha nunca mexi com o JBoleto

Mas achei a linha 51 meio estranha… Olha bem a cada vc da um new em jBoleto certo…

Intão isso não estaria destruindo a instancia anterior :slight_smile:

N

Acredito que pode ser isto tb o problema… acho até q seria exatamente isso o problema, a cada boleto eu estaria destruindo uma instancia anterior realmente, mas então como eu faria pra gerar os boletos em sequencia? eu estou começando agora em java, sou programador PHP(Avançado), estou migrando o meu sistema academico q desenvolvi para java, a não ser que o metodo addBoleto(); adiciona um objeto por intancia, pq eu pensei q seria assim: a cada instancia ele geraria uma página com os dados que eu acabara de setar, então akela página ficaria guardada e a cada nova instancia ele geraria uma página, mas vejo que não é isso que acontece… vc poderia me dar uma luz de como fazer isso?

fabianofrizzo

Olha como eu disse nunca utilizei o JBoleto mas dei uma olhada rapida na documentação…

Acho que vc pode fazer isso só usando o Generator dele…

Mas vamos esperar alguém que ja usou dar mais dicas

N

RESOLVIDO!

É o seguinte... estive olhando a versão antiga do JBoleto a 0.9.7 e nela os metodos são diferente para geração de boletos, então adaptei para a versão anterior e deu certo do jeito q eu imaginava! realmente o problema era a instancia dos objetos! na versão anterior eu não preciso criar uma nova instancia da classe boleto toda vez q for gerar um novo boleto. na versão nova fica amarrado a vc colocar uma nova instancia. fica assim o código:

public void processarBoleto(String idAluno){
        // Buscando dados do lancamento
        ResultSet rs;
        String sql;
        JBoleto jBoleto;
        JBoletoBean jBoletoBean;
        try {
            sql = "SELECT * FROM view_lancamentos WHERE matricula='"+idAluno+"'";
            rs  = this.stm.executeQuery(sql);
            jBoleto = new JBoleto(); // Instancio aqui a classe não dentro do loop!
            rs.next();
            do {
                jBoletoBean = new JBoletoBean();
                jBoletoBean.setDataDocumento(rs.getString("data_documento"));
                jBoletoBean.setDataProcessamento(rs.getString("data_processamento"));      

                jBoletoBean.setCedente("ESCOLA SANTA TERESINHA");  

                jBoletoBean.setNomeSacado("Teste");
                jBoletoBean.setEnderecoSacado("Rua teste");        
                jBoletoBean.setBairroSacado("XXXX");
                jBoletoBean.setCidadeSacado("Rio de Janeiro");
                jBoletoBean.setUfSacado("RJ");
                jBoletoBean.setCepSacado("22753-501");
                jBoletoBean.setCpfSacado("[telefone removido]");
                jBoletoBean.setCarteira("57");
                jBoletoBean.setLocalPagamento("ATE O VENCIMENTO, PREFERENCIALMENTE NO BANCO REAL ABN AMRO");
                jBoletoBean.setLocalPagamento2("APOS O VENCIMENTO, SOMENTE NO BANCO REAL ABN AMRO");

                Vector descricoes = new Vector();
                descricoes.add("Hospedagem I - teste descricao1 - R$ 39,90");
                descricoes.add("Manutencao - teste ricao2 - R$ 32,90");
                descricoes.add("Sistema - teste ssssde descricao3 - R$ 45,90");
                descricoes.add("Extra - teste de descricao4 - R$ 78,90");
                jBoletoBean.setDescricoes(descricoes);

                jBoletoBean.setInstrucao1("APOS O VENCIMENTO COBRAR MULTA DE 2%");
                jBoletoBean.setInstrucao2("APOS O VENCIMENTO COBRAR R$ 0,50 POR DIA DE ATRASO");
                jBoletoBean.setInstrucao3("Inclusao de mais uma linha");
                jBoletoBean.setInstrucao4("");

                jBoletoBean.setAgencia("0611");
                jBoletoBean.setContaCorrente("7709948");
                jBoletoBean.setDvContaCorrente("5");

                jBoletoBean.setNossoNumero(rs.getString("nosso_numero"),13);
                jBoletoBean.setNoDocumento(rs.getString("lancamento"));
                jBoletoBean.setValorBoleto(rs.getString("valor"));                
                jBoletoBean.setDataVencimento(rs.getString("vencimento"));
 
                jBoleto.addBoleto(jBoletoBean,JBoleto.BANCO_REAL);  
                
            } while (rs.next());
            jBoleto.writeToFile("real.pdf");
            rs.close();
        }
        catch (SQLException e){
            e.printStackTrace();
        }	
    }

Valeu até a próxima!

Marky.Vasconcelos

Eu nunca usei o JBoleto mas estou com uma duvida… ele cria o arquivo para transferencia no Banco também?

N

Caro Mark_Ameba, o JBoleto só gera boletos, ele não gera arquivos remessa para bancos, mas no site da FERBRABAN vc pode ver vários layouts tanto para gerar arquivos remessa como para leitura de arquivos retornos, tenho pronto em PHP leitura de retorno do Banco Real, Banco do Brasil, Caixa… pra adpatar pra JAVA é fácil, é só saber a posição de cada campo. VALEU!

Marky.Vasconcelos

Voce pode me passar do Banco Real?

Eu vou ver e implementar um paro o itau também.

N

Cara vou te passar as posições de cada campo do banco real, pelo menos as que eu uso para dar baixa nos boletos gerados pelo meu sistema, eu só preciso de três campos:

NossoNumero
ValorPago
DataPagamento

manda um email pra mim

[email removido]

e eu envio a vc as posções dos 3 campos.

Criado 22 de dezembro de 2008
Ultima resposta 24 de dez. de 2008
Respostas 12
Participantes 4