Clipper On Line • Ver Tópico - ERRATA: Postei um código errado que pode gerar problemas

ERRATA: Postei um código errado que pode gerar problemas

Poste aqui suas sugestões e/ou críticas sobre o fórum, fale sobre a moderação e envie elogios.

Moderador: Moderadores

 

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor Jairo Maia » 28 Ago 2018 14:01

Olá Toledo,

Neste post: http://www.pctoledo.com.br/forum/viewtopic.php?p=125069#p125069 coloquei uma função que verifica se o código GTIN é valido. Ocorre que quando postei, peguei uma função que só funcionava antes porque eu só trabalhava com GTIN13. Agora, relendo o tópico, percebi que essa função é a que não funciona para GTIN8, GTIN12 OU GTIN14, vacilei na hora de pegar da minha pasta Testes.

Abaixo está a função que deveria ser postada, é a que uso em meus sistemas também. Assim, gostaria de solicitar a edição daquele post e substituir aquela função pela função abaixo por favor. É que como se trata de assunto fiscal, pode uma hora alguém decidir pegar a função, e usar em confiança (pela credibilidade que o fórum proporciona), e só perceber depois que gerar algum problema.

Agradeço Antecipadamente.
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
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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2219
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 254 vezes
Mens.Curtidas: 231 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor JoséQuintas » 28 Ago 2018 14:32

Se interessar, a minha está na Sefazclass há bastante tempo, assim como outras validações.

https://github.com/JoseQuintas/sefazclass/blob/master/source/ze_digitodoc.prg

validagtin.png


Dá pra aperfeiçoar usando Mod() por exemplo....
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10032
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 644 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor JoséQuintas » 28 Ago 2018 14:38

Aliás...
É difícil encontrar utilidade pra um FOR/EACH composto, mas essa seria uma delas.
Alguma coisa parecida com isto...

FOR EACH cNumero, nMultiplica IN Left( cGTIN, 13 ), { 3, 1 }
   nSoma += Val( cNumero ) * nMultiplica
NEXT


O FOR/EACH vai percorrer uma letra de cada vez, ao mesmo tempo que um elemento do array de cada vez.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10032
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 644 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor Toledo » 28 Ago 2018 15:11

Jairo, mensagem já editada.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Avatar de usuário

Toledo
Administrador

Administrador
 
Mensagens: 2964
Data de registro: 22 Jul 2003 18:39
Cidade/Estado: Araçatuba - SP
Curtiu: 214 vezes
Mens.Curtidas: 209 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor Jairo Maia » 28 Ago 2018 15:46

Toledo escreveu:Jairo, mensagem já editada.
Obrigado.

JoséQuintas escreveu:Se interessar, a minha está na Sefazclass há bastante tempo
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:

1-Você inicia lOK como verdadeiro, então se enviar um código vazio, retornará .T.
2-Você não está tratando código 0 (zero) ou sequência de zeros, então também vai retornar .T. No meu caso, quando não há GTIN preencho com Zeros.

Em nenhum dos dois casos são GTIN´s válidos. Valeu.
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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2219
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 254 vezes
Mens.Curtidas: 231 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor alxsts » 28 Ago 2018 15:50

Olá!

Parabéns Jairo pela preocupação em corrigir o equívoco.

GTIN e EAN... qual é a diferença?
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2153
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 142 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor JoséQuintas » 28 Ago 2018 19:22

Jairo Maia escreveu:Em nenhum dos dois casos são GTIN´s válidos. Valeu.


Opção:

... 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?


Até pesquisei agora...
GTIN é o código do produto, padrão mundial.
EAN é o nome do padrão do código de barras, mas tradicionalmente era o nome do "GTIN" também.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 10032
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 6 vezes
Mens.Curtidas: 644 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor Jairo Maia » 28 Ago 2018 19:33

Olá Alexandre,

alxsts escreveu:GTIN e EAN... qual é a diferença?
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.

Isso porque em função da globalização, foi necessário um acordo internacional para resolver o problema de exportações/importações. Hoje todos os códigos são únicos no mundo, pois são precedidos pelo código do pais origem, exceto o EAN 12, que ainda não entendo direito.

O EAN-12, pode começar com zero, e não é precedido pelo código do pais de origem. Sei lá, não entendo esse código direito ainda.
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)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2219
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 254 vezes
Mens.Curtidas: 231 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor alxsts » 29 Ago 2018 00:03

Olá!

Obrigado Jairo e Quintas.
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2153
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 13 vezes
Mens.Curtidas: 142 vezes

ERRATA: Postei um código errado que pode gerar problemas

Mensagempor hazael » 30 Ago 2018 11:09

Veja resposta aqui: https://www.gs1br.org/faq/o-que-e-gtin

O que é o GTIN?
O GTIN, sigla de Global Trade Item Number, é um identificador para itens comerciais desenvolvido e controlado pela GS1, antiga EAN/UCC.

Os GTINs, anteriormente chamados de códigos EAN, são atribuídos para qualquer item (produto ou serviço) que pode ser precificado, pedido ou faturado em qualquer ponto da cadeia de suprimentos.

O GTIN é utilizado para recuperar informação pré-definida e abrange desde as matérias primas até produtos acabados. GTIN é um termo "guarda-chuva" para descrever toda a família de identificação das estruturas de dados GS1 para itens comerciais (produtos e serviços).

Os GTINs podem ter o tamanho de 8, 12, 13 ou 14 dígitos e podem ser construídos utilizando qualquer uma das quatro estruturas de numeração dependendo da aplicação. O GTIN-8 é codificado no código de barras EAN-8. O GTIN-12 é mais utilizado no código de barras UPC-A, o GTIN-13 é codificado no EAN-13 e o GTIN-14 no ITF-14.

Conheça o Cadastro Nacional de Produtos, ferramenta online da GS1 Brasil para geração de GTIN e gestão de produtos.

Há 4 maneiras de construir o GTIN:

Nomes anteriores do GTIN
GTIN-8 à antigo EAN-8, GTIN-12 à antigo Código UPC, GTIN-13 à antigo Código EAN, GTIN-14 à antigo DUN-14.
FAQ4.jpg
Harbour | GTWVT | MingW | Visual Studio Code
Avatar de usuário

hazael
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 486
Data de registro: 27 Nov 2016 12:59
Curtiu: 8 vezes
Mens.Curtidas: 35 vezes




Retornar para Sugestões, Críticas e Elogios sobre o Fórum

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Faça uma doação para o forum
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro