Visual FoxPro e Internet

Por Whil Hentzen
© Copyrights 1996 by FoxPress, All rights reserved
FoxPress, Diciembre 1996

Introducción

En esta sesión aprenderemos como usar Visual FoxPro para automatizar el mantenimiento de páginas Web y cómo permitir que los usuarios hagan consultas a través de la Web.

Para que una página Web tenga éxito su contenido ha de ser regularmente actualizado. Sin embargo esta tarea puede ser algo tedioso y verdaderamente cansado. Por eso es interesante disponer de herramientas que actualicen periódica-mente el contenido de las páginas Web para facilitar la tarea de los usuarios. De esta forma el contenido se mantendría fresco e interesante responsabili-zando a VFP de la labor de generar nuevas páginas HTML. Veremos cómo construir una página Web y el fuente de un programa en Visual FoxPro que actualiza una página Web desde una base de datos.

El otro tema que con frecuencia preocupa a los desarrolladores de Visual FoxPro es ver la forma de publicar contenidos a través de la red y que estos contenidos estén accesibles a un amplio número de usuarios. A diferencia de la primera cuestión, el propósito aquí es permitir que los usuarios entren criterios determinados en una página Web para seleccionar un subconjunto de datos desde una Base de Datos y mostrar el resultado de la búsqueda. La ventaja es que los datos y el mantenimiento de la aplicación se mantienen en un lugar centralizado pero los datos y el motor que facilita el acceso a los datos está accesibles a todos siempre y cuando tengan los permisos apropiados. Aprenderemos como crear una página Web con una variedad de controles que se puedan usar para introducir criterios y enviar los criterios de consulta a la aplicación Visual FoxPro que interpretará la petición de los datos y establecerá la forma de presentar los datos para ser vistos por el usuario.

¿Por qué interesa Internet?

Internet tendrá un gran impacto en la forma en que haremos nuestros futuros desarrollos. Las herramientas no están aquí todavía y la forma de desarrollar tradicional no ha finalizado, pero sus días están contados.

Conceptos Básicos de Internet

Internet es un conjunto de redes TCP/IP. TCP/IP es un protocolo que permite a los ordenadores hablar entre sí y se usa bastante en el mundo. Viene con Windows 95 y Windows NT, y se puede descargar y usar con Windows 3.1.

Cada una de estas redes tiene uno o más ordenadores en ella, y cada ordenador tiene una dirección IP. Una dirección IP tiene la forma de cuatro números separados por puntos -tal como 123.101.099.215. Ya que estas direcciones son dificiles de recordar, una dirección, IP puede ser reconvertida en un nombre de dominio como microsoft.com o hentzenwerke.com. El mecanismo que reconvierte una dirección IP en un dominio se llama Domain Name Server (DNS).

Un uso común de Internet es para guardar archivos que puedan ser visualizados con un tipo de software que llamamos browser. Estos archivos se llaman páginas Web, y Netscape e Internet Explorer son dos de los más populares browsers. Estas herramientas interpretan los datos que se encuentran en los archivos y muestran los datos con un formato especial, de la misma manera que las órdenes de FoxPro muestran los datos contenidos en archivos .DBF como una hoja de cálculo que se compone de filas y columnas. Los browsers que existen actualmente tienen capacidades limitadas y pueden mostrar texto e imágenes en diversos formatos y permiten algunas posibilidades básicas para que el usuarios pueda interactuar. Pero de ningún modo todavía las posibilidades interactivas a las que estamos acostumbrados con las versiones actuales de FoxPro.

Las páginas Web se pueden hospedar en cualquier ordenador de Internet, pero ese ordenador debe tener un tipo de software llamado Web server en orden a "servir" las páginas Web a otros ordenadores que les realicen peticiones a ellos. Los páquetes más normales de Servidores de Web incluyen el Microsoft's Internet Information Server (IIS) y el Commerce Builder de Internet Factory.

Ya que uno de los elementos más atractivos de los servidores de páginas Web (el ordenador de hospeda las páginas Web) es la posibilidad de que las páginas puedan ser linkadas mediante el uso de enlaces de hipertexto, un ordenador puede tener docenas, cientos o muchas más páginas Web en él. El software servidor de páginas Web tiene unas especificaciones que indican qué página Web en el ordenador es la página Web por defecto, o qué página Web debe ser inicialmente cargada cuando un usuario accede al ordenador, algo similar al startup de una aplicación en FoxPro o a un archivo AUTOEXEC.BAT de un PC basado en DOS.

El formato HTML

La discusión anterior asume la existencia de unos archivos llamados "páginas web" que presumiblemente contienen textos e imágenes. Discutiremos el aspecto de estas páginas Web en unos minutos.

Estas páginas se denominan con frecuencia páginas HTML, ya que el lenguaje usado para describir el código especial y sus ordenes se llama HyperText Markup Language (HTML). Un ejemplo de una simple página HTML tendría un aspecto parecido a lo siguiente si se visualiza en un editor de texto:

<HTML>

<HEAD>

<TITLE>Esto es un título</TITLE>

</HEAD>

<H1><FONT COLOR="BLUE">Esto es una cabecera </FONT></H1>

<BODY>Esto es el cuerpo del texto</BODY>

</HTML>

Vemos que esto se parece mucho a un documento WordPerfect con una serie de Reveal Codes puestos.

Hay una gran cantidad de órdenes que permiten especificar la forma de situar los objetos, su apariencia, su texto, las imágenes y controles interactivos en esa página. Sin embargo, recordemos que la premisa fundamental de una página HTML es que es estática; cualquier interacción con la página requiere un refresco de la página, a diferencia de otras aplicaciones como Visual FoxPro, donde el refresco se puede hacer pulsando un simple botón.

Este código incluye una imagen:

<IMG SRC="sample.gif" WIDTH="100" HEIGHT="125" ALIGN="MIDDLE" ALT="Programming VFP" BORDER="0">

Esta "ancla" (Anchor) un enlace de hipertexto:

<A HREF="sample2.html">This is a hypertext link</A>

Pueden incluirse controles simples (text boxes, radio buttons, command buttons):

<FORM METHOD="POST" ACTION="http://hentzenwerke.com/cgi-win/wwcgi.dll?getart">

<B>Author:</B>

<INPUT TYPE="TEXT" NAME="Author" SIZE="20">

<BR>

<B>Keywords:</B>

<INPUT TYPE="RADIO" NAME="allorany" VALUE="all" CHECKED>

All

<INPUT TYPE="RADIO" NAME="allorany" VALUE="any">

Any

<INPUT TYPE="SUBMIT" NAME="SubmitButton" VALUE="Search for these articles">

<BR>

<INPUT TYPE="RESET" NAME="SubmitButton" VALUE="Search for these articles">

Otros tipos de objetos que se incluyen en una página Web pueden ser tablas y controles ActiveX.

Construcción Automatizada de Páginas Web

Hace no mucho tiempo, era muy común oir afirmaciones como "Esta página Web ha sido generada por Visual FoxPro" y alguna que otra afirmación como "Cualquier tecnología lo suficientemente avanzada no se distingue de la magia". Bien, en realidad no es algo tan dificil como parece.

Para que una página Web sea exitosa tiene que tener un contenido que debe ser periódicamente actualizado. Como hemos visto no es difícil modificar el archivo HTML que construye páginas Web. Sin embargo, si bien no es difícil, tampoco es interesante. Y esta es una de las razones fundamentales para las aplicaciones de Bases de Datos que nos permitan automatizar las tareas pesadas y repetitivas de forma que las tareas intelectuales se queden para nosotros los humanos. Relacionar una Base de Datos con un Web tiene que ser algo natural

WHATSNEW.DBF

nOrder mDate mDe

-2 Memo Memo

-1 Memo Memo

1 Memo Memo

2 Memo Memo

etc.

El campo mDate contiene la cadena de texto para la fecha (tal como Noviembre 15, 1996) y el campo mDe contiene la descripción de what´s new en esa fecha. El campo nOrder se usa para poner los registros en el orden propio (por fecha), para evitar tener que describir el contenido del campo mDate.

En esta tabla existe un truco. Ya que los datos mostrados en la página deberán tener una serie de códigos especiales, parece lógico guardar esa serie de códigos especiales en un lugar centralizado de forma que puedan ser fácilmente mantenidos. El registro con nOrder igual a -1 contiene los códigos de construcción de principio para cada campo y el registro con nOrder igual a -2 contiene los códigos que se deben poner al final de cada campo.

El programa de Visual FoxPro es algo retorcido. El programa, que se muestra a continuación en sus aspectos más esenciales, tiene el siguiente aspecto:

* CREAWHAT.PRG

*

* Crea una tabla temporal para el proceso

* intermedio

*

create table JUNK (mMAINDEF m, mHISTDEF m)

insert into JUNK (mMainDef) values ("")

*

* Coloca el esqueleto de los ficheros HTML

* en campos memo para su manipulación

*

append memo mMainDef from MAINDEF.HTML

append memo mHistDef from HISTDEF.HTML

*

* Crea variables de memoria que contienen

* esos bloques de texto

*

scatter memo memvar

*

* Carga los códigos de formato para cada

* bloque de texto

*

select mDate, mDe from WHATSNEW ;

where nOrder < 0 ;

order by nOrder descending ;

into array aCode

*

* Colocamos en la página sólo los cinco

* eventos más recientes. El resto va a una

* página enlazada llamada History

*

select mDate, mDe from WHATSNEW ;

where recno() > recc() - 5 ;

order by nOrder descending ;

into array aLastFive

*

* Crea una cadena de texto que consiste en

* los códigos de formato e la cinco

* entradas más recientes

*

m.lcMain = ""

for I = 1 to 5

m.lcMain = m.lcMain ;

+ aCode[1,1] + aLastFive[I,1] + aCode[1,2] ;

+ aCode[2,1] + aLastFive[I,2] + aCode[2,2]

endfor

*

* Ahora incluimos la nueva cadena creada en

* la variable de memoria de base de la

* página HTML

*

m.lcWorkerMain = m.mMainDef

m.lcWorkerMain = strtran(m.lcWorkerMain, "whatsnewlist", m.lcMain)

m.lcWorkerMain = strtran(m.lcWorkerMain, "//date//", dtoc(date()))

*

* (El mismo proceso para la página History)

* Crea una tabla que rellenamos con datos

* de variables de memoria (los avances de

* línea son un incordio)

*

create table JUNK (mMainOut m, mHistOut m)

insert into JUNK (mMainOut, mHistOut) values (m.lcWorkerMain, m.lcWorkerHist)

*

* Crea variables de memoria para los

* nombres de los ficheros HTML

*

m.cNaFiMain = "main.html"

m.cNaFiHist = "history.html"

*

*Finalmente, crea los ficheros HTML

*

copy memo mMainOut to &cNaFiMain

copy memo mHistOut to &cNaFiHist

(Este programa muestra los pasos esenciales. No hay captura de errores para hacer que el código sea fácil de seguir y de entender.)

Publicación de los datos de la Base de Datos

Dada la facilidad con que el contenido de una Base de Datos puede ser puesta en formato HTML, sólo tiene sentido ir al paso siguiente y permitir al usuario que especifique el contenido que quiere ver. El escenario básico es crear una plantilla de página Web que permita al usuario introducir información que pueda ser interpretada como el criterio de búsqueda a usar en una consulta contra una Base de Datos, enviar la información que el usuario ha introducido a una aplicación, ejecutar la aplicación VFP (que generalmente toma la forma de una consulta que devuelve el conjunto de resultados), y a continuación transformar el conjunto de resultados en formato HTML y presentar la página final al usuario. Demos un vistazo a este proceso con más detalle.

Una página Web puede contener ciertos controles con los que el usuario puede interactuar. Estos incluyen muchos de los controles con los que nosotros estamos familiarizados. Se incluyen controles de entrada de datos como cajas de texto, botones de opciones, casillas de verificación, listas combinadas y cajas de listas, y la acción se controla con otros controles como los botones de comandos.

La página tiene un "método" pegado a ella que se ejecuta cuando el usuario inicia una acción. En este caso, es al pulsar el botón de comandos cuando se envía la petición realizada. El destino último de la petición es una aplicación de Visual FoxPro que aceptará y procesará los datos que el usuario ha introducido y de los que espera que se le devuelvan otra serie de datos.

Veamos qué sucede cuando los datos se piden de esta forma.

Todas las peticiones de un usuario comienzan fuera de una página HTML ya sea como un hypertext link o una acción dada por un command desde un formulario de entrada. En nuestro caso, usaremos la última. El formulario de entrada contiene el nombre de un programa que debe ser ejecutado. Este programa podría ser una aplicación de Visual FoxPro, pero en la práctica, esto sería una terrible elección. Una aplicación VFP es grande, y le cuesta bastante tiempo ser cargada, y cada petición desde una página Web haría que la aplicación fuese recargada. Imaginemos que tuviéramos que recargar la aplicación cada vez que el usuario guarda un dato o se mueve hacia otro registro!

Una forma mejor sería cargar VFP y dejarlo en memoria esperando las peticiones. Entonces usamos una aplicación conectora que envie los datos a VFP desde la página HTML. El programa en el formulario de entrada -algunos lo llaman script- es un EXE o una DLL que hace una referencia a la aplicación conectora.

En este ejemplo el conector es wwcgi.dll.

<FORM METHOD="POST" ACTION="http://hentzenwerke.com/cgi-win/wwcgi.dll?getart">

Este script ejecuta y devuelve una página HTML que debe ser completada. Los items después del "?" son parámetros que se pueden pasar a un programa VFP. Esta aplicación conectora, wwcgi, es normalmente escrita en C, y usa un entorno de alta velocidad y bajos requerimientos de recursos en la parte del servidor. La aplicación conectora pueden ser archivos EXE que usan CGI (el protocolo estándar de Internet que describe cómo se deben manejar los datos de entrada y de salida) o procesar las DLLs que son cargadas por el Web server.

Hay gran un número de estas aplicaciones conectoras. La que estamos mostrando, WWCGI, viene con el paquete shareware de West Wind Web Connection.

Una vez que el control ha pasado desde la aplicación conectora a la aplicación Visual FoxPro, VFP obtendría información del Web server.

Mirando esta situación desde el otro lado, VFP está corriendo y facilitando el entorno para las peticiones CGI que se envian desde la aplicación conectora. Con Web Connection, el programa CGIMAIN.PRG está corriendo y esperando.

* CGIMAIN.PRG

* Ejemplo de código

set proc to CGIServ

*

* Arranca el server y crea un objeto que

* contiene métodos para manejar las

* peticiones CGI

*

oCGIServer = CREATE("wwCGIServer",; "Process")

*

* Establece el modo de diálogo y muestra

* una ventana de status. Esta es

* simplemente un timer que da una vuelta

* cada vez en un oCGIServer.show()

Cuando se llama a WWCGI.DLL (pulsando el botón "Enviar" del formulario), se construye la petición de forma que el objeto wwCGIServer pueda verlo y procesarlo. La función "Process" es llamada desde dentro de la aplicación VFP por un método del objeto oCGIServer cuando se recibe una petición.

*****************************************

FUNCTION PROCESS.PRG

* Objeto que contiene información del CGI

* (la petición)

lparameters loCGI

*

* Ejecuta mi propio programa específico

* (do my own specific query program (GET

* ARTicles) y pasa el objeto (referenciado

* como parámetro)

*

do GETART with loCGI

return

El programa GETART es el único fragmento de código requerido y es el motor del sistema. Es el que trae los datos desde las tablas y usa los métodos del objeto wwCGI para preparar y formatear los resultados para la presentación en un browser via HTML. De nuevo, como en los ejemplos anteriores en este documento, está el código básico para entender el proceso mostrado.

* GETART.PRG

* Rutina para recuperar datos de tablas

* Recoge variables de memoria de la página

* HTML en las que el usuario introduce

* datos

*

m.lcAuthor = loCGI.GetFormVar("Autor")

m.lcKeyw = loCGI.GetFormVar("Clave")

* etc.

decl laPubs[1]

m.lnCount=loCGI.GetFormMultiple(@laPubs)

*

* Se usan estas variables para saber

* cuántos registros serán encontrados

*

select count(*) from TUFR_BI ;

where m.lcAuthor $ cAuthor ;

into array aHowMany

*

* Si el número de registros es demasiado

* grande para ser mostrado, informar al

* usuario y volver

*

if aHowMany[1] > 50

loHTML.SendLn("Demasiados artículos.; Ajuste la búsqueda e inténtelo de ;

nuevo.")

else

select cTitle as "Title", cAuthor as ;

"Autor", cPub as "Publicación", ;

dDate as "Pub_Date", mDesc as

"Descripción" ;

from TUFR_BI ;

where m.lcAuthor $ cAuthor ;

into curs csrArts

*

* Muestra los resultados

*

loHTML.ShowCursor()

endif

*

* Indica al usuario qué parámetros han

* sido introducidos inicialmente

*

loHTML.SendPar()

loTHML.SendLn("Autor solicitado: " + ; m.lcAuthor+"<BR>")

loTHML.SendLn("Clave: " + m.lcKeyw+"<BR>")

* etc.

return .t.

Ahora que VFP tiene los parámetros con los que ejecutar la consulta, la realiza, y crea un conjunto de resultados para devolver. El servidor obtiene la página y la devuelve al browser del usuario.

Este ejemplo usa el Web Connection de Rick Strahl como ejemplo de una herramienta que proporciona:

  1. un mecanismo para llamar a una aplicación VFP desde una página (wwcgi.dll)
  2. un entorno para obtener datos desde una página Web a una aplicación Fox, y
  3. un mecanismo para construir y devolver un conjunto de resultados al servidor Web. ¿Por qué escribir uno propio cuando podemos tomar ventaja del trabajo que otros predecesores han realizado?

La tecnología mostrada en esta presentación es lo suficientemente robusta y viable como para ser usada hoy día. Se están introduciendo tecnologías nuevas que están extendiendo la capacidad de Internet de ser realmente un servidor de aplicaciones read/write y los pioneros de hoy serán los lideres del mañana. Hoy es un momento apropiado para incorporarse al uso de Internet como otra plataforma para tratar los sistema de información que has estado construyendo.

WHIL HENTZEN es editor de nuestra colega FoxTalk. Ha escrito varios libros sobre FoxPro y dirige una consultora independiente, Hentzelwerke Corporation.