CODBARRAS

De WikI de SOMFUEAL (Alfonso Somoza de la Fuente)
Saltar a: navegación, buscar

IMPRESION DE CODIGO DE BARRAS EAN-13 EAN-8 (PROCESOS PLSQL PARA ORACLE con fuentes de Windows Ean13.TTF)

  Para el codigo de barras EAN-13 (13 digitos) y en le EAN-8 (8 digitos) la codificación 
numérica es la misma, el numero es dividido en partes y dos zonas diferenciadas, Izquierda 
y Derecha, esta Zonas estan delimitadas por marcas de inicio de código, separación de zonas 
y fin de código, esto hace que nuestro codigo final sea algo mayor.
Por Ejemplo en el EAN-13:  1 234567 890128
El primer digito "1" es de codificación, los "234567" y  "890128" son las zonas Izquierda y 
Derecha del codigo el último "8" es del de cóntrol que es calculado por una rutina.
En el Ejemplo en EAN-8: 1234 5678
Los "1234" son la zona Izquierda y "5678" es la zona Derecha el untino digito "8" es de control
igual que en caso anterior es calulado por una rutina, estos digitos de control en los dos casos
nos dicen si los codigos son correctos.
los codigos de Inicio en nuestra codificación estaran representados por el caracter "*",
los Codigos de separación por el caracter "+" y el codigo de fin tambien por el caracter "*".
estos procedimientos transladan los digitos a caracteres que aplicados a las fuentes Ean13.TTF de 
Windows dan como resultados la impresión de los codigo de barras.
En EAN-13: el 1 234567 890128  -> Proceso -> z*23r5yu+klñask*  -> Ean13.TTF -> Grafico del código barras
En EAN-8:  el 1234 5670        -> Proceso -> *1234+ghjñ*       -> Ean13.TTF -> Grafico del código barras
 
podemos ver el la transcripción en caracteres los "* y +" así como las zonas.
Funciones para generar y comprobar codigo de barras EAN8 y EAN13, estan escritas en PL/SQL
para ser incluidas en Bases de Datos ORACLE.

Las variables de entorno para el lenguaje Español para Oracle.

LANG=es; export LANG  
LANGUAGE=spanish_spain.WE8ASCII; export LANGUAGE 
NLS_LANG=SPANISH_SPAIN.WE8ISO8859P1; export NLS_LANG 
La rutina de cálculo del dígito de control EAN-8
1º Sumamos todos los dígitos impares y multiplicamos por 3  (1+3+5+7)*3 = 48
2º Sumamos todos los dígitos pares                          (2+4+6)     = 12
3º Sumamos las dos cantidades                                           = 80
4º El dígito de control será 10 menos las unidades de la suma total,( si es 0 será 0). 
                                              las unidades son cero luego (0)
La rutina de cálculo del dígito de control EAN-13
1º Sumamos todos los dígitos pares y multiplicamos por 3    (2+4+6+8+0+2)*3 = 66
2º Sumamos todos los dígitos impares                        (1+3+5+7+9+1)   = 26
3º Sumamos las dos cantidades                                               = 92
4º El dígito de control será 10 menos las unidades de la suma total, (si es 0 será 0). 
                                               las unidades son (2) luego  10-2=8 (8)

Función que devuelve el codigo de contról del EAN8:

CREATE OR REPLACE FUNCTION PB_CEAN8 (codigo IN VARCHAR2)
RETURN VARCHAR2 IS
  i  int;
  dp number;
  di number;
  dc number;
  ccode8 VARCHAR2(1);
BEGIN
  dp:=0;
  i:=2;
  loop
      dp:=dp+to_number(substr(codigo,i,1));
      i:=i+2;
      exit when i > 6;    
  end loop;	  
  di:=0;
  i:=1;
  loop
      di:=di+to_number(substr(codigo,i,1));
      i:=i+2;
      exit when i > 7;    
  end loop;	  
  dc:=abs(mod(100-(dp+di*3),10));
  ccode8:=substr(to_char(dc),1,1);   
RETURN ccode8;
END PB_CEAN8;
/
show errors
exit


Función que genera el codigo para el ENA8:

CREATE OR REPLACE FUNCTION PB_EAN8 (codigo IN VARCHAR2)
RETURN VARCHAR2 IS
  codigoc   varchar2(8);
  i         number;
  d1        varchar2(1);
  code8     VARCHAR2(11);
BEGIN
    codigoc:=codigo||PB_CEAN8(codigo);
    code8:='*'||substr(codigoc,1,4)||'+';
    i:=5;
    loop
       d1:=substr(codigoc,i,1); 
       if d1='0' then code8:=code8||'ñ'; end if; -- ñ
       if d1='1' then code8:=code8||'a'; end if; -- a
       if d1='2' then code8:=code8||'s'; end if; -- s
       if d1='3' then code8:=code8||'d'; end if; -- d
       if d1='4' then code8:=code8||'f'; end if; -- f
       if d1='5' then code8:=code8||'g'; end if; -- g 
       if d1='6' then code8:=code8||'h'; end if; -- h
       if d1='7' then code8:=code8||'j'; end if; -- j
       if d1='8' then code8:=code8||'k'; end if; -- k
       if d1='9' then code8:=code8||'l'; end if; -- l
       i:=i+1;
       exit when i > 8;  
    end loop;   
    code8:=code8||'*';
    RETURN code8;
END PB_EAN8;
/
show errors
exit


Función de devuelve el codigo de control del EAN13:

CREATE OR REPLACE FUNCTION PB_CEAN13 (codigo IN VARCHAR2)
RETURN VARCHAR2 IS
  i  int;
  dp number;
  di number;
  dc number;
  ccode13 VARCHAR2(1);
BEGIN
  dp:=0;
  i:=2;
  loop
      dp:=dp+to_number(substr(codigo,i,1));
      i:=i+2;
      exit when i > 12;    
  end loop;	  
  di:=0;
  i:=1;
  loop
      di:=di+to_number(substr(codigo,i,1));
      i:=i+2;
      exit when i > 11;    
  end loop;
  dc:=abs(mod(100-(dp*3+di),10));
  ccode13:=substr(to_char(dc),1,1);      
RETURN ccode13;
END PB_CEAN13;
/
show errors
exit


Función que genera el codigo del ENA13:

CREATE OR REPLACE FUNCTION PB_EAN13 (codigo IN VARCHAR2)
RETURN VARCHAR2 IS

type tabla is varray(10) of varchar2(5);
L_tabla tabla :=tabla('11111','10100','10010','10001','01100','00110','00011','01010','01001','00101');

codigoc   varchar2(13);
d1        varchar2(1);
i         number; -- Indice Codigo
j         number; -- Indice tabla 
t         number; 
code13    VARCHAR2(16):=null;

BEGIN
    codigoc:=codigo||PB_CEAN13(codigo);
    d1:=substr(codigoc,1,1);
    if d1 = '0' then code13:=code13||'-';j:=1; end if;
    if d1 = '1' then code13:=code13||'z';j:=2; end if;
    if d1 = '2' then code13:=code13||'x';j:=3; end if;
    if d1 = '3' then code13:=code13||'c';j:=4; end if;
    if d1 = '4' then code13:=code13||'v';j:=5; end if;
    if d1 = '5' then code13:=code13||'b';j:=6; end if;
    if d1 = '6' then code13:=code13||'n';j:=7; end if;
    if d1 = '7' then code13:=code13||'m';j:=8; end if;
    if d1 = '8' then code13:=code13||',';j:=9; end if;
    if d1 = '9' then code13:=code13||'.';j:=10;end if;
    
    code13:=code13||'*'||substr(codigoc,2,1);
     
    for i in 3..7 loop
      d1:=substr(codigoc,i,1); -- Subtraemos digito del codigo del 3 al 7  	
      t:=i-2;
      if d1 = '0' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'p'; end if;end if; 
      if d1 = '1' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'q'; end if;end if;
      if d1 = '2' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'w'; end if;end if;
      if d1 = '3' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'e'; end if;end if;
      if d1 = '4' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'r'; end if;end if;
      if d1 = '5' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'t'; end if;end if;
      if d1 = '6' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'y'; end if;end if;
      if d1 = '7' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'u'; end if;end if;
      if d1 = '8' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'i'; end if;end if;
      if d1 = '9' then if substr(L_tabla(j),t,1) = '1' then code13:=code13||d1; else code13:=code13||'o'; end if;end if;	   	
    end loop;
  
    code13:=code13||'+';
   
    for i in 8..13 loop
      d1:=substr(codigoc,i,1);		
      if d1 = '0' then code13:=code13||'ñ';end if;
      if d1 = '1' then code13:=code13||'a';end if;
      if d1 = '2' then code13:=code13||'s';end if;
      if d1 = '3' then code13:=code13||'d';end if;
      if d1 = '4' then code13:=code13||'f';end if;
      if d1 = '5' then code13:=code13||'g';end if;
      if d1 = '6' then code13:=code13||'h';end if;
      if d1 = '7' then code13:=code13||'j';end if;
      if d1 = '8' then code13:=code13||'k';end if;
      if d1 = '9' then code13:=code13||'l';end if;
    end loop;
  
    code13:=code13||'*';
  
    RETURN code13;
END PB_EAN13;
/
show errors
exit

Compilamos las funciones en el esquema que queremos primero PB_CEAN13.sql y PB_CEAN8.sql ya que PB_EAN13.sql y PB_EAN8.sql llaman a las primeras.

bartola>$sqlplus esquema/password @PB_CEAN13.sql  
bartola>$sqlplus esquema/password @PB_CEAN8.sql
 
bartola>$sqlplus esquema/password @PB_EAN13.sql  
bartola>$sqlplus esquema/password @PB_EAN8.sql 

Comprobamos la funciones para EAN13 generamos el codigo '234567893456' y para ENA8 el '2357970' por Ejemplo:

bartola>sqlplus esquema/password
SQL> select PB_EAN13('234567893456') from dual;
 
PB_EAN13('234567893456')
---------------------------------------------
x*34ty7i+ldfghñ*
SQL> select PB_EAN8('2357970') from dual; 
PB_EAN8('2357970') 
--------------------------------
*2357+ljñg*   
SQL> select PB_CEAN13('000234568000') from dual;  
PB_CEAN13('000234568000') 
----------------------------------------------
8
SQL>select PB_CEAN8('2357970') from dual; 
PB_CEAN8('2357970')  
--------------------------------
5

Documeto Editado por Alfonso Somoza de la Fuente
E-Mail: somfueal@gmail.com

Página Principal