Tu primera aplicación
Web con VFP (y IV)
© Por Hector
Correa Vision Data Solutions, Inc.
El código para Employee_Edit.ASP es también bastante
simple. Devuelve el ID del Empleado y llama a nuestra clase VFP para crear el
formulario HTML.
<%
set oEmployee = Server.CreateObject(
"employee.employee" )
dim cEmployeeID
cEmployeeID = Request.QueryString(
"id" )
%>
<%=oEmployee.Edit( cEmployeeID )
%>
<%set oEmployee = nothing%>
Finalmente, Employee_Save.ASP es muy similar a el
código que hemos usado en Customer_Save.ASP. Incluso en este caso estamos
usando nuestro Servidor VFP COM para procesar el update en vez de usar ADO.
dim cFieldList
cFieldList = "first_name = '" & Request.Form(
"txtEmpFirstName" ) &"', "&_
"last_name = '" & Request.Form(
"txtEmpLastName" ) & "', "&_
"title = '" & Request.Form(
"txtEmpTitle" ) & "' "
dim cEmployeeID
cEmployeeID = Request.Form(
"txtEmpID" )
set oEmployee = Server.CreateObject(
"employee.employee" )
oEmployee.Update cFieldList, cEmployeeID
Como puedes ver la cantidad de código requerido en
nuestra página se ha reducido
considerablemente. Ten en cuenta que este código no ha cambiado
sustancialmente, lo único que se ha hecho es moverlo a una clase. VFP es un
lenguaje más proderoso y robusto que VB Script (o Jscript). Además de eso, eres
un desarrollador de VFP y sabes cómo programar en VFP. Usando VFP COM Server la
cantidad de VB Script y Jscript que necesitas aprender se reduce dramáticamente. Sin duda, usarás
VFP para dotar de potencia a tus páginas Internet J
Hay un problema cuando usas VFP COM Servers dentro de
las Active Server Pages. Una vez que un COM Server (como por ejemplo
Employee.DLL) se ha instanciado dentro de una ASP, el Internet Information
Server (IIS) bloqueará esta DLL en memoria para mejorar el rendimiento en
futuras llamadasfuture calls. Sin embargo, una vez que una DLL ha sido
bloqueada en memoria no puedes
reemplazarla con una versión más nueva.
Para poder reemplazarla, necesitas cerrar temporalmente el IIS y
reiniciarlo de nuevo. En un entorno de producción esto suele ser inaceptable ya
que basicamente significa cerrar la tienda por unos segundos. Esto no es un
problema específico de VFP, sucede también con todas las DLLs instanciadas via
ASP, independientemente del lenguaje en el que sean desarrolladas.
Afortunadamente, los desarrolladores de VFP tienen
una forma de evitar este problema. El siguiente ejemplo lo demuestra.
Archivos de Ejemplo: Proxy.ASP, Proxy.PRG, MyProgram.PRG, MyOtherProgram.PRG and Proxy.PJX
Descripción:
Una normal
aproximación cuando se trabajacon ASP y Fox es crear una clase en VFP que
actuará como proxy entre ASP y tus archivos de programa en VFP. Esta clase proxy no tendrá de por sí mucha
funcionalidad; meramente recibirá el nombre de la función que quieres ejecutar
y el nombre del archivo donde esta función reside. A continuación hay un
ejemplo:
DEFINE CLASS Proxy AS SESSION OLEPUBLIC
FUNCTION
Do( cCommand, cProgramFile )
IF
'.PRG' $ UPPER( cProgramFile )
SET
PROCEDURE TO &cProgramFile
ENDIF
xRetVal
= &cCommand
*
Clear the PRG from memory so
*
we can replace it later on.
SET
PROCEDURE TO
CLEAR
PROGRAM &ProgramFile
RETURN
xRetVal
FUNCTION
Init()
SET
RESOURCE OFF
SET
EXCLUSIVE OFF
SET
CPDIALOG OFF
SET
DELETED ON
SET
SAFETY OFF
RETURN
DODEFAULT()
enddefine
Para usar esta clase, justo necesitas compilar el
Servidor COM ejecutando la siguiente instrucción desde la ventana de comandos
de VFP:
BUILD
MTDLL proxy.dll FROM proxy
El archivo Proxy.ASP hace uso de este VFP COM Server.
Este archivo crea una instancia de nuestra clase proxy VFP y hace un grupo de
llamadas para invocar las funciones de VFP [como DateTime()] y algunas
funciones propias [como About() y FindOldestEmployee()] incluidas en arthivos
de programa diferentes.
<%set oVfpProxy = Server.CreateObject(
"proxy.proxy" ) %>
<%=oVfpProxy.Do( "DATETIME()" )
%>
<%=oVfpProxy.Do( "About()",
"c:\glgdw_web\myprogram.prg" ) %>
<%=oVfpProxy.Do(
"FindOldestEmployee()", "c:\glgdw_web\myotherprg.prg" )
%>
<% set oVfpProxy = nothing %>
Lo bueno
sobre esta clase es que una vez creada es que nunca necesitarás reemplazarla de
nuevo y de esta forma no entrarás en la problemática del bloqueo de la DLL
dentro del IIS. Además, ya que tu funcionalidad no está embebida dentro de la
DLL, pero está distribuida en un programa separado (PRGs), puedes reemplazarla
cuando quieras sin tener que tocar el IIS!
Este concepto es extremadamente poderoso y es único a
VFP ya que otros lenguajes tienen que meter los programas compilados dentro del
propio programa. Muchas de las utilidades de terceras partes para VFP hacen uso
de esta funcionalidad.
Archivos de Código: FatClient.SCX, EmployeeFat.PRG, Employee_List_Fat.ASP and Employee_Save_Fat.ASP
Descripción:
Este ejemplo usa un formulario VFP para mostrar y
editar datos de empleados. Aunque los datos mostrados vienen desde tablas de
VFP, todos los accesos a estos datos se hacen a través de HTTP. La idea de esto
es que puedas correr el formulario VFP desde cualquier lugar en el mundo y leer
y escribir datos VFP mediante HTTP.
hay
cuatro archivos incluidos en este ejemplo:
· FatClient.SCX es un formulario de VFP que muestra información de employees’ y te permite editar esta información. Cubre en este caso la parte del presentation tier.
· Employee_List_Fat.ASP es un fichero tipo ASP que llama a una función VFP en EmployeeFat.PRG para devolver una lista de empleados como una cadena XML.
· Employee_Save_Fat.ASP es un archivo ASP que llama a una función VFP en EmployeeFat.PRG para guardar información de los empleados para un empleado específico.
· EmployeeFat.PRG implementa métodos para leer y guardar información de los empleados.
Comenzaremos mirando al formulario de VFP. Hay dos métodos principales en este formulario: LoadRecords() y SaveRecords()
LoadRecords() devuelve información, pero
contrariamente a lo que son las típicas aplicaciones de VFP, no abre las tablas
directamente. En su lugar, va a través de HTTP y pregunta a una página Web
(Employee_List_Fat.ASP) para devolver la lista de empleados. Nuestra página ASP
devuelve una cadena XML con esa lista. Convertimos esta cadena XML a un cursor
VFP y lo asignamos a un Grid. El código para LoadRecords() se muestra a continuación:
*
Connect to URL using XMLHTTP.
oXMLHTTP
= CREATEOBJECT( "Microsoft.XMLHTTP" )
oXMLHTTP.Open(
"GET",;
“http://localhost/firstwebapp/employee_list_fat.asp”,;
.F. )
oXMLHTTP.Send()
*
Convert XML string to a VFP cursor.
*
(Our URL must have returned an XML
*
string for this to work.)
XMLTOCURSOR(
oXMLHTTP.ResponseText, "EmployeeCursor" )
*
Assign VFP cursor to grid.
SELECT
EmployeeCursor
thisform.grdData.RecordSource
= "EmployeeCursor"
thisform.grdData.Refresh()
El código para
SaveRecords es algo más simple. Este
método se conecta a una página Web (Employee_Save_Fat.ASP) y envía los campos
que necesitan ser actualizados mediante el método XMLHTTP Send().
*
Instanciate XMLHTTP.
oXMLHTTP
= CREATEOBJECT( "Microsoft.XMLHTTP" )
cString
= "id=" + TRANSFORM( employee_id ) + "," +;
"last_name=[" + TRANSFORM( last_name ) + "]," +;
"first_name=[" + TRANSFORM( first_name ) + "]"
oXMLHTTP.open(
"POST",;
"http://localhost/firstwebapp/employee_save_fat.asp",;
.F. )
oXMLHTTP.setRequestHeader(
"Content-Type",;
"text/xml;
charset=utf-8" )
oXMLHTTP.send(
cString )
El código en ambos archivos ASP es muy similar a lo
que has visto en los ejemplos anteriores para clientes delgados. Esta vez, sin
embargo, Estos archivos ASP no devuelven texto HTML para ser mostrado por los
browser, en su lugar, devuelven cadenas XML que deberán ser pasadas a tu
formulario VFP.
A continuación está el código en
Employee_List_Fat.ASP. Fíjate cómo
unicamente pasas una petici´n a nuestra clase Proxy para llamar a la función EmployeeList dentro de EmployeeFat.PRG.
Esta función devuelve una cadena XML con una lista de empleados.
<%set oVfpProxy = Server.CreateObject(
"proxy.proxy" ) %>
<%= oVfpProxy.Do(
"EmployeeList()", "c:\glgdw_web\employeefat.prg" ) %>
<%set oVfpProxy = nothing%>
El código para Employee_Save_Fat.ASP se muestra a
continuación. Lo primero que esta
página hace es tratar los datos que se han enviado por el formulario VFP. Para hacer esto, Estás usando el método Request.BinaryRead. A continuación, mediante el uso de la clase
Proxy, puedes llamar a la función
EmployeeSave() y pasar los parámetros recibidos desde el formulario de VFP.
<%
' sData will contain values passed to this
' ASP file through XMLHTTP.Send() method.
dim sData
sData = Request.BinaryRead(
Request.TotalBytes )
sData = BinaryToString( sData )
' Concatenate sData to our EmployeeSave()
' function.
dim sCall
sCall = "EmployeeSave( '" &
sData & "' )"
' Call
EmployeeSave() function through our
' Proxy class.
if len( sData ) > 0 then
set
oVfpProxy = Server.CreateObject( "proxy.proxy" )
Response.Write
oVfpProxy.Do( sCall, "c:\glgdw_web\employeefat.prg" )
set
oVfpProxy = nothing
end if
%>
Como puedes ver VFP es una herramienta poderosa que se puede usar para crear todo tipo de
aplicaciones Web, incluyendo clientes delgados de aplciaciones Web.
Además, los
desarolladores de VFP son muy afortunados cuando vienen a las herramientas de
desarrollo. Hay varios y muy conocidas
que se orientan a los desarrolladores de VFP y entregan un framework para las aplicaciones Web. La tabla
siguiente lista los productos más comunes de VFP para los desarrolladores Fox en la web (listados alfabeticamente):
Product |
Company |
Web Page |
|
Active FoxPro Pages |
ProLib |
|
|
EEVA Web Server |
Eetasoft |
|
|
FoxWeb |
Aegis Group |
|
|
Visual Web Builder |
EPS Software |
|
|
Voodo Web Controls |
EPS Software |
|
|
Web-Connect |
West-Wind |
Wong, Clinton. Web Client Programming with Perl. O’Reilly & Associates, Inc., 1999.
Strahl, Rick. Internet Applications with Visual FoxPro 6.0. Hentzenwerke Publishing, 1999.
Strahl, Rick. Using VFP COM Objects with Active Server Pages. West-Wind Technologies (www.west-wind.com), 2000.
Strahl, Rick. Building distributed Web Applications with Visual FoxPro. West-Wind Technologies (www.west-wind.com), 2000.
Strahl, Rick. Internet enabling Visual FoxPro applications. West-Wind Technologies (www.west-wind.com), 1999.
Bromberg, Peter.
Publish your home IP address to your favorite web server. Egghead Café (www.eggheadcafe.com), 2001.
FoxPress – Octubre de 2002