miércoles, 6 de enero de 2010

ASP.NET – obtener Stock Quotes automaticamente cada x segundos

stockquotes Podemos darle un gran valor agregado a nuestro web site si le añadimos la funcionalidad de estar mostrando la información de sus stock quotes actualizados…(claro, en el caso que tuviera).

Vamos a mostrar una manera sencilla y simple de cómo podemos mostrar la información de un determnado símbolo de stock quotes en una página ASP.NET… obviamente uds lo pueden mejorar, la idea aquí (como siempre) es que se entienda cómo hacerlo.

0.- Vamos a usar el ajaxcontrol toolkit y ASP.NET ajax 2.0… así que asegúrense de haberlos referenciado en su proyecto.

1.- Añadimos un control de usuario ascx a nuestro proyecto, lo llamamos wucStockQuotes.ascx

1.1.- le añadimos un UpdatePanel, un timer y el código HTML necesario que me permita mostrar el stock quotes en una pequeña tabla, así debiera quedar:

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<
ContentTemplate>
<
asp:Timer ID="Timer1" Interval="10000" runat="server">
</
asp:Timer>
<
table style='width: 85%; text-align: left; width: 200px'>
<
tr>
<
td>
<
span style='font-weight: bold'>
<
asp:Literal ID="ltSymbol" runat="server"></asp:Literal></span>
</
td>
<
td>
<
span style='font-weight: bold'>OTC BB</span>
</
td>
</
tr>
<
tr>
<
td>
Last
</td>
<
td>
<
asp:Literal ID="ltLast" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Change
</td>
<
td>
<
asp:Literal ID="ltChange" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Volume
</td>
<
td>
<
asp:Literal ID="ltVolume" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Day's Range
</td>
<
td>
<
asp:Literal ID="ltDaysRange" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Open
</td>
<
td>
<
asp:Literal ID="ltOpen" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Prev. Close
</td>
<
td>
<
asp:Literal ID="ltPrevClose" runat="server"></asp:Literal>
</
td>
</
tr>
<
tr>
<
td>
Market Cap
</td>
<
td>
<
asp:Literal ID="ltMarketCap" runat="server"></asp:Literal>
</
td>
</
tr>
</
table>
</
ContentTemplate>
</
asp:UpdatePanel>









El Timer tiene un Interval de 10000 milisegundos, entonces se supone que la información deberá refresacarse cada 10 segundos.

En el code beside:

+ creamos una propiedad pública llamada Symbol, que me permitirá obtener el símbolo del stock quotes desde la página aspx.

+ Creamos un procedimiento llamado StockQuotes() , el cual permitirá mostrar la información recuperada desde YAHOO, vean el código completo:

Public Partial Class wucStockQuotes
Inherits System.Web.UI.UserControl

Private _Symbol As String = "MSFT"
Public Property Symbol() As String
Get
Return
_Symbol
End Get
Set
(ByVal value As String)
_Symbol = value
End Set
End Property

Protected Sub
Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
StockQuotes()
End Sub

Protected Sub
Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick
StockQuotes()
End Sub

Private Sub
StockQuotes()
        Dim c As Char = System.Web.UI.Html32TextWriter.DoubleQuoteChar

Dim sq As String = Get_DataFromYahoo(_Symbol)
Dim arrValues() As String = sq.Split(",")

ltSymbol.Text = _Symbol
ltLast.Text = arrValues(1)
ltChange.Text = String.Format("{0}({1})", arrValues(4), arrValues(11).Replace(c, "").Replace("+", ""))

ltVolume.Text = String.Format("{0:#,###}", Convert.ToDouble(arrValues(8)))
ltDaysRange.Text = String.Format("{0}-{1}", arrValues(7), arrValues(6))
ltOpen.Text = arrValues(5)
ltPrevClose.Text = arrValues(10)
ltMarketCap.Text = arrValues(9)

End Sub

Public Shared Function
Get_DataFromYahoo(ByVal symbol As String) As String
Dim
url As String = "http://download.finance.yahoo.com/d/quotes.csv?s={0}&d=t&f=sl1d1t1c1ohgvj1pp2wern"

Return GetHTMLFromURL(String.Format(url, symbol))

End Function

Public Shared Function
GetHTMLFromURL(ByVal URL As String) As String
Dim
ASCII As New System.Text.ASCIIEncoding
Dim netWeb As New System.Net.WebClient
Dim lsWeb As String
Dim
laWeb As Byte()

Try
laWeb = netWeb.DownloadData(URL)
lsWeb = ASCII.GetString(laWeb)
Catch ex As Exception
Throw New Exception(ex.Message.ToString + ex.ToString)
End Try

Return
lsWeb

End Function

End Class

Lo que se hace aquí (a grandes rasgos es):

Yahoo devuelve los datos en un string separado por comas,,, entonces lo que hacemos en splitearlo y luego mostrar los datos que nos interesan, dándole un poco de formato.

2.- Añadimos una página aspx a nuestro proyecto, lo llamamos StockQuotes.aspx y le añadimos un scriptManager, luego arrastramos el control de usuario wucStockQuotes.ascx creado previamente sobre la página aspx, el código final debe verse más o menos así:

<html xmlns="http://www.w3.org/1999/xhtml" >
<
head runat="server">
<
title>Obtener Stock Quotes</title>
<
style type="text/css">
* { font-family: Trebuchet MS; }
</style>
</
head>
<
body>
<
form id="form1" runat="server">
<
asp:ScriptManager ID="ScriptManager1" runat="server">
</
asp:ScriptManager>
<
h3>Obtener stock Quotes cada x segundos</h3>

<
uc1:wucStockQuotes ID="wucStockQuotes1" Symbol="IBM" runat="server" />

</
form>
</
body>
</
html>









Dense cuenta que en el control de usuario que acabo de arrastrar hacia la página aspx he puesto Symbol="IBM" lo cual significa que ese será el Stock Quotes a consultar.

Cualquier duda, comentan? ;)

No hay comentarios.: