PROBLEMA AO GERAR LINHA DIGITAVEL COM COD. BARRAS
Estou utilizando o procedimento abaixo para gerar os digitos no meu Sistema de Código de Barras; o problemas e que cheguei a um valor que o resultado é igual a "X" ou números negativos no Modulo 11 o que fazer:
Ex : 858 9 0000000 33380179070 60748505083 39094410001
Gera: 858 9 0000000.X 33380179070. 5 60748505083. 7 39094410001.0
Segue codigo utilizado
Ex : 858 9 0000000 33380179070 60748505083 39094410001
Gera: 858 9 0000000.X 33380179070. 5 60748505083. 7 39094410001.0
Segue codigo utilizado
Function Calculo_DV11(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(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 10
Calculo_DV10 = "0"
Case Else
Calculo_DV10 = Str(intResto)
End Select
End Function
Private Function calcula_DV_CodBarras(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
Seguinte:
O Módulo 11 é utilizado para calcular o dÃÂÂgito verificador do nosso número.
Se no código de barras ou linha digitável está aparecento o X é porque você está usando o Módulo errado.
Para a linha digitável você deve utilizar o Módulo 10
O Módulo 11 é utilizado para calcular o dÃÂÂgito verificador do nosso número.
Se no código de barras ou linha digitável está aparecento o X é porque você está usando o Módulo errado.
Para a linha digitável você deve utilizar o Módulo 10
Não ententi nosso numero, mim explique pois para testar utilizei um boleto de pagamento do FGTS e quando utilizo o modulo 10 os digitos nao funciona e quando utilizo o modulo 11 os digitos batem, agora o problema é que alguns o valor deu X, -11, 10. Se vc utiliza o mesmo código do marcoratti se nao me ajude
Segue uma colher de chá pra você. Observe como é montado o campo LIVRE no banco do brasil. Cadas banco pode montar como bem entender. Por isso é importante ler o material fornecido para cada banco, pois apesar de haver uma padronização, existem campos que cada banco pode usar como bem entender.
No caso do banco do brasil, podem haver NossoNumero com dÃÂÂgito ou sem dÃÂÂgito, dependento do convênio e da carteira de cobrança usada.
No caso do banco do brasil, podem haver NossoNumero com dÃÂÂgito ou sem dÃÂÂgito, dependento do convênio e da carteira de cobrança usada.
Private Sub Command1_Click()
strLivre = Format(strNossoNumerosemDv, "00000000000") & Format(Agencia, "0000") & Format(ContaCedente, "00000000") & Format(Carteira, "00")
strSeqCodBarras = objBco.ConstroiCodBarras(Format(Banco, "000"), Moeda, ValorDocumento, DataVencimento, strLivre)
strSeqLinhaDigitavel = objBco.ConstroiLinhaDigitavel(strSeqCodBarras, ValorDocumento)
End Sub
Function ConstroiCodBarras(Banco As String, Moeda As String, valor As Currency, vencimento As Date, ByVal Livre As String) 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(strDataBaseFator)
fator = DateDiff("d", database, Format(vencimento, "dd/mm/yyyy")) - 1
valor = Int(valor * 100)
Livre = Format(Livre, "0000000000000000000000000")
'sequencia sem o dÃÂÂgito verificador
codigo_sequencia = Banco & Moeda & fator & Format(valor, "0000000000") & Livre
'calculo do dÃÂÂgito verificador
intDac = CalculaDVCodBarras(codigo_sequencia)
'monta a sequencia para o codigo de barras com o dÃÂÂgito verificador
ConstroiCodBarras = Left(codigo_sequencia, 4) & intDac & Right(codigo_sequencia, 39)
End Function
Function CalculaDVCodBarras(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
CalculaDVCodBarras = 1
Else
CalculaDVCodBarras = intresultado
End If
End Function
Function ConstroiLinhaDigitavel(sequencia As String, valor As Single) As String
Dim seq1 As String
Dim seq2 As String
Dim seq3 As String
Dim seq4 As String
Dim seq5 As String
Dim dv1, dv2, dv3 As Integer
'mota linha digitável com dados do código de barras
seq1 = Mid(sequencia, 1, 4) & Mid(sequencia, 20, 5)
seq2 = Mid(sequencia, 25, 10)
seq3 = Mid(sequencia, 35, 10)
seq4 = Mid(sequencia, 5, 1)
seq5 = Mid(sequencia, 6, 4) & Mid(sequencia, 10, 10)
valor = Int(valor * 100)
'calcula os digitos verificadores
dv1 = Val(CalculaModulo10(seq1))
dv2 = Val(CalculaModulo10(seq2))
dv3 = Val(CalculaModulo10(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)
ConstroiLinhaDigitavel = seq1 & " " & seq2 & " " & seq3 & " " & seq4 & " " & seq5
End Function
olhe a documentação para emissão de boleto do banco do brasil, o exemplo do macorrati precisa de uns ajustes, e muda para cada banco.
InResto = IntTotalNumero Mod 11
If TPO = "1" Then 'Brasil
If InResto = 0 Then
Calculo_DV11 = 1
ElseIf InResto > 9 Then
Calculo_DV11 = 1
Else
Calculo_DV11 = 11 - InResto
End If
end if
InResto = IntTotalNumero Mod 11
If TPO = "1" Then 'Brasil
If InResto = 0 Then
Calculo_DV11 = 1
ElseIf InResto > 9 Then
Calculo_DV11 = 1
Else
Calculo_DV11 = 11 - InResto
End If
end if
Tem que ficar bem claro que:
1)O Módulo11 não vai ser utilizado para gerar o codigo de barras e também não vai ser utilizado para a linha digitável
2)A linha digitável vai usar o Módulo10
3)O código de barras não usa nenhum dos dois, pois tem a função CalculaDVCodBarras para isso.
4)O Módulo11 no caso do banco do brasil é usado somente para calcular o dv do nosso número, isso qdo o nosso número tiver dÃÂÂgito verificador, o que nem sempre acontece.
1)O Módulo11 não vai ser utilizado para gerar o codigo de barras e também não vai ser utilizado para a linha digitável
2)A linha digitável vai usar o Módulo10
3)O código de barras não usa nenhum dos dois, pois tem a função CalculaDVCodBarras para isso.
4)O Módulo11 no caso do banco do brasil é usado somente para calcular o dv do nosso número, isso qdo o nosso número tiver dÃÂÂgito verificador, o que nem sempre acontece.
Para mim o ARNALDOCRUZ está equivocado, o correto, cfme o DINHORSO já postou, para o resto do calculo no Módulo11 é:
'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
'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
Obrigado amigos, por mim ajudarem, por isso o vbmania e super visitado pois nós programadores iniciante sempre podemos tirar dúvidas.
Tópico encerrado , respostas não são mais permitidas