Página 1 de 1

Código de Barras 07033071756

Enviado: 29 Abr 2014 10:40
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

Código de Barras 07033071756

Enviado: 29 Abr 2014 13:13
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

Código de Barras 07033071756

Enviado: 29 Abr 2014 13:38
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

Código de Barras 07033071756

Enviado: 29 Abr 2014 17:33
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		                                                              

Código de Barras 07033071756

Enviado: 04 Mai 2014 16:43
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