Hola invitado         02 Sep, 2010 - 04:43
Menú principal
 
Ads
 
Patrocinadores
 
Anuncios
 
© 2009 PortalFox
Códigos de barra Interleaved 2 de 5 en el portapapeles lecturas 18057
 Enviado por Luis María Guayán en Sábado, 29 Enero, 2005
Artículos Debido a que la Resolución General 1702 de la AFIP de Argentina establece la impresión de un código de barras Interleaved 2 de 5, muchos desarrolladores quieren cumplimentarla con una imagen BMP insertada en un informe. Aquí una forma de copiar la imagen desde un formulario de Visual FoxPro.

Códigos de barra Interleaved 2 de 5 en el portapapeles

Luis María Guayán Por Luis María Guayán, Tucumán, Argentina


A pesar de poder imprimir informes con códigos de barras Interleaved 2 de 5 con fuentes True Type como se mostró en los artículos de PortalFox "Codigos de barras en reportes de VFP" y "Resolución General 1702 de la AFIP (Argentina)" para cumplimentar la R.G.1702, son repetidas las preguntas en los foros de VFP de como poder "capturar" una imagen para poder insertarla, y que esta no pierda definición y se pueda imprimir y leer correctamente.

La forma "artesanal" en que podemos hacer esto con nuestro querido zorro es:

  • Ejecutar el código del programa de abajo (cambiar los parámetros envados al formulario de acuerdo a nuestras necesidades)
  • Capturar la imagen del formulario de nivel superior con la combinación de teclas [Alt]+[PrtScn] (ImprimePantalla)
  • Pegar la imagen del Portapapeles en un editor de imágenes (se puede usar Paint)
  • Recortar y quitar los bordes del formulario
  • Grabar la imagen en un archivo de tipo BitMaP (.BMP) (este formato es el mejor para que no pierdan definición las barras)
  • Insertar en el informe un control Image con la imagen del archivo .BMP guardado

El siguiente es el código en Visual FoxPro que "dibuja" el código de barras Interleaved 2 de 5 en un formulario y añade una Etiqueta con el texto codificado apto para la lectura humana.

* Parametros enviados al formulario:
*    1° Cadena a convertir a Interleaved 2 of 5
*    2° Tamaño del código [1..5]
*    3° Alto del código de barra [1..600]

LOCAL loForm
loForm = CREATEOBJECT("MiForm", "201688627180100011234567890123420051231", 2, 32)
loForm.SHOW
READ EVENTS
RETURN

DEFINE CLASS MiForm AS FORM
  cTexto = ""
  cI2of5 = ""
  nAlto = 32
  nTama = 1
  nBA = 2
  nBF = 1
  BACKCOLOR = RGB(255,255,255)
  WIDTH = 1600
  HEIGHT = 1200
  SHOWWINDOW = 2
  MINBUTTON = .F.
  MAXBUTTON = .F.
  CAPTION = "Presione [Alt]+[PrnScr]"
  DRAWMODE = 1
  DRAWSTYLE = 0
  DRAWWIDTH = 1

  PROCEDURE INIT(tcTexto, tnTama, tnAlto)
    THIS.cTexto = ALLTRIM(tcTexto)
    IF NOT EMPTY(CHRTRAN(THIS.cTexto, "0123456789", ""))
      MESSAGEBOX("Solo se permiten dígitos numéricos [0..9]",64,"Atención")
      RETURN .F.
    ENDIF
    IF NOT EMPTY(tnTama)
      THIS.nTama = INT(tnTama)
    ENDIF
    IF NOT EMPTY(tnAlto)
      THIS.nAlto = INT(tnAlto)
    ENDIF
    DO CASE
      CASE THIS.nTama = 1
        THIS.nBF = 1
        THIS.nBA = 2
      CASE THIS.nTama = 2
        THIS.nBF = 1
        THIS.nBA = 3
      CASE THIS.nTama = 3
        THIS.nBF = 2
        THIS.nBA = 4
      CASE THIS.nTama = 4
        THIS.nBF = 2
        THIS.nBA = 5
      CASE THIS.nTama = 5
        THIS.nBF = 3
        THIS.nBA = 6
    ENDCASE
    THIS.cI2of5 = THIS.StrToI2of5()
    THIS.Dibujar()
  ENDPROC

  PROCEDURE StrToI2of5
    LOCAL lcI2of5, lnLong, lnSuma, lnCont, lnI, lnAuxi
    lnLong = LEN(THIS.cTexto)
    lnSuma = 0
    lnCont = 1
    FOR lnI = lnLong TO 1 STEP -1
      lnSuma = lnSuma + VAL(SUBSTR(THIS.cTexto,lnI,1)) * ;
        IIF(MOD(lnCont,2) = 0,1,3)
      lnCont = lnCont + 1
    ENDFOR
    lnAuxi = MOD(lnSuma,10)
    lcI2of5 = THIS.cTexto + ALLTRIM(STR(IIF(lnAuxi = 0,0,10 - lnAuxi)))
    lnLong = LEN(lcI2of5)
    *--- La longitud debe ser par
    IF MOD(lnLong,2) # 0
      lcI2of5 = '0' + lcI2of5
    ENDIF
    RETURN lcI2of5
  ENDPROC

  PROCEDURE Dibujar
    LOCAL lnLong, lnLeft, lnTop, ;
      lcChar, lcStop, lcStart, lnI, lnJ, lnK
    lnLong = LEN(THIS.cI2of5)
    lnLeft = 10 * THIS.nBF
    lnTop = 10
    lnLH = lnLeft
    lcStart = "FFFF"
    lcStop = "AFF"
    lcStart = CHRTRAN(lcStart,"FA", STR(THIS.nBF,1) + STR(THIS.nBA,1))
    lcStop = CHRTRAN(lcStop,"FA", STR(THIS.nBF,1) + STR(THIS.nBA,1))
    *-- Dibujo el Start
    lcChar = lcStart
    FOR lnI = 1 TO LEN(lcChar)
      FOR lnJ = 1 TO VAL(SUBSTR(lcChar,lnI,1))
        IF MOD(lnI,2) # 0
          THIS.LINE(lnLeft,lnTop, lnLeft, lnTop + THIS.nAlto)
        ENDIF
        lnLeft = lnLeft + 1
      ENDFOR
    ENDFOR
    *-- Dibujo los datos
    FOR lnK = 1 TO lnLong STEP 2
      lcChar = THIS.Entrelazar(SUBS(THIS.cI2of5,lnK,2))
      FOR lnI = 1 TO LEN(lcChar)
        FOR lnJ = 1 TO VAL(SUBSTR(lcChar,lnI,1))
          IF MOD(lnI,2) # 0
            THIS.LINE(lnLeft,lnTop, lnLeft, lnTop + THIS.nAlto)
          ENDIF
          lnLeft = lnLeft + 1
        ENDFOR
      ENDFOR
    ENDFOR
    *-- Dibujo el Stop
    lcChar = lcStop
    FOR lnI = 1 TO LEN(lcChar)
      FOR lnJ = 1 TO VAL(SUBSTR(lcChar,lnI,1))
        IF MOD(lnI,2) # 0
          THIS.LINE(lnLeft,lnTop, lnLeft, lnTop + THIS.nAlto)
        ENDIF
        lnLeft = lnLeft + 1
      ENDFOR
    ENDFOR
    *-- Añado la lectura humana
    THIS.ADDOBJECT("lblLH","Label")
    WITH THIS.lblLH
      .BACKCOLOR = THIS.BACKCOLOR
      .CAPTION = THIS.cI2of5
      .LEFT = lnLH
      .WIDTH = lnLeft - lnLH
      .ALIGNMENT = 2 && Centro
      .HEIGHT = 12 * THIS.nBF
      .TOP =   lnTop + THIS.nAlto
      .FONTNAME = "Courier New" && "Arial"
      .FONTSIZE = 8 * THIS.nBF
      .FONTBOLD = THIS.nTama > 1
      .VISIBLE = .T.
    ENDWITH
    THIS.WIDTH = lnLeft + lnLH
    THIS.HEIGHT = 2 * lnTop + THIS.nAlto + 10 * THIS.nBF
    THIS.AUTOCENTER = .T.
  ENDPROC

  PROCEDURE Entrelazar(tcTexto)
    LOCAL lnI, lcRet, la[10]
    la[1]="FFAAF"
    la[2]="AFFFA"
    la[3]="FAFFA"
    la[4]="AAFFF"
    la[5]="FFAFA"
    la[6]="AFAFF"
    la[7]="FAAFF"
    la[8]="FFFAA"
    la[9]="AFFAF"
    la[10]="FAFAF"
    lcRet = ""
    FOR lnI = 1 TO 5
      lcRet = lcRet + SUBSTR(la[VAL(LEFT(tcTexto,1))+1],lnI,1) + ;
        SUBSTR(la[VAL(RIGHT(tcTexto,1))+1],lnI,1)
    ENDFOR
    lcRet = CHRTRAN(lcRet,"FA", STR(THIS.nBF,1) + STR(THIS.nBA,1))
    RETURN lcRet
  ENDPROC

  PROCEDURE DESTROY
    CLEAR EVENTS
  ENDPROC

ENDDEFINE

Estas son algunas imágenes capturadas con este ejemplo de código.


Imagen con los parámetros Tamaño=1 y Alto=32


Imagen con los parámetros Tamaño=2 y Alto=32


Imagen con los parámetros Tamaño=3 y Alto=40


Imagen con los parámetros Tamaño=4 y Alto=40

Este ejemplo no solo sirve para cumplimentar la R.G.1702 de la AFIP, sino también se puede utilizar para generar y capturar la imagen de cualquier código de barras Interleaved 2 de 5, solo se debe cambiar los parámetros que se envía al formulario en la línea:

goForm = CREATEOBJECT("MiForm", "201688627180100011234567890123420051231", 2, 32)

Hasta la próxima.

Luis María

 Versión imprimible  
Códigos de barra Interleaved 2 de 5 en el portapapeles | Entrar/Crear una cuenta | 2 Comentarios
Los comentarios son propiedad de sus respectivos autores.
No somos responsables de su contenido.

Re: Códigos de barra Interleaved 2 de 5 en el portapapeles


por jolumm en 23 Sep, 2009 - 08:27
(Información del usuario  | Enviar un mensaje 
Buenismo. Quisiera preguntar que modificaciones serian necesarias para utilizar las funciones ya comentadas en otro artículo :

* Codigo 39 : _StrTo39()
* Codigo 128-A : _StrTo128A()
* Codigo 128-B : _StrTo128B()
* Codigo 128-C : _StrTo128C()
* Codigo EAN-13 : _StrToEan13()
* Codigo EAN-8 : _StrToEan8()

Gracias y Un Saludo.

Re: Códigos de barra Interleaved 2 de 5 en el portapapeles


por rolomilman en 16 Nov, 2009 - 05:17
(Información del usuario  | Enviar un mensaje http://)
Me parece muy buena la solución. Te consulto sobre el siguiente inconveniente: cuando uso la fuente PF interleaved 2of5 y quiero imprimir por ejemplo en una impresora láser HP P1005 ó P1006, ocurre que las imprime al revés. Cómo puedo hacer para que aparezca el código de barras como imagen (ya que de esa manera parece que anda bien) en el informe. Te comento también que ese código de barras toma un número que es variable.
Desde ya, muchísimas gracias por todo lo que hacés por todos.
Rolando Milman




Todas las marcas y los logos utilizados en este sitio son propiedad de sus respectivos dueños.
Los artículos, noticias y comentarios son propiedad y responsabilidad de sus respectivos autores.
Copyright © 2000-2010 PortalFox. Todos los derechos reservados.