Ver Mensaje Individual
  #3  
Antiguo 16-10-2004
jostrix jostrix is offline
Miembro
 
Registrado: ago 2003
Posts: 21
Reputación: 0
jostrix Va por buen camino
Gracias por Responder (nueva duda)

Muchas gracias por responder mis dudas, cheque las paginas q me indicaste y estuve descargando unas demos, y pues buscando encontre el siguiente codigo q te desarrolla en EAN 8 y 13, tiene un errorcito al tratar con EAN 13, cuando el caluclo para el digito verificador es mayor q 100, pero q se resuelve con un nuevo mod de 10 sobre el resultado obtenido, (bueno eso creo, lo he hecho asi y no he tenido broncas por el momento)I
Código Delphi [-]
   unit EAN; 
   
   interface 
   
   uses 
     Windows, SysUtils, Forms, Dialogs, StdCtrls, ExtCtrls, Classes, Controls; 
   
   const 
   EAN_izqA : array[0..9] of PChar=('0001101','0011001','0010011','0111101','0100011',
  '0110001','0101111','0111011','0110111','0001011'); 
   EAN_izqB : array[0..9] of PChar=('0100111','0110011','0011011','0100001','0011101',
  '0111001','0000101','0010001','0001001','0010111'); 
   EAN_dcha : array[0..9] of PChar=('1110010','1100110','1101100','1000010','1011100',
  '1001110','1010000','1000100','1001000','1110100'); 
     CodificaIzq : array[0..9] of PChar=('AAAAA','ABABB','ABBAB','ABBBA','BAABB',
 'BBAAB','BBBAA','BABAB','BABBA','BBABA'); 
   
   type 
     TFCodigoBarras = class(TForm) 
       Label1: TLabel; 
       Edit1: TEdit; 
       Panel1: TPanel; 
       PaintBox1: TImage; 
       procedure Edit1KeyPress(Sender: TObject; var Key: Char); 
     private 
       { Private declarations } 
     public 
       { Public declarations } 
       // procedimiento que codifica el número en un nº binario 
       procedure Codifica(num : string); 
       // procedimiento para dibujar el cód. de barras a partir del nº binario 
       procedure Dibujar(matrix : string); 
       // procedimiento para validar-corregir los códigos 
       procedure EANCorrecto(var num : string); 
     end; 
   
   var 
     FCodigoBarras: TFCodigoBarras; 
   
   implementation 
   
   {$R *.DFM} 
   
   procedure TFCodigoBarras.EANCorrecto(var num : string); 
   var 
     i,N : byte; 
     sum : integer; 
     flag : byte; 
   begin 
     sum:=0; 
     N:=Length(num)-1; 
     for i:=1 to N do 
     begin 
       if (i mod 2)=0 then 
       begin 
         if N=12 then 
           sum:=sum+StrToInt(num[i])*3 
         else 
           sum:=sum+StrToInt(num[i]); 
       end 
       else 
       begin 
         if N=12 then 
           sum:=sum+StrToInt(num[i]) 
         else 
           sum:=sum+StrToInt(num[i])*3; 
       end; 
     end; 
     if sum>99 then 
       Flag:=10-(sum mod 100) 
     else 
       Flag:=10-(sum mod 10); 
     if Flag=10 then Flag:=0; 
     if not(StrToInt(num[N+1])=flag) then 
       num:=copy(num,1,length(num)-1)+IntToStr(Flag); 
   end; 
   
   procedure TFCodigoBarras.Codifica(num : string); 
   var 
     matrix : string; 
     i : integer; 
   begin 
     num:=Edit1.Text; 
     matrix:=''; 
     case Length(num) of 
     13: begin 
         EANCorrecto(num); 
         Edit1.Text:=num; 
         matrix:=matrix+'x0x'; // barra inicio 
         matrix:=matrix+EAN_izqA[StrToInt(num[2])]; 
         for i:=3 to 7 do 
           if CodificaIzq[StrToInt(num[1])][i-3]='A' then 
             matrix:=matrix+EAN_izqA[StrToInt(num[i])] 
           else 
             matrix:=matrix+EAN_izqB[StrToInt(num[i])]; 
         matrix:=matrix+'0x0x0'; // barra central 
         matrix:=matrix+EAN_dcha[StrToInt(num[8])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[9])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[10])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[11])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[12])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[13])]; 
         matrix:=matrix+'x0x'; // barra final 
         Dibujar(Matrix); 
       end; 
     8: begin 
         EANCorrecto(num); 
         Edit1.Text:=num; 
         matrix:=matrix+'x0x'; 
         matrix:=matrix+EAN_izqA[StrToInt(num[1])]; 
         matrix:=matrix+EAN_izqA[StrToInt(num[2])]; 
         matrix:=matrix+EAN_izqA[StrToInt(num[3])]; 
         matrix:=matrix+EAN_izqA[StrToInt(num[4])]; 
         matrix:=matrix+'0x0x0'; 
         matrix:=matrix+EAN_dcha[StrToInt(num[5])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[6])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[7])]; 
         matrix:=matrix+EAN_dcha[StrToInt(num[8])]; 
         matrix:=matrix+'x0x'; 
         Dibujar(Matrix); 
       end 
     else 
       ShowMessage('LONGITUD DE CODIGO NO VALIDA'); 
     end; 
   
   end; 
   
   procedure TFCodigoBarras.Dibujar(matrix : string); 
   var 
     i : integer; 
   begin 
     PaintBox1.Canvas.Brush.Color:=clWhite; 
     PaintBox1.Canvas.FillRect(Rect(0,0,PaintBox1.Width,PaintBox1.Height)); 
     PaintBox1.Canvas.Pen.Color:=clBlack; 
   
     for i:=1 to Length(Matrix) do 
       if matrix[i]='1' then 
         PaintBox1.Canvas.PolyLine([Point(10+i,10),Point(10+i,50)]) 
       else 
       if matrix[i]='x' then 
         PaintBox1.Canvas.PolyLine([Point(10+i,10),Point(10+i,55)]); 
   
     if Length(Edit1.Text)=13 then 
     begin 
         PaintBox1.Canvas.TextOut(3,50,Edit1.Text[1]); 
         PaintBox1.Canvas.TextOut(17,50,copy(Edit1.Text,2,6)); 
         PaintBox1.Canvas.TextOut(63,50,copy(Edit1.Text,8,6)); 
     end 
     else 
     if Length(Edit1.Text)=8 then 
     begin 
         PaintBox1.Canvas.TextOut(16,50,copy(Edit1.Text,1,4)); 
         PaintBox1.Canvas.TextOut(48,50,copy(Edit1.Text,5,4)); 
     end; 
   
     PaintBox1.Picture.SaveToFile('c:\windows\escritorio\BarCode\'+Edit1.Text+'.bmp'); 
   end; 
   
   procedure TFCodigoBarras.Edit1KeyPress(Sender: TObject; var Key: Char); 
   begin 
     if Key=#13 then 
     begin 
       Codifica(Edit1.Text); 
       Edit1.SelStart:=0; 
       Edit1.SelLength:=Length(Edit1.Text); 
     end; 
   end; 
   
   end.

Ahora mi duda es, tengo una tabla relacionada con mis clientes en donde la clave principal es la q quiero el codigo genere su codigo de barras, el problema es q quiero q el sistema genere automaticamente la clave, pense en utilizar un campo Auto_increment, la bronca es q con este numero no se prevee lo del digito verificador..., entonces pense en un campo auto_increment y a partir de ese calcular el digio verificador y su concatenacion q sea el resultado... Esto es correcto? o existe una forma mas sencilla de hacerlo? y por otra parte q es mejor usar EAN 8 o EAN13, y en dado caso por q numero es recomendable inicializar mi campo auto_increment

Última edición por marcoszorrilla fecha: 16-10-2004 a las 22:04:22. Razón: Añadir etiquetas
Responder Con Cita