24 de enero de 2005

El nuevo tipo de datos BLOB en VFP 9.0

Introducción

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.
El formulario de ejemplo

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

2 comentarios :

  1. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  2. Amigo buen aporte. Pero en VFP 9 no se muestra la imagen. para solucionarlo hice esta corrección en la grilla:}
    LPARAMETERS 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

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.