2 de septiembre de 2005

Autocompletar en Cuadros de Textos de VFP 9.0

Introducción

Una nueva característica de Visual FoxPro 9.0 es que el control TextBox (Cuadro de Texto) tiene la funcionalidad de Autocompletar, que nos sugiere valores de una tabla, a medida que se introducen caracteres en él. Si se selecciona un valor de la lista desplegada, el cuadro de texto se completa y se actualiza la tabla que contiene los datos almacenados.

Esta nueva característica ya fue tratada en un artículo de Jorge Mota (Guatemala) publicado en PortalFox: "Usando Autocompletar en TextBoxs de VFP 9"

En este nuevo artículo veremos como podemos hacer para que Autocompletar nos sugiera valores de una tabla de nuestra aplicación.

Las nuevas propiedades

Visual FoxPro 9.0 incorporó tres nuevas propiedades al control TextBox para esta funcionalidad: AutoComplete, AutoCompSource y AutoCompTable.

Si la propiedad AutoComplete se configura con un valor distinto de cero (el valor cero indica que no está habilitado Autocompletar), a medida que se introducen caracteres, se sugieren valores con la exhibición de una lista desplegada. Esta lista muestra los valores que concuerden con los valores previamente almacenados. Según el valor que se configure esta propiedad, la lista se ordenará "Alfabéticamente", "El mas frecuentemente usado", "El mas recientemente usado" o "Personalizado", que se ordena descendentemente por el "peso" que se le da al valor mediante un algorítmo realizado por el usuario que modifique el campo Weight (Peso) de la tabla AutoComp. Los valores permitidos para esta propiedad son 0, 1, 2, 3 y 4.

La propiedad AutoCompSource almacena el nombre clave que se utilizará para buscar en la tabla AutoComp. Si se omite esta propiedad, el nombre del control será la clave de búsqueda en la tabla. Se puede lograr que varios controles del tipo TextBox, utilicen la misma lista, configurando esta propiedad con un valor igual en todos los controles.

La propiedad AutoCompTable especifica el nombre y la ruta de la tabla que almacena los datos usados por un control TextBox para sugerir los valores. El valor por omisión de esta propiedad es (HOME(7) + "autocomp.dbf"). Si la tabla no existe, VFP la creará automáticamente.
Nuestro caso

Para nuestro caso de que Autocompletar nos sugiera los valores de una tabla de nuestra aplicación, haremos hincapié en la propiedad AutoCompTable y la configuraremos con la ruta y nombre de una tabla que crearemos y poblaremos con los datos de nuestra tabla de acuerdo a la estructura y descripción de cada campo de la tabla AutoComp que es la siguiente:

CampoTipoDescripción
Source Caracter(20) Nombre de la fuente del control TextBox.
Data Caracter(254) Dato a mostrar.
Count Entero Número de veces que el dato fue seleccionado.
Weight Entero Especifica el valor a usar cuando AutoComplete esta configurado en 4.
Created DateTime Fecha y hora de creación del dato.
Updated DateTime Fecha y hora de la última modificación del dato.
User Memo Especifica información de usuario.

La tabla AutoComp esta indexada con la siguiente clave:
INDEX ON ;
  UPPER(SOURCE + LEFT(DATA,30)) + PADL(COUNT,8) ;
  TAG DATA FOR NOT DELETED()

El ejemplo

Para nuestro ejemplo tomaremos la tabla "Customers" de la base de datos "Northwind" que viene junto a los ejemplos de Visual FoxPro 9.0. Los campos que seleccionaremos e insertaremos en la tabla son "CompanyName", "ContactName", "City" y "Country".

Primeramente invocamos al método "CrearTablaAutoComp()" que crea la tabla "MiAutoComp.dbf" en el directorio de archivos temporales de Windows y la indexa.

Luego por cada control TextBox en los cuales queremos habilitar la funcionalidad de autocompletar, invocamos al método "InsertarReg()" que inserta en la tabla "lcDbfAuto", los datos de la tabla "lcDbfOrigen" y del nombre de campo y nombre de clave que pasamos como parámetros, mediante un "INSERT INTO ... FROM SELECT ..."; y configuramos las propiedades "AutoComplete", "AutoCompSource" y "AutoCompTable".

El siguiente código genera un formulario con cuatro cuadros de textos con las propiedades configuradas para que Autocompletar nos sugiera los valores de nuestra tabla "MiAutoComp".

PUBLIC goMiForm
goMiForm = CREATEOBJECT("MiForm")
goMiForm.SHOW(1)
RETURN

DEFINE CLASS MiForm AS FORM
  AUTOCENTER = .T.
  CAPTION = "Ejemplo de Autocompletar en TextBox"
  NAME = "MiForm"
  ADD OBJECT txtCompania AS TEXTBOX WITH ;
    HEIGHT = 24, ;
    LEFT = 84, ;
    TOP = 24, ;
    WIDTH = 264, ;
    NAME = "txtCompania"
  ADD OBJECT txtContacto AS TEXTBOX WITH ;
    HEIGHT = 24, ;
    LEFT = 84, ;
    TOP = 72, ;
    WIDTH = 264, ;
    NAME = "txtContacto"
  ADD OBJECT txtCiudad AS TEXTBOX WITH ;
    HEIGHT = 24, ;
    LEFT = 84, ;
    TOP = 120, ;
    WIDTH = 264, ;
    NAME = "txtCiudad"
  ADD OBJECT txtPais AS TEXTBOX WITH ;
    HEIGHT = 24, ;
    LEFT = 84, ;
    TOP = 168, ;
    WIDTH = 264, ;
    NAME = "txtPais"
  ADD OBJECT lblCompania AS LABEL WITH ;
    AUTOSIZE = .T., ;
    BACKSTYLE = 0, ;
    CAPTION = "Compañia", ;
    LEFT = 12, ;
    TOP = 28, ;
    NAME = "lblCompania"
  ADD OBJECT lblContacto AS LABEL WITH ;
    AUTOSIZE = .T., ;
    BACKSTYLE = 0, ;
    CAPTION = "Contacto", ;
    LEFT = 12, ;
    TOP = 76, ;
    NAME = "lblContacto"
  ADD OBJECT lblCiudad AS LABEL WITH ;
    AUTOSIZE = .T., ;
    BACKSTYLE = 0, ;
    CAPTION = "Ciudad", ;
    LEFT = 12, ;
    TOP = 124, ;
    NAME = "lblCiudad"
  ADD OBJECT lblPais AS LABEL WITH ;
    AUTOSIZE = .T., ;
    BACKSTYLE = 0, ;
    CAPTION = "País", ;
    LEFT = 12, ;
    TOP = 172, ;
    NAME = "lblPais"

  PROCEDURE INIT
    LOCAL lcDbfAuto, lcDbfOrigen
    *-- Ruta y nombre de la tabla AutoCompletar
    lcDbfAuto = ADDBS(SYS(2023)) + "MiAutoComp.dbf"
    *-- Creo la tabla AutoCompompletar
    THISFORM.CrearTablaAutoComp(lcDbfAuto)

    *-- Ruta y nombre de la tabla Origen
    lcDbfOrigen = ADDBS(HOME(2))+ "NorthWind\Customers.dbf"

    *-- Inserto los registros para cada campo
    *-- y configuro las propiedades de cada TextBox
    THISFORM.InsertarReg(lcDbfOrigen,lcDbfAuto,"AC_COMPANIA","CompanyName")
    THISFORM.txtCompania.AUTOCOMPLETE = 1
    THISFORM.txtCompania.AUTOCOMPSOURCE = "AC_COMPANIA"
    THISFORM.txtCompania.AUTOCOMPTABLE = lcDbfAuto

    THISFORM.InsertarReg(lcDbfOrigen,lcDbfAuto,"AC_CONTACTO","ContactName")
    THISFORM.txtContacto.AUTOCOMPLETE = 1
    THISFORM.txtContacto.AUTOCOMPSOURCE = "AC_CONTACTO"
    THISFORM.txtContacto.AUTOCOMPTABLE = lcDbfAuto

    THISFORM.InsertarReg(lcDbfOrigen,lcDbfAuto,"AC_CIUDAD","City")
    THISFORM.txtCiudad.AUTOCOMPLETE = 1
    THISFORM.txtCiudad.AUTOCOMPSOURCE = "AC_CIUDAD"
    THISFORM.txtCiudad.AUTOCOMPTABLE = lcDbfAuto

    THISFORM.InsertarReg(lcDbfOrigen, lcDbfAuto,"AC_PAIS","Country")
    THISFORM.txtPais.AUTOCOMPLETE = 1
    THISFORM.txtPais.AUTOCOMPSOURCE = "AC_PAIS"
    THISFORM.txtPais.AUTOCOMPTABLE = lcDbfAuto
  ENDPROC

  PROCEDURE CrearTablaAutoComp(tcDbfAuto)
    *-- Crea mi tabla Autocompletar
    SET SAFETY OFF
    CREATE TABLE (tcDbfAuto) FREE ;
      (SOURCE C(20), DATA C(254), COUNT I, Weight I, ;
      Created T, UPDATED T, USER M)
    *-- Indexo la tabla
    INDEX ON UPPER(SOURCE + LEFT(DATA,30)) + PADL(COUNT,8) ;
      TAG DATA FOR NOT DELETED()
    *-- Cierro tabla
    USE IN SELECT(JUSTSTEM(tcDbfAuto))
  ENDPROC

  PROCEDURE InsertarReg(tcDbfOrigen, tcDbfAuto, tcSource, tcData)
    *-- Inserto los registros a la tabla Autocompletar
    INSERT INTO (tcDbfAuto) ;
      SELECT DISTINCT UPPER(tcSource) AS SOURCE, ;
      EVALUATE(tcData) AS DATA, 0 AS COUNT, 0 AS Weight, ;
      DATETIME() AS Created, DATETIME() AS UPDATED, .F. AS USER ;
      FROM (tcDbfOrigen)
    *-- Cierro tablas
    USE IN SELECT(JUSTSTEM(tcDbfAuto))
    USE IN SELECT(JUSTSTEM(tcDbfOrigen))
  ENDPROC
ENDDEFINE

Si ejecutamos el código e introducimos valores en los cuadros de textos, se mostraran las listas con los valores sugeridos como se observa en la siguiente imagen:



El número de items mostrados en la lista desplegable por defecto es 15. Se puede configurar este número con la siguiente función:

SYS(2910,nValor) && nValor = [5..200]

Conclusiones

Este ejemplo es solo para mostrar como podemos sugerir valores en un cuadro de texto en Visual FoxPro 9.0. Queda en nosotros saber si conviene o no utilizar esta técnica con el control TextBox o elegir otro tipo de control como un ComboBox o ListBox.

Hasta la próxima.

Luis María Guayán

No hay comentarios. :

Publicar un comentario