FoxPress – Octubre 2002

 

      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.

 

Proxy.ASP

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.

 

 

 

Ejemplos de Código usando  VFP para hacer Clientes de Aplicaciones Web

 

FatClient.SCX

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

%>

 

Una nota Final

 

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

http://www.afpages.com/

EEVA Web Server

Eetasoft

http://www.eetasoft.ee/ewebserv.htm

FoxWeb

Aegis Group

http://www.foxweb.com

Visual Web Builder

EPS Software

http://www.eps-software.com

Voodo Web Controls

EPS Software

http://www.eps-software.com

Web-Connect

West-Wind

http://www.west-wind.com

 

Referencias

 

Books

Wong, Clinton. Web Client Programming with Perl. O’Reilly & Associates, Inc., 1999.

 

Strahl, Rick. Internet Applications with Visual FoxPro 6.0. Hentzenwerke Publishing, 1999.

 

 

White Papers

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.

 

Articulos

Bromberg, Peter. Publish your home IP address to your favorite web server. Egghead Café (www.eggheadcafe.com), 2001.

 

 

FoxPress – Octubre de 2002