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 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
|