<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8807459026660690490</atom:id><lastBuildDate>Sat, 14 Sep 2024 13:44:55 +0000</lastBuildDate><title>Haciendo una vida más fácil</title><description>Software, entornos web y dispositivos móviles, integración de tecnologías Microsoft y Google</description><link>http://jcantos.blogspot.com/</link><managingEditor>noreply@blogger.com (Javier Cantos)</managingEditor><generator>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:image href="http://profile.ak.fbcdn.net/hprofile-ak-snc4/187181_1011540756_6028822_n.jpg"/><itunes:keywords>Microsoft,Google,Android,NET</itunes:keywords><itunes:summary>Software, entornos web y dispositivos móviles, integración de tecnologías Microsoft y Google</itunes:summary><itunes:subtitle>Haciendo una vida más fácil</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:author>Javier Cantos</itunes:author><itunes:owner><itunes:email>jcantos@gmail.com</itunes:email><itunes:name>Javier Cantos</itunes:name></itunes:owner><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-6559780017960879552</guid><pubDate>Tue, 19 Apr 2011 18:09:00 +0000</pubDate><atom:updated>2011-04-19T20:09:06.661+02:00</atom:updated><title>Crear una sección personalizada en Umbraco (II)</title><description>&lt;h3&gt;&lt;a href="http://lh5.ggpht.com/_qugalmxwkz0/Ta3PvPGn88I/AAAAAAAAB7Y/Z5U1EIvtdmU/s1600-h/prueba_umbraco%5B3%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 14px 0px 17px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="prueba_umbraco" border="0" alt="prueba_umbraco" src="http://lh6.ggpht.com/_qugalmxwkz0/Ta3PvkNKblI/AAAAAAAAB7c/ak_O5Qos26Y/prueba_umbraco_thumb%5B1%5D.png?imgmax=800" width="507" height="423"&gt;&lt;/a&gt;&lt;/h3&gt; &lt;h3&gt;Creando el icono de la nueva sección&lt;/h3&gt; &lt;p&gt;Antes que nada vamos a eliminar los archivos temporales situados en la ruta: &lt;strong&gt;\App_Data\TEMP&lt;/strong&gt;, no olvidéis este paso porque me pasé un buen ratito hasta dar con la tecla de donde se encontraba la caché de la hoja de estilos.&lt;/p&gt; &lt;p&gt;Ahora, vamos a la carpeta &lt;strong&gt;\umbraco\images\tray\traySprites.png &lt;/strong&gt;y modificamos el archivo gráfico con nuestro editor favorito, solo hemos de tener en cuenta que la separación entre iconos debe ser de &lt;strong&gt;72 pixles&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Después, abrimos la hoja de estilos &lt;strong&gt;\umbraco\css\umbracoGui.css &lt;/strong&gt;y añadimos la clase que creamos en la tabla &lt;strong&gt;UmbracoApp&lt;/strong&gt; y campo &lt;strong&gt;appIcon&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;.trayjcantos { background-position: -18px -594px;}&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Añadiendo el nombre de la sección al archivo de recurso local&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;Localizamos el archivo de recurso para el que hemos configurado el sitio web e idioma predeterminado, en nuestra caso &lt;strong&gt;\umbraco\config\lang\es.xml &lt;/strong&gt;y añadimos la entrada:&lt;/p&gt;&lt;pre&gt;&amp;lt;area alias="sections"&amp;gt;&lt;br /&gt;(...)&lt;br /&gt;&amp;lt;key alias="jcantos"&amp;gt;Javi Cantos&amp;lt;/key&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Presta atención de que el valor de la propiedad alias en el elemento key debe ser el mismo que pusimos en la tabla &lt;strong&gt;UmbracoApp&lt;/strong&gt; y campo &lt;strong&gt;appAlias&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;&lt;/h3&gt;&lt;br /&gt;&lt;h3&gt;Incluyendo los nodos de la nueva sección&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;La inclusión de los nuevos nodos debe realizarse desde un proyecto externo de tipo &lt;strong&gt;asp.net&lt;/strong&gt; y que después será referenciado y añadido al sitio web de &lt;em&gt;umbraco&lt;/em&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Para la nueva sección crearemos dos páginas, la primera la llamaremos &lt;em&gt;MantCategorias.aspx&lt;/em&gt; y la segunda &lt;em&gt;MantProductos.aspx&lt;/em&gt;, cada una de estas páginas contiene la lógica necesaria para lo que pretendemos en cada caso, un mantenimiento de categorías y otro de productos.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Como el nombre de la aplicación que hemos elegido es jcantos debemos de: &lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Crear un nuevo proyecto donde añadir las referencias &lt;em&gt;umbraco.dll&lt;/em&gt; e &lt;em&gt;interfaces.dll&lt;/em&gt;, estas la podéis encontrar en el directorio bin de umbraco.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Añadimos dos páginas MantCategorias.aspx y MantProductos.aspx, aquí incluimos el código de la lógica para ambos mantenimientos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Creamos y añadimos una clase a nuestro proyecto a la que podemos llamar &lt;strong&gt;loadjcantos, &lt;/strong&gt;este el tipo que debemos poner en el campo &lt;em&gt;treeHandlerType de la tabla &lt;/em&gt;&lt;strong&gt;UmbracoAppTree&lt;/strong&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Comprobamos el valor del campo &lt;em&gt;treeHandlerAssembly &lt;/em&gt;de la tabla &lt;strong&gt;UmbracoAppTree&lt;/strong&gt;, en nuestro caso &lt;em&gt;PruebaUmbraco, &lt;/em&gt;sin la extensión .dll&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Por otra parte, crear una carpeta dentro del directorio umbraco que se llame jcantos, nos debería quedar así &lt;strong&gt;\umbraco\jcantos, &lt;/strong&gt;en esta carpeta es donde copiamos los aspx mencionados anteriormente.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copiar al directorio bin de umbraco la librería resultante de nuestro nuevo proyecto.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Os dejo el código fuente de la clase loadjcantos:&lt;/p&gt;&lt;pre&gt;&lt;font size="1"&gt;using System;&lt;br /&gt;using System.Text;&lt;br /&gt;using umbraco.cms.presentation.Trees;&lt;br /&gt;&lt;br /&gt;namespace PruebaUmbraco&lt;br /&gt;{&lt;br /&gt;    public class loadjcantos : BaseTree&lt;br /&gt;    {&lt;br /&gt;        public loadNewsletter(string application)&lt;br /&gt;            : base(application)&lt;br /&gt;        { }&lt;br /&gt;&lt;br /&gt;        protected override void CreateRootNode(ref XmlTreeNode rootNode)&lt;br /&gt;        {&lt;br /&gt;            rootNode.Icon = FolderIcon;&lt;br /&gt;            rootNode.OpenIcon = FolderIconOpen;&lt;br /&gt;            rootNode.NodeType = "init" + TreeAlias;&lt;br /&gt;            rootNode.NodeID = "init";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &lt;br /&gt;        /// Override the render method to create the newsletter tree&lt;br /&gt;        /// &lt;br /&gt;        /// &lt;br /&gt;        public override void Render(ref XmlTree Tree)&lt;br /&gt;        {&lt;br /&gt;            // Nodo mantenimiento de categorías&lt;br clear="all"&gt;            &lt;/font&gt;&lt;font size="1"&gt;var mtoCategorias = XmlTreeNode.Create(this);&lt;br /&gt;            mtoCategorias.Text = "Mantenimiento de categorías";&lt;br /&gt;            mtoCategorias.Icon = "docPic.gif";&lt;br /&gt;            mtoCategorias.Action = "javascript:openMtoCateogorias()";&lt;br /&gt;            // añadimos el nodo al árbol&lt;br clear="all"&gt;            Tree.Add(mtoCategorias);&lt;br /&gt;&lt;br /&gt;            // Nodo mantenimiento de productos&lt;br /&gt;            var mtoProductos = XmlTreeNode.Create(this);&lt;br /&gt;            mtoProductos.Text = "Mantenimiento de productos";&lt;br /&gt;            mtoProductos.Icon = "docPic.gif";&lt;br /&gt;            mtoProductos.Action = "javascript:openMtoProductos()";&lt;br /&gt;            // añadimos el nodo al árbol&lt;br /&gt;            Tree.Add(mtoProductos);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public override void RenderJS(ref StringBuilder Javascript)&lt;br /&gt;        {&lt;br /&gt;            Javascript.Append(@"&lt;br /&gt;                function openMtoCategorias() {&lt;br /&gt;                    parent.right.document.location.href = 'jcantos/MantCategorias.aspx';&lt;br /&gt;                }&lt;br /&gt;			");&lt;br /&gt;&lt;br /&gt;            Javascript.Append(@"&lt;br /&gt;                function openMtoProductos() {&lt;br /&gt;                    parent.right.document.location.href = 'jcantos/MantProductos.aspx';&lt;br /&gt;                }&lt;br /&gt;			");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Resultado final&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;El resultado final es una plena integración de componentes personalizados que pueden ser administrados directamente desde la propia plataforma, sin necesidad de crear nuevos espacios webs que contengan las piezas que no encajen en el estándar de &lt;em&gt;Umbraco&lt;/em&gt;.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_qugalmxwkz0/Ta3Pv36TMRI/AAAAAAAAB7g/5qShXjydm7E/s1600-h/resultado_section%5B4%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="resultado_section" border="0" alt="resultado_section" src="http://lh5.ggpht.com/_qugalmxwkz0/Ta3PwV6G3KI/AAAAAAAAB7k/_-5DdA12lCs/resultado_section_thumb%5B2%5D.png?imgmax=800" width="502" height="360"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;font size="2"&gt;Fuente: &lt;/font&gt;&lt;a href="http://www.geckonewmedia.com/blog/2009/8/3/how-to-create-a-custom-section-in-umbraco-4"&gt;&lt;font size="2"&gt;http://www.geckonewmedia.com/blog/2009/8/3/how-to-create-a-custom-section-in-umbraco-4&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;  </description><link>http://jcantos.blogspot.com/2011/04/crear-una-seccion-personalizada-en_19.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh6.ggpht.com/_qugalmxwkz0/Ta3PvkNKblI/AAAAAAAAB7c/ak_O5Qos26Y/s72-c/prueba_umbraco_thumb%5B1%5D.png?imgmax=800" width="72"/><thr:total>0</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-5149580801790093510</guid><pubDate>Fri, 15 Apr 2011 17:05:00 +0000</pubDate><atom:updated>2011-04-15T19:05:03.029+02:00</atom:updated><title>Crear una sección personalizada en Umbraco (I)</title><description>&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_qugalmxwkz0/Tah6tdDbrdI/AAAAAAAAB7Q/MGoj2l9SZ6E/s1600-h/seccion_umbraco5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 13px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="seccion_umbraco" border="0" alt="seccion_umbraco" src="http://lh3.ggpht.com/_qugalmxwkz0/Tah6uE6qiXI/AAAAAAAAB7U/BhIva7g3hGk/seccion_umbraco_thumb3.png?imgmax=800" width="506" height="337"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Una de las cosas que más me ha sorprendido de este CMS es la cierta facilidad para crear nuevas secciones y ser incorporadas al panel de administración. &lt;/p&gt; &lt;p&gt;Con estas breves instrucciones que veremos a continuación vamos a tunear, tunear en todas sus reglas y además de forma oficial con nuevas características que nos permitirán poner nuestro CMS al doscientos por ciento.&lt;/p&gt; &lt;h3&gt;Empezamos por la base de datos&lt;/h3&gt;  Empezaremos por localizar las siguientes tablas en la nueva base de datos generada en la instalación de Umbraco.&lt;br clear="all"&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;umbracoApp, &lt;/strong&gt;en esta tabla se almacén todas las secciones que se encuentran disponibles.  &lt;li&gt;&lt;strong&gt;umbracoAppTree&lt;/strong&gt;, aquí especificamos los datos del nuevo nodo como el nombre de la librería o la clase de inicialización.  &lt;li&gt;&lt;strong&gt;umbracoUser2app&lt;/strong&gt;, aquí definimos los permisos para la nueva sección.&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;&amp;nbsp;&lt;/h4&gt; &lt;h4&gt;Tabla UmbracoApp&lt;br clear="all"&gt;&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;sortOrder:&lt;/em&gt; indica el orden en el que aparecerá en la interfaz dentro del módulo secciones.  &lt;li&gt;&lt;em&gt;appAlias:&lt;/em&gt; simplemente un nombre identificativo, vaya el identificador.  &lt;li&gt;&lt;em&gt;appIcon:&lt;/em&gt; la clase CSS que representa al icono, ahora lo vemos.  &lt;li&gt;&lt;em&gt;appName:&lt;/em&gt; esto es un nombre descriptivo pero no prestéis atención porque el nombre definitivo será ajustado mediante archivos de configuración regional, ahora lo vemos.  &lt;li&gt;&lt;em&gt;appInitWithTreeAlias:&lt;/em&gt; valor NULL.&lt;br clear="all"&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Tabla UmbracoAppTree&lt;br clear="all"&gt;&lt;/h4&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;treeSilent:&lt;/em&gt; ponemos False.  &lt;li&gt;&lt;em&gt;treeInitialize:&lt;/em&gt; ponemos True.  &lt;li&gt;&lt;em&gt;treeSortOrder:&lt;/em&gt; ponemos un cero, será el primer elemento.  &lt;li&gt;&lt;em&gt;appAlias:&lt;/em&gt; el mismo de antes.  &lt;li&gt;&lt;em&gt;treeAlias:&lt;/em&gt; el mismo valor que appAlias.  &lt;li&gt;&lt;em&gt;treeTitle:&lt;/em&gt; el mismo valor que appAlias.  &lt;li&gt;&lt;em&gt;treeIconClosed:&lt;/em&gt; ponemos .sprTreeFolder.  &lt;li&gt;&lt;em&gt;treeIconOpen:&lt;/em&gt; ponemos .sprTreeFolder_o.  &lt;li&gt;&lt;em&gt;treeHandlerAssembly:&lt;/em&gt; este campo representa el nombre del ensamblado que contiene la clase para iniciar la nueva sección, por ejemplo si la libreria resultante es “holamundo.dll” pondríamos “holamundo”, obviando la extensión.  &lt;li&gt;&lt;em&gt;treeHandlerType:&lt;/em&gt; el nombre de la clase que contiene los métodos que ejecutarán la carga del árbol de la nueva sección, ahora lo vemos.  &lt;li&gt;&lt;em&gt;action:&lt;/em&gt; valor NULL.&lt;br clear="all"&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h4&gt;Tabla UmbracoUser2app&lt;/h4&gt; &lt;p&gt;En esta tabla es donde damos los permisos al usuario administrador para que acceda a la nueva sección.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;em&gt;user&lt;/em&gt;: ponemos un cero.  &lt;li&gt;&lt;em&gt;app&lt;/em&gt;: ponemos el mismo valor que &lt;em&gt;appAlias&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;  </description><link>http://jcantos.blogspot.com/2011/04/crear-una-seccion-personalizada-en.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh3.ggpht.com/_qugalmxwkz0/Tah6uE6qiXI/AAAAAAAAB7U/BhIva7g3hGk/s72-c/seccion_umbraco_thumb3.png?imgmax=800" width="72"/><thr:total>3</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-2347968298885127009</guid><pubDate>Wed, 13 Apr 2011 18:48:00 +0000</pubDate><atom:updated>2011-04-13T20:48:24.204+02:00</atom:updated><title>Primer acercamiento a Umbraco</title><description>&lt;h3&gt;&lt;a href="http://lh4.ggpht.com/_qugalmxwkz0/TaXv9G4K89I/AAAAAAAAB7I/YyAubUP9nVE/s1600-h/logo_umbraco3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 34px 15px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="logo_umbraco" border="0" alt="logo_umbraco" align="left" src="http://lh6.ggpht.com/_qugalmxwkz0/TaXv92NFt7I/AAAAAAAAB7M/QwsP1mc5tMc/logo_umbraco_thumb1.png?imgmax=800" width="161" height="161"&gt;&lt;/a&gt;&lt;/h3&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;Instalación&lt;/h3&gt; &lt;p&gt;Tan solo comentar que podéis realizar la instalación desde &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web Platform Installer&lt;/a&gt;, será todo mucho más rápido y transparente con la excepción de indicar que la instalación se realice como un nuevo sitio web, me encontré problemas intentándolo instalar como directorio virtual.&lt;/p&gt; &lt;p&gt;También podéis acceder a &lt;a href="http://umbraco.com/"&gt;http://umbraco.com/&lt;/a&gt; donde encontrar bastante información y documentación de partida, sobre todo muy interesante la sección de videos.&lt;/p&gt; &lt;h3&gt;Personalizando el splash de login&lt;/h3&gt; &lt;p&gt;Para acceder al área de administración escribimos la siguiente ruta: &lt;a href="http://host/umbraco/login.aspx"&gt;http://host/umbraco/login.aspx&lt;/a&gt;, &lt;/p&gt; &lt;p&gt;Tenemos que editar y modificar los siguientes recursos gráficos para adaptarlos a la identidad de nuestro sitio web. Para ello simplemente lo abrimos con nuestro editor gráfico preferido y actualizamos los siguientes recursos:&lt;/p&gt;/umbraco/images/loginbg.gif&lt;br clear="all"&gt;/umbraco/images/loginbg.png&lt;br clear="all"&gt;/umbraco/images/umbracosplash.gif&lt;br clear="all"&gt;/umbraco/images/umbracosplash.png  &lt;p&gt;Para modificar el texto de la pantalla de login localizamos el archivo:&lt;/p&gt; &lt;p&gt;/umbraco/config/lang/es.xml&lt;/p&gt; &lt;p&gt;y buscamos la entrada “topText” y “bottomText” para modificar el texto de la pantalla de login, podría ser algo parecido a esto: &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;key alias="topText"&amp;gt;&amp;lt;![CDATA[Bienvenido a &lt;a href="http://www.midominio.com"&gt;www.midominio.com&lt;/a&gt;, escribe tu nombre de usuario y clave en los campos de debajo:]]&amp;gt;&amp;lt;/key&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;key alias="bottomText"&amp;gt;&amp;lt;![CDATA[&amp;lt;p style="text-align:right;"&amp;gt;&amp;amp;copy; 2001 - %0% &amp;lt;br /&amp;gt;&amp;lt;a href=&lt;/font&gt;&lt;a href="http://www.midominio.com"&gt;&lt;font size="2" face="Courier New"&gt;http://www.midominio.com&lt;/font&gt;&lt;/a&gt;&lt;font size="2" face="Courier New"&gt; style="text-decoration: none" target="_blank"&amp;gt;www.midominio.com&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt; ]]&amp;gt;&amp;lt;/key&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Con estos sencillos pasos tendréis vuestra pantalla de acceso a CMS Umbraco personalizado y a vuestro gusto.&lt;/p&gt;  </description><link>http://jcantos.blogspot.com/2011/04/primer-acercamiento-umbraco.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh6.ggpht.com/_qugalmxwkz0/TaXv92NFt7I/AAAAAAAAB7M/QwsP1mc5tMc/s72-c/logo_umbraco_thumb1.png?imgmax=800" width="72"/><thr:total>0</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-3877529098029034896</guid><pubDate>Sun, 10 Apr 2011 21:19:00 +0000</pubDate><atom:updated>2011-04-10T23:19:15.661+02:00</atom:updated><title>Perdón, me he equivocado…</title><description>&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_qugalmxwkz0/TaIe0MRHa9I/AAAAAAAAB7A/LX9Ni0Zfv1I/s1600-h/error%5B3%5D.png"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" title="error" alt="error" src="http://lh4.ggpht.com/_qugalmxwkz0/TaIe0gYH3sI/AAAAAAAAB7E/N0qQppWJVzE/error_thumb%5B1%5D.png?imgmax=800" width="240" height="211"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;¿Porqué cuando llega el jefe de una reunión con el cliente o de una visita, lo primero que dice es?: “señores tenemos una oportunidad y es de vital importancia para la empresa”.&lt;/p&gt; &lt;p&gt;El empleado piensa que será otra patata caliente y lo realmente importante es otro objetivo….comenta al compañero ”y esto de que va ahora, ¿en este momento?, ¿no está viendo que no nos lleva a ningún lado el hacerlo de esta manera?, si lo que estaba haciendo es realmente lo que tenía que hacer!!!”.&lt;/p&gt; &lt;p&gt;¿Os suena?, seguro que nos ha pasado en alguna ocasión, y si esto ocurre es que algo en el sistema no funciona, por varios factores.&lt;/p&gt; &lt;p&gt;¿Me he sabido comunicar de la manera correcta?&lt;br clear="all"&gt;¿He hablado en el momento adecuado?&lt;br clear="all"&gt;¿He expresado con claridad mi punto de vista?&lt;br clear="all"&gt;¿He aceptado mis errores e intentado corregirlos?&lt;br clear="all"&gt;¿Tenéis oportunidad de preguntar el porqué de las decisiones?&lt;br clear="all"&gt;¿He preguntado el porqué de una decisión cuando he tenido oportunidad?&lt;br clear="all"&gt;¿Habéis puesto el freno antes de llegar al callejón sin salida, aún sabiendo que no la tenía?&lt;br clear="all"&gt;¿Somos conscientes del dinamismo de las necesidades?&lt;br clear="all"&gt;¿Sois conscientes de la seguridad virtual en la que vive un empleado?&lt;br clear="all"&gt;¿Tendría que haber dicho NO en alguna ocasión?&lt;/p&gt; &lt;p&gt;Tras varias victorias y derrotas a lo largo de mi trayectoria profesional, hoy he vuelto a equivocarme, pero levanto la cabeza y lo digo a lo &lt;strong&gt;dos punto cero&lt;/strong&gt;, &lt;strong&gt;sí, me he equivocado&lt;/strong&gt;, seguramente mañana volveré a hacer las mismas cosas pero os aseguro que de manera distinta.&lt;/p&gt; &lt;p&gt;Después de un largo fin de semana de reflexión, todavía no soy consciente de las cosas que he hecho mal pero lo que si esta claro es que por las razones que sean no estoy cumpliendo los objetivos que me marqué hace unos meses, así que ahora toca seguir reflexionando, recapacitar, echar leña al fuego, ponerse las pilas y corregir el rumbo.&lt;/p&gt;  </description><link>http://jcantos.blogspot.com/2011/04/perdon-me-he-equivocado.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh4.ggpht.com/_qugalmxwkz0/TaIe0gYH3sI/AAAAAAAAB7E/N0qQppWJVzE/s72-c/error_thumb%5B1%5D.png?imgmax=800" width="72"/><thr:total>0</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-2027916066080725530</guid><pubDate>Wed, 06 Apr 2011 21:47:00 +0000</pubDate><atom:updated>2011-04-07T15:02:08.265+02:00</atom:updated><title>SEO rápido, posiciona tu web con ASP.NET + IIS 7</title><description>&lt;p&gt;&lt;img style="margin: 30px 20px 0px 0px; display: inline; float: left" align="left" src="http://www.microsoft.com/web/media/main-webpi-download-v2.jpg" width="227" height="155"&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Si quieres mejorar la visibilidad de tu página web y competir con el resto del mercado puedes seguir estas pequeñas pautas realizando un mínimo esfuerzo en el desarrollo y publicación de tu sitio web, la creación de estos pasos no te llevará más de 20 minutos.&lt;/p&gt; &lt;h3&gt;Calidad del contenido&lt;/h3&gt; &lt;p&gt;Esto es fundamental y estamos ya hartos de escucharlo pero si no ofrecemos algo de interés y calidad al usuario, ten claro que no volverá a nuestra web y pasará a convertirse en visitante &lt;em&gt;Kleenex.&lt;/em&gt;&lt;/p&gt; &lt;h3&gt;Semántica del contenido&lt;/h3&gt; &lt;p&gt;Esto si que nos cuesta poco trabajo y veo cada regalito todos los días que a veces se me ponen los pelos de punta. Si queremos indicar que el texto es un título por favor usemos una etiqueta &amp;lt;h1&amp;gt;, y no usemos etiquetas para formatear y poner bonita nuestra web, del tipo….pongo un &amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt; que hace falta para “respirar” según dice el “creativo”.&lt;/p&gt; &lt;h3&gt;Título de las páginas y descripción&lt;/h3&gt; &lt;p&gt;Ponle un titulo y descripción a cada una de tus páginas utilizando la siguiente etiquetas en tu documento html.&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&amp;lt;meta name="description" content="Descripción corta de mi página, no más de 125 caracteres" /&amp;gt;&lt;br&gt;&amp;lt;title&amp;gt;Título de mi página&amp;lt;/title&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;Uso de palabras claves&lt;/h3&gt; &lt;p&gt;Utiliza la etiqueta keywords para añadir palabras o tags que permitan a los buscadores localizar los contenidos de tus páginas.&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&amp;lt;meta name="keywords" content="coche, venta, segundamano" /&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;Inclusión de archivo sitemap.xml&lt;/h3&gt; &lt;p&gt;Para la inclusión de nuestro archivo sitemap usaremos la herramienta on-line &lt;a href="http://www.xml-sitemaps.com"&gt;XML Sitemaps Generator&lt;/a&gt;, tan solo tenemos que indicar el sitio de nuestra web y el solito generará el archivito listo para copiar y pegar en el raíz de nuestra web. Tan solo echo en falta la etiqueta &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;priority&amp;gt;0.65&amp;lt;/priority&amp;gt;&lt;/em&gt;&lt;/strong&gt; para cada uno de los nodos, es algo que podemos hacer para una segunda vuelta, esto nos permitirá de cada a los buscadores indicar que página es “más importante” dentro de nuestro sitio web, por ejemplo la home debería tener una prioridad más elevada que por ejemplo el aviso legal.&lt;/p&gt; &lt;h3&gt;Inclusión de archivo robots.txt&lt;/h3&gt; &lt;p&gt;Si por ejemplo queréis que cualquier robot de búsqueda o rastreador no cachee los contenidos de la carpeta imágenes o directorio upload, incluid estas líneas en un archivo llamado &lt;strong&gt;&lt;em&gt;robots.txt&lt;/em&gt;&lt;/strong&gt; y lo colgáis en el raíz del site.&lt;/p&gt; &lt;p&gt;&lt;font size="4" face="Cordia New"&gt;User-Agent: *&lt;br&gt;Disallow: /imagenes/&lt;br&gt;Disallow: /upload/&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;Tuneando el web.config de nuestra web&lt;/h3&gt; &lt;p&gt;Nos apoyaremos en la extensión &lt;a href="http://www.iis.net/download/URLRewrite"&gt;URL Rewrite&lt;/a&gt; que debéis instalar en vuestro servidor, podeis utilizar la herramienta &lt;a href="http://www.microsoft.com/web/downloads/platform.aspx"&gt;Web Platform Installer&lt;/a&gt; que ella se encargará solita de la instalación.&lt;/p&gt; &lt;p&gt;Antes de subir a producción vuestro sitio web debéis tunear un poco el web.config para aquellos que trabajéis con APS.NET Webforms, de manera que dentro del nodo &lt;strong&gt;system.webServer &lt;/strong&gt;colocáis esto.&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&amp;lt;rewrite&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;rules&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;font size="3" face="Cordia New"&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rule name="CanonicalHostNameRule1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;match url="(.*)" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add input="{HTTP_HOST}" pattern="^www\.&lt;font color="#ff0000"&gt;&lt;strong&gt;midominio&lt;/strong&gt;&lt;/font&gt;\.com$" negate="true" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rule&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rule name="LowerCaseRule1" stopProcessing="true"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;match url="[A-Z]" ignoreCase="false" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action type="Redirect" url="{ToLower:{URL}}" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add input="{URL}" matchType="Pattern" pattern="WebResource.axd" ignoreCase="true" negate="true" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rule&amp;gt;&lt;/p&gt; &lt;p&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rule name="Default Document URL Rewrite" stopProcessing="true"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;match url="(.*?)/?Default\.aspx$" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action type="Redirect" url="{R:1}/" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rule&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&amp;nbsp;&lt;font face="Arial"&gt;Si por ejemplo tenéis una página del tipo &lt;a href="http://www.midominio.com/avisolegal.aspx"&gt;http://www.midominio.com/avisolegal.aspx&lt;/a&gt; y queréis convertirla a &lt;a href="http://www.midominio.com/aviso-legal"&gt;http://www.midominio.com/aviso-legal&lt;/a&gt; incluir las siguientes reglas, una por cada página aspx que tengáis en vuestro proyecto &lt;/font&gt;&amp;nbsp; &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&amp;lt;rule name="RedirectUserFriendlyURL1" stopProcessing="true"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;match url="^avisolegal\.aspx$" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add input="{REQUEST_METHOD}" pattern="^POST$" negate="true" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action type="Redirect" url="aviso-legal" appendQueryString="false" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rule&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rule name="RewriteUserFriendlyURL1" stopProcessing="true"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;match url="^aviso-legal$" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/conditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action type="Rewrite" url="avisolegal.aspx" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rule&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rules&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&lt;font face="Arial"&gt;Igualmente aplicamos las reglas de salida, para convertir &lt;a href="http://www.midominio.com/aviso-legal"&gt;http://www.midominio.com/aviso-legal&lt;/a&gt; en &lt;a href="http://www.midominio.com/avisolegal.aspx"&gt;http://www.midominio.com/avisolegal.aspx&lt;/a&gt; y pueda ser interpretado por el framework.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&lt;font face="Arial"&gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;outboundRules&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rule name="OutboundRewriteUserFriendlyURL1" preCondition="ResponseIsHtml1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;match filterByTags="A, Form, Img" pattern="^(.*)avisolegal\.aspx$" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;action type="Rewrite" value="{R:1}/aviso-legal" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/rule&amp;gt;&lt;br&gt;&lt;/p&gt;&lt;/font&gt; &lt;p&gt;&lt;font size="3" face="Cordia New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;preConditions&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;preCondition name="ResponseIsHtml1"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/preCondition&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/preConditions&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/outboundRules&amp;gt;&lt;br&gt;&amp;lt;/rewrite&amp;gt;&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;Dando a conocer nuestra web&lt;/h3&gt; &lt;p&gt;Podéis visitar &lt;a href="http://www.google.es/addurl/"&gt;http://www.google.es/addurl/&lt;/a&gt; y dar de alta la dirección electrónica de vuestro sitio web.&lt;/p&gt; &lt;p&gt;Además es interesante darnos de alta en &lt;a href="http://www.dmoz.org/"&gt;http://www.dmoz.org/&lt;/a&gt;, repositorio común utilizado por muchos de los buscadores conocidos.&lt;/p&gt; &lt;p&gt;Con estos simples pasos, lograréis ganar presencia, calidad y posicionamiento a vuestra web, claro que existen muchos más técnicas y factores a tener en cuenta, pero puede ser un buen punto de partida para profundizar y realizar otra serie de mejoras que veremos en nuevos posts.&lt;/p&gt;  </description><link>http://jcantos.blogspot.com/2011/04/seo-rapido-posiciona-tu-web-con-aspnet.html</link><thr:total>0</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-6034105208526075870</guid><pubDate>Sat, 01 Jan 2011 18:51:00 +0000</pubDate><atom:updated>2011-04-05T20:52:16.772+02:00</atom:updated><title>Desarrollo orientado a productos</title><description>&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_qugalmxwkz0/TZtk3jprglI/AAAAAAAAB6U/7vY4ecsgn0E/s1600-h/Network%20Service%5B5%5D.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px 31px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="Network Service" border="0" alt="Network Service" align="left" src="http://lh3.ggpht.com/_qugalmxwkz0/TZtk32iYFxI/AAAAAAAAB6Y/7mBde9FbCgQ/Network%20Service_thumb%5B3%5D.png?imgmax=800" width="128" height="128"&gt;&lt;/a&gt;Ya nadie puede discutir que el modelo SaaS como enfoque de modelo de negocio es una realidad cotidiana, donde normalmente existen grandes ventajas tanto para el cliente como el proveedor, pero…¿habéis hecho una pausa en el desarrollo de vuestro producto y considerado la posibilidad de convertirlo realmente en un servicio?. &lt;p&gt;Seguramente, la mayoría de vuestros desarrollos serán técnicamente de muy alto valor, pero de que nos sirve si todo ese potencial no es capaz de transmitirse y comunicarse con el resto de la comunidad 3.0, o incluso bajando el listón con otras aplicaciones de valor añadido. &lt;p&gt;Si después de trabajar meses en un producto redondo con una inteligencia de negocio fantástica no sois capaces de transmitirlo el fracaso estará en la primera línea de código, y vamos a explicarlo más claramente con un ejemplo. &lt;p&gt;Imaginaros a Albert Einstein formulando en su cabeza la teoría de la relatividad, y de repente decidiera no disponer de boca, mano u oídos, sería un desastre y una pena no conocer las posibilidades de este genio. &lt;p&gt;Pues a nuestro producto le puede ocurrir lo mismo si decidimos no escuchar la problemática real del usuario, es decir, si por ejemplo hemos trabajado en un fantástico CRM sería genial que pudiera exportar determinada información de contactos a un formato estándar para agregarlos o sincronizarlos con mi IPhone. &lt;p&gt;De igual manera si dispongo de unos contactos perfectamente organizados en mi Google Contacts, podría ofrecer la posibilidad de agregarlos a mi producto para enriquecerlo y darle un valor añadido apoyado por otras herramientas de mercado. &lt;p&gt;Espero vuestras opiniones que seguro serán interesantes.   </description><link>http://jcantos.blogspot.com/2011/01/desarrollo-orientado-productos.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh3.ggpht.com/_qugalmxwkz0/TZtk32iYFxI/AAAAAAAAB6Y/7mBde9FbCgQ/s72-c/Network%20Service_thumb%5B3%5D.png?imgmax=800" width="72"/><thr:total>0</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-2216189428165942740</guid><pubDate>Mon, 01 Nov 2010 18:47:00 +0000</pubDate><atom:updated>2011-04-05T20:49:00.817+02:00</atom:updated><title>Reutilización de informes en entornos de aplicación orientadas a productos</title><description>&lt;p&gt;&amp;nbsp; &lt;p&gt;Merece la pena escribir este post, ya que me ha dado algún que otro dolor de cabeza hasta llegar a la solución. Vamos a jugar un ratito a pasar como parámetro la cadena de conexión para visualizar un informe mediante Report Viewer 2010. &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;Generando el informe con Report Builder 3.0&lt;/h3&gt; &lt;p&gt;Esta herramienta, ya mencionada en posts anteriores, nos permitirá crear la definición del informe y obtener un archivo en formato RDL (Report Definition Language) se trata de un fichero estándar XML que nos permite cotillear las tripas y ver lo que ocurre en la “sala de máquinas”. &lt;p&gt;Primeramente tendremos que incluir un nuevo parámetro en el informe al que llamaremos &lt;strong&gt;&lt;em&gt;BaseDatos&lt;/em&gt;&lt;/strong&gt;, lo marcaremos como oculto, guardamos y salimos de Report Builder. &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;Modificando el RDL&lt;/h3&gt; &lt;p&gt;Partiendo de cualquier informe generado previamente con dicha herramienta, solo nos queda guardar el archivo (en el escritorio de Windows por ejemplo) y usar el bloc de notas para ver en detalle la definición del mismo. Tendremos que localizar al principio del documento la sección &lt;strong&gt;&lt;em&gt;ConnectString&lt;/em&gt;&lt;/strong&gt; del elemento &lt;strong&gt;&lt;em&gt;DataSource&lt;/em&gt;&lt;/strong&gt; y modificarlo de la siguiente manera: &lt;p&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br&gt;&amp;lt;Report xmlns:rd="&lt;a href="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner%22"&gt;http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"&lt;/a&gt;xmlns:cl="&lt;a href="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition%22"&gt;http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition"&lt;/a&gt;xmlns="&lt;a href="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition%22"&gt;http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition"&lt;/a&gt;&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;AutoRefresh&amp;gt;0&amp;lt;/AutoRefresh&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;DataSources&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataSource Name="GIE"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectionProperties&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataProvider&amp;gt;SQL&amp;lt;/DataProvider&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConnectString&amp;gt;="Password=XXXX;Persist Security Info=True;User ID=XXXX;Data Source=XXXX;Initial Catalog=" &amp;amp;amp; Parameters!BaseDatos.Value&amp;lt;/ConnectString&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ConnectionProperties&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;rd:DataSourceID&amp;gt;2bf79f31-84cc-4a46-b53d-93fbf236f92d&amp;lt;/rd:DataSourceID&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataSource&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/DataSources&amp;gt; &lt;p&gt;Lo que hemos modificado con respecto al original ha sido la inclusión de la expresión &lt;strong&gt;&lt;em&gt;Parameters!BaseDatos.Value&lt;/em&gt;&lt;/strong&gt; embebida en la cadena de conexión del&lt;em&gt;&lt;strong&gt;DataSource&lt;/strong&gt;&lt;/em&gt; &lt;p&gt;Os dejo un enlace de interés donde podréis indagar mas sobre estas cuestiones:&lt;a href="http://msdn.microsoft.com/en-us/library/ms156450.aspx#Expressions"&gt;http://msdn.microsoft.com/en-us/library/ms156450.aspx#Expressions&lt;/a&gt; &lt;p&gt;Hay otro punto importantísimo y que también me costo un buen rato, no se porque razón la definición del parámetro BaseDatos tiene que ser el primero de la colección, podemos observar también su definición en el propio documento RDL casi al final del archivo: &lt;p&gt;&amp;lt;ReportParameters&amp;gt;&lt;br&gt;&lt;strong&gt;&amp;nbsp; &amp;lt;ReportParameter Name="BaseDatos"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataType&amp;gt;String&amp;lt;/DataType&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Prompt&amp;gt;BaseDatos&amp;lt;/Prompt&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Hidden&amp;gt;true&amp;lt;/Hidden&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/ReportParameter&amp;gt;&lt;br&gt;&lt;/strong&gt;&amp;nbsp; &amp;lt;ReportParameter Name="IdUsuarioComercial"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataType&amp;gt;Integer&amp;lt;/DataType&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DefaultValue&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataSetReference&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataSetName&amp;gt;Comerciales&amp;lt;/DataSetName&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ValueField&amp;gt;IdUsuario&amp;lt;/ValueField&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataSetReference&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DefaultValue&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Prompt&amp;gt;Comercial&amp;lt;/Prompt&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ValidValues&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataSetReference&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataSetName&amp;gt;Comerciales&amp;lt;/DataSetName&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ValueField&amp;gt;IdUsuario&amp;lt;/ValueField&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;LabelField&amp;gt;Comercial&amp;lt;/LabelField&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataSetReference&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ValidValues&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;MultiValue&amp;gt;true&amp;lt;/MultiValue&amp;gt;&lt;br&gt;&amp;nbsp; &amp;lt;/ReportParameter&amp;gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;Publicación del informe mediante Report Manager&lt;/h3&gt; &lt;p&gt;Ya sabéis que Report Manager es la herramienta web que nos permite gestionar y publicar informes cuando nos basamos en &lt;strong&gt;&lt;em&gt;RemoteMode, &lt;/em&gt;&lt;/strong&gt;solo tendremos que asegurarnos de indicar que no se necesitan credenciales para la visualización del informe, os dejo la pantalla donde se parametriza: &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_qugalmxwkz0/TZtkGOdVlVI/AAAAAAAAB6I/TSpIXdIDKAI/s1600-h/report_manager%5B3%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="report_manager" border="0" alt="report_manager" src="http://lh3.ggpht.com/_qugalmxwkz0/TZtkGixNWxI/AAAAAAAAB6M/_u7mjtjPxYQ/report_manager_thumb%5B1%5D.jpg?imgmax=800" width="502" height="492"&gt;&lt;/a&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;Report Viewer en Visual Studio&lt;/h3&gt; &lt;p&gt;Os dejo el código a implementar desde Visual Studio con la llamada al informe: &lt;p&gt;&lt;font size="2" face="Courier New"&gt;if (!IsPostBack)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReportViewer1.ProcessingMode = ProcessingMode.Remote;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ServerReport serverReport = ReportViewer1.ServerReport;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverReport.ReportServerUrl = new Uri(Properties.Settings.Default.ReportServer);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverReport.ReportPath = Request["ReportPath"].ToString();&lt;br&gt;&lt;/font&gt;&lt;strong&gt;&lt;font size="2" face="Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReportParameter rp = new ReportParameter("BaseDatos",”XXXXX”);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; serverReport.SetParameters(rp);&lt;/font&gt;&lt;/strong&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;}&lt;/font&gt; &lt;p&gt;Esto nos permitirá reutilizar informes que compartan diferentes bases de datos con misma estructura, imprescindible cuando se trata por ejemplo de desarrollo de aplicaciones orientadas a productos donde existe un único repositorio de ejecución de aplicación pero diferentes bases de datos (una para cada cliente). &lt;p&gt;Como inconveniente es que no podéis hacer ingeniería inversa, si abres el informe (ya modificado desde el bloc de notas anteriormente) mediante Report Manager al volverlo a publicar o grabar destroza la expresión de paso de parámetros de la cadena de conexión. Se lo comunicaremos a Redmond para que lo corrijan &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-winkingsmile" alt="Gui&amp;ntilde;o" src="http://lh4.ggpht.com/_qugalmxwkz0/TZtkGx7xDbI/AAAAAAAAB6Q/iIK2IaWmbts/wlEmoticon-winkingsmile%5B2%5D.png?imgmax=800"&gt;  </description><link>http://jcantos.blogspot.com/2010/11/reutilizacion-de-informes-en-entornos.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh3.ggpht.com/_qugalmxwkz0/TZtkGixNWxI/AAAAAAAAB6M/_u7mjtjPxYQ/s72-c/report_manager_thumb%5B1%5D.jpg?imgmax=800" width="72"/><thr:total>0</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-6959316147345638508</guid><pubDate>Fri, 02 Jul 2010 18:43:00 +0000</pubDate><atom:updated>2011-04-05T20:44:08.845+02:00</atom:updated><title>Comunicando Android y Web Services .NET</title><description>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_qugalmxwkz0/TZti9QtmiQI/AAAAAAAAB6A/jP3La6waarw/s1600-h/Android_NET%5B8%5D.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Android_NET" border="0" alt="Android_NET" src="http://lh4.ggpht.com/_qugalmxwkz0/TZti9rlq4TI/AAAAAAAAB6E/uJH7Ad5XWAg/Android_NET_thumb%5B4%5D.jpg?imgmax=800" width="495" height="233"&gt;&lt;/a&gt; &lt;p&gt;En esta ocasión el objetivo del post será el de comunicar dos tecnologías totalmente complementarias: &lt;strong&gt;Google Android&lt;/strong&gt; y&lt;strong&gt;Microsoft .NET&lt;/strong&gt;, para ello nos basaremos en el protocolo &lt;strong&gt;SOAP&lt;/strong&gt;, más concretamente en &lt;strong&gt;Web Services&lt;/strong&gt; desde el lado Microsoft y la creación de un componente personalizado que permitirá consumir y acceder a los datos del modelo de negocio desde un dispositivo Android. &lt;p&gt;Estudiaremos los casos más sencillos para comunicar un servicio web y un dispositivo móvil, desde la interacción de datos simples hasta estructuras de datos complejas definidos por el desarrollador. &lt;p&gt;En el ejemplo que vamos a abordar el sistema comprobará un par usuario y contraseña y nos informará si el usuario en cuestión se encuentra registrado dentro del repositorio de members de nuestra aplicación. La arquitectura que entrará en juego será la siguiente, partiremos primeramente de un servicio web que será el encargado de albergar la lógica de comprobación y autenticación de usuario junto con un cliente, en este caso un dispositivo móvil que será el encargado de consumir dicho servicio e informar al usuario del resultado de la operación. &lt;h4&gt;&amp;nbsp;&lt;/h4&gt; &lt;h4&gt;Definiendo el Web Services .NET&lt;/h4&gt; &lt;p&gt;No profundizaremos demasiado en este aspecto puesto que no es el objetivo del post, partiremos de una clase de tipo “System.Web.Services.WebService” en la que incluiremos un método “EsUsuarioValido” que nos devolverá un objeto de tipo “Usuario” si la autenticación se ha realizado con éxito. Nos debería de quedar algo así: &lt;p&gt;&lt;code&gt; &lt;p&gt;&lt;font size="2"&gt;[WebMethod]&lt;br&gt;public Usuario EsUsuarioValido(string username, string password)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Usuario reply = null;&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (Contexto ctx = new Contexto())&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reply = new CADUsuario(ctx).ObtenerUsuario(username, password);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return reply;&lt;br&gt;}&lt;/font&gt; &lt;p&gt;&lt;/code&gt; &lt;p&gt;La clase Usuario nos debería quedar algo así: &lt;p&gt;&lt;code&gt; &lt;p&gt;&lt;font size="2"&gt;namespace WebService.Entidades&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public class Usuario&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; …&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string username;&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Username&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return username; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { username = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private string password;&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public string Password&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return password; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set { password = value; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; …&lt;/font&gt; &lt;p&gt;&lt;font size="2"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt; &lt;p&gt;&lt;/code&gt; &lt;p&gt; &lt;p&gt;Ya solo nos quedaría realizar el despliegue y publicarlo en un sitio visible para ser consumido desde cualquier cliente. El siguiente paso que estudiaremos será el desarrollo de la capa del cliente, encargada de consumir y comunicarse con nuestro servicio web, en este caso el dispositivo móvil elegido es &lt;strong&gt;Android&lt;/strong&gt; sobre la versión&lt;strong&gt;1.6&lt;/strong&gt; aunque también funcionaría en versiones superiores &lt;strong&gt;2.2&lt;/strong&gt; &lt;h3&gt;&amp;nbsp;&lt;/h3&gt; &lt;h3&gt;Consumiendo el servicio web .NET desde Android&lt;/h3&gt; &lt;p&gt;Para empezar sera necesario descargar el paquete &lt;strong&gt;ksoap2-android&lt;/strong&gt; de la siguiente dirección: &lt;a href="http://code.google.com/p/ksoap2-android/downloads/list"&gt;http://code.google.com/p/ksoap2-android/downloads/list&lt;/a&gt;, ya solo queda incluirlo en nuestra aplicación Android (&lt;a href="http://developer.android.com/guide/index.html"&gt;http://developer.android.com/guide/index.html&lt;/a&gt;, si os queréis iniciar está bastante completa), en el caso de estar trabajando con el IDE &lt;strong&gt;Eclipse&lt;/strong&gt; nos situamos con el botón derecho sobre las propiedades del proyecto y añadimos la referencia bajo la opción &lt;strong&gt;Java Build Path.&lt;/strong&gt; &lt;p&gt;En la estructura de nuetro proyecto nos encontraremos dos clases, una de ellas será Usuario y otra a la que llamaremos Seguridad. La primera solo la utilizaremos como objeto de transporte de datos y la segunda será la encargada de manejar y contendrá los métodos propios de acceso a la autenticación, actuará de proxy en la comunicación con el servicio web. &lt;p&gt;Os dejo el ejemplo de la clase de datos Usuario, esto es una lata pero ya sabéis que hablamos de Java así que tendremos que picar algo más de código, &lt;strike&gt;Microsoft nos malacostumbra a hacerlo todo con el ratón:&lt;/strike&gt; &lt;p&gt;&lt;code&gt; &lt;p&gt;&lt;font size="1"&gt;package jcantos.demo.entidades;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;import java.util.Hashtable;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;import org.ksoap2.serialization.KvmSerializable;&lt;br&gt;import org.ksoap2.serialization.PropertyInfo;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;public class Usuario implements KvmSerializable {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private int idUsuario;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String nombre;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String email;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String username;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private String password;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Usuario(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_idUsuario.setName("IdUsuario");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_nombre.setName("Nombre");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_email.setName("Email");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_username.setName("Username");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_password.setName("Password");&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_idUsuario.setType(PropertyInfo.INTEGER_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_nombre.setType(PropertyInfo.STRING_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_email.setType(PropertyInfo.STRING_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_username.setType(PropertyInfo.STRING_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_password.setType(PropertyInfo.STRING_CLASS);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setIdUsuario(int idUsuario) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.idUsuario = idUsuario;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getIdUsuario() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return idUsuario;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setNombre(String nombre) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.nombre = nombre;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getNombre() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return nombre;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setEmail(String email) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.email = email;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getEmail() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return email;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setUsername(String username) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.username = username;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getUsername() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return username;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setPassword(String password) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.password = password;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public String getPassword() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return password;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static PropertyInfo PI_idUsuario = new PropertyInfo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static PropertyInfo PI_nombre = new PropertyInfo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static PropertyInfo PI_email = new PropertyInfo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static PropertyInfo PI_username = new PropertyInfo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static PropertyInfo PI_password = new PropertyInfo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static PropertyInfo[] PI_PROP_ARRAY =&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_idUsuario,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_nombre,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_email,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_username,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PI_password&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Object getProperty(int param) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Object object = null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(param)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0 : object = new Integer(idUsuario);break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1 : object = nombre;break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2 : object = email;break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3 : object = username;break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 4 : object = password;break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return object;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int getPropertyCount() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 5;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void getPropertyInfo(int param, Hashtable arg1, PropertyInfo propertyInfo) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(param){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.type = PropertyInfo.INTEGER_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.name = "IdUsuario";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.type = PropertyInfo.STRING_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.name = "Nombre";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.type = PropertyInfo.STRING_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.name = "Email";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.type = PropertyInfo.STRING_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.name = "Username";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 4:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.type = PropertyInfo.STRING_CLASS;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; propertyInfo.name = "Password";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; @Override&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void setProperty(int param, Object obj) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch(param)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0&amp;nbsp; : idUsuario&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = ((Integer)obj).intValue(); break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 1&amp;nbsp; : nombre&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (String)obj; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 2&amp;nbsp; : email&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (String)obj; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 3&amp;nbsp; : username&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (String)obj; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 4&amp;nbsp; : password&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = (String)obj; break;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt; &lt;p&gt;&lt;font face="Arial"&gt;Me parece algo tosco para indicar a una clase que es Serializable, &lt;em&gt;en .NET simplemente marcaríamos como atributo [Serializable]&lt;/em&gt; pero bueno “eso es así”. Y ahora os dejo la clase correspondiente al consumo del web services.&lt;/font&gt; &lt;p&gt;&lt;code&gt; &lt;p&gt;&lt;font size="1"&gt;package jcantos.demo.utiles;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;import org.ksoap2.SoapEnvelope;&lt;br&gt;import org.ksoap2.serialization.SoapObject;&lt;br&gt;import org.ksoap2.serialization.SoapSerializationEnvelope;&lt;br&gt;import org.ksoap2.transport.HttpTransportSE;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;import android.util.Log;&lt;br&gt;import jcantos.demo.entidades.*;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;public class Seguridad {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String METHOD_NAME = "EsUsuarioValido";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String NAMESPACE = "&lt;/font&gt;&lt;a href="http://tempuri.org/%22;"&gt;&lt;font size="1"&gt;http://tempuri.org/";&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String URL = "&lt;/font&gt;&lt;a href="http://www.jcantos.net/webservice.asmx%22;"&gt;&lt;font size="1"&gt;http://www.jcantos.net/webservice.asmx";&lt;/font&gt;&lt;/a&gt;&lt;font size="1"&gt; //sustituir esta URL por el sitio definitivo&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String SOAP_ACTION = "&lt;/font&gt;&lt;a href="http://tempuri.org/EsUsuarioValido%22;"&gt;&lt;font size="1"&gt;http://tempuri.org/EsUsuarioValido";&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static Usuario usuario=null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static Usuario EsUsuarioValido(String username, String password){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Usuario reply=null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.addProperty("username", username);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.addProperty("password", password);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; envelope.dotNet=true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; envelope.setOutputSoapObject(request);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; androidHttpTransport.call(SOAP_ACTION, envelope);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SoapObject result = (SoapObject)envelope.getResponse();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (result!=null){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reply=new Usuario();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reply.setIdUsuario(Integer.parseInt(result.getProperty("IdUsuario").toString()));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reply.setNombre(result.getProperty("Nombre").toString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reply.setEmail(result.getProperty("Email").toString());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reply.setUsername(username);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reply.setPassword(password);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.e("Servicio_Web",e.getMessage());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return reply;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static void setUsuario(Usuario usuario) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Seguridad.usuario = usuario;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static Usuario getUsuario() {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return usuario;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static boolean EsLogueado(){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Seguridad.usuario!=null;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt; &lt;p&gt;&lt;font face="Arial"&gt;Me parece un tema interesantísimo, imaginaros las posibilidades que se nos abre y el abanico de oportunidades para integrar vuestros cacharritos con aplicaciones ya desarrolladas, no solamente en .NET sino cualquier otro lenguaje JAVA por ejemplo,……¿quién nos quita que pudiésemos elaborar un servicio web a modo de &lt;strong&gt;gateway&lt;/strong&gt; que expusiese aquellos métodos que quisieran ser consumidos por un dispositivo móvil?. Y no solo hablamos a modo de consulta, aquí os dejo un ejemplo en el que podemos actualizar la clave de un usuario una vez que la autenticación se ha realizado con exito, básado en el ejemplo anterior.&lt;/font&gt;&lt;/p&gt; &lt;h3&gt;&lt;font face="Arial"&gt;Editando y actualizando objetos de negocio desde el dispositivo móvil&lt;/font&gt;&lt;/h3&gt; &lt;p&gt;&lt;code&gt;&lt;code&gt;&lt;font face="Arial"&gt;Supongamos que un usuario ha realizado una operación de login con éxito y desea cambiar o actualizar su perfil, informando al sistema central del cambio de su correo electrónico junto con la actualización de su nueva contraseña. Para ello podríamos tener una clase tal que esta:&lt;/font&gt;&lt;/code&gt;&lt;/code&gt; &lt;p&gt;&lt;code&gt; &lt;p&gt;&lt;font size="1"&gt;package jcantos.demo.cad;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;import jcantos.demo.entidades.Usuario;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;import org.ksoap2.SoapEnvelope;&lt;br&gt;import org.ksoap2.serialization.PropertyInfo;&lt;br&gt;import org.ksoap2.serialization.SoapObject;&lt;br&gt;import org.ksoap2.serialization.SoapSerializationEnvelope;&lt;br&gt;import org.ksoap2.transport.HttpTransportSE;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;import android.util.Log;&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;public class CADUsuario {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String METHOD_NAME = "ActualizarUsuario";&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String NAMESPACE = "&lt;/font&gt;&lt;a href="http://tempuri.org/%22;"&gt;&lt;font size="1"&gt;http://tempuri.org/";&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String URL = "&lt;/font&gt;&lt;a href="http://www.jcantos.net/webservice/olvidemimovil.asmx%22;"&gt;&lt;font size="1"&gt;http://www.jcantos.net/webservice.asmx";&lt;/font&gt;&lt;/a&gt;&lt;br&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; private static final String SOAP_ACTION = "&lt;/font&gt;&lt;a href="http://tempuri.org/ActualizarUsuario%22;"&gt;&lt;font size="1"&gt;http://tempuri.org/ActualizarUsuario";&lt;/font&gt;&lt;/a&gt; &lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public void ActualizarUsuario(Usuario usuario){&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PropertyInfo pi=new PropertyInfo();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pi.setName("usuario");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pi.setValue(usuario);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pi.setType(usuario.getClass());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; request.addProperty(pi);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; envelope.dotNet=true;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; envelope.setOutputSoapObject(request);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; envelope.addMapping(NAMESPACE, "Usuario", usuario.getClass());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; androidHttpTransport.setXmlVersionTag("&amp;lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&amp;gt;");&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; androidHttpTransport.debug=false;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; androidHttpTransport.call(SOAP_ACTION, envelope);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; envelope.getResponse();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } catch (Exception e) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Log.e("Servicio_Web",e.getMessage());&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt; &lt;p&gt;&lt;font size="1"&gt;&lt;/font&gt;&lt;/code&gt; &lt;p&gt;&lt;font face="Arial"&gt;Como veis las posibilidades son infinitas, así que una vez más &lt;strong&gt;que la técnica no coarte las necesidades del cliente. &lt;/strong&gt;Un abrazo a todos y nos vemos en el próximo post.&lt;/font&gt;&lt;/code&gt;&lt;/code&gt;  </description><link>http://jcantos.blogspot.com/2010/07/comunicando-android-y-web-services-net_02.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh4.ggpht.com/_qugalmxwkz0/TZti9rlq4TI/AAAAAAAAB6E/uJH7Ad5XWAg/s72-c/Android_NET_thumb%5B4%5D.jpg?imgmax=800" width="72"/><thr:total>5</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8807459026660690490.post-7047726047341074433</guid><pubDate>Thu, 17 Jun 2010 18:32:00 +0000</pubDate><atom:updated>2011-04-05T20:33:04.379+02:00</atom:updated><title>Report Viewer 10 y ASP.NET en Visual Studio 2010, paso a paso</title><description>&lt;p&gt;&amp;nbsp; &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_qugalmxwkz0/TZtgE_rimzI/AAAAAAAAB5w/3lNESiNJ79Y/s1600-h/logo_SQL%5B4%5D.jpg"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="logo_SQL" border="0" alt="logo_SQL" src="http://lh6.ggpht.com/_qugalmxwkz0/TZtgFf_NE-I/AAAAAAAAB50/vpxgB6Gg_pk/logo_SQL_thumb%5B2%5D.jpg?imgmax=800" width="382" height="70"&gt;&lt;/a&gt;  &lt;p&gt;Como no podía ser de otra manera nos afrontamos a un nuevo reto, la generación de informes elevada a la máxima expresión, SQL Server 2008 Express R2, Reporting Services, y Visual Studio 2010.  &lt;p&gt;El motivo de este post viene derivado de una necesidad del cliente como alternativa a Crystal Reports y sus costes de licencia asociados. Estudiaremos paso paso como instalar todas las distribuciones necesarias para la ejecución de informes en Visual Studio 2010. Los productos que mencionaremos a continuación son gratuitos con ciertas restricciones que también comentaremos.  &lt;h5&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/h5&gt; &lt;h5&gt;&lt;strong&gt;Descarga de paquetes&lt;/strong&gt;&lt;/h5&gt; &lt;p&gt;Comenzaremos por la descarga de todos los paquetes necesarios para el desarrollo y la integración de informes con Reporting Services, estos son los siguientes:  &lt;ul&gt; &lt;li&gt;SQL Server 2008 Express R2, versión Advance Tools,&lt;a href="http://www.microsoft.com/express/Database/"&gt;http://www.microsoft.com/express/Database/&lt;/a&gt;  &lt;li&gt;Adventure Works, bases datos ejemplos,&lt;a href="http://msftdbprodsamples.codeplex.com/releases/view/45907"&gt;http://msftdbprodsamples.codeplex.com/releases/view/45907&lt;/a&gt;  &lt;li&gt;Report Builder 3.0, &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=f78b6b1e-8ccb-407a-bc3e-7955d60e1a6c"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=f78b6b1e-8ccb-407a-bc3e-7955d60e1a6c&lt;/a&gt;  &lt;li&gt;Report Viewer 2010, &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=a941c6b2-64dd-4d03-9ca7-4017a0d164fd"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=a941c6b2-64dd-4d03-9ca7-4017a0d164fd&lt;/a&gt;  &lt;li&gt;Report Viewer 2010 Language Pack,&lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=28af0789-9b20-4cba-9f76-d30dbf9a8c53"&gt;http://www.microsoft.com/downloads/details.aspx?displaylang=es&amp;amp;FamilyID=28af0789-9b20-4cba-9f76-d30dbf9a8c53&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Una vez descargados e instalados todos los paquetes, nos disponemos a abrir Visual Studio 2010 y agregamos un nuevo proyecto de aplicación web ASP.NET. Llegado a este momento es importante destacar que VS2010 no incluye la versión 10 de Report Viewer sino la 9, por lo tanto será necesario añadir a nuestro cuadro de herramientas la última versión.  &lt;h5&gt;Agregando referencias al proyecto&lt;/h5&gt; &lt;p&gt;Creamos una carpeta en nuestro proyecto y la llamamos “librerias”, en esta copiamos tres DLLs que se encuentran ubicadas en el GAC_MSIL del directorio c:\windows\assembly, todas ellas en su versión 10:  &lt;ul&gt; &lt;li&gt;Microsoft.ReportViewer.Common.dll  &lt;li&gt;Microsoft.ReportViewer.ProcessingObjectModel.dll  &lt;li&gt;Microsoft.ReportViewer.WebForms.dll&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Posteriormente añadimos las referencias a nuestro proyecto web ASP.NET. Este paso es interesante tenerlo en cuenta para realizar un futuro despliegue en el servidor de producción o subir el proyecto a algún repositorio de código fuente, de esta manera tendremos todas las dependencias bien guardaditas en el árbol del proyecto y así evitaremos quebraderos de cabeza.  &lt;h5&gt;Remozando Visual Studio 2010&lt;/h5&gt; &lt;p&gt;Vamos a ello, nos posicionamos sobre la ventana de cuadro de herramientas y añadimos una nueva ficha a la que podemos llamar “Reports”, de seguido elegimos los elementos y seleccionamos el control &lt;strong&gt;ReportViewer&lt;/strong&gt; de&lt;strong&gt;Microsoft.ReportViewer.WebForms.dll&lt;/strong&gt;, a partir de este momento ya podemos arrastrar y soltar el control ReportViewer en cualquiera de nuestras páginas aspx. La nueva versión de este control necesita de un &lt;strong&gt;ScriptManager&lt;/strong&gt; para su funcionamiento por lo que podríamos añadirlo a nuestra página Maestra para que estuviera disponible en cualquier momento.  &lt;h5&gt;Actualizando referencias&lt;/h5&gt; &lt;p&gt;Hay que tener cuidadin porque al arrastrar el control ReportViewer a nuestra página, nos añade una directiva de control pero referenciado a la versión 9, tendremos que cambiarlo a la 10, además es nesesario retocar el &lt;strong&gt;web.config &lt;/strong&gt;en los siguientes aspectos:  &lt;ul&gt; &lt;li&gt;Actualizar versiones de assemblys de la 9 a la 10  &lt;li&gt;Incluir el manejador AXD&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Nos debería de quedar algo tal como esto:  &lt;p&gt;&lt;code&gt; &lt;p&gt;&amp;lt;system.web&amp;gt;&lt;br&gt;&amp;lt;compilation debug="true" targetFramework="4.0"&amp;gt;&lt;br&gt;&amp;lt;assemblies&amp;gt;&lt;br&gt;&amp;lt;add assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/&amp;gt;&lt;br&gt;&amp;lt;add assembly="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/&amp;gt;&lt;br&gt;&amp;lt;add assembly="Microsoft.Build.Framework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/&amp;gt;&lt;br&gt;&amp;lt;add assembly="System.Management, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/&amp;gt;&amp;lt;/assemblies&amp;gt;&amp;lt;/compilation&amp;gt;  &lt;p&gt;&amp;lt;httpHandlers&amp;gt;&lt;br&gt;&amp;lt;add verb="*" path="Reserved.ReportViewerWebControl.axd" type = "Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /&amp;gt;&lt;br&gt;&amp;lt;/httpHandlers&amp;gt;&lt;br&gt;&amp;lt;/system.web&amp;gt;  &lt;p&gt;&lt;/code&gt; &lt;h5&gt;Generando y publicando el informe con Report Builder 3.0&lt;/h5&gt; &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_qugalmxwkz0/TZtgF4xvazI/AAAAAAAAB54/Li4YagKOvxk/s1600-h/report_builder%5B3%5D.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="report_builder" border="0" alt="report_builder" src="http://lh5.ggpht.com/_qugalmxwkz0/TZtgGtTHqLI/AAAAAAAAB58/u5pHq1A0dvo/report_builder_thumb%5B1%5D.png?imgmax=800" width="502" height="384"&gt;&lt;/a&gt;  &lt;p&gt;Abrimos &lt;strong&gt;Report Builder&lt;/strong&gt;, y creamos un nuevo informe basado en algunas de las plantillas existentes, como anteriormente hemos instalado la base de datos de ejemplo de AdventureWorks podemos tomar esta como origen de datos, para facilitaros la labor os dejo un &lt;a href="http://docs.google.com/leaf?id=0B4U3U6oeIP9bNTgxNmRkYjMtZDMwZi00Y2VhLTlkNjktY2RkZWFjMmE4NjZl&amp;amp;hl=es"&gt;RDL&lt;/a&gt; de ejemplo generado con esta herramienta. Este informe muestra un historial de precios de todos los productos.  &lt;p&gt;Una vez generado tenemos que publicarlo en Reports Manager en esta dirección:&lt;a href="http://localhost/Reports_SQLEXPRESS2008"&gt;http://localhost/Reports_SQLEXPRESS2008&lt;/a&gt;, es una herramienta web que nos instala Reporting Services y que nos permite gestionar todos los informes que vayamos publicando, asignar permisos y organizarlos entre otras cuestiones. Por si queréis cotillear la herramienta se nos instala en Microsoft SQL Server 2008 R2 &amp;gt;&amp;gt; Configuration Tools &amp;gt;&amp;gt; Reporting Services Configuration Manager, aquí podemos cambiar el directorio virtual y muchas más cosas que investigaremos en otro post. Por cierto esta herramienta solo funciona con Internet Explorer, en el resto de navegadores tiene algunos problemillas supongo se solucionarán en próximas versiones.  &lt;p&gt;Para publicar el informe simplemente cargamos el archivo desde la opción habilitada a tal efecto y le ponemos un nombre identificativo, en nuestro caso&lt;strong&gt;preciosProductos&lt;/strong&gt;, este nombre es el que corresponderá a la propiedad&lt;strong&gt;ServerReport.ReportPath&lt;/strong&gt; del control &lt;strong&gt;ReportViewer&lt;/strong&gt;  &lt;h5&gt;Volvemos al IDE&lt;/h5&gt; &lt;p&gt;Ya nos queda menos, vamos a añadir una nueva página donde arrastrar un control de tipo ReportViewer, no olvidamos actualizar las directivas del control a la versión 10 y en el Code Behind de nuestra página incluimos lo siguiente:  &lt;p&gt;&lt;code&gt; &lt;p&gt;protected void Page_Load(object sender, EventArgs e)&lt;br&gt;{&lt;br&gt;if (!IsPostBack)&lt;br&gt;{&lt;br&gt;ReportViewer1.ProcessingMode = ProcessingMode.Remote;&lt;br&gt;ServerReport serverReport = ReportViewer1.ServerReport;&lt;br&gt;serverReport.ReportServerUrl = new Uri("&lt;a href="http://localhost/ReportServer_SQLEXPRESS2008%22);"&gt;http://localhost/ReportServer_SQLEXPRESS2008");&lt;/a&gt;&lt;br&gt;serverReport.ReportPath = "/preciosProductos";&lt;br&gt;}&lt;br&gt;}  &lt;p&gt;El valor de ReportServerUrl corresponderá a la propiedad &lt;strong&gt;Virtual Directory&lt;/strong&gt; de &lt;strong&gt;Web Service URL&lt;/strong&gt; definido en Reporting Services Configuration Manager.  &lt;p&gt;&lt;/code&gt; &lt;h5&gt;Conclusiones&lt;/h5&gt; &lt;p&gt;Visto lo visto es una muy buena opción ante Crystal Reports, todo muy bien integrado y sobre todo simple, fácil e intuitivo. Aquí os dejo algunas conclusiones:  &lt;ul&gt; &lt;li&gt;La versión Express de SQL Server 2008 R2 dispone de 10Gb para nuestra base de datos, lo cual es algo más que sobrado.  &lt;li&gt;Reporting Services solo permite trabajar con motores de bases de datos SQL Server, si quisiéramos integrar informes de otros proveedores tendremos que adquirir la licencia superior Standard o Enterprise.  &lt;li&gt;La herramienta de generación de informes Report Builder 3.0 está un poco verde, &lt;strike&gt;peta&lt;/strike&gt; errores en el diseñador en algunas ocasiones pero normalmente estable.  &lt;li&gt;Integración del control Report Viewer 10 con tecnología AJAX.  &lt;li&gt;La potencia de la generación de informes con Report Builder 3.0 es impresionantemente productiva, por ejemplo la inclusión de informes de tablas cruzadas, mapas de color, indicadores, gráficos, de verdad que es para echarle un ratillo y ponernos a jugar con el detenidamente.  &lt;li&gt;Por cierto, esto también funciona en Visual Studio 2008.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Aquí os dejo el proyecto de ejemplo para Visual Studio 2010 Express:&lt;a href="http://docs.google.com/leaf?id=0B4U3U6oeIP9bYTBjZjBiMmQtYWNlNC00MmMxLWE1YjEtMDBlZGI3OWI5ZWFi&amp;amp;hl=es"&gt;ReportExample.rar&lt;/a&gt;  </description><link>http://jcantos.blogspot.com/2011/04/report-viewer-10-y-aspnet-en-visual.html</link><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://lh6.ggpht.com/_qugalmxwkz0/TZtgFf_NE-I/AAAAAAAAB50/vpxgB6Gg_pk/s72-c/logo_SQL_thumb%5B2%5D.jpg?imgmax=800" width="72"/><thr:total>1</thr:total><author>jcantos@gmail.com (Javier Cantos)</author></item></channel></rss>