MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    Cálculos de Digitos verificadores para Emissão de Boleto - Segundo Manual Tec. HSB

    Compartilhe
    avatar
    HARYSOHN
    Moderador Global
    Moderador Global

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 12265
    Registrado : 01/03/2011

    Cálculos de Digitos verificadores para Emissão de Boleto - Segundo Manual Tec. HSB

    Mensagem  HARYSOHN em Sab 28 Jul 2012, 03:36

    Còdigos confeccionados conforme manual técnico do HSBC para cobranças via Boleto bancário.

    [Você precisa estar registrado e conectado para ver este link.]

    Crie um Módulo e nomeeie de DigitoVerificador, no módulo



    '===========================================================================================================
    'em 2012-07-25
    'Cálculo do Nosso Número (Conforme Manual técnico do HSBC)
    'do fórum MaximoAccess
    '***********************************************************************************************************
    '1 – ESTRUTURA DO NÚMERO BANCÁRIO (NOSSO NÚMERO)
    'E E E E E N N N N N D
    'Onde:
    'EEEEE = Código do Cliente no Banco (Nº. do Range)
    'Código numérico a ser fornecido pelo Banco por ocasião do início dos testes.
    'Este código tem amarração cadastral com a conta de cobrança, portanto deverão ser
    'obtidos tantos códigos quantos forem às contas de cobrança a serem utilizadas para a Cobrança
    'Diretiva ou após utilizar todos os números sequenciais do documento.
    'NNNNN = Número sequencial do documento / título.
    'Uso a critério do cliente e quando utilizar todos, deve solicitar um novo número Range.
    'D = Dígito verificador de segurança.
    'É calculado pelo Módulo 11, com pesos de 2 a 7 da direita para a esquerda.
    '2 – CÁLCULO DO DÍGITO VERIFICADOR DO NOSSO NÚMERO
    'Para efetuar o cálculo do dígito verificador:
    '2.1 – Aplicar os pesos de 2 a 7 da direita para esquerda, no código do cliente (range) e o Número
    'sequencial, composto por 10 caracteres.
    'Exemplo: Código do Cliente (Nº. Range) = 11111
    'Número Seqüencial = 22222
    'Dígito Verificador = ?
    '1 1 1 1 1 2 2 2 2 2
    'X X X X X X X X X X
    '5 4 3 2 7 6 5 4 3 2
    'Pesos
    '2.2 – Deve multiplicar o código do cliente (range) e o Nº sequencial pelos respectivos pesos:
    '(1 x 5 ) + ( 1x 4 ) + ( 1x 3 ) + ( 1 x 2 ) + ( 1 x 7 ) + ( 2 x 6 ) + ( 2 x 5 ) + ( 2 x 4 ) + ( 2 x 3 ) +
    '( 2 x 2) = 61
    '2.3 – Calcular a somatória dos produtos multiplicados;
    'Divide-se a somatória por 11: 61| 11
    '5
    'Resto = 6
    'Nota: Quando o resto da divisão for igual a “0” ou “1”, o Dígito Verificador será sempre “0”.
    '2.4 – Dividir a somatória por 11 obtendo o resto da divisão;
    'Calcula-se o Dígito Verificador pela fórmula (Módulo - Resto = Dígito Verificador):
    'Então subtrair 11 - 6 = 5
    '2.5 – Considera-se o resultado da subtração como o dígito verificador do “nosso número”.
    'Então o Dígito Verificador é o número 5.
    'Composição final do Nosso Número = 11111222225
    '===========================================================================================================

    Function CalcDVNossoNumero(strSequencia)
    'Funçao para Cálculo do Dígito Verificador MÓDULO 11
    'O MÓDULO 11 é utilizado para calcular o DV do NOSSO NÚMERO

    Dim intCont As Integer, intNum As Integer, intNumT As Integer, intDoisSete As Integer

    intDoisSete = 2
    For intCont = Len(strSequencia) To 1 Step -1
    'pega o algarismo da sequencia
    intNum = Val(Mid(strSequencia, intCont, 1))
    intNum = intNum * intDoisSete
    intNumT = intNumT + intNum

    If intDoisSete = 2 Then
    intDoisSete = 3
    ElseIf intDoisSete = 3 Then
    intDoisSete = 4
    ElseIf intDoisSete = 4 Then
    intDoisSete = 5
    ElseIf intDoisSete = 5 Then
    intDoisSete = 6
    ElseIf intDoisSete = 6 Then
    intDoisSete = 7
    ElseIf intDoisSete = 7 Then
    intDoisSete = 2
    End If
    Next
    If (intNumT Mod 11) = 0 Then
    CalcDVNossoNumero = "0"
    ElseIf (intNumT Mod 11) = 1 Then
    CalcDVNossoNumero = "0"
    Else
    CalcDVNossoNumero = Str(11 - (intNumT Mod 11))
    End If
    End Function



    '===========================================================================================================
    'em 2012-07-25
    'Cálculo do Dígito Verificador (DAC) (Conforme Manual técnico do HSBC)
    'do fórum MaximoAccess

    'Para chamar no form:
    CalcDAC(strSequencia)
    'strDAC = CalcDAC(Numero do Código de Barras - 43 Dígitos)
    'Onde StrDAC é a variável que comportará o valor do Dígito
    '***********************************************************************************************************
    'DÍGITO DE AUTOCONFERÊNCIA (DAC)
    '· Com o objetivo de garantir a integridade dos dados capturados por ocasião do recebimento dos
    'bloquetos, é obrigatória a inclusão do Dígito de Autoconferência (DAC) em toda composição do
    'Código de Barras.
    '· Será aplicada a fórmula algorítmica padrão para este fim, sendo o resultado lançado na 5ª posição
    'do Código de Barras.
    '· O cálculo padronizado do Dígito de Autoconferência (DAC) utiliza o Módulo 11, com pesos de 2 a
    '9 alinhados da direita para a esquerda.
    '· Para o cálculo considerar as posições de 1 a 4 e de 6 a 44, iniciando-se pela 44ª posição e saltando a
    '5ª posição.
    'CÁLCULO DO DÍGITO DE AUTOCONFERÊNCIA (DAC)
    'Exemplo:
    'Código do HSBC na compensação = 399
    'Tipo de moeda – Real = 9
    'Fator de vencimento = 1001 exemplo da data (04/07/2000)
    'Valor do título / documento = R$ 311,55
    'Número Bancário (Nosso Número) = 11111222225
    'Agência e Conta de Cobrança = 0054-6666666
    'Código da carteira = 00
    'Código do aplicativo Cobrança = 1
    'Rotina de cálculo:
    'a) Multiplica-se cada um dos números da composição pelo respectivo peso:
    '3 9 9 9 1 0 0 1 0 0 0 0 0 3 1 1 5 5 1 1 1 1 1 2 2 2 2 25 00 5 4 6 6 6 6 6 6 6 001
    'x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
    '4 3 2 9 8 7 6 5 4 3 2 9 8 7 6 5 4 3 2 9 8 7 6 5 4 3 2 9 8 7 6 5 4 3 2 9 8 7 6 5 4 3 2
    'Pesos
    'b) Calcula-se o somatório dos produtos dos números da composição pelos respectivos pesos:
    '2 + 0 + 0 + 30 + 36 + 42 + 48 + 54 + 12 + 18 + 16 + 25 + 0 + 0 + 40 + 18 + 4 + 6 + 8 + 10 + 6 +
    '7 + 8 + 9 + 2 + 15 + 20 + 5 + 6 + 21 + 0 + 0 + 0 + 0 + 0 + 5 + 0 + 0 + 8 + 81 + 18 + 27 +
    '12 = 619
    'c) Divide-se o somatório por 11:
    '619 | 11
    '= 56
    'Resto = 3
    'd) Subtrai-se o resto encontrado de 11;
    '11
    '- 3
    '______
    '= 8 Dígito de Autoconferência (DAC) = 8
    'Nota: Quando o resto da divisão da somatória por 11 for igual a “0”, “1” ou “10” o dígito
    '(DAC) será igual a “1”.
    'e) A composição numérica do Código de Barras para este exemplo, fica da seguinte maneira:
    '3 9 9 9 8 1 0 0 1 0 0 0 0 0 3 1 1 5 5 1 1 1 1 1 2 2 2 2 2 5 0 0 5 4 6 6 6 6 6 6 6
    '===========================================================================================================

    Function CalcDAC(strSequencia)
    'Funçao para Cálculo do Dígito Autoconferência(DAC) MÓDULO 11
    Dim intCont As Integer, intNum As Integer, intNumT As Integer, intDoisNove As Integer

    intDoisNove = 2
    For intCont = Len(strSequencia) To 1 Step -1
    'pega o algarismo da sequencia
    intNum = Val(Mid(strSequencia, intCont, 1))
    intNum = intNum * intDoisNove
    intNumT = intNumT + intNum
    If intDoisNove = 2 Then
    intDoisNove = 3
    ElseIf intDoisNove = 3 Then
    intDoisNove = 4
    ElseIf intDoisNove = 4 Then
    intDoisNove = 5
    ElseIf intDoisNove = 5 Then
    intDoisNove = 6
    ElseIf intDoisNove = 6 Then
    intDoisNove = 7
    ElseIf intDoisNove = 7 Then
    intDoisNove = 8
    ElseIf intDoisNove = 8 Then
    intDoisNove = 9
    ElseIf intDoisNove = 9 Then
    intDoisNove = 2
    End If
    Next
    If (intNumT Mod 11) = 0 Then
    CalcDAC = "1"
    ElseIf (intNumT Mod 11) = 1 Then
    CalcDAC = "1"
    ElseIf (intNumT Mod 11) = 10 Then
    CalcDAC = "1"
    Else
    CalcDAC = Str(11 - (intNumT Mod 11))
    End If
    End Function




    '===========================================================================================================
    'em 2012-07-25
    'Cálculo do Digito verificador dos primeiros 3 campos da linha digitável (Conforme Manual técnico do HSBC)
    'do fórum MaximoAccess
    '***********************************************************************************************************
    'LINHA DIGITÁVEL
    'CÁLCULO DO DÍGITO VERIFICADOR - CAMPOS 1, 2 e 3
    'Exemplo:
    '39991.1111? 22222.50054? 66666.66001? 8 10010000031155
    '__________ ___________ ____________ ___ ______________
    'campo 1 campo 2 campo 3 campo 4 campo 5
    'Tomaremos como modelo o Campo 1, para demonstrar a fórmula algorítmica.
    'Rotina de cálculo:
    'a) Atribuição dos pesos.
    '3 9 9 9 1 1 1 1 1
    'x x x x x x x x x
    '2 1 2 1 2 1 2 1 2
    'b) Multiplica-se os números da composição do campo, pelos respectivos pesos, obtendo-se seus
    'produtos.
    'Caso o produto seja igual ou maior que 10, somam-se as duas unidades do produto.
    'Exemplo: 2 x 9 = 18 18 = 1 + 8 = 9
    'Então temos:
    '3 9 9 9 1 1 1 1 1
    'x 2 x 1 x 2 x 1 x 2 x 1 x 2 x 1 x 2
    '------------------------------------------------------------
    '6 + 9 + 9 + 9 + 2 + 1 + 2 + 1 + 2 = 41
    'c) Divide-se este somatório, pelo fator 10:
    '41| 10
    '= 4
    'Resto = 1
    'Obs.: Quando o somatório for menor que 10, adotar a fórmula: (10 - somatório = dígito
    'Verificador), dispensando o item “d”, abaixo.
    'Quando o resto for igual a “0” o dígito verificador será também igual a “0”.
    'd) Aplica-se a fórmula : Fator 10 menos o Resto = Dígito Verificador
    '10 - 1 = 9 Então o Dígito Verificador é igual a 9.
    'e) Então teremos para o Campo 1 do nosso exemplo, a composição: 39991.11119
    'f) Adota-se a mesma metodologia para o cálculo dos dígitos verificadores dos campos 2 e 3.
    'No nosso exemplo, então teremos a seguinte composição da Linha Digitável:
    '39991.11119 22222.500542 6666.6660015 8 10010000031155
    '__________ ___________ ____________ ___ ______________
    'campo 1 campo 2 campo 3 campo 4 campo 5

    Public Function CalculaDigitoLinha(Campo1, Campo2, Campo3)
    Dim DigVer_Cp1(0 To Cool, DigVer_Cp2(0 To 9), DigVer_Cp3(0 To 9)
    Dim DigitoVerificador As Integer
    Dim strNumCp_1, StrNumCp_2, StrNumCp_3 As Double
    Dim Resto As Integer

    [color=green]'============================================================================================================
    Function CalcDV10(strSequencia)
    'Funçao para Cálculo do Dígito Verificador MÓDULO 10
    'O MÓDULO 10 é utilizado para calcular o DV do 03 primeiros campos da LINHA DIGITÁVEL

    Dim intCont As Integer, intNum As Integer, intNumT As Integer, intDoisUm As Integer

    intDoisUm = 2
    For intCont = Len(strSequencia) To 1 Step -1
    'pega o algarismo da sequencia
    intNum = Val(Mid(strSequencia, intCont, 1))
    intNum = intNum * intDoisUm
    If intNum > 9 Then
    intNum = Val(Left(intNum, 1)) + Val(Right(intNum, 1))
    End If
    intNumT = intNumT + intNum
    If intDoisUm = 2 Then
    intDoisUm = 1
    Else
    intDoisUm = 2
    End If
    Next

    If (intNumT Mod 10) = 0 Then
    CalcDV10 = "0"
    Else
    CalcDV10 = Str(10 - (intNumT Mod 10))
    End If
    End Function


    Espero que seja útil.
    Cumprimentos.


    Última edição por PILOTO em Sab 25 Ago 2012, 22:22, editado 5 vez(es) (Razão : Correção)


    .................................................................................
    PILOTO
    الله أكبر Paz, Justiça e Liberdade! الله أكبر
    [Você precisa estar registrado e conectado para ver este link.]

    Iniciando no Access? Então veja esse [Você precisa estar registrado e conectado para ver este link.] e também [Você precisa estar registrado e conectado para ver este link.]


    [Você precisa estar registrado e conectado para ver este link.]

    Quando tua dúvida for RESOLVIDA, dê retorno com AGRADECIMENTO a aqueles que gastaram seu tempo em te ajudar.
    Clique no botão Resolvido logo acima do botão Enviar, do lado direito. Todos nós agradecemos.  
    [Você precisa estar registrado e conectado para ver esta imagem.]

    din00tavares
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1
    Registrado : 17/08/2017

    Correção

    Mensagem  din00tavares em Qua 25 Out 2017, 19:13

    Olá,

    Para o pedaço do código para Validação dos 3 campos do boleto, parece que estava faltando um pedaço do código.

    Fiz algumas alterações pequenas e está funcionando perfeitamente agora.




    Public Function CalculaDigitoLinha(Campo1, Campo2, Campo3) As Boolean

    Dim DV1, DV2, DV3 As Integer

    ' Indica o campo menos o dígito verificador
    strCampo1 = Left(Campo1, Len(Campo1) - 1)
    strCampo2 = Left(Campo2, Len(Campo2) - 1)
    strCampo3 = Left(Campo3, Len(Campo3) - 1)

    ' Indica qual o dígito verificador digitado
    DV1 = Right(Campo1, 1)
    DV2 = Right(Campo2, 1)
    DV3 = Right(Campo3, 1)


    If CalcDV10(strCampo1) <> DV1 Then
    CalculaDigitoLinha = False
    Exit Function
    ElseIf CalcDV10(strCampo2) <> DV2 Then
    CalculaDigitoLinha = False
    Exit Function
    ElseIf CalcDV10(strCampo3) <> DV3 Then
    CalculaDigitoLinha = False
    Exit Function
    Else
    CalculaDigitoLinha = True
    End If

    End Function

    Function CalcDV10(strSequencia) As Integer
    'Funçao para Cálculo do Dígito Verificador MÓDULO 10
    'O MÓDULO 10 é utilizado para calcular o DV do 03 primeiros campos da LINHA DIGITÁVEL
    Dim intCont As Integer, intNum As Integer, intNumT As Integer, intDoisUm As Integer

    intDoisUm = 2
    For intCont = Len(strSequencia) To 1 Step -1
    'pega o algarismo da sequencia
    intNum = Val(Mid(strSequencia, intCont, 1))
    intNum = intNum * intDoisUm
    If intNum > 9 Then
    intNum = Val(Left(intNum, 1)) + Val(Right(intNum, 1))
    End If
    intNumT = intNumT + intNum
    If intDoisUm = 2 Then
    intDoisUm = 1
    Else
    intDoisUm = 2
    End If
    Next

    If (intNumT Mod 10) = 0 Then
    CalcDV10 = "0"
    Else
    CalcDV10 = Str(10 - (intNumT Mod 10))
    End If
    End Function

      Data/hora atual: Qua 13 Dez 2017, 11:05