<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Datapayasadas</title>
	<atom:link href="http://datapayasadas.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://datapayasadas.wordpress.com</link>
	<description>Datasets y DataAdapters en su mas delirante expresión ...</description>
	<lastBuildDate>Mon, 26 Oct 2009 12:37:15 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='datapayasadas.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/e098c94907192faf5fc8771586d506ef?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Datapayasadas</title>
		<link>http://datapayasadas.wordpress.com</link>
	</image>
			<item>
		<title>Feliz Cumple Matías!!!</title>
		<link>http://datapayasadas.wordpress.com/2009/10/26/feliz-cumple-matias-2/</link>
		<comments>http://datapayasadas.wordpress.com/2009/10/26/feliz-cumple-matias-2/#comments</comments>
		<pubDate>Mon, 26 Oct 2009 12:37:15 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=309</guid>
		<description><![CDATA[Te deseamos lo mejor! Que los cumplas muy feliz!!!
Saludos!
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=309&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Te deseamos lo mejor! Que los cumplas muy feliz!!!</p>
<p>Saludos!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/309/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/309/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/309/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=309&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/10/26/feliz-cumple-matias-2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Actualizador (2da Parte)</title>
		<link>http://datapayasadas.wordpress.com/2009/10/25/actualizador-2da-parte/</link>
		<comments>http://datapayasadas.wordpress.com/2009/10/25/actualizador-2da-parte/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 03:11:16 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[actualizador]]></category>
		<category><![CDATA[updater]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=244</guid>
		<description><![CDATA[En el artículo previo (Actualizador 1era Parte) llegamos a definir la estructura iba a tener nuestro archivo de actualizaciones, ahora solo nos falta descargar esa información, parsearla y hacer algo útil con ella.
Recuerden que el formato a utilizar en dicho archivo será el siguiente:
ruta relativa y nombre de archivo : versión
donde la primer parte antes [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=244&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>En el <a href="http://datapayasadas.wordpress.com/2009/10/20/actualizador-1era-parte/">artículo previo (Actualizador 1era Parte)</a> llegamos a definir la estructura iba a tener nuestro archivo de actualizaciones, ahora solo nos falta descargar esa información, parsearla y hacer algo útil con ella.</p>
<p>Recuerden que el formato a utilizar en dicho archivo será el siguiente:</p>
<pre class="brush: plain;">ruta relativa y nombre de archivo : versión</pre>
<p>donde la primer parte antes de caracter <strong>:</strong> es la ruta relativa tanto remota como local; y la segunda es la última versión disponible.<br />
Veamoslo con un ejemplo que va a ser más fácil de entender. Suponiendo que mi programa consiste de los siguientes archivos:</p>
<pre class="brush: plain;">C:\Mi Programa\EjecutablePrincipal.exe
C:\Mi Programa\una_carpeta\OtroArchivo.dll
C:\Mi Programa\otro path con espacio\Lala.dll</pre>
<p>En el servidor de actualizaciones tendríamos:</p>
<pre class="brush: plain;">http://miservidor.algo/actualizaciones.txt
http://miservidor.algo/EjecutablePrincipal.exe
http://miservidor.algo/una_carpeta/OtroArchivo.dll
http://miservidor.algo/otro path con espacio/Lala.dll</pre>
<p><span id="more-244"></span></p>
<h2>Procesando la información</h2>
<p>Ahora veremos como podemos obtener la información que necesitamos de ese archivo:</p>
<pre class="brush: csharp;">private const char SEPARADOR_VERSION = ':';

private static Dictionary&lt;string, string&gt; ObtenerVersionesOnline(string ServidorActualizaciones)
{
    Dictionary&lt;string, string&gt; listadoArchivos = new Dictionary&lt;string, string&gt;();
    WebClient clienteWeb = new WebClient();
    string actualizacionesEnCrudo;
    string[] actualizacionesPorLinea, informacionPorFila;

    try
    {
        actualizacionesEnCrudo = clienteWeb.DownloadString(ServidorActualizaciones);
        actualizacionesPorLinea = actualizacionesEnCrudo.Split(Convert.ToChar(&quot;\n&quot;));

        foreach (var actualizacion in actualizacionesPorLinea)
        {
            string infoRuta, infoVersion;
            informacionPorFila = actualizacion.Split(SEPARADOR_VERSION);
            infoRuta = informacionPorFila[0].Trim();
            infoVersion = informacionPorFila[1].Trim();

            if (listadoArchivos.ContainsKey(infoRuta))
                continue;

            listadoArchivos.Add(infoRuta, infoVersion);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, &quot;¡Ocurrió un error al comprobar version online!&quot;, MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        clienteWeb.Dispose();
    }

    return listadoArchivos;
}</pre>
<p>Como verán, el código es bastante simple: descargamos el archivo de texto con la información de las actualizaciones (en nuestro ejemplo sería <em>http://miservidor.algo/actualizaciones.txt</em>), lo desglosamos linea por linea, y luego a cada una la dividimos mediante el separador que habíamos elegido previamente, en éste caso fue el caracter <em>dos puntos</em>. De esta forma tenemos por un lado la ruta relativa (incluyendo el nombre del archivo) y por el otro el número de versión, claro, esto por cada línea. Guardamos esa información en una lista del tipo <em>Dictionary</em> y listo el pollo, pelada la gallina.</p>
<p>El siguiente paso sería utilizar esa información para compararla con las versiones locales de los archivos equivalentes.</p>
<pre class="brush: csharp;">public static bool ComprobarActualizaciones(string ServidorActualizaciones)
{
    Dictionary&lt;string, string&gt; listadoArchivos = ObtenerVersionesOnline(ServidorActualizaciones);

    try
    {
        foreach (var archivo in listadoArchivos)
        {
            string rutaAbsoluta = Path.Combine(Application.StartupPath, archivo.Key);

            if (File.Exists(rutaAbsoluta))
            {
                if (archivo.Value != &quot;?&quot;)
                {
                    Version versionLocal = new Version(FileVersionInfo.GetVersionInfo(rutaAbsoluta).FileVersion);
                    Version versionRemota = new Version(archivo.Value);

                    // De esta forma podemos volver a una versión anterior en caso que encontremos
                    // algun problema importante en un actualización (luego de publicarla)
                    if (versionLocal != versionRemota)
                        return true;
                }
            }
            else
            {
                return true;
            }
        }

        return false;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, &quot;¡Ocurrió un error al comprobar actualizaciones!&quot;, MessageBoxButtons.OK, MessageBoxIcon.Error);
        return false;
    }
}</pre>
<p>Lo que hacemos con éste método es recorrer la lista de actualizaciones (que obtuvimos online), tratamos de encontrar el archivo local correspondiente para cada uno de ellos y comparamos la versiones, por supuesto, solo en el caso de que exista localmente. Realmente no hace falta verificar todos y cada uno de ellos, con que encontremos uno solo desactualizado ya podremos podremos devolver un valor <em>verdadero</em>, que implica que existe al menos una actualización.</p>
<p>Vale la pena notar que en vez de:</p>
<pre class="brush: csharp;">if (versionLocal != versionRemota)
    return true;</pre>
<p>podríamos haber usado:</p>
<pre class="brush: csharp;">if (versionLocal &lt; versionRemota)
    return true;</pre>
<p>No lo he hecho así por una simple razón. Me ha pasado que al publicar una actualización había algo realmente mal en alguna <em>dll</em> incluída, algo que cambie y no me percate que lo había roto hasta que un usuario me avisa. En estos casos prefiero volver atrás una versión para esa <em>librería</em> particular, simplemente modificando el archivo de texto de las actualizaciones, que tener que recompilar la <em>dll</em> asignándole una versión superior.</p>
<p>Otra cosa a tener en cuenta: es posible que en algún momento, necesitemos agregar archivos que no puedan ser versionados, al menos no como .Net lo entiende, por ejemplo, una imagen o icono. En este caso, en vez de asignar una versión en la entrada correspondiente en el archivo de texto de actualizaciones, usaremos un signo de interrogación <strong>?</strong>. De esta forma, lo único que tendremos que verificar es que el archivo local exista, sino, se considera que hace falta una actualización (lo que va a implicar una simple descarga del archivo faltante).</p>
<p><em><strong>Continuará &#8230;</strong></em></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/244/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/244/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/244/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=244&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/10/25/actualizador-2da-parte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>
	</item>
		<item>
		<title>Pimp my Visual Studio / Enchúlame el Visual Studio</title>
		<link>http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/</link>
		<comments>http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 15:34:12 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[Boludeces]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Herramientas]]></category>
		<category><![CDATA[vs2008 color schemes]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=268</guid>
		<description><![CDATA[Levante la mano aquel que todavía no se cansó de ese fondo blanco con letras negras y colores apagados con el que Visual Studio nos tiene acostumbrados desde tiempos inmemoriales. O si sos uno de esos que ya no aguanta más tener los ojos en compota cada vez que te quedas hasta tarde programando, donde [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=268&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Levante la mano aquel que todavía no se cansó de ese fondo blanco con letras negras y colores apagados con el que Visual Studio nos tiene acostumbrados desde tiempos inmemoriales. O si sos uno de esos que ya no aguanta más tener los ojos en compota cada vez que te quedas hasta tarde programando, donde la única fuente de luz es la brillante pantalla de tu notebook o desktop; o si simplemente mirabas <em>Pimp My Ride</em> y te gusta llevarlo a cada extremo de tu vida, hoy tengo la solución para ustedes, y no involucra ningún <strong><em>¡llame ya!</em></strong>.</p>
<div id="attachment_279" class="wp-caption alignnone" style="width: 660px"><img class="size-full wp-image-279" title="Ragnarok Grey" src="http://datapayasadas.files.wordpress.com/2009/10/ragnarok-grey1.png?w=650&#038;h=400" alt="Ragnarok Grey" width="650" height="400" /><p class="wp-caption-text">Ragnarok Grey</p></div>
<p><span id="more-268"></span></p>
<p>Por si todavía no entendieron de que va la mano les cuento: Visual Studio permite cambiar los esquemas de colores por algo más alegre o personalizado. Si son medio vagos, como yo, y no quieren hacer su propio esquema, no hay nada de que preocuparse, hay varios pupulando la red de redes. Personalmente me gusta mucho <strong><em>Ragnarok Grey</em></strong> con la fuente <strong><em>Monaco 9pt</em></strong>.</p>

<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/ragnarok-blue/' title='Ragnarok Blue'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/ragnarok-blue.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Ragnarok Blue" title="Ragnarok Blue" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/ragnarok-grey/' title='Ragnarok Grey'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/ragnarok-grey.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Ragnarok Grey" title="Ragnarok Grey" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/dark_grey/' title='Dark Grey'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/dark_grey.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Dark Grey" title="Dark Grey" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/desert_nights/' title='Desert Nights'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/desert_nights.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Desert Nights" title="Desert Nights" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/distant_shores/' title='Distant Shores'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/distant_shores.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Distant Shores" title="Distant Shores" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/garden_of_eden/' title='Garden of Eden'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/garden_of_eden.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Garden of Eden" title="Garden of Eden" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/moria-alt/' title='Moria Alt'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/moria-alt.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Moria Alt" title="Moria Alt" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/nightingale/' title='Nightingale'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/nightingale.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Nightingale" title="Nightingale" /></a>
<a href='http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/ragnarok-grey-2/' title='Ragnarok Grey'><img width="150" height="92" src="http://datapayasadas.files.wordpress.com/2009/10/ragnarok-grey1.png?w=150&#038;h=92" class="attachment-thumbnail" alt="Ragnarok Grey" title="Ragnarok Grey" /></a>

<p>Estos esquemas y otros más pueden encontrarlos en el blog de <a title="Blog de Tomas Restrepo" href="http://winterdom.com/category/vs-color-scheme">Tomas Restrepo</a> y en el de <a title="Blog de Scott Hanselman" href="http://www.hanselman.com/blog/VisualStudioProgrammerThemesGallery.aspx">Scott Hanselman</a>. Hay versiones tanto para VS2005 como VS2008.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/268/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=268&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/10/22/pimp-my-visual-studio-enchulame-el-visual-studio/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>

		<media:content url="http://datapayasadas.files.wordpress.com/2009/10/ragnarok-grey1.png" medium="image">
			<media:title type="html">Ragnarok Grey</media:title>
		</media:content>
	</item>
		<item>
		<title>Actualizador (1era Parte)</title>
		<link>http://datapayasadas.wordpress.com/2009/10/20/actualizador-1era-parte/</link>
		<comments>http://datapayasadas.wordpress.com/2009/10/20/actualizador-1era-parte/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 13:17:11 +0000</pubDate>
		<dc:creator>Matías</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[actualizador]]></category>
		<category><![CDATA[updater]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=195</guid>
		<description><![CDATA[Buenas,
Esta es la primera parte de una serie de artículos en los que voy a mostrarles como hacer su propio Actualizador para utilizar en sus programas. Todavía no he decidido de cuantas partes va a constar, porque en realidad no he planificado nada, así que si después terminan siendo solo dos, ¡quedan avisados de antemano!.
Comencemos
Por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=195&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Buenas,</p>
<p>Esta es la primera parte de una serie de artículos en los que voy a mostrarles como hacer su propio <em><strong>Actualizador</strong></em> para utilizar en sus programas. Todavía no he decidido de cuantas partes va a constar, porque en realidad no he planificado nada, así que si después terminan siendo solo dos, ¡quedan avisados de antemano!.</p>
<h3><em>Comencemos</em></h3>
<p>Por lo general, siempre que creamos un programa y lo liberamos al público, vemos al (poco) tiempo la necesidad de hacerle algunos retoques ya sea por la aparición de bugs (si, si, aparecen de la nada, no es que estaban y los pasamos por alto, jajaja) que nos reportan nuestros usuarios o porque queremos agregarle nuevas funcionalidades. Sea por lo que sea, una parte importante para mantener un software estable es la capacidad del mismo para informar la existencia de nuevas versiones o mejor aún, auto actualizarse simplificándole la vida al usuario.</p>
<p><span id="more-195"></span></p>
<p>Como ya habrán visto en gran variedad de programas, hay distintas formas de manejar el tema de actualizaciones. Hay que saber poner en la balanza que es lo que queremos: facilitarnos la vida nosotros, como desarrolladores, o simplificarle la vida a nuestros usuarios.</p>
<p>En un extremo, podríamos solamente comprobar  un archivo de texto online con la referencia a la última versión. Ese número lo comparamos con el assembly local y en caso de ser diferente redirigimos al usuario a la página de descarga para que él mismo se encargue de todo el proceso (o le preguntamos mejor si quiere ir allí). Como verán, esto es muy simple de implementar, sin embargo, lo más probable es que terminemos molestando al usuario.</p>
<p>Por otro lado también he visto programas donde lo que se hace luego de comprobar la versión online, es solicitar permiso al usuario para descargar el nuevo instalador, es decir, la versión actualizada, dentro del mismo programa. Cuando finaliza la descarga se cierra el programa principal, se ejecuta el instalador y listo. Sin embargo hay un pequeño problema en este escenario, ¿qué pasa si el usuario no tiene permisos suficientes para instalar un programa?. También podríamos decir que no es lo mejor cuando queremos que nuestro programa sea <em><strong>portable</strong></em>, aunque en este caso hay algunos <em>work-around</em> para hacer un <em>falso </em>instalador que no escriba en el registro de Windows.</p>
<p>Si bien existen algunas soluciones ya integradas en .Net y de simple aplicación con Visual Studio, como ser <a title="Click Once Deployment" href="http://msdn.microsoft.com/en-us/library/t71a733d%28VS.80%29.aspx">Click Once</a>, hay veces que requerimos de algo más personalizado y que se ajuste mejor a nuestras necesidades. Por este motivo es que he decidido mostrarles la solución que encontré yo para uno de mis proyectos, con esto quiero decir que <strong><em>no lo tomen como una solución universal</em></strong>, cada caso requiere un detallado análisis para poder evaluar cuál se ajusta más.</p>
<p>Para empezar vamos a necesitar dejar en claro que es lo que hace o debería hacer un <em><strong>Actualizador</strong></em>:</p>
<ul>
<li>Comparar versiones locales de archivos con algún repositorio remoto, y en caso de hacer falta descargar actualizaciones.</li>
<li>Armar un listado de los archivos a medida que se van reemplazando para hacer un rollback en el caso que algo salga mal.</li>
<li>Ser capaz no solo de actualizar otros programas, sino también, de actualizarse a si mismo.</li>
</ul>
<p>Esos son los puntos básicos y necesarios sobre los cuales nos vamos a poner a trabajar.</p>
<h2>Planteando la estructura</h2>
<p>Nuestro programa va a contar con tres funciones principales:</p>
<ol>
<li>Comprobar actualizaciones</li>
<li>Descargar actualizaciones</li>
<li>Limpiar restos del proceso</li>
</ol>
<p>Más adelante pasaré a detallar un poco más cada uno de ellos, por el momento todavía falta definir como se van a almacenar las versiones en el servidor remoto.</p>
<p>La forma más fácil sería definir un archivo donde vamos a detallar la ruta relativa de cada componente dentro de la carpeta principal de nuestro programa y la versión online.</p>
<p>Por ejemplo:</p>
<pre class="brush: plain;">EjecutablePrincipal.exe - Versión online: 2.0.0.1
una_carpeta\OtroArchivo.dll - Versión online: 2.0.0.2
otro path con espacio\Lala.dll - Versión online: 1.3.0.0
</pre>
<p>Como verán, ésta puede no ser la mejor forma de hacerlo, primero porque ¿que pasaría si la ruta de acceso contiene el caracter <strong>-</strong> (guión medio)?: no podríamos separar fácilmente la versión de ella. ¿Lo ven?, entonces podríamos mejorar un poco esto. Pensemos en los caracteres inválidos para la ruta de acceso, así podemos tomar uno y tener la certeza de que no nos va a afectar al intentar separar ambas partes.</p>
<p>Como sabrán, o posiblemente no, el caracter <strong>: </strong>(dos puntos) no es válido para nombres de archivo, por lo tanto, no va a existir en una <em><strong>ruta relativa</strong></em>. <strong>¡Cuidado acá!</strong>, si ustedes desean mejorar este programa y utilizar rutas absolutas, dicho caracter puede aparecer luego de la letra de la unidad.</p>
<p>Pueden ver una lista de caracteres no válidos al intentar renombrar un archivo agregándole <strong>:</strong>.</p>
<div id="attachment_208" class="wp-caption alignnone" style="width: 344px"><img class="size-full wp-image-208" title="Caracteres no válidos" src="http://datapayasadas.files.wordpress.com/2009/10/caracteres_invalidos.png?w=334&#038;h=59" alt="Caracteres no válidos" width="334" height="59" /><p class="wp-caption-text">Caracteres no válidos</p></div>
<p>Como se puede apreciar, el caracter <strong>|</strong> también lo podríamos utilizar.</p>
<p>Bueno, no nos vayamos por las ramas que después nos va a salir a perseguir Tarzán &#8230; estábamos buscando una forma de mejorar la estructura inicial que propuse para el archivo de actualización.</p>
<p>¿Qué les parece el siguiente?</p>
<pre class="brush: plain;">EjecutablePrincipal.exe        : 2.0.0.1
una_carpeta\OtroArchivo.dll    : 2.0.0.2
otro path con espacio\Lala.dll : 1.3.0.0</pre>
<p>Como verán, ahora no solo es más fácil identificar los archivos y rutas, sino también comparar las versiones, e incluso terminamos con un texto más fácil de parsear. Se habrán dado cuenta que estoy usando texto simple por comodidad y para que les resulte fácil a los que recién empiezan, pero si lo desean,<strong><em> podrían extender esto para utilizar XML, JSON, o algún otro formato que sea de su agrado</em></strong>.</p>
<p>También es bueno notar que hay infinitas formas de darle un formato a este archivo, incluso podrían usar un separador compuesto de múltiples caracteres, pero recuerden  prestar especial atención para no generar algún conflicto con los posibles nombres de archivos y rutas de acceso.</p>
<pre class="brush: plain;">EjecutablePrincipal.exe        |:==:| 2.0.0.1
una_carpeta\OtroArchivo.dll    |:==:| 2.0.0.2
otro path con espacio\Lala.dll |:==:| 1.3.0.0</pre>
<p>Se podrían estar preguntando por qué es necesario especificar la versión remota, si en definitiva se puede consultar una vez descargado el archivo mediante <em><strong>Reflection</strong></em>; bien, ahí radica el problema, primero deberemos descargar el o los archivos. Si nos detenemos un momento a pensar esto, puede ser que no todos nuestros usuarios cuenten con una conexión de banda ancha, con lo cual hacerle descargar todo el paquete que conforma la actualización y luego preguntarle si la quiere sonaría, cuando menos, ridículo. En el caso que no desee aceptarla, los habremos descargado inútilmente generando una carga innecesaria en nuestro servidor de actualizaciones y además, consumiendo recursos que podrían llegar a ser limitados o escasos.</p>
<p><em><strong><a href="http://datapayasadas.wordpress.com/2009/10/25/actualizador-2da-parte/">Continúa en Actualizador (2da Parte)</a></strong></em></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/195/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/195/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/195/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=195&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/10/20/actualizador-1era-parte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/498533c930f074f8a973101b65a22d0c?s=96&#38;d=" medium="image">
			<media:title type="html">matias</media:title>
		</media:content>

		<media:content url="http://datapayasadas.files.wordpress.com/2009/10/caracteres_invalidos.png" medium="image">
			<media:title type="html">Caracteres no válidos</media:title>
		</media:content>
	</item>
		<item>
		<title>IDataPayasadas: Trabajando con Interfaces</title>
		<link>http://datapayasadas.wordpress.com/2009/10/19/idatapayasadas-trabajando-con-interfaces/</link>
		<comments>http://datapayasadas.wordpress.com/2009/10/19/idatapayasadas-trabajando-con-interfaces/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 12:00:19 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[interfaces]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=221</guid>
		<description><![CDATA[Buenas amigos! Hoy vamos a hablar un poquito sobre el uso de interfaces. ¿Qué son? ¿Para qué sirven? ¿Cómo usarlas? Éstas son algunas de las interrogantes que intentaremos responder.
¿Qué son?
Las interfaces son un conjunto de miembros abstractos (es decir, que no proveen una implementación por defecto) definidos bajo un nombre. Dichos miembros pueden ser por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=221&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Buenas amigos! Hoy vamos a hablar un poquito sobre el uso de interfaces. ¿Qué son? ¿Para qué sirven? ¿Cómo usarlas? Éstas son algunas de las interrogantes que intentaremos responder.</p>
<p>¿Qué son?</p>
<p>Las interfaces son un conjunto de miembros <strong>abstractos </strong>(es decir, que no proveen una implementación por defecto) definidos bajo un nombre. Dichos miembros pueden ser por ejemplo métodos.</p>
<p>¿Para qué sirven?</p>
<p>Las interfaces expresan un protocolo o un comportamiento que las clases o estructuras <strong>deben</strong> implementar. Podemos pensarlo como un contrato que aceptan las clases si quieren implementar ese protocolo.</p>
<p>¿Cómo se usan?</p>
<p>Veamos un ejemplo para aclarar el panorama. Supongamos que tenemos la siguiente interface:</p>
<p><span id="more-221"></span></p>
<pre class="brush: csharp;">
public interface IDataPayasadas
{
     //Propiedades
     string Mensaje { get; set; }
     //Métodos
     void Saludo();
}
</pre>
<p>Un método Saludo y una propiedad Mensaje.</p>
<p>Supongamos que tenemos la siguiente clase:</p>
<pre class="brush: csharp;">
public class MyDataPayasadas : IDataPayasadas
{
     string Mensaje { get; set; }
     void Saludo()
     {
          Console.Write(string.Format(&quot;Hola mundo! Te traigo un mensaje: {0}&quot;, Mensaje);
     }
}
</pre>
<p>¿Qué fue lo que pasó? Simplemente implementamos la interface IDataPayasadas. ¿Y con eso qué gano? No mucho. Pero, ¿qué pasa si tengo otra clase que implementa IDataPayasadas y quiero usarlas indistintamente? Supongamos la clase:</p>
<pre class="brush: csharp;">
public class MyDataPayasadasNuevo : IDataPayasadas
{
     string Mensaje { get; set; }
     void Saludo()
     {
          MessageBox.Show(Mensaje);
     }
}
</pre>
<p>Aquí es donde se ve el beneficio de usar interfaces, ya que puedo llamar al método Saludo indistintamente de su implementación:</p>
<pre class="brush: csharp;">
public class Program
{
     void Main()
     {
          IDataPayasadas saludo1 = new MyDataPayasadas();
          saludo1.Mensaje = &quot;hola&quot;;
          saludo1.Saludo();

          IDataPayasadas saludo2 = new MyDataPayasadasNuevo();
          saludo2.Mensaje = &quot;hola&quot;;
          saludo2.Saludo();
     }
}
</pre>
<p>MyDataPayasadas y MyDataPayasadasNuevo tienen formas diferentes de mostrar el mensaje, pero como implementan la interface IDataPayasadas puedo estar tranquilo de que si o si van a tener una propiedad Mensaje y un método Saludo.</p>
<p>También podemos implementar más de una interface. La forma de hacerlo es:</p>
<pre class="brush: csharp;">
public class MyClase : IDataPayasadas, ICloneable
{
     ...
}
</pre>
<p>También puede ser que una clase derive de otra y a la vez implemente varias interfaces:</p>
<pre class="brush: csharp;">
public class MyClase : MyClaseBase, IDataPayasadas, ICloneable
{
     ...
}
</pre>
<p>Podemos verificar si una clase implementa una interface mediante la palabra clave <code>is</code>:</p>
<pre class="brush: csharp;">
if(MyDataPayasadas is IDataPayasadas)
{
     MyDataPayasadas.Saludo();
}
else
{
     Console.Write(&quot;No implementa IDataPayasadas&quot;);
}
</pre>
<p>¿Cuál es la diferencia con una Clase Base Abstractas?</p>
<p>Las clases base abstractas además pueden definir constructores, variables de campo, miembros no abstractos (con implementación), etc.</p>
<p>En cambio las interfaces solo definen miembros abstractos.</p>
<p>Hay toda una serie de escenarios y motivos por los cuales son diferentes, pero escapa del objetivo de este post que es acercarles una introducción a lo que son las interfaces y para que pueden ser útiles.</p>
<p>Resumiendo:</p>
<ul>
<li>Las interfaces son puro protocolo: definen qué comportamientos debe tener la clase, pero no se puede definir cómo implementarlos.</li>
<li>Los miembros son por defecto públicos y abstractos. No es necesario definir el scope de cada miembro.</li>
<li>No puede contener variables de campo</li>
<li>No puede definir constructores</li>
<li>No puede contener implementaciónes</li>
<li>Las interfaces no se pueden instanciar!!! (No intenten hacer IDataPayasadas dp = new IDataPayasadas();)</li>
<li>Las interfaces se pueden usar como tipo, por lo tanto podemos pasarlas como parámetros, como tipo de retorno de un método, podemos crear arrays de interfaces (IDataPayasadas[] dps = {new MyDataPayasadas(), new MyDataPayasadasNuevo()};)</li>
</ul>
<p>Espero que les sea de utilidad! Cualquier duda o sugerencia pregunten nomas. Saludos!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/221/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/221/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/221/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/221/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/221/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/221/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/221/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/221/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/221/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/221/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=221&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/10/19/idatapayasadas-trabajando-con-interfaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Hack Reporting Services 2005 y la división por cero</title>
		<link>http://datapayasadas.wordpress.com/2009/09/15/hack-reporting-services-2005-y-la-division-por-cero/</link>
		<comments>http://datapayasadas.wordpress.com/2009/09/15/hack-reporting-services-2005-y-la-division-por-cero/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 12:14:15 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[Reporting Services]]></category>
		<category><![CDATA[División por cero]]></category>
		<category><![CDATA[Expresiones]]></category>
		<category><![CDATA[Hack]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=191</guid>
		<description><![CDATA[Buenas amigos&#8230; me he encontrado con este problemita de la división por cero en Reporting Services 2005.
Lo primero que pensé fue en hacer algo como esto:
=IIF(Fields!Numerador.Value &#60;&#62; 0, (Fields!Numerador.Value) / (Fields!Denominador.Value), 0)
Pero resulta que el IIF siempre ejecuta tanto la expresión de la parte verdadera como la expresión de la parte falsa y por eso [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=191&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Buenas amigos&#8230; me he encontrado con este problemita de la división por cero en Reporting Services 2005.</p>
<p>Lo primero que pensé fue en hacer algo como esto:</p>
<pre class="brush: sql;">=IIF(Fields!Numerador.Value &lt;&gt; 0, (Fields!Numerador.Value) / (Fields!Denominador.Value), 0)</pre>
<p>Pero resulta que el IIF <strong>siempre</strong> ejecuta tanto la expresión de la parte verdadera como la expresión de la parte falsa y por eso siempre va a devolver #Error.</p>
<p>Ahora bien, una pequeña chanchada que podemos hacer para evitar ésto es:</p>
<pre class="brush: sql;">=IIF(Fields!Numerador.Value &lt;&gt;  0, (Fields!Numerador.Value) / (IIF(Fields!Denominador.Value &lt;&gt; 0, Fields!Denominador.Value  0, 1), 0)</pre>
<p>Qué fue lo que hicimos? Simplemente engañamos al IIF cuando el denominador es 0. Cuando eso ocurre de todas formas el primer IIF va a devolver 0 pero ya la expresion (Fields!Numerador.Value) / (Fields!Denominador.Value) no va a dar #Error ya que estaríamos dividiendo por 1 y no por 0.</p>
<p>No es lo mejor ni lo mas óptimo, pero remitiendome a las palabras de mi amigo Carlos A.:<br />
&#8220;Primero que funcione, despues que funcione bien, y por último que funcione como uno quiere.&#8221;</p>
<p>Salutes!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/191/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/191/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/191/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=191&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/09/15/hack-reporting-services-2005-y-la-division-por-cero/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Recuperar el QueryString en un WebPart de SharePoint</title>
		<link>http://datapayasadas.wordpress.com/2009/09/11/recuperar-el-querystring-en-un-webpart-de-sharepoint/</link>
		<comments>http://datapayasadas.wordpress.com/2009/09/11/recuperar-el-querystring-en-un-webpart-de-sharepoint/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 19:01:48 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[SharePoint]]></category>
		<category><![CDATA[QueryString]]></category>
		<category><![CDATA[WebPart]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=183</guid>
		<description><![CDATA[Para recuperar un parametro del QueryString en un WebPart de SharePoint:
Supongamos que queremos recuperar el valor de tipo int del Parametro IdProyecto en el QueryString:

using System.Web;
.
.
.

int idProyecto = Convert.ToInt32(HttpContext.Current.Params[&#34;IdProyecto&#34;]);

Espero que les sirva. Saludos!
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=183&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Para recuperar un parametro del QueryString en un WebPart de SharePoint:</p>
<p>Supongamos que queremos recuperar el valor de tipo int del Parametro IdProyecto en el QueryString:</p>
<pre class="brush: csharp;">
using System.Web;
.
.
.

int idProyecto = Convert.ToInt32(HttpContext.Current.Params[&quot;IdProyecto&quot;]);
</pre>
<p>Espero que les sirva. Saludos!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=183&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/09/11/recuperar-el-querystring-en-un-webpart-de-sharepoint/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Parámetros Multivalor con Reporting Services 2005 y ASP.NET ReportViewer</title>
		<link>http://datapayasadas.wordpress.com/2009/09/11/parametros-multivalor-con-reporting-services-2005-y-asp-net-reportviewer/</link>
		<comments>http://datapayasadas.wordpress.com/2009/09/11/parametros-multivalor-con-reporting-services-2005-y-asp-net-reportviewer/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 18:21:53 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Reporting Services]]></category>
		<category><![CDATA[Report Viewer]]></category>
		<category><![CDATA[Reporting Services 2005]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=174</guid>
		<description><![CDATA[Buenasss como les va? Esta vez me trae por aquí este tema de los reportes. Resulta que me han pedido que haga un reporte donde pueda filtrar los valores a mostrar en el reporte pero desde el Report Viewer en una página Aspx&#8230;
Empecemos por el reporte. Supongamos que tenemos un reporte que debe mostrar un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=174&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Buenasss como les va? Esta vez me trae por aquí este tema de los reportes. Resulta que me han pedido que haga un reporte donde pueda filtrar los valores a mostrar en el reporte pero desde el Report Viewer en una página Aspx&#8230;</p>
<p>Empecemos por el reporte. Supongamos que tenemos un reporte que debe mostrar un listado de proyectos y quiero elegir cuales mostrar y cuales no. </p>
<p><span id="more-174"></span></p>
<p>El reporte es bastante sencillo de hacer:</p>
<li>Crear un DataSource para conectarse a la base de datos</li>
<li>Crear un DataSet con una consulta que tenga la siguiente forma:</li>
<pre class="brush: sql;">
SELECT ID, Nombre, Descripcion FROM Proyectos WHERE ID IN(@IdProyectos)
</pre>
<p>@IdProyectos es un parámetro del reporte que admite múltiples valores.</p>
<p>Finalmente le damos el estilo visual al reporte, agregando una tabla con los campos del DataSet.</p>
<p>Hasta aquí es bastante sencillo.</p>
<p>Luego, en nuestra página ASPX agregamos un ListBox, un botón (para cargar el reporte) y el ReportViewer.</p>
<p>Luego, para pasarle los valores al reporte:</p>
<pre class="brush: csharp;">

BindingList parametrosReporte = new BindingList();&lt;/code&gt;

ReportParameter idProyectos = new ReportParameter(&quot;IdProyectos&quot;);

for (int i = 0; i &lt; listProyectos.Items.Count; i++)
{
        idProyectos.Values.Add(listProyectos.Items[i].Value;
}

parametrosReporte.Add(idProyectos);
</pre>
<p>Con esto creamos un parámetro de reporte y lo agregamos a la colección. Luego tenemos que asignar estos parámetros al ReportViewer que insertamos en la página. Para ello podemos usar el siguiente código:</p>
<pre class="brush: csharp;">
try
{
        ReportViewer1.ServerReport.SetParameters(parametrosReporte);
}
catch
{
        //Manejamos la excepción
}
</pre>
<p>Y listo. Espero que les sea de utilidad!!!</p>
<p>Saludos</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/174/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/174/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/174/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=174&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/09/11/parametros-multivalor-con-reporting-services-2005-y-asp-net-reportviewer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Response.Redirect en una ventana nueva</title>
		<link>http://datapayasadas.wordpress.com/2009/06/04/response-redirect-en-una-ventana-nueva/</link>
		<comments>http://datapayasadas.wordpress.com/2009/06/04/response-redirect-en-una-ventana-nueva/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 16:11:29 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[ASP.NET]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=161</guid>
		<description><![CDATA[Buenas. Hoy me topé con un problemita. Tenia que abrir en una ventana nueva una página pasandole un parametro por query string. Como lo estaba haciendo del lado del servidor me encontré con que Response.Redirect no tiene forma de pasarle el target ya que esto es un concepto del lado cliente.
Por suerte encontré este snippet [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=161&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Buenas. Hoy me topé con un problemita. Tenia que abrir en una ventana nueva una página pasandole un parametro por query string. Como lo estaba haciendo del lado del servidor me encontré con que Response.Redirect no tiene forma de pasarle el target ya que esto es un concepto del lado cliente.</p>
<p>Por suerte encontré este snippet que funcionó:</p>
<pre class="brush: csharp;">
Response.Write(&quot;&lt;script type='text/javascript'&gt;window.open('TuPagina.aspx?parametro=1');&lt;/script&gt;&quot;);
</pre>
<p>La desventaja que tiene esto es que se produce un Postback en la página que hace el llamado. Si necesitamos generar la URL en forma dinámica esta es una buena alternativa. Espero que les sea útil!</p>
<p>Saludos</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=161&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/06/04/response-redirect-en-una-ventana-nueva/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
		<item>
		<title>Obtener WorkItems de TFS mediante código C#</title>
		<link>http://datapayasadas.wordpress.com/2009/06/04/obtener-workitems-de-tfs-mediante-codigo-c/</link>
		<comments>http://datapayasadas.wordpress.com/2009/06/04/obtener-workitems-de-tfs-mediante-codigo-c/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 15:53:39 +0000</pubDate>
		<dc:creator>pabloide86</dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[TFS]]></category>
		<category><![CDATA[WorkItems]]></category>

		<guid isPermaLink="false">http://datapayasadas.wordpress.com/?p=164</guid>
		<description><![CDATA[Recientemente me tocó armar una pequeña aplicación que debía tomar desde el repositorio de Team Foundation Server los items de trabajo de todos los proyectos asignados a mí, que no hayan sido completados o eliminados.

Para ello utilicé el siguiente código:

private WorkItemCollection GetTareasTFS()
    {
        try
  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=164&subd=datapayasadas&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Recientemente me tocó armar una pequeña aplicación que debía tomar desde el repositorio de Team Foundation Server los items de trabajo de todos los proyectos asignados a mí, que no hayan sido completados o eliminados.</p>
<p><span id="more-164"></span></p>
<p>Para ello utilicé el siguiente código:</p>
<pre class="brush: csharp;">
private WorkItemCollection GetTareasTFS()
    {
        try
        {
            string serverTFS = &quot;http://servidor:puerto&quot;; //El puerto generalmente es 8080

            // Creo la conexión y pido credenciales si no las tengo
            TeamFoundationServer tfsServer = TeamFoundationServerFactory.GetServer(serverTFS, new UICredentialsProvider());
            tfsServer.EnsureAuthenticated();

            //Obtengo el WorkItemStore
            WorkItemStore workItemStore = tfsServer.GetService(typeof(WorkItemStore)) as WorkItemStore;

            //Creo una consulta que trae todos los items que no fueron terminados ni eliminados
            //y que fueron asignados a mi
            string query = string.Format(&quot;SELECT [System.Id], [System.WorkItemType],&quot; +
                &quot; [System.State], [System.AssignedTo], [System.Title] &quot; +
                &quot; FROM WorkItems &quot; +
                &quot; WHERE [System.Title] &lt;&gt; '' AND [System.State] &lt;&gt; 'Done' AND [System.State] &lt;&gt; 'Deleted' AND [System.ChangedBy] = '{0}'&quot; +
                &quot; ORDER BY [System.WorkItemType], [System.Id]&quot;, tfsServer.AuthenticatedUserDisplayName);
            //Ejecuto la consulta
            WorkItemCollection workItemCollection = workItemStore.Query(query);

            //Devuelvo la colección de workItems
            return workItemCollection;
        }
        catch (Exception ex)
        {
            //Manejo la excepción
        }
    }
</pre>
<p>Ademas hay que agregar referencias a los siguientes assemblies:</p>
<ul>
<li>Microsoft.TeamFoundation.Client</li>
<li>Microsoft.TeamFoundation.WorkItemTracking.Client</li>
</ul>
<p>Es bastante sencillo. A partir de ahí puedo iterar sobre la colección para sacar los campos que me interesan, o bien bindear la colección a algún control. Espero que les sea útil!</p>
<p>Saludos!</p>
<p>UPDATE! Para que esto funcione deberemos tener instalado el Team Explorer!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/datapayasadas.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/datapayasadas.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/datapayasadas.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/datapayasadas.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/datapayasadas.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/datapayasadas.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/datapayasadas.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/datapayasadas.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/datapayasadas.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/datapayasadas.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=datapayasadas.wordpress.com&blog=3707397&post=164&subd=datapayasadas&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://datapayasadas.wordpress.com/2009/06/04/obtener-workitems-de-tfs-mediante-codigo-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/6f7927a7c2c6558264298a1350df50c8?s=96&#38;d=" medium="image">
			<media:title type="html">Gnanduuu</media:title>
		</media:content>
	</item>
	</channel>
</rss>