Atenção "SEM GTIN" na entrada dos produtos.

Fórum sobre desenvolvimento de software para atender as exigências da legislação fiscal e tributária (NFe, NFCe, NFSe, SPEED, Projeto ACBr, TEF, ECD, EFD, etc.)

Moderador: Moderadores

JSystem
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 21 Jan 2010 21:10
Localização: Uberaba

Atenção "SEM GTIN" na entrada dos produtos.

Mensagem por JSystem »

Jairo,

Fiz as mudanças, porém não deu certo, segue abaixo o código, percebi que retorna .T. qualquer numero que digitar, desde que o último dígito seja 0.

Código: Selecionar todos

Func ValidaGTIN( cCodGtin )

 Local nPosi       := 0
 Local nDigito     := 0
 Local nSomatoria  := 0
 Local aAlgoritmo  := {}
 Local lRetorno    := .F.
 
 aAlgoritmo := { 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3 }

 cCodGtin := AllTrim( str(cCodGtin,14) )
 
 If ( Val( cCodGtin ) <= 0 ) .Or. !( StrZero( Len( cCodGtin ), 2 ) $ [08,12,13,14] )
    Return lRetorno
 Else
    nPosi := ( ( 14 - Len( cCodGtin ) ) + 1 )
 EndIf

 For x := 1 To ( Len( cCodGtin ) - 1 )
     nSomatoria += ( Val( SubStr( cCodGtin, x, 1 ) ) * aAlgoritmo[ nPosi ] )
     nPosi++
 Next

// nDigito := Val( Right( Hb_NToS( nSomatoria ), 1 ) )
 nDigito := Val( Right( LTrim( Str(nSomatoria,1) ), 1 ) )
 If nDigito != 0
    nDigito := ( 10 - nDigito )
 EndIf

 lRetorno := ( LTrim( Str(nDigito,1) ) = Right( cCodGtin, 1 ) )
 
Return lRetorno
[/b]


Segue três códigos de barras válidos de produtos que consegui emitir NFe, caso queira testar:

7898584070440 - Apenas este retorna .T.
7898584070457
7898584070464

Se puder me ajudar ficarei grato.

Att.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Atenção "SEM GTIN" na entrada dos produtos.

Mensagem por Jairo Maia »

Olá JSystem,

Você fez confusão ao alterar as linhas 11 e 25 da função e tirou a funcionalidade dela. Pela linha 11, percebe-se que você envia o GTIN numérico, e não caractere. Alterei a função para tratar se envia numérico ou caractere, e está compatível com Clipper. Use essa função:

Código: Selecionar todos

Func ValidaGTIN( cCodGtin )

 Local nPosi       := 0
 Local nDigito     := 0
 Local nSomatoria  := 0
 Local aAlgoritmo  := {}
 Local lRetorno    := .F.
 
 aAlgoritmo := { 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3 }

 If ValType( cCodGtin ) = "N"
  cCodGtin := AllTrim( Str( cCodGtin ) )
 Else
  cCodGtin := AllTrim( cCodGtin )
 EndIf
 
 If ( Val( cCodGtin ) <= 0 ) .Or. !( StrZero( Len( cCodGtin ), 2 ) $ [08,12,13,14] )
    Return lRetorno
 Else
    nPosi := ( ( 14 - Len( cCodGtin ) ) + 1 )
 EndIf

 For x := 1 To ( Len( cCodGtin ) - 1 )
     nSomatoria += ( Val( SubStr( cCodGtin, x, 1 ) ) * aAlgoritmo[ nPosi ] )
     nPosi++
 Next

 nDigito := Val( Right( LTrim( Str( nSomatoria ) ), 1 ) )
 If nDigito != 0
    nDigito := ( 10 - nDigito )
 EndIf

 lRetorno := ( LTrim( Str(nDigito,1) ) = Right( cCodGtin, 1 ) )
 
Return lRetorno
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
JSystem
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 21 Jan 2010 21:10
Localização: Uberaba

Atenção "SEM GTIN" na entrada dos produtos.

Mensagem por JSystem »

Olá Jairo,

Novamente te dando trabalho, vai tendo um pouco de paciência rsrs.

Substitui a função, porém a falha continua, retornando .T. apenas para os códigos de barras terminados com o número 0, inclusive testei o seguinte, 9999999999990, retornou .T.
JSystem
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 21 Jan 2010 21:10
Localização: Uberaba

Atenção "SEM GTIN" na entrada dos produtos.

Mensagem por JSystem »

Olá Pessoal,

Até que o Jairo atenha condição de me retornar, alguém mais utiliza a função e pode me orientar acerca dessa falha ?

Grato.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Atenção "SEM GTIN" na entrada dos produtos.

Mensagem por Jairo Maia »

Olá JSystem,

Sua primeira alteração realmente estava com problema, mas fiz as correções e funcionou corretamente. Não vejo razão por ser Clipper e estar dando o problema, acho que você está fazendo algo errado, e ai só você para saber mesmo. Compile o exemplo abaixo em Clipper e veja que resultado retorna:

Código: Selecionar todos

CLS
?
? ValidaGTIN( Val( "7898584070440" ) )
? ValidaGTIN( Val( "7898584070457" ) )
? ValidaGTIN( Val( "7898584070464" ) )
?

Func ValidaGTIN( cCodGtin )

 Local nPosi       := 0
 Local nDigito     := 0
 Local nSomatoria  := 0
 Local aAlgoritmo  := {}
 Local lRetorno    := .F.
 
 aAlgoritmo := { 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3 }

 If ValType( cCodGtin ) = "N"
  cCodGtin := AllTrim( Str( cCodGtin ) )
 Else
  cCodGtin := AllTrim( cCodGtin )
 EndIf
 
 If ( Val( cCodGtin ) <= 0 ) .Or. !( StrZero( Len( cCodGtin ), 2 ) $ [08,12,13,14] )
    Return lRetorno
 Else
    nPosi := ( ( 14 - Len( cCodGtin ) ) + 1 )
 EndIf

 For x := 1 To ( Len( cCodGtin ) - 1 )
     nSomatoria += ( Val( SubStr( cCodGtin, x, 1 ) ) * aAlgoritmo[ nPosi ] )
     nPosi++
 Next

 nDigito := Val( Right( LTrim( Str( nSomatoria ) ), 1 ) )
 If nDigito != 0
    nDigito := ( 10 - nDigito )
 EndIf

 lRetorno := ( LTrim( Str(nDigito,1) ) = Right( cCodGtin, 1 ) )
 
Return lRetorno
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
JSystem
Usuário Nível 3
Usuário Nível 3
Mensagens: 143
Registrado em: 21 Jan 2010 21:10
Localização: Uberaba

Atenção "SEM GTIN" na entrada dos produtos.

Mensagem por JSystem »

Olá Jairo,

Depois de bastante tempo e apanhar bastante, descobri que o problema era na variável de ambiente, set fixed on, foi só desativar funcionou perfeito.

Obrigado pela atenção e paciência.

Grato.
Responder