Erro ao gerar arquivo remessa (vb.net)

Jul 19, 2011 at 1:50 PM
Edited Jul 19, 2011 at 2:16 PM

Senhores

Estou tentando gerar um arquivo remessa no vb.net, porém está retornando uma mensagem dizendo apenas "Erro ao gerar arquivo remessa". Já procurei aqui no fórum mas não encontrei uma solução.

Alguém poderia me ajudar?

Segue abaixo o código que estou usando:

Obs: Com esse mesmo código, consigo gerar o Boleto, o problema está mesmo na geração do arquivo remessa.

 

	    'Pega informacoes do titulo no BD
            Dim txtVencimento = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "vencimento")
            Dim txtValorBoleto = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "valor")
            Dim txtNumeroDocumentoBoleto = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletonumerodocumento")
            Dim txtCarteira = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletocarteira")
            Dim txtInstrucao = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletoinstrucao")
            Dim txtBanco = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletobanco")
            'Cedente
            Dim txtCodigoCedente As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletocodigocedente")
            Dim txtNossoNumeroBoleto As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletonossonumero")
            Dim txtCPFCNPJ As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletocpfcnpjcedente")
            Dim txtNomeCedente As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletonomecedente")
            Dim txtAgenciaCendente As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletoagenciacedente")
            Dim txtContaCedente As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletocontacedente")
            'Sacado
            Dim txtCPFCNPJSacado As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletocpfcnpjsacado")
            Dim txtNomeSacado As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletonomesacado")
            Dim txtEnderecoSacado As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletoenderecosacado")
            Dim txtBairroSacado As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletobairrosacado")
            Dim txtCidadeSacado As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletocidadesacado")
            Dim txtCEPSacado As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletocepsacado")
            Dim txtUFSacado As String = PegaInfoBanco("ContasReceber", "iddoc", _IdDocto, "boletoufsacado")

            '###############################################################################################

            Dim c = New Cedente(txtCPFCNPJ, txtNomeCedente, txtAgenciaCendente, txtContaCedente)
            c.Codigo = CInt(txtCodigoCedente)

            Dim b = New Boleto(CDate(txtVencimento), CDbl(txtValorBoleto), txtCarteira, txtNossoNumeroBoleto, c)
            b.NumeroDocumento = txtNumeroDocumentoBoleto
            b.Sacado = New Sacado(txtCPFCNPJSacado, txtNomeSacado)
            b.Sacado.Endereco.End = txtEnderecoSacado
            b.Sacado.Endereco.Bairro = txtBairroSacado
            b.Sacado.Endereco.Cidade = txtCidadeSacado
            b.Sacado.Endereco.CEP = txtCEPSacado
            b.Sacado.Endereco.UF = txtUFSacado

            Dim i As New Instrucao(txtBanco)
            i.Descricao = txtInstrucao
            b.Instrucoes.Add(i)
            b.EspecieDocumento = New EspecieDocumento(txtBanco) 

            Dim bb As New BoletoBancario()
            bb.CodigoBanco = txtBanco 
            bb.Boleto = b
            bb.MostrarCodigoCarteira = False 'True
            bb.Boleto.Valida()
            bb.MostrarComprovanteEntrega = False

            Dim rdr = New MemoryStream()
            b.Banco = New Banco(bb.CodigoBanco)
            Dim Boletos = New Boletos()
            Boletos.add(b)
            Dim ArquivoRemessa = New ArquivoRemessa(TipoArquivo.CNAB400)
            ArquivoRemessa.GerarArquivoRemessa("0", b.Banco, c, Boletos, rdr, 1)
Sep 6, 2011 at 7:44 PM

Ola Vinicius,

Para qual banco?

 

 

Sep 8, 2011 at 11:47 AM

Bom dia Luiz,

Para o banco Bradesco.

Abraço,

Vinicius.

Sep 23, 2011 at 7:00 PM

Vinicius

por acaso você conseguiu gerar a remessa e o retorno?

estou me matando nisso tambem

Sep 27, 2011 at 12:34 PM
Mflavio wrote:

Vinicius

por acaso você conseguiu gerar a remessa e o retorno?

estou me matando nisso tambem

Consegui nada cara, tive que fazer na unha mesmo =(

Sep 27, 2011 at 6:14 PM
viniciussaes wrote:
Mflavio wrote:

Vinicius

por acaso você conseguiu gerar a remessa e o retorno?

estou me matando nisso tambem

Consegui nada cara, tive que fazer na unha mesmo =(

Caramba eu também precisei fazer na raça tambem

estou agora trabalhando na leitura do retorno

Oct 26, 2011 at 9:29 AM

Já conseguiram o retorno também?

Mandem para o mantenedor do codigo, para ele atualizar a dll.

Abraços!

Nov 11, 2011 at 6:32 PM

alguém pode me ajudar a gerar o arquivo de remessa?

não estou conseguindo..

Abraço

Nov 25, 2011 at 10:20 PM

Mandei um arquivo de remessa para o Bradesco e tive alguns probleminhas (carteira 9, CNAB 400). Fiz um debug (C# e VS) com os fontes.
Primeiro tive alguns problemas com a função Mod11Bradesco... se mandar o Nosso Número já formatado para gerar a remessa, dá erro.
O jeito foi "desformatar" o Nosso Número (mantendo os zeros à esquerda) antes de gerar a remessa. Funcionou. Se tiver um jeito mais fácil, agradeço.

Resolvido isso passei a usar só a DLL e não usei mais os fontes.

Depois o banco me informou problema com o Código de Cedente e o Número da Remessa (MX0000000) Header.
Aparentemente, o código de cedente para gerar o boleto para "impressão" é o número da Conta e Dígito, mas para a remessa
é o Código de Remessa (o que estou acreditando ser o código de cedente). Então tive que mudar essas informações no momento de passar
as informações de cedente na impressão. Algo tipo:

c é a classe Cedente

c.Codigo = Convert.ToInt32(Conta);
c.DigitoCedente = Convert.ToInt32(DigConta);

e na remessa:

c.Codigo = Convert.ToInt32(ct.codced);
c.DigitoCedente = Convert.ToInt32(ct.dig);  (ct é minha classe do cadastro de Conta Corrente).

Funcionou, mas o maior problema é o MX0000000. É a identificação do NumeroArquivoRemessa.
Mesmo passando o Numero da Remessa como parâmetro, o código ignora, deixando tudo zero.

Fiz mais uma gambiarra, e aparentemente funcionou. (se tiver outro jeito, agradeço).

inclua:
using System.Text.RegularExpressions;

            string local = caminhoenomedoarquivoremessa;
            Stream rdr = new FileStream(local, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);

            if (CNAB == "CNAB400")
            { 
                ArquivoRemessa arq = new ArquivoRemessa(TipoArquivo.CNAB400);
                arq.GerarArquivoRemessa(pConvenio, pIBanco, pCedente, pBoletos, rdr, codremessa); //codremessa é ignorado
                
                /// Corrige o arquivo gerado pelo Boleto.NET (MX0000000) número da remessa
                StreamReader rdr2 = new StreamReader(local); 
                string remessaAtual = rdr2.ReadToEnd();//le o arquivo gerado
                rdr2.Close();
                string novoMX = codremessa.ToString();
                novoMX= "MX" + cm.FormatCode(novoMX, "0", 7, true); 
                //cm é uma classe que criei com algumas funções. Neste caso gera zeros
                // à esquerda do número do arquivo de remessa 
                remessaAtual = Regex.Replace(remessaAtual, "MX0000000", novoMX); 
                StreamWriter rdr3 = new StreamWriter(local);  
                rdr3.Write(remessaAtual); 
                rdr3.Close();
São apenas "remendos", não mudei os fontes do BoletoNET (estou usando a DLL). Se eu estiver passando algum 
parâmetro errado para o BoletoNET que corrija esses remendos agradeço as sugestões.
Abraço
Dec 30, 2011 at 1:29 PM

Tive um problema ontem no arquivo Banco/Banco_Bradesco.cs a linha 697:

_detalhe += Mod11Bradesco(boleto.Carteira + boleto.NossoNumero, 7); // Digito de Auto Conferencia do Nosso N�mero (01)

O problema é que quando a função Mod11Bradesco(seq, b) é chamada a variável boleto.NossoNumero já foi tratada anteriormente quando chamamos a função do objeto boleto.Valida() e é chamada a função ValidaBoleto(boleto) e a partir daí a função FormataNossoNumero(boleto):

public override void FormataNossoNumero(Boleto boleto)
        {
            boleto.NossoNumero = string.Format("{0}/{1}-{2}", boleto.Carteira, boleto.NossoNumero,
                                            Mod11Bradesco(boleto.Carteira + boleto.NossoNumero, 7));
        }

Ele transforma o a variável boleto.NossoNumero no formato ex: 00/00000000000-0 . Quando chamamos a linha 697(acima) ele envia para o Mod11Bradesco o boleto.NossoNumero já tratado, o que causa o travamento da função que tenta multiplicar o caracter "-" por p:

 

private string Mod11Bradesco(string seq, int b)
        {
            #region Trecho do manual layout_cobranca_port.pdf do BRADESCO

            /* Vari�veis
             * -------------
             * s - Soma
             * p - Peso
             * b - Base
             * r - Resto
             */

            int s = 0, p = 2;

            for (int i = seq.Length; i > 0; i--)
            {
                s = s + (Convert.ToInt32(Microsoft.VisualBasic.Strings.Mid(seq, i, 1)) * p);
                if (p == b)
                    p = 2;
                else
                    p = p + 1;
            }

            int r = (s % 11);

            if (r == 0)
                return "0";
            else if (r == 1)
                return "P";
            else
                return (11 - r).ToString();
        }

 

A saída que encotrei foi tratar o boleto.NossoNumero antes de entrar na função: boleto.NossoNumero.SubString(3, 11) retirando os primeiros 3 dígitos "00/" e pegando os 11 digitos do NossoNúmero, original.

 

_detalhe += Mod11Bradesco(boleto.Carteira + boleto.NossoNumero.Substring(3, 11), 7); // Digito de Auto Conferencia do Nosso N�mero (01)

Espero ter ajudado.