Sie sind auf Seite 1von 13

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

Accediendo a datos de VFP 9.0 desde la Web


DB de VFP 9.0
Por Luis Mara Guayn
Descargar ejemplos de este artculo (6 KB).
Contenido
Introduccin
Qu necesitamos?
Algunos conceptos previos
Nuestra primer pgina
Utilizando procedimientos almacenados
Modificando los datos de las tablas
Para tener en cuenta
Conclusin

Introduccin

A partir de Visual FoxPro 9.0 tenemos una nueva opcin para publicar los datos de nuestras tablas en la Web. Esta opcin la
terceras partes, ni desarrollar objetos COM con Visual FoxPro. En este artculo veremos cmo desarrollar esta opcin, con el u
el uso de una nueva funcin includa en Visual FoxPro 9.0 y el nuevo Proveedor OLE DB de Visual FoxPro 9.0.
Principio de la pgina

Qu necesitamos?

Suponemos en este artculo que tienes conocimientos sobre Microsoft Internet Information Server (IIS) y cmo crear aplic
Lo que necesitamos para desarrollar este breve y funcional ejemplo es:

1. Una PC servidora con Internet Information Server (IIS) instalado en donde montaremos nuestro sitio Web. Si tienes po
"Configurando IIS."

2. Visual FoxPro 9.0 instalado o solamente el Proveedor OLE DB de Visual FoxPro 9.0; lo puedes descargar de Microsoft O

Como parte de lo nuevo que trae el Proveedor OLE DB de Microsoft para Visual FoxPro 9.0, y que utilizaremos en este

Los procedimientos almacenados pueden ahora retornar RecordSets creados a partir de cursores de VFP usand
GETRESULTSET() y CLEARRESULTSET().

Se actualiz la base de datos Northwind con 5 procedimientos almacenados que incluyen la funcin SETRESU
ejecutan.
3. Microsoft Data Access Components (MDAC) versin 2.6 superior. La ltima versin de MDAC la puedes descargar

4. Disponer de un editor de pginas ASP como Visual InterDev, FrontPage o simplemente el Block de Notas de Windo

Principio de la pgina

Algunos conceptos previos

Que es el Proveedor OLE DB de Visual FoxPro?


OLE DB (Object Linking and Embedding for DataBases) para Visual FoxPro es un componente COM que se utiliza para tener a
lenguajes de programacin u otras aplicaciones. OLE DB no se utiliza directamente sino por medio de ADO (ActiveX Data Ob

1 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

con OLE DB u ODBC (Open DataBase Connectivity). ADO est formado por varios objetos organizados de forma jerrquica y
Veamos los 2 objetos de ADO que utilizaremos en el ejemplo:

Connection Object: Nos proporciona una conexin a una base de datos. Esta conexin nos permitir ejecutar los dist
objeto primario de ADO; ninguno de los otros objetos puede existir si ste no es declarado. La conexin terminar cua
ejecucin de la pgina ASP.

Recordset Object: Representa el resultado de una consulta ejecutada contra la base de datos. Este objeto es la interfa

Principio de la pgina

Nuestra primer pgina

Una vez instalado y corriendo el servicio de IIS, e instalado el Proveedor OLE DB de VFP en el servidor, creamos una carpeta (
"C:\Inetpub\wwwroot\") y sta ser nuestra carpeta o sitio de trabajo. En esta nueva carpeta creamos nuestra primera pgi
contenido:

<%@ Language=VBScript%>
<%
Dim Ruta, oConn, oRs
'-- Si solo tenemos instalado el proveedor OLE DB de VFP 9.0
' Ruta = "C:\Archivos de programa\" & _
' "Microsoft Visual FoxPro OLE DB Provider\Samples\Northwind\Northwind.DBC"
'-- Si tenemos instalado Visual FoxPro 9.0
Ruta = "C:\Archivos de programa\" & _
"Microsoft Visual FoxPro 9\Samples\Northwind\Northwind.DBC"
Set oConn = CREATEOBJECT("ADODB.Connection")
Set oRs = CREATEOBJECT("ADODB.RecordSet")
oConn.Open("Provider=VFPOLEDB.1;Data Source=" & Ruta)
oRs.Open "SELECT CustomerId, CompanyName, Address, City, Country FROM Customers", oConn
%>
<html>
<body>
<h3>Listado de Clientes al: <% =Now() %></h3>
<table border=1 width=100% cellspacing="1" cellpadding="2">
<tr>
<% For i = 0 to oRS.Fields.Count - 1 %>
<th><% = UCASE(oRS(i).Name) %></th>
<% Next %>
</tr>
<% Do While Not oRS.EOF %>
<tr bgcolor="#FFFFFF">
<% For i = 0 to oRS.Fields.Count - 1 %>
<td><% = oRS(i) %></td>
<% Next %>
</tr>
<%
oRs.MoveNext
Loop
oRs.Close
oConn.Close
Set oRs = Nothing
Set oConn = Nothing
%>

2 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

</table>
</body>
</html>

Guardamos los cambios y desde el Explorador de Internet, ejecutamos:

http://localhost/vfp/vfpoledb.asp

Si todo va bien, estaremos visualizando la pgina que se muestra en la Figura 1.

Figura 1. Volver al texto.

Fcil? Ahora ya sabemos cmo podemos hacer nuestras pginas consultando dinmicamente los datos de nuestras tablas d
creacin y apertura de nuestro objeto Connection en todas nuestras pginas, vamos a utilizar los Include que nos permiten
nuestra base de datos, solo deberemos cambiar en un slo lugar. Esto tambin le dar ms seguridad a nuestro cdigo.
Creamos una nueva pgina que llamaremos "conn.asp" y copiamos el siguiente cdigo:

<%
Dim cRuta, oConn
'-- Si tenemos instalado Visual FoxPro 9.0
cRuta = "C:\Archivos de programa\" & _
"Microsoft Visual FoxPro 9\Samples\Northwind\Northwind.DBC"
Set oConn = CREATEOBJECT("ADODB.Connection")
oConn.Open("Provider=VFPOLEDB.1;Data Source=" & cRuta & ";Mode=ReadWrite")
%>

Cambiamos el cdigo de la pgina "vfpoledb.asp" y la guardamos como "vfpoledb2.asp".

<%@ Language=VBScript%>
<!-- #include file="conn.asp" -->
<%
Dim oRs
Set oRs = CREATEOBJECT("ADODB.RecordSet")

3 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

oRs.Open "SELECT CustomerId, CompanyName, Address, City, Country FROM Customers", oConn
%>
<html>
<body bgcolor="#E0EAFC">
<h3>Listado de Clientes al: <% =Now() %></h3>
<table border=1 width=100% cellspacing="1" cellpadding="2">
<tr>
<% For i = 0 to oRS.Fields.Count - 1 %>
<th><% = UCASE(oRS(i).Name) %></th>
<% Next %>
</tr>
<% Do While Not oRS.EOF %>
<tr bgcolor="#FFFFFF">
<% For i = 0 to oRS.Fields.Count - 1 %>
<td><% = oRS(i) %></td>
<% Next %>
</tr>
<%
oRs.MoveNext
Loop
oRs.Close
oConn.Close
Set oRs = Nothing
Set oConn = Nothing
%>
</table>
</body>
</html>

Ejecutamos desde el Explorador de Internet:

http://localhost/vfp/vfpoledb2.asp

Y veremos los mismos resultados que en el ejemplo anterior.


Principio de la pgina

Utilizando procedimientos almacenados

Para nuestro ejemplo utilizaremos los procedimientos almacenados actualizados que trae Visual FoxPro 9.0 en la base de dat
almacenados. Para crear nuestro procedimiento almacenado, abrimos la base de datos y editamos los procedimientos almace

OPEN DATABASE (HOME(2) + "Northwind\Northwind")


MODIFY PROCEDURE

Al final del archivo, escribimos nuestro procedimiento almacenado llamado CustomersAll, el cual nos retornar todos los reg

PROCEDURE CustomersAll
SELECT CustomerId, CompanyName, Address, City, Country ;
FROM Customers ;
INTO CURSOR CustomersAll
RETURN SETRESULTSET("CustomersAll")
ENDPROC

4 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

El cdigo para llamar un procedimiento almacenado de nuestra base de datos, desde la pgina ASP, es el siguiente:

<%
Dim cRuta, oConn
Ruta = "C:\Archivos de programa\" & _
"Microsoft Visual FoxPro 9\Samples\Northwind\Northwind.DBC"
Set oConn = CREATEOBJECT("ADODB.Connection")
oConn.Open("Provider=VFPOLEDB.1;Data Source=" & cRuta)
Dim oRS, nReg
Set oRs = oConn.Execute("CustomersAll",nReg,4)
%>

Creamos la nueva pgina customers.asp para obtener todos los registros de la tabla Customers, esta vez llamando al proced
agregamos cdigo HTML para enlazar con las siguientes pginas que realizaremos para completar este ejemplo. El cdigo de

<%@ Language=VBScript%>
<!-- #include file="conn.asp" -->
<%
Dim oRs, nReg
Set oRs = oConn.Execute("CustomersAll",nReg,4)
%>
<html>
<body bgcolor="#E0EAFC">
<h3>Listado de Clientes al: <% =Now() %></h3>
<table border=1 width=100% cellspacing="1" cellpadding="2">
<tr>
<th>Id</th>
<th>Compaia</th>
<th>Direccin</th>
<th>Ciudad</th>
<th>Pas</th>
</tr>
<% Do While Not oRS.EOF %>
<tr bgcolor="#FFFFFF">
<td><a href="/vfp/orders.asp?cId=<%=oRs(0)%>"><%=oRs(0)%></a></td>
<td><%=oRs(1)%></td>
<td><%=oRs(2)%></td>
<td><%=oRs(3)%></td>
<td><%=oRs(4)%></td>
</tr>
<%
oRs.MoveNext
Loop
oRs.Close
oConn.Close
Set oRs = Nothing
Set oConn = Nothing
%>
</table>
<p>Registros: <%=nReg%></p>
</body>
</html>

5 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

Al ejecutar la pgina customers.asp nos muestra la tabla que se muestra en la Figura 2.

Figura 2. Volver al texto.

Como se puede apreciar en en la Figura 2, hemos creado un enlace a la pgina orders.asp pasando como parmetro el
continuacin; ste llama al procedimiento almacenado CustOrdersOrders, que ya est incluido en la base de datos Northwi

<%@ Language=VBScript%>
<!-- #include file="conn.asp" -->
<%
Dim cId
cId = Request("cId")
Dim oRs, nReg
Set oRs = oConn.Execute("CustOrdersOrders('" + cId + "')",nReg,4)
%>
<html>
<body bgcolor="#E0EAFC">
<h3>Ordenes del cliente <%=cId%></h3>
<table border=1 width=100% cellspacing="1" cellpadding="2">
<tr>
<th>Orden Id</th>
<th>Fecha Orden</th>
<th>Fecha Pedido</th>
<th>Fecha Envio</th>
</tr>
<% Do While Not oRS.EOF %>
<tr bgcolor="#FFFFFF">
<td><a href="/vfp/details.asp?oId=<%=oRs(0)%>"><%=oRs(0)%></a></td>
<td><%=oRs(1)%></td>
<td><%=oRs(2)%></td>
<td><%=oRs(3)%></td>
</tr>
<%
oRs.MoveNext
Loop
oRs.Close
oConn.Close
Set oRs = Nothing

6 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

Set oConn = Nothing


%>
</table>
<p>Registros: <%=nReg%></p>
<p><a href="javascript:history.back()">Pgina&nbsp;anterior</a></p>
</body>
</html>

Los resultados de la ejecucin de la pgina orders.asp son los que se muestran en la Figura 3.

Figura 3. Volver al texto.

Al igual que en la pgina anterior, incluimos un enlace a la pgina details.asp que llama al procedimiento almacenado
la pgina es el siguiente:

<%@ Language=VBScript%>
<!-- #include file="conn.asp" -->
<%
Dim oId
oId = Request("oId")
Dim oRs, nReg
Set oRs = oConn.Execute("CustOrdersDetail(" + oId + ")",nReg,4)
%>
<html>
<body bgcolor="#E0EAFC">
<h3>Detalle de la orden <%=oId%></h3>
<table border=1 width=100% cellspacing="1" cellpadding="2">
<tr>
<th>Producto</th>
<th>Precio unitario</th>
<th>Cantidad</th>
<th>Descuento</th>
<th>Precio Total</th>
</tr>
<% Do While Not oRS.EOF %>
<tr bgcolor="#FFFFFF">
<td><%=oRs(0)%></td>
<td align="right"><%=oRs(1)%></td>

7 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

<td align="right"><%=oRs(2)%></td>
<td align="right"><%=oRs(3)%>%</td>
<td align="right"><%=oRs(4)%></td>
</tr>
<%
oRs.MoveNext
Loop
oRs.Close
oConn.Close
Set oRs = Nothing
Set oConn = Nothing
%>
</table>
<p>Registros: <%=nReg%></p>
<p><a href="javascript:history.back()">Pgina&nbsp;anterior</a></p>
</body>
</html>

Y el resultado de esta pgina es el que vemos en la Figura 4.

Figura 4. Volver al texto.

Hasta aqu se observa que con un poco de cdigo ASP y cdigo en nuestra base de datos, podemos realizar cualquier tipo de
sentencias SELECT escritas en nuestros procedimientos almacenados son optimizables, los tiempos de respuestas son excelen
Principio de la pgina

Modificando los datos de las tablas

Aparte de consultar los datos de nuestras tablas, tambin podemos modificar e insertar datos en tablas de VFP. Sobre este pu
pginas ASP y nuestros procedimientos almacenados. Las pginas ASP deben ser seguras y debemos validar todos los datos
tambin para tener en cuenta datos ingresados con fines maliciosos. En los procedimientos almacenados tambin debemos v
el caso de modificar los datos de los clientes, sin prestar mucha atencin al punto anteriormente citado. Para realizar la pgin
en la pgina customers.asp para enlazar la pgina editcustomer.asp. Solo debemos agregar el siguiente cdigo a continuac

<td><a href="/vfp/editcustomer.asp?cId=<%=oRs(0)%>">Editar</a></td>

8 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

Antes de crear las pginas para la edicin y actualizacin de los datos, agregamos dos nuevos procedimientos almacenados a

PROCEDURE GetCustomer(tcCID)
SELECT CustomerId, CompanyName, ContactName, ContactTitle, ;
Address, City, REGION, PostalCode, Country, Phone, Fax ;
FROM Customers ;
WHERE CustomerId = tcCid ;
INTO CURSOR GetCustomer
RETURN SETRESULTSET("GetCustomer")
ENDPROC
PROCEDURE UpdateCustomer
LPARAMETERS tcCustomerid, tcCompanyName, tcContactName, ;
tcContactTitle, tcAddress, tcCity, tcRegion, ;
tcPostalCode, tcCountry, tcPhone, tcFax
LOCAL lnErr
UPDATE Customers SET ;
Companyname = tcCompanyname, ;
Contactname = tcContactname, ;
Contacttitle = tcContacttitle, ;
Address = tcAddress, ;
City = tcCity, ;
Region = tcRegion, ;
Postalcode = tcPostalcode, ;
Country = tcCountry, ;
Phone = tcPhone, ;
Fax = tcFax ;
WHERE Customerid = tcCustomerid
lnErr = _TALLY
RETURN lnErr
ENDPROC

La pgina editcustomer.asp llama al procedimiento almacenado GetCustomer y contiene un formulario con todos los camp
updatecustomer.asp. El cdigo de la pgina es el siguiente:

<%@ Language=VBScript %>


<!-- #include file="conn.asp" -->
<html>
<%
Dim oRs, nReg, cId
cId = Request("cId")
Set oRs = oConn.Execute("GetCustomer('" & cId & "')", nReg, 4)
%>
<body bgcolor="#E0EAFC">
<h3>Editar cliente <%=cId%> </h3>
<hr>
<form id="frmCust" name="frmCust" action="updatecustomer.asp" method="post">
<table width="100%" border="0" cellpadding="5" cellspacing="0">
<tr>
<td>Id Cliente</td>
<td><input name="CustomerId" size="10" value="<%=Trim(oRs(0))%>"
readonly style="color: #FF0000"></td>
</tr>
<tr>
<td>Nombre Compaia</td>
<td><input name="CompanyName" size="40" value="<%=Trim(oRs(1))%>"></td>

9 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

10 de 13

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

</tr>
<tr>
<td>Nombre Contacto</td>
<td><input name="ContactName" size="40" value="<%=Trim(oRs(2))%>"></td>
</tr>
<tr>
<td>Ttulo Contacto</td>
<td><input name="ContactTitle" size="40" value="<%=Trim(oRs(3))%>"></td>
</tr>
<tr>
<td>Domicilio</td>
<td><input name="Address" size="40" value="<%=Trim(oRs(4))%>"></td>
</tr>
<tr>
<td>Ciudad</td>
<td><input name="City" value=" <%=Trim(oRs(5))%>"></td>
</tr>
<tr>
<td>Regin</td>
<td><input name="Region" value=" <%=Trim(oRs(6))%>"></td>
</tr>
<tr>
<td>Cdigo postal</td>
<td><input name="PostalCode" size="10" value="<%=Trim(oRs(7))%>"></td>
</tr>
<tr>
<td>Pas</td>
<td><input name="Country" value="<%=Trim(oRs(8))%>"></td>
</tr>
<tr>
<td>Telfono</td>
<td><input name="Phone" value="<%=Trim(oRs(9))%>"></td>
</tr>
<tr>
<td>Fax</td>
<td><input name="Fax" value="<%=Trim(oRs(10))%>"></td>
</tr>
<tr>
<td></td>
<td>
<input type="submit" value="Grabar" name="cmdG">&nbsp;
<input type="button" value="Cancelar" name="cmdC" OnClick="history.back()"/>
</td>
</tr>
</table>
</form>
<script Language="VBScript">frmCust.CompanyName.Focus</script>
</body>
</html>

Al ejecutar la pgina nos retorna el registro a modificar, tal como lo muestra la Figura 5.

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

Figura 5. Volver al texto.

Una vez editados los datos, el botn Grabar llama a la pgina updatecustomer.asp, la cual invoca al procedimiento almacen
parmetros. El cdigo para ello es el siguiente:

<%@ Language=VBScript %>


<!-- #include file="conn.asp" -->
<html>
<%
Dim cParams
cParams = "'" & Request("CustomerId") & "','" & Request("CompanyName") & "','" & _
Request("ContactName") & "','" & Request("ContactTitle") & "','" & _
Request("Address") & "','" & Request("City") & "','" & _
Request("Region") & "','" & Request("PostalCode") & "','" & _
Request("Country") & "','" & Request("Phone") & "','" & Request("Fax") & "'"
Dim nReg, oRs
nReg = 0
oRs = oConn.Execute("UpdateCustomer(" & cParams & ")", nReg, 4)
%>

11 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

<body bgcolor="#E0EAFC">
<h3>Grabar cliente <%=Request("CustomerId")%></h3>
<hr>
<% If nReg > 0 Then %>
<h1>Los datos se grabaron correctamente</h1>
<% Else %>
<h1>Error al grabar los datos</h1>
<% End If %>
<input type="button" value="Continuar" name="cmdC" OnClick="location.href='customers.asp'"/>
</body>
</html>

Si los datos se grabaron correctamente en la tabla, la pgina se visualiza como lo muestra la Figura 6.

Figura 6. Volver al texto.

Con este ltimo ejemplo observamos que la modificacin de los datos no es una tarea complicada de realizar. Solo se deber
para cada necesidad y tomar las precauciones descriptas anteriormente.
Principio de la pgina

Para tener en cuenta

Cuando se instala Internet Information Server (IIS) en un servidor, ste crea el usuario IUSR_<Nombre_Servidor> para el acc
correctamente, este usuario deber tener los privilegios necesarios para consultar y modificar la carpeta donde se encuentra

Por defecto IIS controla la contrasea de este usuario, esto nos puede traer problemas si la base de datos se encuentra en otr
Para evitar esto debemos desmarcar la casilla de verificacin Permitir que IIS controle la contrasea, tal como se muestra e

12 de 13

01/06/2015 7:16

Accediendo a datos de VFP 9.0 desde la Web con el Proveedor OLE ...

https://msdn.microsoft.com/es-es/library/bb972247(d=printer).aspx

Figura 7. Volver al texto.

Para llegar a la ventana de la Figura 7 debes acceder a las Propiedades del sitio Web, seleccionando la solapa Seguridad de
autentificacin y acceso annimo.

Este caso est documentado en la Base de Conocimientos de Microsoft: Accessing FoxPro Table in ASP Returns Error 80040e1
Principio de la pgina

Conclusin

Como comentamos al inicio de este artculo, sta es una opcin vlida y muy fcil de implementar para publicar nuestros dat
la aplicacin a desarrollar solo depende de nosotros y de nuestras necesidades. Para finalizar, deseo agradecer el apoyo y las
para elaborar el cdigo de los ejemplos de este artculo.

Luis Mara Guayn est radicado en Tucumn, Argentina. Comenz a programar en el ao 1990 con len
FoxPro. Es cofundador y SysOp de PortalFox, el mayor portal para desarrolladores en Visual FoxPro de h
rea Visual Developer: Visual FoxPro.

Principio de la pgina
2015 Microsoft

13 de 13

01/06/2015 7:16

Das könnte Ihnen auch gefallen