martes, 7 de abril de 2009

Consumir Web Services desde Office Excel

Continuando con la publicación anterior, hoy quiero mostrarles la forma de conectarnos a un Web Services desde Microsoft Office Excel 2003. Si aún no haz leido la publicación anterior, es bueno que lo hagas ahora en Web Services con Word 2003, ya que hoy saltaré al código inmediatamente, puesto que la forma de utilización es la misma.


Y como ya tenemos instalado el Microsoft Office 2003 Web Services Toolkit 2.01, abre Microsoft Excel y dirígete a “Herramientas/Macro/Macros…” y creas una macro llamada “macroIndicadores”


Una vez abierto el editor de Microsoft Visual Basic, ir al menú “Herramientas/Web Services Referentes…”.


Seleccionar la opción “Dirección URL del servicio Web” e ingresar la URL de Web Services, que en nuestro caso será http://www.desachile.com/webservice.asmx , luego presionar “Buscar” y seleccionar el servicio que se muestra y presionar “Agregar”.




Ahora nos vamos a nuestra macro creada anteriormente (macroIndicadores) y escribimos el siguiente código:


Sub macroIndicadores()
'
' macroIndicadores Macro
' Macro creada el 06/04/2009 por Toby
'
Dim indica As New clsws_Servicios
Dim oFullNodeList As MSXML2.IXMLDOMNodeList
Dim oFilteredNodeList As MSXML2.IXMLDOMNodeList
Dim oNode As MSXML2.IXMLDOMNode
Dim xdd As MSXML2.DOMDocument30
Dim xdlRows As MSXML2.IXMLDOMNodeList
Dim iRow As Integer
Dim valor As String
Dim lcntRows As Integer
Dim uf As String
Dim usd As String
Dim euro As String
Dim utm As String

Set oFullNodeList = indica.wsm_Indicadores("06", "04", "2009")
Set oFilteredNodeList = oFullNodeList.Item(1).selectNodes("NewDataSet")

Set xdd = New MSXML2.DOMDocument30

With xdd
.async = False
.preserveWhiteSpace = True
.loadXML oFullNodeList.Item(1).XML
Set xdlRows = xdd.selectNodes("//indicadores")
End With

lcntRows = xdlRows.Length - 1

For Each oNode In oFilteredNodeList
For iRow = 0 To lcntRows
uf = oNode.childNodes.Item(iRow).selectSingleNode("UF.valor").Text
usd = oNode.childNodes.Item(iRow).selectSingleNode("USD.valor").Text
euro = oNode.childNodes.Item(iRow).selectSingleNode("EURO.valor").Text
utm = oNode.childNodes.Item(iRow).selectSingleNode("UTM.valor").Text
Next
Next
Hoja1.Cells(2, 2) = "Indicadores Económicos del Día"
Hoja1.Cells(4, 2) = "uf"
Hoja1.Cells(5, 2) = "usd"
Hoja1.Cells(6, 2) = "euro"
Hoja1.Cells(7, 2) = "utm"

Hoja1.Cells(4, 3) = uf
Hoja1.Cells(5, 3) = usd
Hoja1.Cells(6, 3) = euro
Hoja1.Cells(7, 3) = utm

End Sub

Luego de ejecutar la macro, el resultado será:



Si te has fijado bien, el código es exactamente el mismo a la publicación anterior Web Services con Word 2003 exepto por la forma de como mostrarás los valores. Más sencillo no puede ser.


Es todo por hoy y hasta la próxima publicación.


Saludos, Toby

miércoles, 21 de enero de 2009

Consumir Web Services desde Office Word

Muchas veces nos resultará más fácil y práctico extender la funcionalidad de las aplicaciones Office a través de la utilización de Web Services, en lugar de crear una aplicación Windows desde cero, por lo tanto lo que hoy les enseñaré será la forma de cómo podemos conectarnos al Web Services mediante Visual Basic para Aplicaciones (VBA) desde las aplicaciones de Microsoft Office 2003. Hoy será utilizando Microsoft Office Word 2003 y en la siguiente publicación lo haremos con Microsoft Office Excel 2003.


Vamos a conectarnos nuevamente al Web Services de Indicadores Financieros de DesaChile.com.


Lo primero que necesitaremos será descargar el Microsoft Office 2003 Web Services Toolkit 2.01 desde el sitio de Microsoft en esta dirección (yo descargue la versión en español) http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=fa36018a-e1cf-48a3-9b35-169d819ecf18


Luego de instalar el Toolkit, abre Microsoft Word y dirígete a “Herramientas/Macro/Macros…”



Ingresa un nombre para la macro. En mi caso he colocado “macroIndicadores”. Hacer clic en “Crear”.



Una vez abierto el edito de Microsoft Visual Basic, ir al menú “Herramientas/Web Services Referentes…”.



Seleccionar la opción “Dirección URL del servicio Web” e ingresar la URL de Web Services, que en nuestro caso será http://www.desachile.com/webservice.asmx , luego presionar “Buscar” y seleccionar el servicio que se muestra y presionar “Agregar”.



“Microsoft Office 2003 Web Services Toolkit” nos ha creado una clase Proxy llamada “clsws_Servicios” para el Web Services y además nos agrego un código de ejemplo que se encuentra comentariado al inicio de la clase.



Este es el código que nos agrego en un módulo de clase llamado “clsws_Servicios”


Private sc_Servicios As SoapClient30
Private Const c_WSDL_URL As String = "http://www.desachile.com/webservice.asmx?wsdl"
Private Const c_SERVICE As String = "Servicios"
Private Const c_PORT As String = "ServiciosSoap"
Private Const c_SERVICE_NAMESPACE As String = "DESACHILE"

Private Sub Class_Initialize()
'*****************************************************************
'Se llamará a esta subrutina cada vez que se creen instancias de la clase.
'Crea sc_ComplexTypes como SoapClient30 nuevo y, a continuación,
'inicializa sc_ComplexTypes.mssoapinit2 con el archivo WSDL encontrado en
'http://www.desachile.com/webservice.asmx?wsdl.
'*****************************************************************

Dim str_WSML As String
str_WSML = ""

Set sc_Servicios = New SoapClient30

sc_Servicios.MSSoapInit2 c_WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
'Utilice el servidor proxy definido en la configuración LAN de Internet Explorer
'estableciendo ProxyServer en <CURRENT_USER>
sc_Servicios.ConnectorProperty("ProxyServer") = "<CURRENT_USER>"
'Detectar automáticamente la configuración proxy si la aplicación Internet Explorer está definida para realizar esta función
'estableciendo EnableAutoProxy en True
sc_Servicios.ConnectorProperty("EnableAutoProxy") = True


End Sub

Private Sub Class_Terminate()
'*****************************************************************
'Se llamará a esta subrutina cada vez que se destruya la clase.
'Establece sc_ComplexTypes a Nothing.
'*****************************************************************

'Intercepción de errores
On Error GoTo Class_TerminateTrap

Set sc_Servicios = Nothing

Exit Sub

Class_TerminateTrap:
ServiciosErrorHandler ("Class_Terminate")
End Sub

Private Sub ServiciosErrorHandler(str_Function As String)
'*****************************************************************
'Esta subrutina es el controlador de errores de clase. Se puede llamar desde cualquier subrutina o función de clases
'cuando dicha subrutina o función encuentra un error. A continuación, generará el error junto con el
'nombre de la subrutina o función que realiza la llamada.
'*****************************************************************

'Error SOAP
If sc_Servicios.FaultCode <> "" Then
Err.Raise vbObjectError, str_Function, sc_Servicios.FaultString
'Error no SOAP
Else
Err.Raise Err.Number, str_Function, Err.Description
End If

End Sub

Public Function wsm_Indicadores(ByVal str_day As String, ByVal str_month As String, ByVal str_year As String) As MSXML2.IXMLDOMNodeList
'*****************************************************************
'Se creó la función proxy desde http://www.desachile.com/webservice.asmx?wsdl.
'
'"wsm_Indicadores" está definido como XML. Consulte el tema Tipos complejos: Variables XML en
'la Ayuda de Web Services Toolkit de Microsoft Office 2003 para obtener detalles acerca de la implementación de variables XML.
'*****************************************************************

'Intercepción de errores
On Error GoTo wsm_IndicadoresTrap

Set wsm_Indicadores = sc_Servicios.indicadores(str_day, str_month, str_year)

Exit Function
wsm_IndicadoresTrap:
ServiciosErrorHandler "wsm_Indicadores"
End Function

Ahora nos vamos a nuestra macro creada anteriormente (macroIndicadores) y escribimos el siguiente código:


Option Explicit

Sub macroIndicadores()
'
' macroIndicadores Macro
' Macro creada el 21/01/2009 por Toby
'
Dim indica As New clsws_Servicios
Dim oFullNodeList As MSXML2.IXMLDOMNodeList
Dim oFilteredNodeList As MSXML2.IXMLDOMNodeList
Dim oNode As MSXML2.IXMLDOMNode
Dim xdd As MSXML2.DOMDocument30
Dim xdlRows As MSXML2.IXMLDOMNodeList
Dim iRow As Integer
Dim valor As String
Dim lcntRows As Integer
Dim uf As String
Dim usd As String
Dim euro As String
Dim utm As String

Set oFullNodeList = indica.wsm_Indicadores("21", "01", "2009")
Set oFilteredNodeList = oFullNodeList.Item(1).SelectNodes("NewDataSet")

Set xdd = New MSXML2.DOMDocument30

With xdd
.async = False
.preserveWhiteSpace = True
.LoadXml oFullNodeList.Item(1).XML
Set xdlRows = xdd.SelectNodes("//indicadores")
End With

lcntRows = xdlRows.Length - 1

For Each oNode In oFilteredNodeList
For iRow = 0 To lcntRows
uf = oNode.ChildNodes.Item(iRow).SelectSingleNode("UF.valor").Text
usd = oNode.ChildNodes.Item(iRow).SelectSingleNode("USD.valor").Text
euro = oNode.ChildNodes.Item(iRow).SelectSingleNode("EURO.valor").Text
utm = oNode.ChildNodes.Item(iRow).SelectSingleNode("UTM.valor").Text
Next
Next

Selection.TypeText Text:="Indicadores Económicos del Día"
Selection.TypeParagraph
Selection.TypeText Text:="Euro = " & euro
Selection.TypeParagraph
Selection.TypeText Text:="Dólar = " & usd
Selection.TypeParagraph
Selection.TypeText Text:="UTM = " & utm
Selection.TypeParagraph
Selection.TypeText Text:="UF = " & uf
End Sub

Luego de ejecutar la macro, el resultado será:



Desde aquí en adelante ustedes pueden hacer lo que quieran con estos valores. Yo me despido hasta la próxima publicación.


Saludos, Toby

lunes, 19 de enero de 2009

Consumir Web Services con C#

Hola a todos. Hoy lo que haremos será consumir el Web Services de Indicadores financieros utilizando Visual Studio 2005 y comprobaremos lo sencillo que resulta. Lo primero será crear un nuevo proyecto Web, seleccionamos C#, le damos un nombre (yo le he colocado “WSIndicadores”) y guardamos.



Ahora vamos al “Solution Explorer” y dando clic derecho sobre “WSIndicadores” agregamos una “Web Reference” tal como lo indica la imagen.



Ahora colocamos la dirección del Web Services que consumiremos, que para nuestro ejemplo será el de indicadores financieros del sitio desachile.com. La dirección es la siguiente: http://www.desachile.com/webservice.asmx. Luego de hacer clic en “Go” se nos mostrarán los servicios disponibles.



Damos un nombre en “Web referente name”, en mi caso he colocado “desachile_Indicadores” y pinchamos sobre el botón “Add Reference”.



Ahora que ya tenemos la referencia al servicio, ósea nuestro Proxy local, es posible instanciarlo colocando lo siguiente:


using desachile_Indicadores;

Agreguemos un “Button” que llamaremos Button1 y un “GridView” que llamaremos GridView1.



Dependiendo de lo que queramos realizar con los indicadores, es como lo vamos trabajar. En mi caso yo solo quiero mostrar el resultado en la grilla de datos, cuando consulto por los indicadores del 02 de enero del 2009.


Aquí el código completo en C#.


using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using desachile_Indicadores;

public partial class _Default : System.Web.UI.Page
{
protected void Button1_Click(object sender, EventArgs e)
{
Servicios Indi = new Servicios();
DataSet Ds = Indi.Indicadores("02", "01", "2009");
GridView1.DataSource = Ds;
GridView1.DataBind();
}
}

El resultado que obtendremos será el siguiente:



Resumiendo lo visto en esta publicación, he querido mostrarles la conexión a un Web Services distinto al tradicional “Hola Mundo” que encontramos en la mayoría de los sitios Web, tratando de hacerlo de la forma más rápida y sencilla posible, es decir, sin aburrirlos con la parte teórica y las definiciones que las pueden encontrar en cualquier libro.


Espero les haya gustado

Saludos, Toby.

miércoles, 7 de enero de 2009

¿Para qué sirven los Web Services?

El desarrollo y la programación de sistemas orientado a objetos o componentes nos ha llevado a lo largo del tiempo a tener la necesidad de reutilizarlos en diferentes proyectos. Ya sean componentes desarrollados por nosotros o componentes desarrollados por terceras partes. Hasta la existencia de los Web Services esta reutilización nos limitaba a un lenguaje de programación o a una plataforma en particular. Por lo tanto, el uso de los Web Services nos facilitará la reutilización de funciones de una aplicación en distintas plataformas o lenguajes ya sea para un uso personal en distintos proyectos, para comercializarlos o adquirir prestaciones de terceros.


De la misma forma que anteriormente incluíamos en nuestras aplicaciones referencias a otras librerías como ser Dlls o componentes ActiveX, ahora podremos referenciar funciones que se estarán ejecutando en otra computadora o servidor sin importarnos en qué están programados ni en que plataforma están corriendo.


Uno de los ejemplos más comunes del uso de los Web Services se encuentra en los sitios web de comercio electrónico, los cuales hacen uso de un Web Service para validar los datos de las tarjetas de crédito de sus clientes. Normalmente este Web Service es provisto por algún banco o entidad financiera que actúa como intermediario entre el comercio y las tarjetas de crédito. Otro ejemplo podría ser que necesitamos usar el corrector ortográfico del Microsoft Word desde un sitio web que creamos en ASP.NET. Ahora bien, esto es algo que podemos hacer a través de los Visual Studio 2005 Tools for the Microsoft Office System, pero para ello necesitaremos tener instalado el Microsoft Word en el servidor Web. Supongamos que por alguna razón no se nos permite instalar el Microsoft Word en el servidor Web, pero disponemos de un servidor de aplicaciones en el que tenemos control total y allí podemos instalar el MS Word. Para poder utilizar el MS Word que está instalado en otro servidor desde nuestra aplicación web podríamos crear un Web Services en el servidor de aplicaciones, el cual expondrá un Web Método público que se encargue de ejecutar el corrector ortográfico de MS Word. Teniendo esto podremos utilizar esta funcionalidad desde nuestra aplicación Web a través de un Web Service sin haber instalado MS Word en el servidor Web. Para poder reutilizar bien los componentes y objetos desarrollados era necesario un lenguaje de programación orientado a objetos. Ahí nace el lenguaje c# de la mano del .NET framework, que desde sus inicios se focalizó en proveer una herramienta como el Visual Studio, capaz de crear y consumir Web Services de la forma más rápida y sencilla tornando transparentes para el desarrollador protocolos y tipos de mensajes XML como WSDL y SOAP, los que describiremos en futuras publicaciones.

Entradas populares