Código de Barras 07033071756

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Código de Barras 07033071756

Mensagem por rubens »

Bom dia

O Cliente me chamou ontem porque o programa nao estava aceitando esse código de barras 07033071756. Fiz alguns testes e realmente esse código não valida na minha rotina de validar código de barras que foi discutida nesse tópico https://pctoledo.org/forum/viewto ... 365#p70365
Fiz umas pesquisas e não encontrei esse padrão de código de barra. Os que encontrei são o Gtin8 e Gtin13. Esse código tem 11 dígitos. A função de validação preenche automaticamente com zeros a esquerda até completar 13 digitos. Mas aí não passa na validação.

Alguém conhece esse código e como validar ele... Não dá simplesmente para ler ele sem validar porque aí vai ser barrado na nfe.

Obrigado

Rubens

Código de validação que está sendo usado:

Código: Selecionar todos

********************************************************************************
cCodBar := '07033071756'
If !ValidaEAN( @cCodbar )
    alert('Codigo nao Validado')
else
    alert('Codigo Validado'')
endif

********************************************************************************
Static Function ValidaEAN(cCodBar)

Local nInd	:= 0
Local nUnidade := 0
Local nDigito	:= 0
Local lRetorno := .T.
Local aPosicao[12]

IF EMPTY( cCODBAR )
	RETURN lRETORNO
ENDIF

MUDACOD( @cCODBAR )

cCODBAR := StrZero(Val(AllTrim(cCODBAR)), 13, 0)

For nInd := 1 to 12
	aPosicao[nInd] := Val(SubStr(cCODBAR, nInd, 1))
Next

nUnidade := Val(Right(Str(((aPosicao[2]+aPosicao[4]+aPosicao[6]+aPosicao[8]+aPosicao[10]+aPosicao[12])*3) + ( aPosicao[1]+aPosicao[3]+aPosicao[5]+aPosicao[7]+aPosicao[9]+aPosicao[11])), 1))
nDigito  := If((10-nUnidade ) > 9, 0, 10-nUnidade)
lRetorno := nDigito = Val(Right(AllTrim(cCODBAR), 1))

Return lRetorno
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Código de Barras 07033071756

Mensagem por fladimir »

Aqui validou... eu uso assim:

Código: Selecionar todos

//------------------------------------------------------------------------------
Function ValidaEAN(cCodigoBarras)
	Local nInd   := 0
	Local nUnidade := 0
	Local nDigito  := 0
	Local lRetorno := .f.
	Local aPosicao[12]

	If StrZero(Len(Trim(cCodigoBarras)), 2,0) $ "13"
	   For nInd := 1 to 12
	      aPosicao[nInd] := Val(SubStr(cCodigoBarras, nInd, 1))
	   Next
	   nUnidade := Val(Right(Str(((aPosicao[2]+aPosicao[4]+aPosicao[6]+aPosicao[8]+aPosicao[10]+aPosicao[12])*3) + ( aPosicao[1]+aPosicao[3]+aPosicao[5]+aPosicao[7]+aPosicao[9]+aPosicao[11])), 1))
	   nDigito := If((10-nUnidade ) > 9, 0, 10-nUnidade)
	   lRetorno := nDigito = Val(Right(AllTrim(cCodigoBarras), 1))
	   IF(!lRetorno, Alert("Exigencia NF-e * O digito verificador esta incorreto !; Digito Verificador Correto:" + STR(nDigito,2)),)
	Else
		Return .T.
	EndIf
Return lRetorno
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Código de Barras 07033071756

Mensagem por rubens »

Obrigado Fladimir...

O erro não tinha nada a ver com o Código de barras... eu tinha uma comparação if cCodBar = '0' que tava retornando .t. e na realidade tem que ser if cCodBar == '0'. Daí todo código que começava com '0' tava retornando .t. e a função assumia como não validado...

Blz..

Problema resolvido..
obg

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Código de Barras 07033071756

Mensagem por rubens »

Então... você sabe me dizer se o GTin14 vai vir sempre com 14 digitos ?
O cliente me reclamou isso dizendo que estava tendo de cadastrar o código de barras manual por que o código da caixa é diferente do código do produto.
Daí fui pesquisar e o que encontrei foi o seguinte:

Código da embalagem GTIN 14, o primeiro digito geralmente entre 0 e 9 precede os 13 digitos do GTIN13 e serve para indicar quantos itens tem na embalagem.
Daí fui implementar e me deparei com o seguinte, como faço para identificar um código de barra que seja GTIN 14 para eu remover o primeiro digito do código e usar os outro 13.
Nos testes algums produtos vem com GTIN no xml mas só com 13 digitos, até aí tudo bem. remove o primeiro item e gera o dígito verificador e valida para ver se o código de barras passou correto.
Parti do principio de que se o código de barras tiver o tamanho 14, automaticamente é GTIN 14, Se não, se começar com 77 ou a primeira letra for diferente de 7, eh GTIN 14 (só que com 13 digitos). Mas acho que essa lógica ficou meio 'Incerta', para não dizer gambiarra.
Por que tenho vários produtos que não começam exatamente com 7 o código de barras (Cartucho HP 662XL - 885631033616 - Pilha Golden Power - 4895026706519 ) não começa com 7 e não são GTIN 14, daí na rotina abaixo seriam considerados GTIN 14.

Alguém passou por isso e soube resolver... ???

Obrigado

Rubens

Código: Selecionar todos

IF LEN( ALLTRIM( cCODBARRA ) )=14                                      
   cCODBARRA := RIGHT( cCODBARRA,13 )                                  
   cCODBARRA := GERAEAN( @cCODBARRA )                                  
ELSE                                                                   
   IF LEFT( cCODBARRA,2 ) = '77' .OR. LEFT( cCODBARRA,1 ) != '7'  .OR. LEFT( cCODBARRA,1) != '0'
      cCODBARRA := RIGHT( cCODBARRA,12 )                               
      cCODBARRA := GERAEAN( @cCODBARRA )                               
   ENDIF                                                               
ENDIF		                                                              
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Código de Barras 07033071756

Mensagem por rubens »

Pelos testes que fiz realmente os código de barras de caixa tem o tamanho de 14dígitos..

Só que o dígito verificador o décimo quarto dígito é desse código de barras de 14 dígitos... Daí tem que pegar os 12 dígitos do meio do código substr( cCodbar, 2,12 )
e calcular novamente o dígito verificador do ean13.

Até agora tá funcionando e lendo direitinho os códigos que testamos.
Vamos fazer mais testes e ver o que acontece...

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Responder