28 Ago 2018 14:01
Func ValidaGTIN( cCodGtin ) // Verica se o código é um código GTIN válido
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( cCodGtin )
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 ) )
If nDigito != 0
nDigito := ( 10 - nDigito )
EndIf
lRetorno := ( Hb_NToS( nDigito ) = Right( cCodGtin, 1 ) )
Return lRetorno
28 Ago 2018 14:32
28 Ago 2018 14:38
FOR EACH cNumero, nMultiplica IN Left( cGTIN, 13 ), { 3, 1 }
nSoma += Val( cNumero ) * nMultiplica
NEXT
28 Ago 2018 15:11
28 Ago 2018 15:46
Obrigado.Toledo escreveu:Jairo, mensagem já editada.
José, no meu caso eu não tenho como usar a sua função. Achei bem legal como você montou, particularmente a permuta do algoritmo, mas para meu caso tem dois pontos que inviabiliza o uso, a saber:JoséQuintas escreveu:Se interessar, a minha está na Sefazclass há bastante tempo
28 Ago 2018 15:50
28 Ago 2018 19:22
Jairo Maia escreveu:Em nenhum dos dois casos são GTIN´s válidos. Valeu.
... GET cGTIN VALID ! Empty( cGTIN ) .AND. ;
( Trim( cGTIN ) $ "0000000000000" .OR. ;
Trim( cGTIN ) == "SEM GTIN" .OR. ;
GTINOk( cGTIN ) )
alxsts escreveu:GTIN e EAN... qual é a diferença?
28 Ago 2018 19:33
Apenas o Nome. GTIN uniu os antigos códigos EAN 8 e EAN13, e também o código UPC que tinha 10 dígitos e passou a ter 13 porque se acrescentou o código do pais no início, no caso do Brasil o código identificador de pais é 789, por isso produtos fabricados aqui ou embalados aqui, sempre começam com 789. Também unificou o código ITF-14 ou DUn-14.alxsts escreveu:GTIN e EAN... qual é a diferença?
29 Ago 2018 00:03