FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour validar c贸digos EAN13
Posts: 518
Joined: Fri Jun 29, 2012 12:49 PM
validar c贸digos EAN13
Posted: Sun Mar 17, 2013 07:22 PM

Hola amigos,

驴Alguien tiene una funci贸n para validar c贸digos de barra EAN13, calculando el d铆gito de control?.

Aqu铆 est谩 en C, pero no se como hacerlo en Harbour.

http://latecladeescape.com/t/Validar+c%C3%B3digos+EAN

Muchas gracias!!.

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: validar c贸digos EAN13
Posted: Sun Mar 17, 2013 08:08 PM
Hola

con peque帽os cambios para que funcione en C (no en c++) podrias usar el mismo codigo, pruebalo a ver si te funciona

Code (fw): Select all Collapse
function main()
聽 聽 ? ComprobarEAN("12345678")
聽 聽 ? ComprobarEAN("12345671")
聽 聽 ? ComprobarEAN("12345670")
return nil

#pragma BEGINDUMP
#include <hbapi.h>

HB_BOOL EsSoloNumeros( const char * s)
{
聽 聽HB_BOOL resultado = HB_TRUE;
聽 聽int contador=0;
聽 聽while (resultado && contador < (int) strlen(s) )
聽 聽{
聽 聽 聽 resultado=resultado && (s[contador]>='0' && 聽s[contador] <= '9');
聽 聽 聽 contador++;
聽 聽}
聽 聽return resultado;
}

//devuelve HB_TRUE si el c贸digo es correcto
//HB_FALSE en caso contrario
HB_BOOL ComprobarEAN( const char * ean, int iLen)
{
聽 聽//empezamos suponiendo que el codigo no
聽 聽//es correcto
聽 聽HB_BOOL resultado = HB_FALSE;


聽 聽//S贸lo comprobabos si la cadena est谩 formada por
聽 聽//d铆gitos y su longitud es 8 o 13
聽 聽if (EsSoloNumeros(ean) && (iLen == 8 || iLen==13))
聽 聽{
聽 聽 聽 //Sumaremos los lugares pares por un lado y los
聽 聽 聽 //impares por otro
聽 聽 聽 int pares = 0;
聽 聽 聽 int impares = 0;
聽 聽 聽 int checksum;
聽 聽 聽 int digitoControl;
聽 聽 聽 char n[2];
聽 聽 聽 int numero;
聽 聽 聽 //Recorrer toda la cadena excluyendo el 煤ltimo lugar
聽 聽 聽 for (int i = 0; i <= (iLen-2); i++)
聽 聽 聽 {
聽 聽 聽 聽 聽sprintf( n, "%c", ean[i]);
聽 聽 聽 聽 聽numero = atoi(n);
聽 聽 聽 聽 聽if (i % 2 == 0) //Si lugar impar (empezamos por 0)
聽 聽 聽 聽 聽 聽 impares += numero;
聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 pares += numero;
聽 聽 聽 }
聽 聽 聽 //En EAN13, los pares se multiplican por 3
聽 聽 聽 //En EAN8, son los impares
聽 聽 聽 if (iLen == 13)
聽 聽 聽 聽 聽pares *= 3;
聽 聽 聽 else
聽 聽 聽 聽 聽impares *= 3;
聽 聽 聽 checksum = pares + impares;
聽 聽 聽 digitoControl = 10 - (checksum % 10);
聽 聽 聽 //Si el digito de control es 10, entendemos 0
聽 聽 聽 if (digitoControl == 10)
聽 聽 聽 聽 聽digitoControl = 0;
聽 聽 聽 //Comprobar que el digito de control obtenido y el
聽 聽 聽 //de la cadena ean sean el mismo.
聽 聽 聽 sprintf( n, "%c", ean[iLen-1]);
聽 聽 聽 resultado = (digitoControl == atoi(n));
聽 聽} //fin if
聽 聽return resultado;
}

HB_FUNC( COMPROBAREAN )
{
聽 聽 const char * s = hb_parc(1);
聽 聽 hb_retl( ComprobarEAN(s, hb_parclen(1) ) );
}

#pragma ENDDUMP
Posts: 518
Joined: Fri Jun 29, 2012 12:49 PM
Re: validar c贸digos EAN13
Posted: Sun Mar 17, 2013 09:12 PM
Daniel,

Muchas gracias, pero no me compila.

Al final, enontr茅 esto en la barlib de Cayetano:
Code (fw): Select all Collapse
FUNCTION ComprobarEAN(cCode)
   local s1,s2,l,Control,n
   s1:=0                                         // suma de impares
   s2:=0                                         // suma de pares
   for n=1 to 6
      s1:=s1+val(substr(cCode,(n*2)-1,1))
      s2:=s2+val(substr(cCode,(n*2),1))
   next
   control:=(s2*3)+s1
   l:=10
   do while control>l
      l:=l+10
   end
   control:=l-control

RETURN sTr(control,1,0)
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: validar c贸digos EAN13
Posted: Sun Mar 17, 2013 09:41 PM

Hola

que error te da...
yo lo compile usando la herramienta hbmk2 de harbour y funciona bien

por lo que veo la funcion que muestras solo calcula los ean de 13 digitos y no los de 8 (verifica eso)

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: validar c贸digos EAN13
Posted: Mon Mar 18, 2013 05:17 AM
Daniel:

Reconozco que de C solo se que no se nada :-) , pero en esta parte de tu c贸digo
Code (fw): Select all Collapse
聽 聽 聽 //Recorrer toda la cadena excluyendo el 煤ltimo lugar
聽 聽 聽 for (int i = 0; i <= (iLen-2); i++)
聽 聽 聽 {
聽 聽 聽 聽 聽sprintf( n, "%c", ean[i]);
聽 聽 聽 聽 聽numero = atoi(n);
聽 聽 聽 聽 聽if (i % 2 == 0) //Si lugar impar (empezamos por 0)
聽 聽 聽 聽 聽 聽 impares += numero;
聽 聽 聽 聽 聽else
聽 聽 聽 聽 聽 聽 pares += numero;
聽 聽 聽 }


me parece que estas determinando las ubicaciones pares iniciando desde la izquierda a la derecha,
y si la memoria no me falla, debe ser de derecha a izquierda.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 8515
Joined: Tue Dec 20, 2005 07:36 PM
Re: validar c贸digos EAN13
Posted: Mon Mar 18, 2013 01:35 PM
Jo茫o Santos - S茫o Paulo - Brasil - Phone: +55(11)95150-7341

Continue the discussion