validar códigos EAN13

validar códigos EAN13

Postby elvira » Sun Mar 17, 2013 7: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!!.
elvira
 
Posts: 516
Joined: Fri Jun 29, 2012 12:49 pm

Re: validar códigos EAN13

Postby Daniel Garcia-Gil » Sun Mar 17, 2013 8: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: Select all  Expand view

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

 
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: validar códigos EAN13

Postby elvira » Sun Mar 17, 2013 9:12 pm

Daniel,

Muchas gracias, pero no me compila.

Al final, enontré esto en la barlib de Cayetano:
Code: Select all  Expand view
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)
 
elvira
 
Posts: 516
Joined: Fri Jun 29, 2012 12:49 pm

Re: validar códigos EAN13

Postby Daniel Garcia-Gil » Sun Mar 17, 2013 9: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)
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: validar códigos EAN13

Postby Armando » Mon Mar 18, 2013 5:17 am

Daniel:

Reconozco que de C solo se que no se nada :oops: , pero en esta parte de tu código
Code: Select all  Expand view

      //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
User avatar
Armando
 
Posts: 3087
Joined: Fri Oct 07, 2005 8:20 pm
Location: Toluca, México

Re: validar códigos EAN13

Postby karinha » Mon Mar 18, 2013 1:35 pm

João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7416
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 76 guests