none
Oq está errado na emissão deste boleto (Banco do Brasil)

    Question

  • Olá pessoal,

    Estou tendo problemas para gerar o número código de barras (linha digitável). Ao fazer o teste no site do Banco do Brasil, para efetuar o pagamento, me é retornada a mensagem

    Dígito verificador geral inválido

     O meu código está da seguinte maneira:
     
    Função para gerar o código de barras (getCodigoBarras)
    '-----------------------------------------------------
            'Funcao: getCodigoBarras(ByVal Numeros)
            'Sinopse: Rotina para gerar códigos de barra padrão 2of5 ou 25.
            'Parametro:
            '       Numeros: Números para a geração do código de barras
            'Retorno: String (HTML com o código gerado)
            'Exemplo de geração do código de barras
            'Substitua o valor do parâmetro abaixo pelo número do código de barras.
            'Response.Write getCodigoBarras("7890552007601")
            '-----------------------------------------------------
            Function getCodigoBarras(ByVal Numeros)
                Dim F, F1, F2, i, Texto
                Dim arrCodigoBarra(99)
                Dim htmlCodigoBarra
                htmlCodigoBarra = ""
                Const Fino = 1
                Const Largo = 3
                Const Altura = 50

                'If isempty(arrCodigoBarra(0)) Then
                'If Nothing Then
                If Len(arrCodigoBarra(0)) <= 0 Then
                    arrCodigoBarra(0) = "00110"
                    arrCodigoBarra(1) = "10001"
                    arrCodigoBarra(2) = "01001"
                    arrCodigoBarra(3) = "11000"
                    arrCodigoBarra(4) = "00101"
                    arrCodigoBarra(5) = "10100"
                    arrCodigoBarra(6) = "01100"
                    arrCodigoBarra(7) = "00011"
                    arrCodigoBarra(8) = "10010"
                    arrCodigoBarra(9) = "01010"
                    For F1 = 9 To 0 Step -1
                        For F2 = 9 To 0 Step -1
                            F = F1 * 10 + F2
                            Texto = ""
                            For i = 1 To 5
                                Texto = Texto & Mid(arrCodigoBarra(F1), i, 1) + Mid(arrCodigoBarra(F2), i, 1)
                            Next
                            arrCodigoBarra(F) = Texto
                        Next
                    Next
                End If

                'Construindo o código HTML do código de barras
                'Guarda inicial
                htmlCodigoBarra = htmlCodigoBarra & "<img src=imagensboleto/p.gif width=" & Fino & " height=" & Altura & " border=0>"
                htmlCodigoBarra = htmlCodigoBarra & "<img src=imagensboleto/b.gif width=" & Fino & " height=" & Altura & " border=0>"
                htmlCodigoBarra = htmlCodigoBarra & "<img src=imagensboleto/p.gif width=" & Fino & " height=" & Altura & " border=0>"
                htmlCodigoBarra = htmlCodigoBarra & "<img src=imagensboleto/b.gif width=" & Fino & " height=" & Altura & " border=0>"
                htmlCodigoBarra = htmlCodigoBarra & "<img"
                'Response.Write htmlCodigoBarra
                Texto = Numeros
                If Len(Texto) Mod 2 <> 0 Then
                    Texto = "0" & Texto
                End If
                'HTML dos dados
                Do While Len(Texto) > 0
                    'i = CInt(Left(Texto, 2))
                    i = CInt(Trim(Replace(Left(Texto, 2), ".", "")))
                    Texto = Right(Texto, Len(Texto) - 2)
                    F = arrCodigoBarra(i)
                    For i = 1 To 10 Step 2
                        If Mid(F, i, 1) = "0" Then
                            F1 = Fino
                        Else
                            F1 = Largo
                        End If

                        htmlCodigoBarra = htmlCodigoBarra & " src=imagensboleto/p.gif width=" & F1 & " height=" & Altura & " border=0><img"

                        If Mid(F, i + 1, 1) = "0" Then
                            F2 = Fino
                        Else
                            F2 = Largo
                        End If

                        htmlCodigoBarra = htmlCodigoBarra & " src=imagensboleto/b.gif width=" & F2 & " height=" & Altura & " border=0><img"

                    Next
                Loop

                'Guarda final
                htmlCodigoBarra = htmlCodigoBarra & " src=imagensboleto/p.png width=" & Largo & " height=" & Altura & " border=0>"
                htmlCodigoBarra = htmlCodigoBarra & "<img src=imagensboleto/b.png width=" & Fino & " height=" & Altura & " border=0>"
                htmlCodigoBarra = htmlCodigoBarra & "<img src=imagensboleto/p.png width=1 height=" & Altura & " border=0>"

                'Retornando a função
                getCodigoBarras = htmlCodigoBarra
            End Function

     Código completo da página ASPX.VB

     
    Página ASPX.vb
    Partial Class CANDIDATOS_RELATORIOS_Boleto2
        Inherits System.Web.UI.Page
        Private Candidatos As New SELECOES.objCandidatosEdital
        Private Fn As New Funcoes.classFuncao
        Private Secreto As New Criptografia.ClassEncriptaDecripta

        '***************************************************************************
        'DADOS DO DOCUMENTO
        Private dSequencial, dDataEmissao, dDataVencimento, dDataDocumento, dDataProcesso, dNumero, dValor As String
        'DADOS DO CEDENTE
        Private cCampoLivre, cConvenio, cNossoNumero, cAceite, cCarteira, cContrato, cDocumento, cNome, cAgencia, cConta, cDV, cInstrucao As String
        'DADOS DO SACADO (CLIENTE)
        Private sCodigo, sInscricao, sEdital, sNome, sCPF, sEndereco, sBairro, sCidade, sEstado, sCep As String
        '***************************************************************************

        'Dados do Documento:

        Function Calculo_DV11(ByVal strNumero As String) As String
            'declara as variáveis
            Dim intContador As Integer
            Dim intNumero As Integer

            Dim intTotalNumero As Integer

            Dim intMultiplicador As Integer

            Dim intResto As Integer

            ' se nao for um valor numerico sai da função
            If Not IsNumeric(strNumero) Then
                Calculo_DV11 = ""
                Exit Function
            End If

            'inicia o multiplicador
            intMultiplicador = 9

            'pega cada caracter do numero a partir da direita
            For intcontador = Len(strNumero) To 1 Step -1

                'extrai o caracter e multiplica prlo multiplicador
                intnumero = Val(Mid(strNumero, intcontador, 1)) * intMultiplicador

                'soma o resultado para totalização
                intTotalNumero = intTotalNumero + intnumero

                'se o multiplicador for maior que 2 decrementa-o caso contrario atribuir valor padrao original
                intMultiplicador = IIf(intMultiplicador > 2, intMultiplicador - 1, 9)

            Next

            'calcula o resto da divisao do total por 11
            intResto = intTotalNumero Mod 11

            'verifica as exceções ( 0 -> DV=0    10 -> DV=X (para o BB) e retorna o DV
            Select Case intResto
                Case 0
                    Calculo_DV11 = "0"
                Case 10
                    Calculo_DV11 = "X"
                Case Else
                    Calculo_DV11 = str(intResto)
            End Select

        End Function

        Function Calculo_DV10(ByVal strNumero As String) As String
            'declara As variáveis
            Dim intContador As Integer
            Dim intNumero As Integer

            Dim intTotalNumero As Integer

            Dim intMultiplicador As Integer

            Dim intResto As Integer

            ' se nao for um valor numerico sai da função
            If Not IsNumeric(strNumero) Then
                Calculo_DV10 = ""
                Exit Function
            End If

            'inicia o multiplicador
            intMultiplicador = 2

            'pega cada caracter do numero a partir da direita
            For intContador = Len(strNumero) To 1 Step -1

                'extrai o caracter e multiplica pelo multiplicador
                intNumero = Val(Mid(strNumero, intContador, 1)) * intMultiplicador

                ' se o resultado for maior que nove soma os algarismos do resultado
                If intNumero > 9 Then
                    intNumero = Val(Left(intNumero, 1)) + Val(Right(intNumero, 1))
                End If

                'soma o resultado para totalização
                intTotalNumero = intTotalNumero + intNumero

                'se o multiplicador for igual a 2 atribuir valor 1 se for 1 atribui 2
                intMultiplicador = IIf(intMultiplicador = 2, 1, 2)

            Next

            Dim DezenaSuperior As Integer
            If intTotalNumero < 10 Then
                DezenaSuperior = 10
            Else
                DezenaSuperior = 10 * (Val(Left(CStr(intTotalNumero), 1)) + 1)
            End If
            intResto = DezenaSuperior - intTotalNumero

            'verifica as exceções ( 0 -> DV=0 )
            Select Case intResto
                Case 0
                    Calculo_DV10 = "0"
                Case Else
                    Calculo_DV10 = Str(intResto)
            End Select

        End Function

        Private Function Monta_CodBarras(ByVal Banco As String, ByVal Moeda As String, ByVal valor As Single, ByVal vencimento As Date, ByVal Livre As String)

            Dim codigo_sequencia As String
            Dim database As Date
            Dim fator As Integer
            Dim intDac As Integer

            'database para calculo do fator
            database = CDate("7/10/1997")
            fator = DateDiff("d", database, Format(vencimento, "dd/MM/yyyy"))
            valor = Int(valor * 100)
            'Livre = Format(Livre, "0000000000000000000000000")

            ' sequencia sem o DV
            codigo_sequencia = Banco & Moeda & fator & Format(valor, "0000000000") & Livre

            ' calculo do DV
            intDac = calcula_DV_CodBarras(codigo_sequencia)

            ' monta a sequencia para o codigo de barras com o DV
            Monta_CodBarras = Left(codigo_sequencia, 4) & intDac & Right(codigo_sequencia, 39)

        End Function

        Private Function calcula_DV_CodBarras(ByVal sequencia As String) As Integer

            Dim intContador, intNumero, intTotalNumero As Integer
            Dim intMultiplicador, intResto, intresultado As Integer
            Dim caracter As String

            intMultiplicador = 2

            For intContador = 1 To 43
                caracter = Mid(Right(sequencia, intContador), 1, 1)
                If intMultiplicador > 9 Then
                    intMultiplicador = 2
                    intNumero = 0
                End If
                intNumero = caracter * intMultiplicador
                intTotalNumero = intTotalNumero + intNumero
                intMultiplicador = intMultiplicador + 1
            Next

            intResto = intTotalNumero Mod 11

            intresultado = 11 - intResto

            If intresultado = 10 Or intresultado = 11 Then
                calcula_DV_CodBarras = 1
            Else
                calcula_DV_CodBarras = intresultado
            End If

        End Function

        Function Linha_Digitavel(ByVal sequencia As String, ByVal DV_CodBarras As String, ByVal valor As Single) As String

            Dim seq1 As String
            Dim seq2 As String
            Dim seq3 As String

            Dim dv1, dv2, dv3 As Integer

            'separa a sequencia e prepara o valor
            seq1 = Left(sequencia, 9)
            seq2 = Mid(sequencia, 10, 10)
            seq3 = Right(sequencia, 10)
            valor = Int(valor * 100)

            ' calcula os dvs
            dv1 = Val(Calculo_DV10(seq1))
            dv2 = Val(Calculo_DV10(seq2))
            dv3 = Val(Calculo_DV10(seq3))

            'formata a sequencia
            seq1 = Left(seq1 & dv1, 5) & "." & Right(seq1 & dv1, 5)
            seq2 = Left(seq2 & dv2, 5) & "." & Right(seq2 & dv2, 6)
            seq3 = Left(seq3 & dv3, 5) & "." & Right(seq3 & dv3, 6)

            Linha_Digitavel = seq1 & " " & seq2 & " " & seq3 & " " & DV_CodBarras & " " & valor

        End Function

        Function Calculo_NossoNumero(ByVal sequencia As String) As String
            'montamos o nosso numero com o numero do convenio ( 6 posicoes)
            Dim dv As Integer

            dv = Calculo_DV11(sequencia)
            'Calculo_NossoNumero = Format(sequencia & dv, "00000000000000000")
            Calculo_NossoNumero = sequencia & dv

        End Function

        Private Sub PovoaCandidatos()
            Dim Ds As Data.DataSet

            Ds = Candidatos.ConsultaAvancada(" A.Cand_Codigo = 2150 AND A.Ed_Codigo = 22 ")
            'DADOS DO DOCUMENTO
            dSequencial = Format("0000000000", Ds.Tables(0).Rows(0)("Cand_Codigo"))
            dDataEmissao = Format(Now(), "dd/MM/yyyy")
            dDataVencimento = Ds.Tables(0).Rows(0)("VENCIMENTO_EDITAL")
            dDataDocumento = Format(Now(), "dd/MM/yyyy")
            dDataProcesso = Ds.Tables(0).Rows(0)("INICIO_ESCRICAO")
            dNumero = Ds.Tables(0).Rows(0)("DOCUMENTO")
            dValor = Format("#,##0.00", Ds.Tables(0).Rows(0)("Ed_Valor"))

            'DADOS DO CEDENTE

            cAceite = Ds.Tables(0).Rows(0)("Ed_BoletoAceite")
            cCarteira = Ds.Tables(0).Rows(0)("Ed_BoletoCarteira")
            cDocumento = Ds.Tables(0).Rows(0)("DOCUMENTO")
            cNome = "Instituto Centro de Ensino Tecnológico - CENTEC"
            cAgencia = Ds.Tables(0).Rows(0)("Ed_BoletoAgencia")
            cConta = Ds.Tables(0).Rows(0)("Ed_BoletoConta")
            cDV = Ds.Tables(0).Rows(0)("Ed_BoletoDigito")
            cInstrucao = Ds.Tables(0).Rows(0)("Ed_BoletoInstrucao")
            cConvenio = Ds.Tables(0).Rows(0)("Ed_BoletoConvenio")
            cContrato = Ds.Tables(0).Rows(0)("Ed_BoletoContrato")
            cNossoNumero = cConvenio & Format(Ds.Tables(0).Rows(0)("Cand_Codigo"), "0000000000")
            cCampoLivre = Replace(cAgencia, "-", "") & cCarteira & cConvenio & cNossoNumero & "0"

            'DADOS DO SACADO (CLIENTE)
            sCodigo = Format(Ds.Tables(0).Rows(0)("Cand_Codigo"), "0000000000")
            sInscricao = "000.000.001" 'Ds.Tables(0).Rows(0)("INSCRICAO")
            sEdital = Ds.Tables(0).Rows(0)("DOCUMENTO")
            sNome = Ds.Tables(0).Rows(0)("Cand_Nome")
            sCPF = Secreto.Decriptografa(Ds.Tables(0).Rows(0)("Cand_CPF"))
            sEndereco = Ds.Tables(0).Rows(0)("ENDERECO")
            sBairro = Ds.Tables(0).Rows(0)("Cand_Bairro")
            sCidade =Ds.Tables(0).Rows(0)("Cand_Cidade")
            sEstado =Ds.Tables(0).Rows(0)("Cand_Estado")
            sCep = Ds.Tables(0).Rows(0)("Cand_Cep")

            MontaBoleto()

        End Sub

        Private Sub MontaBoleto()
            Dim pDV10, pDV11, pDV, pLD, pSequencia, pNN, pCB As String
            pDV10 = Calculo_DV10(dNumero)
            pDV11 = Calculo_DV11(dNumero)

            pNN = Calculo_NossoNumero(cNossoNumero)
            pCB = Monta_CodBarras("001", "9", CSng(Convert.ToDouble(dValor)), dDataVencimento, Replace(cCampoLivre, "-", ""))
            pDV = calcula_DV_CodBarras(pCB)
            pSequencia = "001" & "9" & Left(Replace(cCampoLivre, "-", ""), 5) & pDV
            pLD = Linha_Digitavel(pCB, pDV, dValor)


            LbLocalPagto.Text = "Até o vencimento pagável em qualquer banco."
            LbLinha1.Text = pLD
            LbLinha2.Text = pLD
            LbEscola1.Text = "Instituto CENTEC"
            LbEscola2.Text = "Instituto CENTEC"
            LbAgenciaEscola1.Text = cAgencia & "/" & cConta & "-" & cDV
            LbAgenciaEscola2.Text = cAgencia & "/" & cConta & "-" & cDV
            LbQuant1.Text = 1
            LbQuant2.Text = 1

            LbNossoNumero1.Text = cNossoNumero
            LbNossoNumero2.Text = cNossoNumero
            LbNumeroDoc1.Text = dNumero
            LbNumeroDoc2.Text = dNumero
            LbContrato1.Text = cContrato
            LbCPF1.Text = sCPF
            LbVencimento1.Text = dDataVencimento
            LbVencimento2.Text = dDataVencimento
            LbValorDoc1.Text = dValor
            LbValorDoc2.Text = dValor
            LbValor2.Text = dValor
            LbVlrCobrado1.Text = dValor
            LbVlrCobrado2.Text = dValor
            LbDesconto1.Text = "0"
            LbDataDoc2.Text = Format(Now(), "dd/MM/yyyy")
            LbDataProc2.Text = Format(Now(), "dd/MM/yyyy")
            LbDeducoes1.Text = "0"
            LbDeducoes2.Text = "0"
            LbMora1.Text = "0"
            LbMora2.Text = "0"
            LbOutros2.Text = "0"
            LbEspDoc2.Text = "DM"
            LbEsp1.Text = "R$"
            LbEsp2.Text = "R$"
            LbSacado1.Text = sNome
            LbSacado2.Text = sNome
            LbDados.Text = "Inscrição: " & sInscricao & "<br />" & _
                           "Edital: " & sEdital
            LbSacado1.Text = sNome
            LbSacado2.Text = sNome
            LbAceite.Text = "N"

        End Sub

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            If Not IsPostBack Then
                PovoaCandidatos()

            End If

        End Sub
    End Class

    Este modelo peguei na web mas não está batendo. Como posso resolver isto? Os parâmetros que estou passando estão corretos? Onde estou errando?

    Desde já agradeço a atenção de todos.

     

    Ilano.

     

    Friday, May 20, 2011 12:38 PM

All replies

  • Você verificou se esse boleto é para carteira de cobrança que deseja gerar o boleto?
    Compartilhar conhecimento, todos ganhamos!
    Friday, May 20, 2011 1:50 PM
  • Olá Dòrnellas,

    Sim, já verifiquei isso sim. E mesmo assim continua o problema.

    Na função LinhaDigitavel alterei o formato do campo valor para receber 14 dígitos

    Anteriormente estava passando apenas:

    Linha_Digitavel = seq1 & " " & seq2 & " " & seq3 & " " & DV_CodBarras & " " & valor

    Agora está assim:

    Linha_Digitavel = seq1 & " " & seq2 & " " & seq3 & " " & DV_CodBarras & " " & Format(valor, "00000000000000")

    Não estou conseguindo resolver este problema e o meu prazo está chegando ao fim, por favor, preciso urgentemente da ajuda de vcs. Eu devo estar passando algum parâmetro errado e q está causando todo este transtorno.

    O Banco me disse que o meu convênio deve ter 7 posiçòes, bom, o informado por ele está com 6, então formatei o campo Format(Ds.Tables(0).Rows(0)("Ed_BoletoConvenio"), "0000000"). Mesmo assim ainda dá erro no Dígito Verificador Geral. Então, algo esttá errado no código acima mas não estou conseguindo encontrar.

    Friday, May 20, 2011 2:51 PM