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

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

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

Mensagem por Jairo Maia »

Olá Toledo,

Neste post: https://pctoledo.org/forum/viewto ... 69#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.

Código: Selecionar todos

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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

https://github.com/JoseQuintas/sefazcla ... itodoc.prg
validagtin.png
Dá pra aperfeiçoar usando Mod() por exemplo....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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

Código: Selecionar todos

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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Toledo
Administrador
Administrador
Mensagens: 3133
Registrado em: 22 Jul 2003 18:39
Localização: Araçatuba - SP
Contato:

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

Mensagem por Toledo »

Jairo, mensagem já editada.

Abraços,
Toledo - Clipper On Line
toledo@pctoledo.com.br
Harbour 3.2/MiniGui/HwGui
Faça uma doação para o fórum, clique neste link: http://www.pctoledo.com.br/doacao
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

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

Mensagem por Jairo Maia »

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)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

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

Mensagem por alxsts »

Olá!

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

GTIN e EAN... qual é a diferença?
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem por JoséQuintas »

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

Opção:

Código: Selecionar todos

... 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.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

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

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

Mensagem por Jairo Maia »

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)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

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

Mensagem por alxsts »

Olá!

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