Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción
La arquitectura Cliente-Servidor parece ser muy simple en los ejemplos: cree una conexión, cree una vista remota hacia
los datos, y estará en el negocio, correcto? . En esta sesión, Ted se introducirá en la potencia detrás del GUI, con la
revisión de los comandos y funciones necesarias para crear un sistema Cliente-Servidor real. SQL Pass-throuhg, control
manual de transacciones, manipulación de propiedades en conexiones, vistas y cursores, procesamiento en lote,
precompilación y muchos otros temas que necesitará para la lucha con un sistema real a ser considerado.
Este pequeño documento no pretende ser una referencia completa hacia todo lo relacionado con Cliente-Servidor. En
vez de eso, su intención es de servir como una pequeña introducción hacia los conceptos y las técnicas usadas para
realizar una aplicación Cliente-Servidor con Visual FoxPro. Los lectores deberán estar familiarizados con Visual FoxPro y
con el uso del contenedor de Base de Datos de FoxPro (DBC) y las vistas trabajando con datos locales. Empezaremos
con algunas simples definiciones de los términos, revisaremos por qué deberías estar con Cliente-Servidor, y entonces
cavaremos en los comandos y funciones para hacerlo posible. Concluiremos con algunas discusiones acerca de técnicas
más avanzadas y cómo debería considerar la integración de Cliente-Servidor en su Framework.
¿Qué es Cliente-Servidor?
Hay una gran cantidad de definiciones acerca de qué es exactamente “Cliente-Servidor”, existen mas o menos
estudiantiles, mas o menos robustas. Un vendedor hace algunos años diría: ¿“Cliente-Servidor”?, bueno, eso es
cualquier cosa que debo vender ahora. Típicamente, para nuestros propósitos, el elemento clave de Cliente-Servidor es
que dos procesos separados van a ser ejecutados, uno con Visual FoxPro, y otro que proveerá datos a Visual FoxPro.
Estos dos programas pueden ser ejecutados tanto en la misma máquina como en forma separada, esto con algún tipo de
conexión entre ellos (red, puerto serial o Internet) para permitir la comunicación.
Conexiones
Una conexión usa porciones del Microsoft Open Dabatase Connectivity (ODBC) para establecer una conexión de dos
vías de comunicación entre Visual FoxPro y el servidor destino. Cada vendedor tiene su propio mecanismo para proveer,
instalar, configurar y soportar esos drivers. Una vez establecida, la conexión de FoxPro puede ser configurada. Hay cierta
confusión en la aplicación de la terminología VFP con respecto a conexiones. Cuando usted crea o modifica una
conexión usando su sintaxis correspondiente, está modificando la definición de una conexión, y no está afectando una
conexión existente. Las conexiones son almacenadas en el DBC y las definiciones son usadas cuando son llamadas. Las
conexiones FoxPro pueden ser definidas visualmente con el Database Container (DBC) o directamente desde el
Command Window con CREATE CONNECTION. Situación similar sucede con los equivalentes a los comandos
DELETE, MODIFY, RENAME y DISPLAY CONNECTION. Las conexiones pueden referirse a un ODBC Data Source
Name (DSN), definidas con el Applet “Panel de Control ODBC”, o se pueden especificar directamente los parámetros
equivalentes. Por código, la conexión podría lucir como el siguiente:
Finalmente, las conexiones no necesitan ser mantenidas en un DBC. Si el resto de el sistema está usando SQL Pass
Through, las conexiones pueden ser creadas al vuelo, usando las funciones SQLConnect() y SQLStringConnect():
** Abrir una conexión usando un DSN, UserID y PassWord
lnHandle = SQLConnect("mySQLServerDSN","SA","")
Vistas
Las Vistas Remotas no son muy diferentes a las vistas locales, pero hay un par de áreas que nos pueden preocupar. La
primera preocupación es sobre los tipos de datos almacenados en la base de datos remota pueden no compararse
exactamente con los tipos de Visual FoxPro. Por ejemplo, no hay concepto de tipo de datos Lógico o Booleano en el
esquema de Oracle. Esto puede ser fácilmente resuelto usando el Diálogo “Propiedades del Campo” y especificar el tipo
de datos deseado. Use esta opción para mapear campos DateTime a datos tipo Fecha. Los campos Fecha son poco
comunes en backends de base de datos, pero las funciones matemáticas de fechas de VFP están en días y las tipo
DateTime en segundos. Tenga cuidado de asegurarse que se usan las unidades de medida correctas. La segunda
preocupación es uso apropiado de conexiones. En el diseñador de Vistas, bajo las Opciones Avanzadas -> Menú
Opciones, en la sección “Query”, verá un checkbox etiquetado “Compartir Conexión” (“Share Connection” para la versión
en inglés). Por el simple hecho de que las vistas utilizan la misma conexión, no significa que cada uno intentará compartir
la conexión actual, por el contrario, cada vista creará su propia copia de la conexión definida a menos de que ese
checkbox esté marcado. Hay una configuración global equivalente, esta se encuentra en Herramientas/Opciones/Datos
Remotos, esto no hacía nada en VFP 3 y 5. Finalmente, en VFP 6, esta ocasionaba que la compartición de conexión
fuera seleccionada por default cuando estaba marcada. Vea “Vistas y Conexiones” mas adelante para una discusión
sobre los temas envueltos.
Al igual que las conexiones, las Vistas pueden ser definidas y manipuladas programáticamente, al igual que visualmente.
Hay algunas ventajas reales al definir las vistas programáticamente. Es fácil para todos el ver la definición de la vista. No
necesita meterse en problemas con el Diseñador de Vistas cuando las relaciones complejas no son visualizadas
correctamente. Finalmente, puede extender facilemente la naturaleza del meta-data del sistema para generar la Vista al
vuelo. Revise el GenDBC (incluido con Visual FoxPro en el directorio (HOME()+”Tools\GENDBC”) para algunas ideas al
extraer meta-data desde el DBC o usarlo para generar los comando requeridos para regenerar el DBC.
El comando CREATE VIEW crea una vista remota en el contenedor de base de datos actual. El formato de el comando
parece un poco extraño, debido a que el comando SQL SELECT contenido dentro del CREATE VIEW no está delimitado
de ningún modo – no se le establece comillas o paréntesis o algo. Este comando SQL SELECT describe como obtener
los datos para producir la Vista. Recuerde que Visual FoxPro no está dando los datos – una aplicación servidor lo hace.
Así,el SQL usado en el comando CREATE VIEW es el SQL y su extensiones nativas al server, no así a Visual FoxPro.
Esto significa que debería evitar “FoxProismos” o funciones integradas de FoxPro (TRIM(), STR(), VAL()), a menos de
que sepa que son soportadas por el server. Hay una excepción hablando del lenguaje materno del servidor, y esta
situación de pedirle al ODBC que traduzca algunas frase en el proceso. Recuerde que se está usando ODBC para
conectar Visual FoxPro al driver de base de datos correcto. ODBC también provee una API e incluye la habilidad para
traducir la requisición desde un SQL más genérico hacia uno entendible por el backend. Las funciones pedidas al ODBC
se desactivan del código SQL al poner llaves (símbolos { } ). Estos códigos pueden incluir peticiones para funciones
internas del ODBC, traducciones de ciertos datos en formatos fecha y tiempo, y hasta extensiones específicas
soportadas por algunos drivers. Revise la documentación de su driver ODBC llamando el Applet ODBC y selecionando
ayuda.
* Ejemplo de una vista definida por código:
Función Propósito
SQLTables() Retorna una lista de tablas o vistas para una
conexión específica. Útil para utilerías de “caja negra”
SQLColumns() Retorna especificaciones de campos en uno de varios
formatos, útil para comparar capacidades de VFP con
base de datos externas.
SQLConnect(), SQLStringConnect() Descritos anteriormente, son usados para establecer
una conexión con el servidor
SQLExec() Pasa comandos al server vía ODBC, estos serán
ejecutados.
SQLCommit(), SQLRollback() Provee la funcionalidad para completar o abortar una
transacción. La transacción debe ser empezada en
modo manual, utilizando SQLSetProp() descrita más
abajo.
SQLSetProp(), SQLGetProp() Lee y establece propiedades de una conexión
existente.
DBSetProp(), DBGetProp() Lee y establece propiedades de un Contenedor de
Base de Datos con respecto a vistas, conexiones,
tablas, etc. Estos son los únicos valores persistentes
entre sesiones.
CursorSetProp(), CursorGetProp() Establece o lee propiedades en un cursor abierto,
incluyendo el buffering.
Batch SQL: Múltiples estatutos SQL pueden ser enviados al servidor, con procesamiento contínuo en el cliente, y
ocasionalmente revisar el estatus del procesamiento.
Progressive Fetching: Muy conveniente cuando se descarga un conjunto de datos potencialmente grande, este método
retorna el control a FoxPro después de que una cantidad predeterminada de registros han sido devueltos, y
automáticamente obtiene registros adicionales en medida de que se vayan necesitando. Un ejemplo excelente sería un
Grid para tomar la lista de clientes, donde el operador podría especificar un criterio de búsqueda, y el cliente podría estar
listado si está dentro del criterio. El operador podría recorrer la página en la lista, y los registros adicionales podrían ser
obtenidos así sean necesitados.
Precompilación: La función SQLPREPARE() permite al servidor recibir una sentencia SQL a ejecutar, y realizar sus
funciones sobre ella – revisión, análisis, desarrollo del plan de trabajo, etc. - y entonces ejecutar la operación mucho más
rápido que cuando es llamado.
Entodos estos tres casos, estas funciones requerirán una conexión separada, ya que ellas “bloquearán la linea
telefónica” como fue mencionado anteriormente en la sección de Vistas y Conexiones. Sin embargo, estas funciones
proveen esta necesidad de conexión.
Conclusión Visual FoxPro provee excelentes herramientas para obtener un control completo de Cliente-Servidor, tanto
en variedad gráfica, como a través de la línea de comando. La tecnología Cliente-Servidor es apropiada para tamaños de
datos extremadamente grandes, para situaciones de seguridad de alto riesgo, y para ambientes con comunicaciones con
bajo ancho de banda desde el cliente al servidor. Además de que el Diseñador de Vistas y el Diseñador de Conexiones
pueden permitir un completo diseñado gráficamente, Visual FoxPro también provee las herramientas y funciones para
mezclar diseños programáticos y gráficos(o hasta basado en metatablas). Esta combinación hace fácil de aprender
combinando el poder en la implementación.
Acerca del Autor. Ted Roche es un Desarrollador Certificado por Microsoft y es el director de desarrollo en Blackstone
Incorporated, una compañía catalogada como Microsoft Certified Solution Provider en Waltham, Massachussets, USA,
donde el desarrolla aplicaciones complejas usando herramientas visuales y “BackOffice” de Microsoft. Él es un
contribuidor de seis libros de FoxPro, los últimos esfuerzos de Ted han sido como coautor de “Hacker's Guide to Visual
FoxPro 6.0” disponible en Hentzenwerke Publishing, así como también en librerías de prestigio. Ted ha dado mas de una
docena de conferencias profesionales en Canada, Europa y USA, ha sido coautor de “Advisor Answers” (Respuestas
Advisor), una columna para la revista FoxPro Advisor. Contacte a Ted vía telefónica (781) 663-7400, o vía email en
tedroche@compuserve.com
Derechos Reservados © 1999-2003 por Ted Roche bajo licencia Creative Commons Attribution - ShareAlike 1.0 - vea
http://creativecommons.org/licenses/by-sa/1.0/ para mas detalles