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