Está en la página 1de 6

Visual FoxPro 9.0 y WebService (ASP.

NET)

Visual FoxPro 9.0 y WebServices


(ASP.NET)
Introducción
En este artículo intento explicar cómo enviar datos desde un cliente que puede estar ubicado en
cualquier parte del mundo a una base de datos SQL Server en un Servidor y dejar la idea para el
que esté necesitando desarrollar un proyecto con tal fin.

Historia del Proyecto


Hace unos años lancé para la empresa un software hecho en Visual FoxPro 6.0 donde permitía al
cliente ver el catálogo de productos que la misma comercializa, confeccionar pedidos y enviarlos a
la distribuidora mediante la herramienta SOAP Toolkit 3.0

Desde el lado de la empresa, tenemos un Servidor donde para levantar los pedidos entrantes,
desarrollé los WebServices (WS) en Visual Basic 6.0 en ese momento.

Actualmente, la empresa ha crecido en infraestructura y se realizó un cambio de sistema, con lo


cual me llevó a desarrollar un software de clientes nuevo y cambiar la tecnología. El sistema
cliente lo desarrollé en Visual FoxPro 9.0 y los WS de lado de Servidor lo desarrollé en C# usando
Visual Studio 2005.

El motor de base de datos donde se alojan los pedidos entrantes, está diseñada en SQL Server
2005.

Temas a tratar

• Desarrollo del WebService


• Código que permite enviar la información desde el cliente en VFP

Leonardo D. Zulli Pág 1


Visual FoxPro 9.0 y WebService (ASP.NET)

Desarrollo del Web Service

El WebService está vinculado a tres librerías que son:

Entidades.dll

CapaDatos.dll

Bll_Negocio.dll

En este documento no voy a mostrar el código de las tres capas ya que es bastante extenso y la
idea es mostrar cómo podemos hacer para enviar datos desde VFP a un Servidor por medio de un
WebService.

Una vez que tengamos desarrollado los tres componentes dll que nombré anteriormente,
debemos desarrollar el WebService que en .NET es un archivo asmx. En este proyecto usé ASP.NET
C#. A continuación les muestro el código del WebService WSPedidos.asmx:

using System;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;
using Bll_Negocio;
using Entidades;

/// <summary>
/// Descripción breve de WSPedidos
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WSPedidos : System.Web.Services.WebService {

public WSPedidos () {

//Eliminar la marca de comentario de la línea siguiente si utiliza los


//componentes diseñados
//InitializeComponent();
}

[WebMethod]
public int Enviar_Cabecera(
int iNroCta,
string sInterfaz,
int iCantReng,
string sObserv,
string sFecLista
) {

bll_Pedidos obll_ped = new bll_Pedidos();


PedidosC oPedC = new PedidosC();
DateTime oFecLista = new DateTime();

oFecLista = Convert.ToDateTime(sFecLista);

oPedC.Clientes.CodCli = iNroCta;

Leonardo D. Zulli Pág 2


Visual FoxPro 9.0 y WebService (ASP.NET)
oPedC.Anulado = false;
oPedC.CantReng = iCantReng;
oPedC.Fec_Emis = DateTime.Today;
oPedC.Interfaz = sInterfaz;
oPedC.Observ = sObserv;
oPedC.NroPed = oPedC.Id_PedidoC;
oPedC.NroPedExt = 0;
oPedC.FecLista = oFecLista;

obll_ped.PedidoC = oPedC;
obll_ped.Nuevo_Pedido();

return (int) oPedC.Id_PedidoC;


}

[WebMethod]
public int Agregar_Detalle(int iIdPedido, string sCodArt, int iCantidad)
{
bll_Pedidos obll_ped = new bll_Pedidos();
bll_Articulos obll_art = new bll_Articulos();
PedidosD oPedD = new PedidosD();

oPedD.Articulos = obll_art.GetByCodExact(sCodArt);
oPedD.Articulos.Rubros = oPedD.Articulos.Rubros;
oPedD.Articulos.SubRubros = oPedD.Articulos.SubRubros;
oPedD.Id_PedidoC = iIdPedido;
oPedD.Cantidad = iCantidad;
oPedD.FecLista = DateTime.Today;

if (!obll_ped.Agregar_Detalle(oPedD))
{
return -1;
}

return 0;
}

[WebMethod]
public int Confirmar_Pedido(int iNroPed)
{
bll_Pedidos obll_ped = new bll_Pedidos();
PedidosC oPedC = new PedidosC();
int iResult;

oPedC.Id_PedidoC = iNroPed;
obll_ped.PedidoC = oPedC;
iResult = obll_ped.Confirmar_Pedido();

return iResult;
}

Esta clase tiene tres métodos que son:

• Enviar _Cabecera(): Permite levantar los datos de la cabecera del pedido.


• Agregar_Detalle(): Permite generar un registro del detalle del pedido
• Confirmar_Pedido(): Una vez que está cargado permite marcar el pedido como
confirmado.

Leonardo D. Zulli Pág 3


Visual FoxPro 9.0 y WebService (ASP.NET)

Para poner en marcha el WS, hay que copiar el asmx y sus dlls en una carpeta en el servidor y
luego configurar la misma como un sitio web en Internet Information Server y asegurarte de
configurar correctamente el Web.Config

Código que permite enviar la información desde el cliente en VFP


Desde Visual FoxPro lo que he desarrollado es un archivo PRG que se encarga de transferir un
pedido al WebService mediante los objetos que brinda la utilidad SOAP Toolkit 3.0. Esta
herramienta viene en el instalador del Visual FoxPro 9.0

El archivo se llama: transferir.prg y contiene el siguiente código:

&& Este procedimiento se encarga de transferir la cabecera de


&& pedidos a DER

PARAMETERS CodCli, Interfaz, CantReg, Observ, FecLista

LOCAL lo_SoapCli
LOCAL lo_progress
LOCAL li_Porc, li_Total, li_Cont
LOCAL ln_NroPed
LOCAL l_Resul
LOCAL l_Ok
LOCAL ln_Resultado

ln_NroPed = 0
li_Total = 0
l_Result = .F.
l_Ok = .T.

lo_Progress = CREATEOBJECT("_Thermometer")

&& Calculo la cantidad de renglones que tiene el pedido

SELECT cur_Detalle

IF RECCOUNT() > 0
CantReg = RECCOUNT()
GO TOP
ENDIF

&& Genero el encabezado de la nota de pedido

lo_SoapCli = CREATEOBJECT("MSSOAP.SoapClient30")
lo_SoapCli.mssoapinit(“http://www.pag.com.ar/Ws/WSPedidos.asmx?wsdl”, ;
“WSPedidos”, “WSPedidosSoap”)

ln_NroPed = lo_SoapCli.Enviar_Cabecera(CodCli, Interfaz, ;


CantReg, Observ, FecLista)

IF ln_NroPed = -1
RETURN .F.
ENDIF

&& Ahora genero el detalle a partir del cursor que esta


&& en el formulario de la confección de pedidos

SELECT cur_Detalle

Leonardo D. Zulli Pág 4


Visual FoxPro 9.0 y WebService (ASP.NET)

li_Total = RECCOUNT()
li_Porc = 0.00
li_Cont = 0

lo_Progress.Show()

DO WHILE !EOF()
SELECT * FROM Articulos WHERE Id_Art = cur_Detalle.Id_Art ;
INTO CURSOR cur_Artic

SELECT cur_Detalle
lo_SoapCli.Agregar_Detalle(ln_NroPed, cur_Detalle.CodArt,;
cur_Detalle.Cantidad)

li_Cont = li_Cont + 1
li_Porc = (li_Cont * 100) / li_Total
lo_Progress.Update(li_Porc, "Enviando pedido...")
SELECT cur_Detalle
SKIP
ENDDO

ln_Resultado = lo_SoapCli.Confirmar_Pedido(ln_NroPed)

DO CASE
CASE ln_Resultado = -1
MESSAGEBOX("Por algún motivo no se ha logrado “ + ;
“recepcionar el pedido completo", 0+48, ;
"Transfiriendo pedido")
RETURN .F.
CASE ln_Resultado = -2
MESSAGEBOX("Ha ocurrido un error al intentar confirmar el pedido",;
0+48, "Transfiriendo pedido")
RETURN .F.
ENDCASE

lo_Progress.Complete();

IF !USED("CabPed")
USE CabPed ALIAS CabPed AGAIN IN 0
ELSE
SELECT CabPed
ENDIF

CURSORSETPROP("Buffering", 5, "CabPed")

Begin Transaction
l_Ok = .T.

UPDATE CabPed SET NroPed_DER = ln_NroPed WHERE Transf = .F.


l_Ok = TABLEUPDATE(1, .T., "CabPed")

IF l_Ok
END TRANSACTION
ELSE
ROLLBACK
MESSAGEBOX("El pedido fue transferido, “ + ;
“pero hubo un error al intentar guardar el numero obtenido", ;
0+48, "Transfiriendo pedido")
RETURN .F.
ENDIF

RETURN .T.

Leonardo D. Zulli Pág 5


Visual FoxPro 9.0 y WebService (ASP.NET)

lo_SoapCli es el objeto que permite transferir la información mediante el protocolo http.

Espero que este artículo les sea de utilidad para aquellos que requieran desarrollar algún software
específico que necesite tomar información desde cualquier lugar que el usuario se encuentre y
enviar dicha información a una base de datos SQL Server en un determinado servidor.

Autor: Leonardo D. Zulli

Mail: lzulli@arnet.com.ar

Leonardo D. Zulli Pág 6