none
MONTAR CODIGO DE BARRA A PARTIR DA LINHA DIGITAVEL

    Question

  • Olá, preciso de uma grande ajuda: Preciso CONVERTER uma LINHA DIGITAVEL DE UM BOLETO BANCÁRIO E GERAR O CÓDIGO DE BARRA (O CODIGO NÃO A IMAGEM).

    TENHO APENAS 1 ÚNICO CAMPO ONDE O USUÁRIO IRÁ DIGITAR TODOS OS 47 NÚMEROS (LINHA DIGITAVEL) E UM LABEL ONDE SERÁ MOSTRADO O CÓDIGO DE BARRA, ALGUÉM PODE ME AJUDAR, COMO FAÇO PARA CONVERTER TODOS ESSE DIGITOS PARA 44 QUE SÃO O CÓDIGO DE BARRA.

    Fico no aguardo.

    Obrigada.
    Thursday, December 10, 2009 1:31 PM

Answers

  • Jaqueline.

    Transformei o código JavaScript para VB.NET mas não testei com outros valores. Como não entendo o conceito por trás do algoritmo, estou levando em consideração que o código em JavaScript está correto.

    Imports System.Text.RegularExpressions

    Module TesteCalculoBarra

        Sub Main()

            Dim linha As String = "40990.40802 71203.522116 96486.094087 1 39310000233567"

            Console.WriteLine(CalcularCodigoBarra(linha))

        End Sub

        ' calcula ao código de barra dado a linha
        Public Function CalcularCodigoBarra(ByVal linha As String) As String

            ' remove caracteres diferente de dígitos
            Dim barra As String = Regex.Replace(linha, "[^0-9]", "")

            ' completa com zeros à direita da string
            If barra.Length < 47 Then
                barra = String.Concat(barra, New String("0", 47 - barra.Length))
            End If

            barra = barra.Substring(0, 4) + barra.Substring(32, 15) + _
                    barra.Substring(4, 5) + barra.Substring(10, 10) + _
                    barra.Substring(21, 10)

            ' calcula dígito verificador
            Dim digito As Integer = CalcularDigitoModulo11(barra.Substring(0, 4) + barra.Substring(5, 39))

            ' verifica dígito
            If digito <> barra.Substring(4, 1) Then
                Throw New ArgumentException(String.Format("Dígito verificador '{0}', o correto é '{1}'.", _
                    digito, barra.Substring(4, 1)))
            End If

            Return barra

        End Function

        ' Cálculo do dígito verificador
        Public Function CalcularDigitoModulo11(ByVal numero As String) As Integer

            Dim soma As Integer = 0
            Dim peso As Integer = 2
            Dim digito As Integer

            For I = numero.Length - 1 To 0 Step -1

                soma = soma + numero.Substring(I, 1) * peso

                If (peso < 9) Then
                    peso = peso + 1
                Else
                    peso = 2
                End If

            Next I

            digito = 11 - (soma Mod 11)

            If digito > 9 Then
                digito = 0
            End If

            If digito = 0 Then
                digito = 1
            End If

            Return digito

        End Function


    End Module

    Espero ter ajudado.

    Att.

    Ari C. Raimundo
    Friday, December 11, 2009 2:49 AM

All replies

  • Jaqueline,

    Verifique se os links abaixo podem lhe ajudar:

    Gerando Código de Barras na Web
    http://www.macoratti.net/vbcodbar.htm

    Código de Barras de Boleto Bancário Padrão FEBRABAN
    http://evandro.net/codigo_barras.html

    Att.

    Ari C. Raimundo
    Thursday, December 10, 2009 6:46 PM
  • Oi Ari, precisava do código igual ao que o Evandro gera no site dele, mas em VB.Net, pois ele utiliza um padrão para todos os bancos.

    Tipo o usuário vai entrar com a

    Linha Digitavel: 40990.40802 71203.522116 96486.094087 1 39310000233567 e quero que gera

    Código de Barras: 40991393100002335670408071203522119648609408

    Estou ficando louca, pois ele utiliza javascript e não estou conseguindo enterpretar, será que consegue me ajudar ?


    Att,
    Jaqueline

    Thursday, December 10, 2009 7:26 PM
  • Jaqueline.

    Transformei o código JavaScript para VB.NET mas não testei com outros valores. Como não entendo o conceito por trás do algoritmo, estou levando em consideração que o código em JavaScript está correto.

    Imports System.Text.RegularExpressions

    Module TesteCalculoBarra

        Sub Main()

            Dim linha As String = "40990.40802 71203.522116 96486.094087 1 39310000233567"

            Console.WriteLine(CalcularCodigoBarra(linha))

        End Sub

        ' calcula ao código de barra dado a linha
        Public Function CalcularCodigoBarra(ByVal linha As String) As String

            ' remove caracteres diferente de dígitos
            Dim barra As String = Regex.Replace(linha, "[^0-9]", "")

            ' completa com zeros à direita da string
            If barra.Length < 47 Then
                barra = String.Concat(barra, New String("0", 47 - barra.Length))
            End If

            barra = barra.Substring(0, 4) + barra.Substring(32, 15) + _
                    barra.Substring(4, 5) + barra.Substring(10, 10) + _
                    barra.Substring(21, 10)

            ' calcula dígito verificador
            Dim digito As Integer = CalcularDigitoModulo11(barra.Substring(0, 4) + barra.Substring(5, 39))

            ' verifica dígito
            If digito <> barra.Substring(4, 1) Then
                Throw New ArgumentException(String.Format("Dígito verificador '{0}', o correto é '{1}'.", _
                    digito, barra.Substring(4, 1)))
            End If

            Return barra

        End Function

        ' Cálculo do dígito verificador
        Public Function CalcularDigitoModulo11(ByVal numero As String) As Integer

            Dim soma As Integer = 0
            Dim peso As Integer = 2
            Dim digito As Integer

            For I = numero.Length - 1 To 0 Step -1

                soma = soma + numero.Substring(I, 1) * peso

                If (peso < 9) Then
                    peso = peso + 1
                Else
                    peso = 2
                End If

            Next I

            digito = 11 - (soma Mod 11)

            If digito > 9 Then
                digito = 0
            End If

            If digito = 0 Then
                digito = 1
            End If

            Return digito

        End Function


    End Module

    Espero ter ajudado.

    Att.

    Ari C. Raimundo
    Friday, December 11, 2009 2:49 AM
  • Nossa Ari, valeu fiz o teste e funcionou.

    Muito obrigada.

    Boas festas.
    Friday, December 11, 2009 1:50 PM
  • Boa tarde Ari,

    Será que você conseguiria converter esse código por favor, pois necessito agora fazer o oposto do que estava sendo feito acima.
    Tentei converter mas quando chega modulo10 que vai fazer o calculo dá erro, pois ele não aceita o ponto, com razão pois vai diminuindo os valores.

    Se puder me ajudar novamente, agradeço muito de coração.

    Jaqueline

    function f_venc() {
            if ( form.barra.value.substr(5,4) == 0 )
                form.venc.value='Boleto pode ser pago em qualquer data';
            else
                form.venc.value=fator_vencimento(form.barra.value.substr(5,4));
            form.valor.value=(form.barra.value.substr(9,8)*1)+','+form.barra.value.substr(17,2);
            return(false);
        }

          function calcula_linha(barra)
        {
            //var barra = form.barra.value;    // Codigo da Barra
            linha = barra.replace(/[^0-9]/g,'');
            //
            if (modulo10('399903512') != 8) alert('Função "modulo10" está com erro!');
            if (linha.length != 44) alert ('A linha do Código de Barras está incompleta!');
            //
            var campo1 = linha.substr(0,4)+linha.substr(19,1)+'.'+linha.substr(20,4);
            var campo2 = linha.substr(24,5)+'.'+linha.substr(24+5,5);
            var campo3 = linha.substr(34,5)+'.'+linha.substr(34+5,5);
            var campo4 = linha.substr(4,1);        // Digito verificador
            var campo5 = linha.substr(5,14);    // Vencimento + Valor
            //
            if (  modulo11_banco(  linha.substr(0,4)+linha.substr(5,99)  ) != campo4 )
                alert('Digito verificador '+campo4+', o correto é '+modulo11_banco(  linha.substr(0,4)+linha.substr(5,99)  )+'\nO sistema não altera automaticamente o dígito correto na quinta casa!');
            //
            if (campo5 == 0) campo5 = '000';
            //
            linha =     campo1 + modulo10(campo1)
                    +' '
                    +campo2 + modulo10(campo2)
                    +' '
                    +campo3 + modulo10(campo3)
                    +' '
                    +campo4
                    +' '
                    +campo5
                    ;
            //if (form.linha.value != form.linha2.value) alert('Linhas diferentes');
            return(linha);
        }

        function fator_vencimento (dias) {
            //Fator contado a partir da data base 07/10/1997
            //*** Ex: 04/07/2000 fator igual a = 1001
            //alert(dias);
            var currentDate, t, d, mes;
            t = new Date();
            currentDate = new Date();
            currentDate.setFullYear(1997,9,7);//alert(currentDate.toLocaleString());
            t.setTime(currentDate.getTime() + (1000 * 60 * 60 * 24 * dias));//alert(t.toLocaleString());
            mes = (currentDate.getMonth()+1); if (mes < 10) mes = "0" + mes;
            dia = (currentDate.getDate()+1); if (dia < 10) dia = "0" + dia;
            //campo.value = dia +"."+mes+"."+currentDate.getFullYear();campo.select();campo.focus();
            return(t.toLocaleString());
        }

        function modulo10(numero)
        {
           
            numero = numero.replace(/[^0-9]/g,'');
            var soma  = 0;
            var peso  = 2;
            var contador = numero.length-1;
            //alert(contador);
            //numero = '00183222173';
            //for (var i=0; i <= contador - 1; i++) {
            //alert(10);
            //for (contador=10; contador >= 10 - 1; contador--) {
            while (contador >= 0) {
                //alert(contador);
                //alert(numero.substr(contador,1));
                multiplicacao = ( numero.substr(contador,1) * peso );
                if (multiplicacao >= 10) {multiplicacao = 1 + (multiplicacao-10);}
                soma = soma + multiplicacao;
                //alert(numero.substr(contador,1)+' * '+peso+' = '+multiplicacao + ' =>' + soma) ;
                //alert(soma);
                if (peso == 2) {
                    peso = 1;
                } else {
                    peso = 2;
                }
                contador = contador - 1;
            }
            var digito = 10 - (soma % 10);
            //alert(numero + '\n10 - (' + soma + ' % 10) = ' + digito);
            if (digito == 10) digito = 0;
            return digito;
        }
    Tuesday, December 15, 2009 4:24 PM
  • Jaqueline,

    Desculpe, não quero ser chato mas, acho que esse não é o objetivo do fórum. Além disso, no outro post já fui bem generoso em transformar todo o código e fazer algumas modificações também.

    Tente transformar e caso tenha dúvidas estou à disposição.

    Att.

    Ari C. Raimundo
    Tuesday, December 15, 2009 4:31 PM
  • Sem problemas Ari, com certeza você já me ajudou bastante.
    Se puder me ajudar na seguinte dúvida :

    Em certa parte do códgio exatamente está, é concatenado as variáveis
            var campo1 = linha.substr(0,4)+linha.substr(19,1)+'.'+linha.substr(20,4);
            var campo2 = linha.substr(24,5)+'.'+linha.substr(24+5,5);
            var campo3 = linha.substr(34,5)+'.'+linha.substr(34+5,5);
            var campo4 = linha.substr(4,1);        // Digito verificador
            var campo5 = linha.substr(5,14);    // Vencimento + Valor

    E vai para o a próxima parte:
           linha =     campo1 + modulo10(campo1)
                    +' '
                    +campo2 + modulo10(campo2)
                    +' '
                    +campo3 + modulo10(campo3)
                    +' '
                    +campo4
                    +' '
                    +campo5
                    ;

    Para iniciar o calculo do digito e chega na seguinte linha:
         multiplicacao = ( numero.substr(contador,1) * peso ); como ele vai fazendo a multiplicação de traz para frente, quando chega no ponto dá erro e se tiro o ponto que ele concatenou no inicio do código os valores não batem, se puder me esclarecer, agradeço.


    Tuesday, December 15, 2009 4:53 PM
  • Jaqueline,

    Não entendi muito bem, o erro está ocorrendo na função modulo10? A primeira linha dessa função remove os pontos do parâmetro numero.

    numero = numero.replace(/[^0-9]/g,'');

    O equivalente em VB.NET seria:

    numero = Regex.Replace(numero, "[^0-9]", "")

    Tenha o cuidado de não criar a função modulo10 em VB.NET passando parâmetros por referência. O ideal é que os parâmetros sejam enviados para essa função por valor (ByVal). Isso porque o objetivo da mesma é calcular um dígito.

    Att.

    Ari C. Raimundo
    Tuesday, December 15, 2009 5:00 PM
  • Sim estou fazendo isso só q se tiro o ponto calcula valore totalmente errado.

    Fiz a convesão baseado no que vc havia feito inicialmente:

     ' Calcula ao código de barra a partir da linha digitada
        Public Function CalcularCodigoDigitavel(ByVal barra As String) As String
            Dim linha As String
            Dim campo1 As String
            Dim campo2 As String
            Dim campo3 As String
            Dim campo4 As String
            Dim campo5 As String

            linha = barra

            ' completa com zeros à direita da string       
            If linha.Length < 44 Then
                linha = String.Concat(linha, New String("0", 44 - linha.Length))
            End If

            campo1 = linha.Substring(0, 4) + linha.Substring(19, 1) + "" + linha.Substring(20, 4)
            campo2 = linha.Substring(24, 5) + "" + linha.Substring(24 + 5, 5)
            campo3 = linha.Substring(34, 5) + "" + linha.Substring(34 + 5, 5)
            campo4 = linha.Substring(4, 1) 'Digito verificador
            campo5 = linha.Substring(5, 14) 'Vencimento + Valor

            ' calcula dígito verificador
            Dim digito As Integer = CalcularDigitoModulo11(linha.Substring(0, 4) + linha.Substring(5, 39))

            ' verifica dígito
            If digito <> campo4 Then
                Throw New ArgumentException(String.Format("Dígito verificador '{0}', o correto é '{1}'.", _
                    digito, campo4))
            End If

            If campo5 = 0 Then
                campo5 = "000"
            End If

            linha = campo1 + CalcularDigitoModulo10(campo1) + " " + campo2 + CalcularDigitoModulo10(campo2) + " " + campo3 + CalcularDigitoModulo10(campo3) + " " + campo4 + " " + campo5
                   
            Return linha

        End Function

        ' Cálculo do dígito verificador
        Public Function CalcularDigitoModulo10(ByVal numero As String) As Integer

            Dim soma As Integer = 0
            Dim peso As Integer = 2
            Dim multiplicacao As Integer
            Dim digito As Integer
            Dim I As Integer

            numero = replace(numero,".","")

            For I = numero.Length - 1 To 0 Step -1

                multiplicacao = (numero.Substring(I, 1) * peso)
                If (multiplicacao >= 10) Then
                    multiplicacao = 1 + (multiplicacao - 10)
                Else
                    soma = soma + multiplicacao
                End If
            Next I

            If (peso = 2) Then
                peso = 1
            Else
                peso = 2
            End If

            If digito > 9 Then
                digito = 0
            End If

            If digito = 0 Then
                digito = 1
            End If

            Return digito
        End Function
    Tuesday, December 15, 2009 5:05 PM
  • Ola Ari! bom dia tudo bem? Estou iniciando nessa linguagem asp.net!! tenho uma empresa e preciso migrar meus sistemas todos para o web agora! estava precisando de montar um boleto usando codigo de barras febraban! vi que ja fez isso!! Gostaria de saber se pode me ajudar nessa questão! podemos ate combinar um valor, preciso muito! Obrigado! Meu email de contato erodrigohcr@hotmail.com ou no telefone 62-9264-5419. Abraço!!
    Wednesday, July 04, 2012 1:53 PM