Visual FoxPro 9.0 incluye un nuevo tipo de datos llamado BLOB (Binary Large OBject). Este tipo de datos sirve para almacenar datos binarios de cualquier tipo y de longitud variable, como por ejemplo un archivo ejecutable, archivos de imágenes, cadenas de bytes, etc. El tipo de datos Blob es particularmente útil para almacenar imágenes desde un SQL Server.
En el siguiente ejemplo para Visual FoxPro 9, lo utilizaremos en un cursor con un campo tipo Blob, en el cual almacenaremos archivos de imágenes. Este ejemplo es solo ilustrativo e intenta simular un cursor que puede haber sido creado por una cláusula SELECT a una tabla de SQL Server, o bien por un comando XMLTOCURSOR() con datos recibidos de una fuente externa como un Servicio Web.
Conceptos previos
Estos son algunos conceptos que debemos tener en cuenta al utilizar el nuevo tipo de datos Blob:
- Los datos tipos Blob se pueden utilizar en contenedores de bases de datos, tablas libres, cursores y vistas.
- Puede haber múltiples campos de tipo Blob en una misma tabla.
- Los valores Blob se almacenan en un archivo Memo (.ftp).
- En los campos de tipo Blob no se realiza ninguna traducción del código de página.
- El límite de un campo Blob esta dado por la memoria disponible y/o por el límite de 2 GB en el tamaño del archivo.
- Se puede visualizar el contenido de un campo Blob con el control Cuadro de Edición (EditBox), Cuadro de Texto (TextBox) en una Cuadrícula (Grid) o con el comando MODIFY MEMO <CampoBlob>. En todos los casos los valores son de Solo Lectura.
- En los Cuadros de Edición, los valores Blob se muestran como valores hexadecimales sin el prefijo "0h".
- En las Cuadrículas, los valores Blob se muestran con la cadena "blob" si el campo está vacío, o con la cadena "Blob" si el campo contiene datos. Con un doble click en el campo de la cuadrícula se puede visualizar su contenido en una ventana de edición de solo lectura.
- No están soportadas las claves de índices sobre campos de tipo Blob.
En el formulario del ejemplo, en el método Init creamos un cursor Alumnos con un campo Blob en el que almacenaremos las imágenes que se encuentran en la carpeta Samples\Data\Graphics del directorio raíz de la instalación de Visual FoxPro 9.0. (Figura 1)
Figura 1: Imagenes de la carpeta "Samples\Data\Graphics\"
El formulario contiene un control Cuadrícula con todos los campos del cursor Alumnos, un control Cuadro de Edición con el contenido del campo Blob, y un control Imagen en el que configuramos la propiedad PictureVal (nueva en VFP 9.0) con el contenido del campo Blob cada vez que nos movemos de registro en el control Cuadrícula. (Figura 2)
Figura 2: Vista del formulario del ejemplo
Este formulario de ejemplo se puede descargar desde el siguiente enlace:blob.zip (2,87 KB)
A continuación se expone el código del formulario, para correrlo se debe copiar el código en un archivo .PRG y ejecutarlo desde Visual FoxPro 9.0.
PUBLIC oMiForm oMiForm = NEWOBJECT("MiForm") oMiForm.SHOW RETURN DEFINE CLASS MiForm AS FORM HEIGHT = 336 WIDTH = 728 DOCREATE = .T. AUTOCENTER = .T. CAPTION = "Ejemplo de un campo Blob" BINDCONTROLS = .F. NAME = "MiForm" ADD OBJECT edtFoto AS EDITBOX WITH ; COMMENT = "", ; HEIGHT = 216, ; LEFT = 296, ; TABINDEX = 2, ; TOP = 8, ; WIDTH = 216, ; CONTROLSOURCE = "Alumnos.Foto", ; NAME = "edtFoto" ADD OBJECT imgFoto AS IMAGE WITH ; STRETCH = 1, ; HEIGHT = 216, ; LEFT = 520, ; TOP = 8, ; WIDTH = 192, ; NAME = "imgFoto" ADD OBJECT grdAlumnos AS MiGrid ADD OBJECT lblgrid AS LABEL WITH ; WORDWRAP = .T., ; BACKSTYLE = 0, ; CAPTION = [Cursor con un campo Blob. Con "Doble Click" en el campo Blob ] +; [visualizamos el contenido en una ventana de edición de solo lectura.'], ; HEIGHT = 72, ; LEFT = 32, ; TOP = 232, ; WIDTH = 232, ; FORECOLOR = RGB(0,0,0), ; NAME = "lblGrid" ADD OBJECT lbleditbox AS LABEL WITH ; WORDWRAP = .T., ; BACKSTYLE = 0, ; CAPTION = [Cuadro de Edición de solo lectura con el contenido del campo Blob.], ; HEIGHT = 72, ; LEFT = 304, ; TOP = 232, ; WIDTH = 192, ; FORECOLOR = RGB(0,0,255), ; NAME = "lblEditBox" ADD OBJECT lblimage AS LABEL WITH ; WORDWRAP = .T., ; BACKSTYLE = 0, ; CAPTION = [Control Imagen con la propiedad PictureVal configurada con ] +; [el contenido del campo Blob.] , ; HEIGHT = 72, ; LEFT = 528, ; TOP = 232, ; WIDTH = 176, ; FORECOLOR = RGB(255,0,0), ; NAME = "lblImage" ADD OBJECT cmdmodifymemo AS COMMANDBUTTON WITH ; TOP = 304, ; LEFT = 48, ; HEIGHT = 24, ; WIDTH = 216, ; CAPTION = "MODIFY MEMO <CampoBlob>", ; NAME = "cmdModifyMemo" ADD OBJECT label1 AS LABEL WITH ; WORDWRAP = .T., ; BACKSTYLE = 0, ; CAPTION = "Botón con el cláusula MODIFY MEMO Alumnos.Foto", ; HEIGHT = 16, ; LEFT = 272, ; TOP = 310, ; WIDTH = 408, ; FORECOLOR = RGB(0,128,0), ; NAME = "Label1" PROCEDURE INIT LOCAL lcRuta, lcFoto, ln *-- Creo el cursor Alumnos CREATE CURSOR Alumnos (Numero i, Nombre c(10), Foto w) *-- Recorro las imágenes de SAMPLES\DATA\GRAPHICS lcRuta = HOME(2) + "DATA\GRAPHICS\" lcFoto = SYS(2000,lcRuta + "*.GIF") ln = 1 DO WHILE NOT EMPTY(lcFoto) INSERT INTO Alumnos (Numero, Nombre, Foto) ; VALUES (ln, JUSTSTEM(lcFoto), FILETOSTR(lcRuta + lcFoto)) lcFoto = SYS(2000, lcRuta + "*.GIF", 1) ln = ln + 1 ENDDO GO TOP IN Alumnos *-- Enlazo los controles THISFORM.BINDCONTROLS = .T. ENDPROC PROCEDURE grdAlumnos.AFTERROWCOLCHANGE LPARAMETERS nColIndex THISFORM.imgFoto.PICTUREVAL = Alumnos.Foto THISFORM.edtFoto.REFRESH ENDPROC PROCEDURE cmdmodifymemo.CLICK MODIFY MEMO Alumnos.Foto ENDPROC ENDDEFINE DEFINE CLASS MiGrid AS GRID COLUMNCOUNT = 3 DELETEMARK = .F. HEIGHT = 216 LEFT = 16 PANEL = 1 READONLY = .T. RECORDSOURCE = "Alumnos" RECORDSOURCETYPE = 1 SCROLLBARS = 2 TABINDEX = 1 TOP = 8 WIDTH = 272 HIGHLIGHTSTYLE = 2 NAME = "grdAlumnos" Column1.CONTROLSOURCE = "Alumnos.numero" Column1.WIDTH = 75 Column1.READONLY = .T. Column1.VISIBLE = .T. Column1.NAME = "Column1" Column2.CONTROLSOURCE = "Alumnos.Nombre" Column2.WIDTH = 111 Column2.READONLY = .T. Column2.VISIBLE = .T. Column2.NAME = "Column2" Column3.CONTROLSOURCE = "Alumnos.Foto" Column3.WIDTH = 53 Column3.READONLY = .T. Column3.NAME = "Column3" PROCEDURE INIT THIS.Column1.Header1.ALIGNMENT = 2 THIS.Column1.Header1.CAPTION = "Numero" THIS.Column1.Header1.NAME = "Header1" THIS.Column2.Header1.ALIGNMENT = 2 THIS.Column2.Header1.CAPTION = "Nombre" THIS.Column2.Header1.NAME = "Header1" THIS.Column3.Header1.ALIGNMENT = 2 THIS.Column3.Header1.CAPTION = "Blob" THIS.Column3.Header1.NAME = "Header1" ENDPROC ENDDEFINE
Comentarios
Como enunciamos al comienzo, esto es solo un simple ejemplo que ilustra una de las tantas utilidades que podemos darle a este nuevo tipo de datos en Visual FoxPro 9.0.
Hasta la próxima.
Luis María Guayán
Este comentario ha sido eliminado por el autor.
ResponderBorrarAmigo buen aporte. Pero en VFP 9 no se muestra la imagen. para solucionarlo hice esta corrección en la grilla:}
ResponderBorrarLPARAMETERS nColIndex
*THISFORM.imgFoto.PICTUREVAL = Alumnos.Foto
THISFORM.edtFoto.REFRESH
cImg_cadena = CAST(Alumnos.Foto as BLOB)
mFile = "D:\Descargas\blob\Foto.jpg"
STRTOFILE(cImg_cadena,mFile)
THISFORM.imgFoto.Picture = mFile
con eso ya muestra las imagenes