PROBLEMA AO GERAR LINHA DIGITAVEL COM COD. BARRAS

DINHORSO 14/08/2007 20:04:23
#230916
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

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


RODRIGOMARCHESE 15/08/2007 09:04:31
#230944
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
DINHORSO 16/08/2007 14:08:32
#231198
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
RODRIGOMARCHESE 16/08/2007 16:13:51
#231215
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.

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



USUARIO.EXCLUIDOS 16/08/2007 17:19:21
#231232
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
RODRIGOMARCHESE 16/08/2007 18:27:34
#231246
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.

RODRIGOMARCHESE 16/08/2007 18:31:17
#231248
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

DINHORSO 18/08/2007 10:11:35
#231493
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