<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>El blog de Juan Irigoyen en Geeks·ms</title><link>http://geeks.ms/blogs/jirigoyen/default.aspx</link><description>Only one thing in Mind, Less code to Debug, less code to Break, less code to Maintain and Less code to Test</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><itunes:subtitle>Desarrollo en .net</itunes:subtitle><itunes:summary>Only one thing in Mind, Less code to Debug, less code to Break, less code to Maintain and Less code to Test</itunes:summary><itunes:owner><itunes:name>Juan Irigoyen</itunes:name><itunes:email>juan_irigoyen@hotmail.com</itunes:email></itunes:owner><itunes:category text="Desarrollo" /><itunes:explicit>no</itunes:explicit><language /><item><title>Maldivas - Implantación</title><link>http://geeks.ms/blogs/jirigoyen/archive/2013/01/10/maldivas-implantaci-243-n.aspx</link><pubDate>Wed, 09 Jan 2013 23:27:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:208182</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>12</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=208182</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=208182</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2013/01/10/maldivas-implantaci-243-n.aspx#comments</comments><description>&lt;p&gt;Hace ya casi un año que Maldivas comenzó a funcionar, me gustaría deciros que todo el proyecto ha sido un camino de rosas y que todo ha funcionado a la perfección, sin embargo en estos últimos años hemos luchado lo indecible para sacar este proyecto adelante.&lt;/p&gt;  &lt;p&gt;Por el camino y a pesar del conocimiento de muchos de los problemas que se producen en el desarrollo de un proyecto y aunque no es intención de este post buscar responsabilidades, si me gustaría comentar que hemos vuelto a cometer muchos de los errores que se pueden realizar en una gestión de proyectos (si no todos), estimaciones erróneas realizadas por personas ajenas al desarrollo, constantes interrupciones, múltiples cambios de contexto, problemas con la arquitectura y con las herramientas de trabajo, problemas con el equipo de desarrollo, decisiones como dejar de lado la calidad para intentar hacerlo más rápido, muchas horas de trabajo sin descanso, etc.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Grafico1_5F00_544E938A.jpg"&gt;&lt;img title="Maldivas-Grafico1" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Grafico1" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Grafico1_5F00_thumb_5F00_697C9932.jpg" width="519" height="296" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;Maldivas – Erp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;La parte positiva es que hemos aprendido de primera mano la importancia de una buena gestión de proyectos, de la utilización de pruebas unitarias, de la aplicación de reglas con herramientas como FxCop y ReSharper que tanto nos han ayudado, de la utilización de algunos patrones de diseño, de la importancia de las reglas de estilo en un equipo de trabajo, de la aplicación de metodologías de trabajo, de la automatización de procesos, de las ventajas de una formación continua y sobre todo, &lt;b&gt;de la importancia de la colaboración entre todas las personas que participan en el proyecto&lt;/b&gt;. &lt;/p&gt;  &lt;p&gt;No tiene sentido hablar del éxito o del fracaso del proyecto, ya que en este apartado y aunque me pese en cierto sentido, son los usuarios los que han de responder a esta cuestión, también aquí hemos tenido diversidad de opiniones, desde los que dicen que es una maravilla respecto al sistema anterior, algunos que no notaron ningún cambio o aquellos que argumentan que a pesar de las mejoras prefieren sin lugar a dudas el sistema de gestión antiguo. Todas las opiniones son válidas y debemos valorarlas, es importante entender que a lo largo de un proceso de desarrollo, todos cometemos errores y estos deben ayudarnos a mejorar, recuerdo el Sprint Retrospective basado en la mejora continua.&lt;/p&gt;  &lt;p&gt;Un aspecto que si he aprendido en este proyecto es el relativo al equipo de trabajo, casi siempre diferenciamos el equipo de desarrollo (‘los raritos y frikis de la empresa’) de los demás, pero aquí más que en ningún otro proyecto en los que he trabajado, he aprendido la importancia que tiene el hacer partícipes a todas las personas del proyecto desde el inicio y que quizás, es mejor pararse o no hacer algo si no contamos con el suficiente apoyo e implicación de estos. Si alguien piensa que tener un buen equipo de desarrollo es garantía de éxito en un&amp;#160; proyecto es que no tiene ni idea de lo que está hablando, el cliente es parte indivisible del equipo, podemos tener un equipo de desarrollo de nivel medio y un cliente que colabore con nosotros y nos aporte feedback para mejorarlo, si tuviera que elegir apostaría siempre por lo segundo. Sin colaboración no hay proyecto posible, da igual lo buenos o malos que sean los desarrolladores, será un fracaso total, al menos hasta el día que estos puedan leer la mente del cliente, que pensándolo bien, quizás con mi Kinetic y aplicando cierta técnica Jedail todo es posible…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Grafico2_5F00_2EB4F05C.jpg"&gt;&lt;img title="Maldivas-Grafico2" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Grafico2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Grafico2_5F00_thumb_5F00_4A95FF87.jpg" width="531" height="406" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;Maldivas – Erp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Respecto a los usuarios, muchos realizaron su trabajo correctamente lo que nos permitió anticiparnos y resolver los problemas al finalizar cada entrega, mucho antes de la puesta en funcionamiento del sistema, de esta forma su transición fue mucho mejor, sus problemas minimizados y algunos mejorados porque nos aportaron Feedback y los costes fueron menores pues los abordamos en el momento adecuado, sin embargo, otros usuarios alegaban tener una carga de trabajo alta, lo que les impedía destinar tiempo a comprobar y testar sus aplicaciones al finalizar cada sprint, algunos por diversos motivos creían que sus atribuciones no eran la de testar los módulos con los que iban a trabajar y otros pocos simplemente pasaban de hacerlo. Por supuesto para este segundo grupo, la transición al nuevo sistema fue mucho peor, corrijo, ‘para nosotros fue mucho peor’, ya que tuvimos que trabajar más horas en corregir aquellas incidencias no detectadas para que estos pudieran realizar su trabajo a tiempo, por supuesto su coste fue mucho mayor, pues ha veces tuvimos que modificar ciertas reglas de negocio que afectaban a muchos módulos relacionados y tuvimos que abordarlas en un tiempo muy limitado.&lt;/p&gt;  &lt;p&gt;Un aspecto en el que también sufrimos fue la migración de datos que comenzamos al inicio del desarrollo utilizando Data Transformation Services y que finalmente tuvimos que abandonar para utilizar scripts ya que las reglas de integridad y los cambios constantes en las estructuras hicieron de la migración un problema muy complejo que abordar. Finalmente conseguimos realizar una actualización completa de un sistema a otro, que pudimos ejecutar varias veces hasta poner en marcha el proyecto, esto mejoro también el testeo de los usuarios ya que podrían hacerlo con datos reales un factor importante a tener en cuenta en futuros desarrollos, logramos hacer la migración completa sin que ni uno solo de los usuarios introdujese ningún dato, todo un logro para un sistema con más de 500 tablas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Grafico3_5F00_16816034.jpg"&gt;&lt;img title="Maldivas-Grafico3" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Grafico3" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Grafico3_5F00_thumb_5F00_054D8291.jpg" width="525" height="323" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;Maldivas – Erp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Sigo pensado que la presión en el trabajo no hace que este mejore sino todo lo contrario, nos hace equivocarnos y cometer más errores. Creo que este debe ser un aspecto a reflexionar con detenimiento, algo que también he observado aplicando Scrum y es la presión que ha veces se ejerce al finalizar cada Sprint, a veces, si la estimación no es adecuada hace que esta aumente cuando el equipo de desarrollo trata de finalizar cada Sprint, es importante tratar de mejorar en las estimaciones para que estos cada vez se adapten mejor, aunque muchas veces cuando hacemos algo nuevo de lo que no tenemos información es ciertamente difícil acertar, debemos recordar que en el Sprint Review también se analizan aquellas tareas que por los motivos que sean no han podido ser finalizadas y trabajar en disminuir la presión del equipo de desarrollo, esta solo nos entorpece y bloquea.&lt;/p&gt;  &lt;p&gt;Al final, mucha de la parafernalia de una gestión de proyectos ya sea utilizando Scrum, CMMI o cualquier otra metología se puede resumir en una sola palabra ‘confianza’, la mayor parte de lo que hacemos solo sirve para convencer a nuestros clientes de nuestro buen hacer, me pregunto, si tuviéramos confianza plena, ¿Sería necesario esforzarse tanto para tener una buena gestión de proyectos?, seguro que se pueden argumentar mil y una razones para hacerlo, que si queremos controlar su coste o conocer las desviaciones, que si los requerimientos deben quedar claros, etc., etc., pero no nos engañemos, la respuesta es ‘no’. Lo cierto es que los desarrolladores no ofrecemos demasiada confianza y esto es porque hay algo que todavía no hacemos bien. Estoy convencido de que la confianza de un cliente, debe basarse en entregas constantes de software, estas entregas son las que deben convencer al cliente, si no hay entregas, que más dan los análisis, la documentación y todo el trabajo que hayamos realizado, las entregas demuestran nuestro trabajo, hay algo que funciona y que hemos terminado, que a veces&amp;#160; el cliente puede comenzar a amortizar y a utilizar mucho antes de que el proyecto finalice, que esta abierto a mejoras con la aportación del feedback del cliente, minimizando los costes al asumir cambios de forma temprana, que mejor demostración de nuestro trabajo que la entrega de software, aunque lo cierto es que también hay clientes complicados, pero bueno, el mundo no es perfecto.&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="531" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="135"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Terminales_2D00_1_5F00_6AA0E677.png"&gt;&lt;img title="Maldivas-Terminales 1" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Terminales 1" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Terminales_2D00_1_5F00_thumb_5F00_089EF46C.png" width="155" height="244" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="287"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Terminales_2D00_3_5F00_7FCEEC1F.jpg"&gt;&lt;img title="Maldivas-Terminales 3" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;float:none;padding-top:0px;padding-left:0px;margin-left:auto;display:block;padding-right:0px;border-top-width:0px;margin-right:auto;" border="0" alt="Maldivas-Terminales 3" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Terminales_2D00_3_5F00_thumb_5F00_72F49601.jpg" width="157" height="244" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="107"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Terminales_2D00_2_5F00_7CD9876C.jpg"&gt;&lt;img title="Maldivas-Terminales 2" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Terminales 2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Terminales_2D00_2_5F00_thumb_5F00_499D4E03.jpg" width="155" height="244" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;font size="1"&gt;Maldivas – Dispositivos móviles&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Desde la puesta en marcha del proyecto, a pesar de las pruebas unitarias y del trabajo que hemos realizado por escribir código de calidad, se han resuelto más de 1600 incidencias y se han realizado unas 800 nuevas propuestas de mejora. Día a día continuamos progresando y adaptando el sistema a nuevas especificaciones. Debemos recordar que las pruebas unitarias no garantizan el correcto funcionamiento de un programa, existen muchos tipos de pruebas mas que debemos abordar para que una aplicación funcione correctamente, la aportación de la visión de los usuarios es siempre indispensable para asegurar un correcto funcionamiento, es muy difícil simular todo aquello que puede hacer un usuario con un programa y si encima es lunes o ha bebido un par de copas la cosa se torna imposible… &lt;img class="wlEmoticon wlEmoticon-smile" style="border-top-style:none;border-left-style:none;border-bottom-style:none;border-right-style:none;" alt="Sonrisa" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/wlEmoticon_2D00_smile_5F00_68A611E5.png" /&gt;&lt;/p&gt;  &lt;p&gt;Hemos aplicado diversas tecnologías, como sabéis, nuestro modelo de datos está basado en entidades POCO, utilizando un data-mapper propio basado en generics y reflexión, lo cierto es que si hubiéramos contado con Entity FrameWork nos hubiéramos ahorrado un montón de trabajo pero así es la vida unas veces por delante y otras muy por detrás, pensar que un proyecto que nos ha llevado varios años y finaliza en Windows Forms, una tecnología actualmente en ‘desuso’, me entran hasta escalofríos de pensarlo, aunque supongo que en la mayoría de proyectos a largo plazo esto es así. &lt;/p&gt;  &lt;p&gt;El desarrollo se comenzó en el 2006 con VS 2005 y se ha finalizado con VS 2010, aunque actualmente ya funciona con VS 2012, utilidades como FxCop, ReSharer, CodeRush, Stylecop, Pex and Molex, Visual Studio for Database Developers, nos han ayudado mucho a mejorar la calidad, como gestor de proyectos hemos utilizado TFS, hemos integrado la suite de controles de Devexpress, Sql Server como servidor de base de datos e IIS 7 como servidor web. Hemos implementado procesos en segundo plano utilizando programación asíncrona, paralelización, cache, Servicios Windows, Servicios web, Linq, Serialización de archivos, etc., &lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="527" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="246"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Web_2D00_1_5F00_4F77F19C.png"&gt;&lt;img title="Maldivas-Web 1" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Web 1" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Web_2D00_1_5F00_thumb_5F00_1709CAC4.png" width="244" height="210" /&gt;&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="34"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="245"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Web_2D00_2_5F00_0310382E.jpg"&gt;&lt;img title="Maldivas-Web 2" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Web 2" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Web_2D00_2_5F00_thumb_5F00_1A5B3C9F.jpg" width="244" height="217" /&gt;&lt;/a&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;table cellspacing="0" cellpadding="2" width="528" border="0"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="526"&gt;         &lt;p align="center"&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Web_2D00_3_5F00_001AD37B.png"&gt;&lt;img title="Maldivas-Web 3" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="Maldivas-Web 3" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Maldivas_2D00_Web_2D00_3_5F00_thumb_5F00_5DE2C7F4.png" width="404" height="210" /&gt;&lt;/a&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;font size="1"&gt;Maldivas – Comercio electrónico&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;La aplicación tiene múltiples opciones Gestión de usuarios y permisos, enlaces con Office Outlook, Excel y Word, Gestor documental, Estructuras de fabricación, Gestión de órdenes de trabajo, Planificación en base a la demanda basada en sistemas Lean Manufacturing, , Multiempresa con bases de datos diferentes, Generación automática de asientos contables, Gestión de rutas, Enlaces bancarios norma 58 y Gestión de remesas de Confirming, Generación automática de asientos contables, Scheduler, Envió de información automatizado, Gestión de costes, Modulo de consultas y estadísticas, Diseño de Informes por usuarios avanzados, Gráficos interactivos, Cubos OLAP, Picking a través de dispositivos móviles, Comercio electrónico y muchas de las opciones que se integran en un ERP, desde el control de stocks, pasando por la Calidad, Compras, Ventas, Financiera, Recursos Humanos, etc.&lt;/p&gt;  &lt;p&gt;Y para el futuro… pues Maldivas continuara creciendo y actualizándose, nos quedan muchas mejoras que realizar, intentaremos aumentar la cobertura de código con pruebas unitarias, integración con Sharepoint, desarrollo de parte del sistema de producción, aumento de las aplicaciones con Dispositivos móviles y porque no, quizás hasta alguna aplicación en Tablet, migración del sistema de comercio electrónico a ASP MVC, introducción de EF como modelo de entidades, creación de y adaptación de formularios en WPF, etc.&lt;/p&gt;  &lt;p&gt;Aprovecho este post para dar las gracias especialmente a mi compañero Eduardo Obregon, que tanto me ha aguantado, sobre todo en los momentos difíciles de estos últimos años y que gracias a su calidad personal y trabajo ha contribuido a que este proyecto fuera posible, a los usuarios que nos han ayudado aportando Feedback y que han contribuido con sus ideas a mejorar este programa, a mi jefe que siempre me ha escuchado y con el que he podido discutir abiertamente de mis problemas y aquellas personas que siempre han confiado en que pese a los problemas y el tiempo invertido lograríamos realizar este proyecto del que más de una vez pensé en abandonar. &lt;/p&gt;  &lt;p&gt;Bueno, si habéis llegado hasta aquí, (vaya rollo que os he contado), espero que al menos echéis un vistazo a unos videos que diseñamos para formación interna que os permitirán haceros una idea del proyecto. Todos los datos del video de formación son ficticios. Se realizaron pensando en que la mayor parte de los usuarios no disponía de tarjeta de sonido sin audio, pero tienen subtítulos que podéis activar desde el menú inferior de YouTube, también os aconsejo subir la resolución para visualizar correctamente el video, estos se han filmado en 1280 x 800 aunque la resolución óptima del programa es de 1440 x 900, así que algunos formularios se verán bastante comprimidos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=aKrVo9ISLyc"&gt;Video 1 - Maldivas - Características generales&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La primera versión del sistema de terminales se desarrolló en el 2002 con Compaq Framework Beta 1, este ha sido adaptado para su integración con Maldivas&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=JfBAg80FJKY"&gt;Video 2 - Maldivas - Terminales móviles&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=kJJBIiIYmAA"&gt;Video 3 - Maldivas - Terminales gestión&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;La primera versión del sistema de comercio electrónico se desarrolló en ASP.Net 2.0 en el año 2005 y actualmente estamos trabajando para su integración completa en Maldivas con ASP Mvc.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=-Z6xJYt6izU"&gt;Video 4 - Maldivas - Comercio electrónico&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Espero que os gusten y os aporten alguna idea en vuestros desarrollos.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Para adaptar la configuración en Youtube:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_0F07F531.png"&gt;&lt;img title="clip_image001" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;margin:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image001" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_thumb_5F00_140A32E0.png" width="244" height="94" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;El icono amarillo muestra donde activar la resolución.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_4BDC7703.png"&gt;&lt;img title="clip_image002" style="border-left-width:0px;border-right-width:0px;background-image:none;border-bottom-width:0px;padding-top:0px;padding-left:0px;display:inline;padding-right:0px;border-top-width:0px;" border="0" alt="clip_image002" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_thumb_5F00_69021F0D.png" width="244" height="86" /&gt;&lt;/a&gt;&amp;#160; &lt;br /&gt;El icono amarillo muestra como activar los subtítulos.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=208182" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Gesti_26002300_243_3B00_n+de+Proyectos/default.aspx">Gesti&amp;#243;n de Proyectos</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/ERP/default.aspx">ERP</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Gesti_26002300_243_3B00_n+comercial/default.aspx">Gesti&amp;#243;n comercial</category></item><item><title>Scrum - Comparte tu Backlog con el Cliente</title><link>http://geeks.ms/blogs/jirigoyen/archive/2012/08/29/scrum-traslada-to-backlog-al-cliente.aspx</link><pubDate>Wed, 29 Aug 2012 18:22:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206577</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=206577</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=206577</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2012/08/29/scrum-traslada-to-backlog-al-cliente.aspx#comments</comments><description>&lt;p&gt;Los mayores problemas que se producen en la gesti&amp;oacute;n de proyectos se dan en el flujo de informaci&amp;oacute;n, ocurre muchas veces que esta se tergiversa cuando pasa entre las diferentes personas que trabajan en el proyecto y al final se desarrolla algo que muchas veces no ofrece una soluci&amp;oacute;n para el problema presentado por el cliente. Esto hace que la relaci&amp;oacute;n con tu cliente se degrade y al final tu proyecto se demore haciendo que este tenga un mayor sobrecoste y perjudicando tu relaci&amp;oacute;n con el cliente.&lt;/p&gt;
&lt;p&gt;Creo que todos conoc&amp;eacute;is la graciosa imagen que representa esto:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_1180346D.jpg"&gt;&lt;img height="244" width="198" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_thumb_5F00_2D3193D8.jpg" alt="clip_image001" hspace="12" border="0" 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="clip_image001" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un problema habitual se origina en el control de&amp;nbsp;la entrada de informaci&amp;oacute;n. Se dice, que normalmente debe existir una sola persona que trate con el cliente, yo pienso que esto es algo complicado de gestionar, sobre todo en grandes proyectos, en los que participan muchas personas, pues el cliente a veces, prefiere tratar con miembros del equipo de desarrollo con los que ha tenido mayor relaci&amp;oacute;n,&amp;nbsp;con lo que la entrada de informaci&amp;oacute;n puede originarse a trav&amp;eacute;s de los diferentes miembros del equipo y de esta forma las alteraciones con seguridad ser&amp;aacute;n mayores, pues cada uno tendemos a interpretar la informaci&amp;oacute;n a nuestra manera. Cuanto mas cercano se encuentra el equipo con respecto al cliente y mayor n&amp;uacute;mero de personas participan en el proyecto m&amp;aacute;s dif&amp;iacute;cil es controlar esta entrada de informaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Yo creo que la informaci&amp;oacute;n debe introducirse solo por un sitio, y a ser posible sin interaccionar con m&amp;aacute;s personas, para evitar&amp;nbsp;filtros, modificaciones&amp;nbsp;o interpretaciones personales y que esta&amp;nbsp;sea fiel reflejo de los pensamientos&amp;nbsp;del cliente, inclusive si&amp;nbsp;esta presenta alg&amp;uacute;n error para que&amp;nbsp;posteriormente pueda ser analizada&amp;nbsp;por todo el equipo. Pienso que debemos huir del pensamiento de que sea una sola persona la que hable con el cliente, que procese, filtre y finalmente traslade la informaci&amp;oacute;n al equipo de desarrollo. Esto traslada toda la responsabilidad a una sola persona que puede cometer errores&amp;nbsp;en la planificaci&amp;oacute;n y el&amp;nbsp;dise&amp;ntilde;o, al no contar con informaci&amp;oacute;n relevante de otros miembros del equipo de desarrollo que seguramente conozcan&amp;nbsp;a fondo &amp;aacute;reas del cliente en las que han estado trabajando. Creo que deber ser el equipo al completo, el que analice la informaci&amp;oacute;n y tome las decisiones en conjunto pues entre todos contaremos con una visi&amp;oacute;n general mas completa para resolver el problema.&lt;/p&gt;
&lt;p&gt;A veces el cliente llama directamente o la persona encargada del proyecto habla con el personalmente, el cliente traslada&amp;nbsp;cualquier problema o&amp;nbsp;necesidad con una prioridad determinada para resolverla. En este caso se producen varios problemas adicionales:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;- Por un lado el cliente interrumpe el trabajo que estas haciendo y aqu&amp;iacute; se producen las mayores p&amp;eacute;rdidas de productividad, porque estas interrupciones nos obligan a veces a&amp;nbsp;dejar tareas importantes. haciendo que la productividad decaiga en picado, no solamente se pierde el tiempo de la interrupci&amp;oacute;n, si no que&amp;nbsp;despu&amp;eacute;s obliga a que la persona tenga que&amp;nbsp;volver a concentrarse para poder continuar el trabajo que estaban realizando. Debemos intentar eliminar estas interrupciones, cuando veo equipos de desarrollo en los que habitualmente hay una o dos personas hablando constantemente por tel&amp;eacute;fono&amp;nbsp;suelo pensar que las cosas se est&amp;aacute;n haciendo&amp;nbsp;mal. Debemos&amp;nbsp;eliminar estas interrupciones, las reuniones de scrum est&amp;aacute;n para algo y debemos tratar de minimizar las conversaciones con el cliente, sobre todo aquellas que son por tel&amp;eacute;fono y que no quedan debidamente registradas o pueden sufrir diferentes interpretaciones y que adem&amp;aacute;s,&amp;nbsp;afectan al rendimiento de las dem&amp;aacute;s personas del equipo que se encuentra en el mismo entorno. Pienso que una buena soluci&amp;oacute;n aunque a algunos les suene un poco radical es simplemente descolgar el tel&amp;eacute;fono y bloquear las entradas de informaci&amp;oacute;n como skype, en nuestro caso intentamos centrarnos solo en el email que nos permite estar al tanto de cualquier incidencia urgente que requiera una atenci&amp;oacute;n inmediata, las conversaciones con un cliente no aportan absolutamente nada, la informaci&amp;oacute;n no queda registra y esta normalmente llega alterada al repositorio, lo que si puede aportar valor como veremos mas adelante es&amp;nbsp;un di&amp;aacute;logo con un cliente que quede registrado en el sistema y que no obligue a ninguna de las dos partes&amp;nbsp;a interrumpir su trabajo.&lt;/p&gt;
&lt;p&gt;- Puede ser adem&amp;aacute;s, que cuando el cliente llame le atienda una persona que no conozca a fondo su contexto de trabajo y de esta forma no sepa captar adecuadamente sus necesidades trasladando informaci&amp;oacute;n incompleta o err&amp;oacute;nea al equipo de desarrollo.&lt;/p&gt;
&lt;p&gt;- La informaci&amp;oacute;n que nos traslada el cliente no queda registrada, con lo cual nunca sabremos si esta ha sufrido alguna alteraci&amp;oacute;n, es importante que todos los&amp;nbsp;di&amp;aacute;logos sobre un &amp;iacute;tem determinado queden registrados y esta informaci&amp;oacute;n&amp;nbsp;sea accesible tanto por el propio cliente como por los miembros del equipo de desarrollo.&lt;/p&gt;
&lt;p&gt;- Por otro lado a veces el cliente establece una prioridad determinada abduciendo que la necesidad es&amp;nbsp;urgente y prioriza tu trabajo, de manera que esto nos obliga a dejar de lado aquello que estamos haciendo, para solucionar el problema lo antes posible, dejando aquello que ten&amp;iacute;amos planificado y que a&amp;nbsp;veces puede tener una mayor prioridad.&lt;/p&gt;
&lt;p&gt;- Muchas veces, parte del equipo de trabajo no cuenta con esta informaci&amp;oacute;n a tiempo, ya que se comienza a desarrollar&amp;nbsp;mucho antes de que el equipo pueda evaluar&amp;nbsp;su solicitud. En estos casos a lo mejor no conocemos toda la informaci&amp;oacute;n necesaria y ofrecemos una soluci&amp;oacute;n err&amp;oacute;nea debido a dependencias desconocidas y hacemos algo que deber&amp;iacute;a haber sido correctamente planificado y estudiado.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Este y otros problemas&amp;nbsp;son&amp;nbsp;derivados del flujo de informaci&amp;oacute;n y se convierte en una de las principales causas por la que muchos proyectos fracasan. &lt;/p&gt;
&lt;p&gt;Una soluci&amp;oacute;n que a nosotros nos ha funcionado muy bien es la de intentar trasladar y compartir el backlog del proyecto con el cliente, con ello evitaremos la mayor&amp;iacute;a de estos problemas y lograremos varias ventajas:&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;- Se minimizan las interrupciones: Ya no tenemos que atender al cliente por tel&amp;eacute;fono o skype cada vez que nos llame, podemos visualizar las incidencias y requisitos&amp;nbsp;que van llegando y pararnos solo si detectamos que estas requieren una atenci&amp;oacute;n inmediata, de esta forma podemos trabajar sin constantes interrupciones, el cliente tambi&amp;eacute;n se beneficia&amp;nbsp;del mismo sistema de trabajo, si tenemos que realizar alguna pregunta sobre un requisito en concreto utilizaremos el mismo sistema de dialogo con el, evitando interrumpirle en su trabajo y minimizando nuestro tiempo para contactar con el.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;- Registro del flujo de informaci&amp;oacute;n: Por un lado tanto el cliente como el equipo son los que escriben la informaci&amp;oacute;n&amp;nbsp;y esto queda registrado, con lo que evitaremos las alteraciones en la informaci&amp;oacute;n cuando las filtra cualquier persona que hace de intermediario. &lt;/p&gt;
&lt;p&gt;- Una mejor informaci&amp;oacute;n disminuye los tiempos de desarrollo: Muchas veces una llamada no es suficiente para describir adecuadamente&amp;nbsp;un problema, si el sistema de gesti&amp;oacute;n del backlog permite adjuntar archivos, el cliente puede f&amp;aacute;cilmente introducir un documento, un gr&amp;aacute;fico o cualquier tipo de informaci&amp;oacute;n que considere de inter&amp;eacute;s para facilitar su comprensi&amp;oacute;n, esto facilita mucho que la informaci&amp;oacute;n este localizada en un lugar determinada y que el equipo&amp;nbsp;entienda el problema&amp;nbsp;adecuadamente evitando que perdamos el tiempo buscando o intentando entender mejor el proceso.&lt;/p&gt;
&lt;p&gt;- Seguimiento del proceso: El cliente puede conocer en tiempo real la situaci&amp;oacute;n de su incidencia, mejora o el desarrollo de una nueva funcionalidad que haya solicitado, pudiendo adem&amp;aacute;s obtener informaci&amp;oacute;n adicional, fecha de planificaci&amp;oacute;n, personas que lo desarrollaran, estado actual, etc, etc. Esto es muy importante pues evita constantes interrupciones con preguntas del tipo: &amp;iquest;Ya has terminado aquello?, &amp;iquest;Por qu&amp;eacute; no se ha hecho? &amp;iquest;Qu&amp;eacute; problemas hab&amp;eacute;is tenido en el desarrollo?, de esta forma el cliente tiene constancia de las incidencias que ocurren, puede ocurrir que el desarrollo de un m&amp;oacute;dulo tal y como propone el cliente afecte a otros m&amp;oacute;dulos que el desconoce y es importante que si no se realiza como &amp;eacute;l ha solicitado pueda conozca las causas o los motivos por los que se ha realizado de otra manera.&lt;/p&gt;
&lt;p&gt;- Por otro lado esta informaci&amp;oacute;n va quedando almacenada en un hist&amp;oacute;rico, de manera que otros usuario pueden acceder a esta&amp;nbsp;informaci&amp;oacute;n sobre problemas que ya tienen una respuesta determinada. Este deber&amp;iacute;a ser un proceso que el cliente debe hacer antes de introducir una nueva incidencia, de manera que pueda beneficiarse de soluciones que ya hayan sido realizadas obteniendo una respuesta inmediata evitando&amp;nbsp;requerir al&amp;nbsp;equipo de trabajo.&lt;/p&gt;
&lt;p&gt;- La informaci&amp;oacute;n fluye hacia todos los miembros del equipo: Esto es fundamental en un equipo de desarrollo, algunos miembros del equipo desconocen como se han desarrollado otros m&amp;oacute;dulos y las dependencias entre ellos, todo el equipo debe conocer el trabajo de los dem&amp;aacute;s para as&amp;iacute; poder ofrecer la informaci&amp;oacute;n relevante a otros miembros del equipo que la desconocen y lograr la soluci&amp;oacute;n mas adecuada.&lt;/p&gt;
&lt;p&gt;- Filtrado de informaci&amp;oacute;n: Normalmente no nos interesa compartir toda la informaci&amp;oacute;n con toda la gente que participa del proyecto, nuestro sistema permite compartir solo aquellos &amp;iacute;tems que deseemos con determinadas personas que trabajan en el cliente, de manera que el director financiero quiz&amp;aacute;s no quiera visualizar informaci&amp;oacute;n que solo es relevante para el responsable de n&amp;oacute;minas, es importante que podamos controlar con quien queremos compartir esta informaci&amp;oacute;n, no todas las personas que trabajan en el proyecto necesitan estar informadas de todos los aspectos de este. Con lo que logramos que la informaci&amp;oacute;n fluya solo a aquellas personas relevantes evitando sobrecargar de informaci&amp;oacute;n a otras que no la necesitan.&lt;/p&gt;
&lt;p&gt;- El sistema de alerta nos avisa de cualquier incidencia urgente: Es importante que existan ciertos mecanismos que nos permitan notificar r&amp;aacute;pidamente una incidencia urgente, que se bloquee un servidor de BD requiere atenci&amp;oacute;n inmediata, nuestro sistema de alertas a trav&amp;eacute;s de email hace que estemos informados en tiempo real de cualquier incidencia grave y esto nos permite reaccionar con rapidez.&lt;/p&gt;
&lt;p&gt;- El equipo de desarrollo planifica y prioriza: Somos nosotros los que debemos priorizar, no el cliente, el cliente no tiene toda la informaci&amp;oacute;n relevante del desarrollo del proyecto y el equipo si, muchas veces ocurre que para el cliente es muy importante la realizaci&amp;oacute;n de una tarea en concreto, pero en el proyecto pueden existir otras tareas que tengan una prioridad mayor, con un backlog compartido podemos cambiar la prioridad y notificar al cliente del porqu&amp;eacute; de estas decisiones, para justificar y hacerlo participe de nuestro trabajo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Voy a poner un ejemplo de un &amp;iacute;tem de un backlog para ver su funcionamiento, en este caso hemos implementado un peque&amp;ntilde;o programa para realizar esta operaci&amp;oacute;n, que notifica de forma autom&amp;aacute;tica a los usuarios a trav&amp;eacute;s del correo electr&amp;oacute;nico de cualquier cambio en el backlog, he le&amp;iacute;do en alguna parte que en la nueva versi&amp;oacute;n del TFS, esto va a ser posible, seguro que &lt;a href="http://geeks.ms/blogs/elbruno/default.aspx"&gt;El bruno&lt;/a&gt; puede avanzarnos algo sobre este tema.&lt;/p&gt;
&lt;p&gt;1&amp;ordm; - El cliente notifica un nuevo &amp;iacute;tem.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C&amp;oacute;digo: 4212 Fecha: 12/07/2012 9:12 Prioridad: Urgente&lt;/p&gt;
&lt;p&gt;Usuario: Jose Angel Garc&amp;iacute;a (Cliente - Agente comercial)&lt;/p&gt;
&lt;p&gt;Descripci&amp;oacute;n: Necesitamos que en el informe de facturaci&amp;oacute;n aparezca el n&amp;uacute;mero del agente de aduanas. Te adjunto un pdf con el informe de la factura para que ve&amp;aacute;is como debe quedar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2 &amp;ordm; - Hemos recibido su notificaci&amp;oacute;n con fecha 12/07/2012&lt;/p&gt;
&lt;p&gt;3&amp;ordm; - Respuesta de Ana Mart&amp;iacute;nez (Responsable del proyecto) a la notificaci&amp;oacute;n n&amp;ordm; 4212 el d&amp;iacute;a 13/07/2012 10:00&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La propuesta indicada ser&amp;aacute; realizada por Julio Otero (Desarrollador). &lt;/p&gt;
&lt;p&gt;Uno de los miembros del equipo comenta que las facturas pueden contener varios albaranes y estos podr&amp;iacute;an utilizar un agente de aduanas diferente, como procedemos en este caso.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;4&amp;ordm; - Respuesta de Jos&amp;eacute; &amp;Aacute;ngel Garc&amp;iacute;a (Agente comercial) a la notificaci&amp;oacute;n n&amp;ordm; 4212 el d&amp;iacute;a 12/07/2012 11:45&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Este caso no se puede dar, ya que antes de hacer la factura se comprueba que todos los albaranes tengan el mismo agente de aduanas, si existiesen albaranes con diferente agente se generar&amp;iacute;an varias facturas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;5&amp;ordm; - Respuesta de Ana Mart&amp;iacute;nez (Responsable del proyecto) a la notificaci&amp;oacute;n n&amp;ordm; 4212 el d&amp;iacute;a 12/07/2012 12:25&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bien, en este momento no podemos hacerla pues existen dos incidencias prioritarias que debemos resolver antes, cambio la fecha de planificaci&amp;oacute;n para el d&amp;iacute;a 16/07/2012, para salir del paso pod&amp;eacute;is editar el PDF de la factura e introducirlo de forma manual.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;6&amp;ordm; - Respuesta de Julio Otero (Desarrollador) a la notificaci&amp;oacute;n n&amp;ordm; 4212 el d&amp;iacute;a 17/07/2012 10:25&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La notificaci&amp;oacute;n 4212 ha sido resulta, te envi&amp;oacute; el pdf adjunto para que verifiques si todo esta correcto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;7&amp;ordm; - Respuesta de Jos&amp;eacute; &amp;Aacute;ngel Garc&amp;iacute;a (Agente comercial)&amp;nbsp;a la notificaci&amp;oacute;n n&amp;ordm; 4212 el d&amp;iacute;a 17/07/2012 11:00&lt;/p&gt;
&lt;p&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;Lo he verificado y funciona correctamente.&lt;/p&gt;
&lt;p&gt;8&amp;ordm;&amp;nbsp;- Cerrada la notificaci&amp;oacute;n n&amp;uacute;mero 4212 por Jos&amp;eacute; &amp;Aacute;ngel Garc&amp;iacute;a (Agente comercial)&lt;/p&gt;
&lt;p&gt;De esta forma la informaci&amp;oacute;n fluye sin que tengamos que controlar por donde entra y quien la procesa, ya que existe un solo punto de entrada (la aplicaci&amp;oacute;n que permite acceder a nuestro backlog), se disminuyen las interrupciones ya que no tenemos que hablar directamente con el cliente, la informaci&amp;oacute;n sobre los cambios se distribuye de forma autom&amp;aacute;tica notificando al cliente por email de cualquier cambio que se produce, nos permite planificar y cambiar la prioridad de la tarea y estudiar mejor los cambios a aplicar, es el cliente quien escribe sus necesidades, y estas no se tergiversan, el registro guarda la informaci&amp;oacute;n tal y como el cliente la ha introducido, el equipo trabaja como un conjunto en la planificaci&amp;oacute;n de tareas y la correcci&amp;oacute;n de errores evitando errores en el dise&amp;ntilde;o por el desconocimiento de las dependencias y ofrece entre todos sus miembros una soluci&amp;oacute;n mas adecuada y el sistema de alertas notifica en tiempo real de cualquier incidencia grave que pueda surgir para permitirnos reaccionar con rapidez.&lt;/p&gt;
&lt;p&gt;He puesto Scrum porque es la metolog&amp;iacute;a que utilizamos, pero creo que este sistema de trabajo es trasladable cualquier metodolog&amp;iacute;a &amp;Aacute;gil, si hab&amp;eacute;is llegado hasta aqu&amp;iacute;, espero vuestros comentarios.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206577" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Metolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metolog&amp;#237;as &amp;#193;giles</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>Visual Studio 2012 – Primeras impresiones</title><link>http://geeks.ms/blogs/jirigoyen/archive/2012/08/29/visual-studio-2012-primeras-impresiones.aspx</link><pubDate>Wed, 29 Aug 2012 15:02:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:206575</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=206575</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=206575</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2012/08/29/visual-studio-2012-primeras-impresiones.aspx#comments</comments><description>&lt;p&gt;Llevo ya varios d&amp;iacute;as trabajando con la nueva versi&amp;oacute;n de VS, lo cierto es que despu&amp;eacute;s de las &amp;uacute;ltimas versiones, me esperaba mas de lo mismo, los mismos errores sin corregir versi&amp;oacute;n tras versi&amp;oacute;n, los cuelgues con el dise&amp;ntilde;ador de formularios que se produc&amp;iacute;an a diario, la carga eterna de los controles del toolbar, los enormes tiempos de compilaci&amp;oacute;n, etc, etc, nada mas lejos de la realidad, por fin, despu&amp;eacute;s de estos a&amp;ntilde;os parece que las cosas han empezado a cambiar, los desarrolladores somos un valor al alza, (me gustar&amp;iacute;a saber cuanta culpa tiene Google y Apple) en todo esto.&lt;/p&gt;
&lt;p&gt;La primera vez que arrancas VS 2012 y observas el men&amp;uacute;, ya te dan ganas de salir corriendo, vaya un dise&amp;ntilde;o que han aplicado, colores grises, fuentes del men&amp;uacute; principal en may&amp;uacute;scula, etc, he le&amp;iacute;do que se est&amp;aacute;n acercando el dise&amp;ntilde;o Metro, yo creo que el dise&amp;ntilde;ador principal deber&amp;iacute;a acudir a un par de desfiles de Victoria Secret, a ver si se le pega algo sobre la combinaci&amp;oacute;n de colores, aunque lo cierto es que despu&amp;eacute;s de unos pocos d&amp;iacute;as de trabajo, el dise&amp;ntilde;o es, con diferencia lo que menos importa, por mi, como si en la siguiente versi&amp;oacute;n solo funciona en una pantalla de fosforo verde.&lt;/p&gt;
&lt;p&gt;En lo que al entorno de trabajo se refiere, han corregido los errores de las versiones anteriores y han mejorado en gran medida el performance general de todas las operaciones, verificaci&amp;oacute;n de las reglas de fxcop, unit test, el dise&amp;ntilde;o de los formularios ya no da errores constantemente debido a la carga en memoria de librer&amp;iacute;as, la carga del toolbar ya no te hace esperar varios minutos, algunos de nuestros proyectos tienen un gran n&amp;uacute;mero de controles y esto hace que cada vez que quer&amp;iacute;as dise&amp;ntilde;ar un formulario despu&amp;eacute;s de compilar se tuviera que regenerar de nuevo toda la tabla de controles, la carga de los proyectos se realiza en paralelo y en soluciones con muchos proyectos el tiempo de espera se reduce considerablemente, mi conexi&amp;oacute;n remota al servidor de TFS utilizando una VPN a funcionado a la primera, por fin no pierdo las credenciales cada dos por tres, los tiempos de compilaci&amp;oacute;n han mejorado mucho, incre&amp;iacute;blemente no he encontrado ni un solo problema, he instalado Coderush y Resharper y funcionan de maravilla a pesar del aumento de los recursos que requieren.&lt;/p&gt;
&lt;p&gt;En el desarrollo diario con Visual Studio 2010, os puedo asegurar que muchos de estos problemas supon&amp;iacute;an unas perdidas de tiempo enormes, hemos calculado que mas de una hora diaria por persona, esto supone para algunas empresas de desarrollo unas perdidas enormes, no entiendo porque no han corregido estos problemas hasta ahora, pero al menos lo han logrado en esta versi&amp;oacute;n, ya era hora, en estos d&amp;iacute;as no hemos tenido ni un solo problema trabajando con VS 2012, de hecho acabo de borrar de mi equipo la versi&amp;oacute;n de VS 2010, a su favor dir&amp;eacute; que era mucho mas bonito...&lt;/p&gt;
&lt;p&gt;Por fin, Entity FrameWork 5, permite realizar diferentes diagramas, al fin podremos trabajar en el dise&amp;ntilde;ador con bases de datos que contiene muchas tablas, aunque los nombres de estas siguen sin incorporar el esquema de seguridad, algo con lo que sigo sin estar de acuerdo, no es lo mismo una tabla llamada dbo.Articulos que gestion.Articulos y en este caso EF llama a la primera Articulos y a la segunda Articulos1 y no muestra el nombre completo con su esquema, algo que para nosotros es importante, pues forma parte del esquema de seguridad de la tabla y siempre debe ser reflejado en las consultas.&lt;/p&gt;
&lt;p&gt;Uno de los problemas que he visto y que no me ha gustado nada, es que despu&amp;eacute;s de actualizar uno de los proyectos a la versi&amp;oacute;n 4.5 del FrameWork basado en Windows Forms, nos hemos dado cuenta que al instalar este en equipos que usen XP no funciona, en la informaci&amp;oacute;n de Microsoft aparece que solo se da soporte a versiones que parten desde Windows Vista hacia adelante, parece que Microsoft quiere forzar a que los usuarios actualicen a Windows Vista o Windows 7, pienso que es un gran error no dar soporte a Windows XP, hay muchos equipos que funcionan muy bien con este S.O. y que no tienen ninguna necesidad de actualizarse o que su hardware no les permitir&amp;aacute; hacerlo, pienso que deber&amp;iacute;an haberse esforzado en hacerlo compatible al menos para soluciones realizadas en Windows Forms, que todav&amp;iacute;a hoy siguen siendo la mayor&amp;iacute;a.&lt;/p&gt;
&lt;p&gt;Sigo sin entender que pasa con el desarrollo de los dispositivos m&amp;oacute;viles industriales en Windows CE y Pocke PC, est&amp;aacute;n abandonando un sector que tiene un potencial incre&amp;iacute;ble, no he visto que Windows Phone se integre todav&amp;iacute;a con estos dispositivos, pero en fin, ya llegara alguien para hacerse con este hueco y luego llegaran las prisas como con Windows Phone y Windows 8, parece que algunos no reaccionan hasta que viene alguien y se hace con su mercado.&lt;/p&gt;
&lt;p&gt;No he tenido tiempo de ver mucho mas, alg&amp;uacute;n proyecto en ASP.NET y ASP MVC que han funcionado sin problemas, pero si os dir&amp;eacute; que en general, la primera impresi&amp;oacute;n ha sido muy positiva, pienso que han realizado un excelente trabajo en esta versi&amp;oacute;n, as&amp;iacute; que animaros Visual Studio 2012 supone un cambio enorme respecto a las versiones anteriores, solo las mejoras de rendimiento ya justifican el cambio, espero que contin&amp;uacute;en as&amp;iacute;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=206575" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Software/default.aspx">Software</category></item><item><title>Flexibilidad laboral</title><link>http://geeks.ms/blogs/jirigoyen/archive/2011/05/27/flexibilidad-laboral.aspx</link><pubDate>Fri, 27 May 2011 13:44:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:195073</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>20</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=195073</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=195073</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2011/05/27/flexibilidad-laboral.aspx#comments</comments><description>&lt;p&gt;Me asombra ver como a d&amp;iacute;a de hoy con la gran crisis en la que estamos inmersos, la mayor&amp;iacute;a de empresas siga optando por los m&amp;eacute;todos de control hacia sus empleados y no utilicen m&amp;eacute;todos para aumentar la flexibilidad de sus trabajadores, esta es una de las razones del porque Espa&amp;ntilde;a y otros pa&amp;iacute;ses nos encontremos a la cola en lo que a productividad se refiere.&lt;/p&gt;
&lt;p&gt;No puedo entender c&amp;oacute;mo, ya no las Empresas, si no algunos compa&amp;ntilde;eros e incluso amigos, se asombren cuando les comentas que trabajas fuera de tu centro de trabajo, la mayor&amp;iacute;a llegan r&amp;aacute;pidamente a la conclusi&amp;oacute;n de que esto es totalmente improductivo y se quedan perplejos ante este tipo de pr&amp;aacute;cticas.&lt;/p&gt;
&lt;p&gt;En mi caso, tengo la &amp;ldquo;suerte&amp;rdquo;, (parece como que me haya tocado la loter&amp;iacute;a&amp;hellip;), de que mi Empresa me permite realizar este tipo de pr&amp;aacute;cticas, es curioso como mi productividad y mi calidad de vida aumentan cuando trabajo fuera del entorno laboral, bajo mi punto de vista se producen varias ventajas:&lt;/p&gt;
&lt;p&gt;Por un lado este planteamiento me permite eliminar los l&amp;iacute;mites de horarios y tu trabajo se convierte en algo cotidiano y m&amp;aacute;s cercano, dejas de ver el trabajo como una obligaci&amp;oacute;n con el que tienes que vivir.&lt;/p&gt;
&lt;p&gt;Una de las mayores ventajas, es que el individuo se siente mucho m&amp;aacute;s valorado pues entiende que hay una gran relaci&amp;oacute;n de confianza y de esta manera se siente m&amp;aacute;s integrado con su entorno laboral.&lt;/p&gt;
&lt;p&gt;Hay momentos en que uno est&amp;aacute; centrado y se encuenta c&amp;oacute;modo trabajando m&amp;aacute;s y otros sin embargo, en los que no tienes la cabeza para resolver un problema determinado, en este trabajo, muchas veces creativo, todos sabemos que hay momentos en el que podemos solucionar un problema al cabo de toda una semana y otros, en tan solo unas horas, la flexibilidad laboral nos permite adaptar nuestro estado y maximizar nuestra productividad. Comentaba Joel Spolsky en uno de sus art&amp;iacute;culos en los que analizaba sus ratios de productividad que entre reuniones, llamadas, aspectos burocr&amp;aacute;ticos y otros factores, conclu&amp;iacute;a que sus ratios de trabajo real estaban en torno a las 2 y 3 horas diarias, &amp;ldquo;en el caso de los Espa&amp;ntilde;oles lo tendr&amp;iacute;amos que dividir por PI&amp;hellip;&amp;rdquo;,as&amp;iacute; que contamos con un gran marguen de mejora.&lt;/p&gt;
&lt;p&gt;Supone un ahorro de costes para las dos partes, la empresa disminuye sus gastos en medios, energ&amp;iacute;a, oficinas y otros factores y los empleados el gasto enorme en combustible, mantenimiento y amortizaci&amp;oacute;n del veh&amp;iacute;culo. &lt;/p&gt;
&lt;p&gt;Se produce un importante ahorro de tiempo en desplazamientos que podemos utilizar en otras tareas&amp;nbsp;lo curioso es que hay gente que todos los d&amp;iacute;as pierde dos o tres horas diarias en desplazamientos a sus centros de trabajo para realizar trabajos administrativos que f&amp;aacute;cilmente pueden estar sujetos al&amp;nbsp;tele-trabajo.&lt;/p&gt;
&lt;p&gt;Por otra parte, es sumamente importante maximizar nuestro tiempo libre, esto nos permite despejar la mente y disfrutar m&amp;aacute;s de nuestra vida y se convierte en uno de los principales motivos para aumentar nuestra productividad, si llegamos contentos y despegados a nuestro trabajo, este se convierte en un elemento m&amp;aacute;s de nuestra vida cotidiana y desaparece como tarea para convertirse en algo importante en nuestras vidas. &lt;/p&gt;
&lt;p&gt;Las interrupciones disminuyen, en tu empresa, ya no te llaman para cualquier cosa sino para las que realmente te necesitan, ocurre muchas veces cuando te encuentras en el centro de trabajo que mucha gente demanda tus servicios para cosas sin importancia, solo por el hecho de que estas ah&amp;iacute; y presuponen que para ti, solucionar un problema es m&amp;aacute;s f&amp;aacute;cil que para ellos, as&amp;iacute; que prefieren llamarte a intentar solucionarlo por ellos mismos, esto aumenta las interrupciones en tu trabajo y te impide ser productivo. Si te encuentras fuera, te suelen llamar o convocar para aquello en lo que eres realmente necesario disminuyendo los recesos.&lt;/p&gt;
&lt;p&gt;Para los empresarios se convierte tambi&amp;eacute;n en un elemento que permite incentivar a sus trabajadores. Estos valoran mucho este tipo de pr&amp;aacute;cticas, a veces muy por encima incluso de los incentivos dinerarios, para mi es un factor determinante a la hora de plantearte siquiera cambiar de trabajo, la flexibilidad laboral supone un arma muy potente a la hora de negociar un contrato laboral.&lt;/p&gt;
&lt;p&gt;Pero con todo, tambi&amp;eacute;n existen desventajas, no todos cumplimos con un perfil para trabajar en un entorno de este tipo y no todos los trabajos permiten la flexibilidad laboral, para ello se deben dar una serie de circunstancias, tu implicaci&amp;oacute;n con la empresa y tu trabajo debe ser alta, debes ser responsable e intentar cumplir con los objetivos, existen individuos que sin control no son capaces de trabajar en un entorno de flexibilidad o est&amp;aacute;n habituados a trabajar en entornos controlados, cuando eliminas estas barreras lejos de mejorar la productividad, esta disminuye. Habr&amp;iacute;a que preguntarse tambi&amp;eacute;n si queremos contar con estas personas en nuestro entorno laboral, aunque a veces no queda m&amp;aacute;s remedio.&lt;/p&gt;
&lt;p&gt;Algunos individuos, cuando se encuentran lejos del entorno laboral se sienten en la obligaci&amp;oacute;n de trabajar a todas horas y esto, aunque cueste creerlo, al final tambi&amp;eacute;n disminuye la productividad y empeora la calidad de vida, pues la presi&amp;oacute;n del trabajo constante se va haciendo mayor, es muy importante aprender a que todas las actividades diferentes con tu familia, el deporte, los amigos, tus hobbies y por supuesto el trabajo se complementan ayudando a las personas a conseguir un equilibrio que posteriormente les permitir&amp;aacute; abodar mejor los diferentes problemas de su vida laboral, debe existir un equilibrio en la vida de cada persona para poder sacar lo mejor de cada uno, algunos necesitaran m&amp;aacute;s tiempo libre, otros en cambio necesitaran estudiar o trabajar m&amp;aacute;s, es importante aprender a conocernos mejor para aumentar nuestro bienestar y consecuentemente nuestra productividad, esto es algo que han entendido a la perfecci&amp;oacute;n empresas como Microsoft, Google y otras, por algo son ellas las que mayores beneficios obtienen.&lt;/p&gt;
&lt;p&gt;Entiendo que siempre debe existir cierto control y para ello contamos con infinidad de herramientas, debemos habituarnos a estimar e intentar cumplir con los objetivos marcados, en la mayor parte de los trabajos no utilizamos ninguno de estos m&amp;eacute;todos, no existe evaluaci&amp;oacute;n continua ni por objetivos. La utilizaci&amp;oacute;n de metodolog&amp;iacute;as puede ayudarnos mucho en este aspecto. En resumen, creo en el control, pero en el control intentado dotar al individuo de una mayor libertad y confianza para incentivarle y ayudar a mejorar su desarrollo profesional.&lt;/p&gt;
&lt;p&gt;Creo que los empresarios, al menos yo cuando lo era, lo &amp;uacute;nico que buscaba eran personas de confianza que resuelvan los trabajos que hab&amp;iacute;a que realizar, lo dem&amp;aacute;s es completamente secundario. Las Empresas tienen la obligaci&amp;oacute;n de utilizar todos estos m&amp;eacute;todos para mejorar sus ratios de productividad y deben de empezar a comprender que aquellos basados en el &amp;ldquo;control&amp;rdquo; son completamente improductivos, y est&amp;aacute; siendo sobradamente demostrado por todos aquellos Pa&amp;iacute;ses m&amp;aacute;s avanzados que nosotros que utilizan este tipo de pr&amp;aacute;cticas de forma natural y logran indices de productividad mayores. Debemos cambiar la forma de trabajar, pienso que muchos de los problemas existentes hoy en d&amp;iacute;a, podr&amp;iacute;an resolverse f&amp;aacute;cilmente si todos fu&amp;eacute;semos un poco m&amp;aacute;s &amp;ldquo;flexibles&amp;rdquo;. Sigo creyendo que el verdadero valor de las empresas esta en las personas que las forman y ser&amp;aacute; el conjunto de todas ellas las &amp;uacute;nicas que podr&amp;aacute;n hacer que estas tengan un futuro. &lt;/p&gt;
&lt;table border="0" cellpadding="2" cellspacing="0" width="400"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="200"&gt;&lt;img src="http://josemanuelcastro.files.wordpress.com/2011/03/productividad1.gif" height="175" width="250" alt="" /&gt;&lt;/td&gt;
&lt;td valign="top" width="200"&gt;&lt;img src="http://yoriento.com/wp-content/uploads/2009/08/Productividad-forg-550x383.jpg" alt="Productividad-forg" height="175" width="250" /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Quiero con este post animar a las Empresas para que utilicen estos m&amp;eacute;todos que por otra parte son &amp;ldquo;gratis&amp;rdquo;, como elementos que les permitan mejorar la productividad, la captaci&amp;oacute;n de mejores empleados y la mejora del &amp;aacute;mbito laboral. Tambi&amp;eacute;n animaros a todos vosotros para que la flexibilidad se convierta en un elemento de negociaci&amp;oacute;n importante a la hora de trabajar para una empresa, no solo hay que negociar el sueldo, debemos luchar porque las empresas apliquen estos m&amp;eacute;todos que permitir&amp;aacute;n mejorar nuestra productividad.&lt;/p&gt;
&lt;p&gt;Un saludo.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pd. Es incre&amp;iacute;ble que desde hace a&amp;ntilde;os las empleadas de l&amp;iacute;neas er&amp;oacute;ticas realizan el trabajo desde su casa. Curiosamente a nadie le choca este hecho&amp;hellip;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=195073" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Productividad/default.aspx">Productividad</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Flexibilidad+laboral/default.aspx">Flexibilidad laboral</category></item><item><title>Utilizando Arrays de parametros en Procedimientos Almacenados con Sql Server</title><link>http://geeks.ms/blogs/jirigoyen/archive/2010/10/17/utilizando-arrays-de-parametros-en-procedimientos-almacenados-con-sql-server.aspx</link><pubDate>Sun, 17 Oct 2010 20:46:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:183426</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=183426</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=183426</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2010/10/17/utilizando-arrays-de-parametros-en-procedimientos-almacenados-con-sql-server.aspx#comments</comments><description>&lt;p&gt;Una caracter&amp;iacute;stica muy solicitada por los desarrolladores en Sql Server es la de poder pasar varios valores a un procedimiento almacenado en forma de array. Desde la versi&amp;oacute;n 2000 utilizaba una funci&amp;oacute;n de Sql que me permit&amp;iacute;a trabajar con Arrays a trav&amp;eacute;s de una cadena de texto delimitada por comas, normalmente los utilizaba en procesos de selecci&amp;oacute;n como en el ejemplo siguiente:&lt;/p&gt;
&lt;div&gt;
&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;CREATE PROCEDURE GetCustomers @codes VARCHAR(MAX) AS&lt;br /&gt;SELECT CustomerID, Name, Phone, Country &lt;br /&gt;FROM Customers &lt;br /&gt;WHERE CustomerID IN (SELECT * FROM [dbo].[ArrayToTable] (@param))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;En este procedimiento el parametro @codes recibe una cadena delimitada por comas con los valores &amp;rsquo;12,54,89,104,221,423,1239&amp;rsquo;, el sp devuelve todos los clientes con estos c&amp;oacute;digos, la definici&amp;oacute;n del parametro &amp;lsquo;@codes&amp;rsquo; se realiza con varchar(MAX), para que la cadena pueda almacenar la mayor cantidad de c&amp;oacute;digos posible, sin embargo varchar(MAX) tiene la limitaci&amp;oacute;n de 8000 caracteres y en algunas situaciones se nos puede quedar peque&amp;ntilde;o.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;La definici&amp;oacute;n de la funci&amp;oacute;n en Transact-Sql es la siguiente:&lt;/div&gt;
&lt;div style="border:1px solid silver;text-align:left;padding:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;" id="codeSnippetWrapper"&gt;
&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;CREATE FUNCTION [dbo].[ArrayToTable] (@delimStr NVARCHAR(max))&lt;br /&gt;RETURNS &lt;br /&gt;&lt;br /&gt;@StrValTable TABLE &lt;br /&gt;(&lt;br /&gt;    -- Add the column definitions &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; the TABLE variable here&lt;br /&gt;    StrVal VARCHAR(20) &lt;br /&gt;)&lt;br /&gt;AS&lt;br /&gt;BEGIN&lt;br /&gt;    -- Fill the table variable with the rows &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; your result set&lt;br /&gt;    DECLARE @strlist NVARCHAR(max), @pos INT, @delim CHAR, @lstr NVARCHAR(max)&lt;br /&gt;    SET @strlist = ISNULL(@delimStr,&lt;span style="color:#006080;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;    SET @delim = &lt;span style="color:#006080;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    WHILE ((len(@strlist) &amp;gt; 0) and (@strlist &amp;lt;&amp;gt; &lt;span style="color:#006080;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;))&lt;br /&gt;    BEGIN&lt;br /&gt;        SET @pos = charindex(@delim, @strlist)&lt;br /&gt;        &lt;br /&gt;        IF @pos &amp;gt; 0&lt;br /&gt;           BEGIN&lt;br /&gt;              SET @lstr = substring(@strlist, 1, @pos-1)&lt;br /&gt;              SET @strlist = ltrim(substring(@strlist,charindex(@delim, @strlist)+1, 8000))&lt;br /&gt;           END&lt;br /&gt;        ELSE&lt;br /&gt;           BEGIN&lt;br /&gt;              SET @lstr = @strlist&lt;br /&gt;              SET @strlist = &lt;span style="color:#006080;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;br /&gt;           END&lt;br /&gt;&lt;br /&gt;        INSERT @StrValTable VALUES (@lstr)&lt;br /&gt;    END&lt;br /&gt;        RETURN &lt;br /&gt;    END&lt;br /&gt;&lt;br /&gt;GO&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;B&amp;aacute;sicamente lo que hace es crear una tabla temporal conformada por un campo y cada valor en un &amp;uacute;nico registro, de esta forma la consulta de arriba puede ser ejecutada sin problemas, hay que tener en cuenta que el uso de tablas temporales puede reducir el rendimiento, sin embargo es mejor esto a llamar al SP muchas veces. Podriamos tambien optar por pasar los arrays con XML y readaptar la funci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Sin embargo en la versi&amp;oacute;n 2008 aparecen los User-Defined Table Type, que permiten definir la estructura de una tabla, que posteriormente puede ser utilizada para pasar valores a un SP.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_56AB9BAC.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="clip_image001" alt="clip_image001" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_thumb_5F00_66D763A5.png" border="0" height="244" width="161" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Para el ejemplo partimos de la tabla siguiente:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_6BD9A154.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="clip_image002" alt="clip_image002" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_thumb_5F00_31EA5E68.png" border="0" height="104" width="244" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La definici&amp;oacute;n de este tipo de estructura es relativamente sencilla, similar a la creaci&amp;oacute;n de una tabla, el tipo anterior se definir&amp;iacute;a con la siguiente instrucci&amp;oacute;n transact-sql&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;CREATE TYPE [dbo].[UsersTable] AS TABLE&lt;br /&gt;(&lt;br /&gt;    [UserID] [&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;] NOT NULL,&lt;br /&gt;    [Postal] [&lt;span style="color:#0000ff;"&gt;char&lt;/span&gt;] NULL&lt;br /&gt;    PRIMARY KEY([UserID])&lt;br /&gt;    )&lt;br /&gt;GO&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;Este nuevo tipo de estructura nos aporta varias ventajas, podemos definir la tabla con varios campos&amp;nbsp; y limitar el contenido del campo [UserID] utilizando primary key para que no se repitan los valores. &lt;/p&gt;
&lt;p&gt;Una vez definida la estructura podemos utilizarla como un par&amp;aacute;metro m&amp;aacute;s. &lt;/p&gt;
&lt;p&gt;La definici&amp;oacute;n del SP que utiliza la nueva estructura es la siguiente:&lt;/p&gt;
&lt;div&gt;
&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;CREATE PROCEDURE [dbo].[GetUsers] @users dbo.UsersTable READONLY&lt;br /&gt;AS&lt;br /&gt;    SELECT * FROM Users WHERE UserID IN (SELECT userId from @users)&lt;br /&gt;&lt;br /&gt;GO&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;El programa para llamar al SP desde c# podria ser similar al&amp;nbsp; ejemplo siguiente:&lt;/div&gt;
&lt;div&gt;
&lt;div style="border:1px solid silver;text-align:left;padding:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;" id="codeSnippetWrapper"&gt;
&lt;div style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;
&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Data;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Data.SqlClient;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; ConsoleApplication1&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;{&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;    &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Program&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;    {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;        {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlConnection sqlConnection = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlConnection(&lt;span style="color:#006080;"&gt;&amp;quot;Server=(local);Integrated Security=SSPI;Initial Catalog=Database&amp;quot;&lt;/span&gt;))&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;            {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlCommand sc = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SqlCommand(&lt;span style="color:#006080;"&gt;&amp;quot;dbo.GetUsers&amp;quot;&lt;/span&gt;, sqlConnection))&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                    &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (IDataReader idr = GetParams())&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                    {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                        sc.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@users&amp;quot;&lt;/span&gt;, SqlDbType.Structured).Value = idr;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                        sqlConnection.Open();&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (sqlConnection.State == ConnectionState.Open)&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                        {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                            sc.CommandType = CommandType.StoredProcedure;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (SqlDataReader sqlDataReader = sc.ExecuteReader())&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                            {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (sqlDataReader != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; sqlDataReader.FieldCount &amp;gt; 0)&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                    &lt;span style="color:#0000ff;"&gt;while&lt;/span&gt; (sqlDataReader.Read())&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                    {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                        Console.WriteLine(String.Format(&lt;span style="color:#006080;"&gt;&amp;quot;C&amp;oacute;digo {0}, Nombre {1}&amp;quot;&lt;/span&gt;, sqlDataReader[0], sqlDataReader[1]));&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                    }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                    Console.ReadLine();&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                                }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                            }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                        }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                    }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;            }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;        }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; DataTableReader GetParams()&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;        {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;            &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (DataTable dt = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; DataTable(&lt;span style="color:#006080;"&gt;&amp;quot;Prueba&amp;quot;&lt;/span&gt;))&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;            {&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dt.Columns.Add(&lt;span style="color:#006080;"&gt;&amp;quot;UserID&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;));&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                DataRow dr1 = dt.NewRow();&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dr1[&lt;span style="color:#006080;"&gt;&amp;quot;UserId&amp;quot;&lt;/span&gt;] = 3;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dt.Rows.Add(dr1);&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                DataRow dr2 = dt.NewRow();&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dr2[&lt;span style="color:#006080;"&gt;&amp;quot;UserId&amp;quot;&lt;/span&gt;] = 1;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dt.Rows.Add(dr2);&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                DataRow dr3 = dt.NewRow();&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dr3[&lt;span style="color:#006080;"&gt;&amp;quot;UserId&amp;quot;&lt;/span&gt;] = 4;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dt.Rows.Add(dr3);&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                dt.AcceptChanges();&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;&amp;nbsp;&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; dt.CreateDataReader();&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;            }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;        }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;    }&lt;/pre&gt;

&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Limitaciones de los User Defined Table Type:&lt;/p&gt;
&lt;p&gt;- No se pueden pasar par&amp;aacute;metros table-valued a user-defined functions&lt;/p&gt;
&lt;p&gt;- Las estructuras solo pueden ser indexadas para soportar valores &amp;uacute;nicos o primary keys. Sql server no mantiene estad&amp;iacute;sticas sobre par&amp;aacute;metros table-valued.&lt;/p&gt;
&lt;p&gt;- Los par&amp;aacute;metros table-valued son de solo lectura en el c&amp;oacute;digo transact-sql, no se pueden actualizar valores de filas y no se pueden insertar datos.&lt;/p&gt;
&lt;p&gt;- No se puede alterar o modificar el dise&amp;ntilde;o de una table-valued, para conseguir esto se debe borrar y volver a crear la estructura.&lt;/p&gt;
&lt;p&gt;No debemos olvidar que en Entity FrameWork este problema se resuelve de una forma mucho m&amp;aacute;s sencilla sin la utilizaci&amp;oacute;n de SP, como usuarios de EF debemos huir del uso de procedimientos almacenados siempre que podamos, ya que debemos abstraernos de la base de datos y habitualmente la perdida de rendimiento es inapreciable, sin embargo pueden existir algunas ocasiones en que el uso del Store Procedure est&amp;eacute; justificado, si bien, la mayor&amp;iacute;a de las veces podemos resolverlo de forma muy sencilla tal y como demuestran este par de ejemplos.&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] customerIds = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;[] { 1, 2, 3 };&lt;br /&gt;&lt;br /&gt;var customers = from customer &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; context.CustomerSet&lt;br /&gt;                &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; customerIds.Contains(customer.Id)&lt;br /&gt;                select customer;&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] cities = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] { &lt;span style="color:#006080;"&gt;&amp;quot;New York&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;London&amp;quot;&lt;/span&gt;, &lt;span style="color:#006080;"&gt;&amp;quot;Seattle&amp;quot;&lt;/span&gt; };&lt;br /&gt;&lt;br /&gt;var query = context.Orders.Where(c =&amp;gt; cities.Contains(c.Customer.Address.City)).Select(o =&amp;gt; o);&lt;/p&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Y recordar, alegaros de algunas practicas, si bien funcionan, son fruto de muchos errores en las aplicaciones de hoy en dia, como muestra el siguente c&amp;oacute;digo:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre style="border-style:none;text-align:left;padding:0px;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;,courier,monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;" id="codeSnippet"&gt;SqlCommand(&lt;span style="color:#006080;"&gt;&amp;quot;SELECT UserID, Name, Phone FROM Users WHERE UserID IN (2,4,5,24)&amp;quot;&lt;/span&gt;, sqlConnection);&lt;/pre&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=183426" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Sql+Server/default.aspx">Sql Server</category></item><item><title>Constrúyete tu propio gestor documental</title><link>http://geeks.ms/blogs/jirigoyen/archive/2010/03/25/constr-250-yete-tu-propio-gestor-documental.aspx</link><pubDate>Thu, 25 Mar 2010 08:09:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:171318</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=171318</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=171318</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2010/03/25/constr-250-yete-tu-propio-gestor-documental.aspx#comments</comments><description>&lt;p&gt;Uno de los programas m&amp;aacute;s utilizados en nuestro sistema de gesti&amp;oacute;n es el gestor documental, como todos sab&amp;eacute;is Sharepoint se conforma entre otras cosas como un gestor de contenidos, que permite almacenar todo tipo de documentos, pero hay veces que buscamos una mayor integraci&amp;oacute;n en nuestros sistemas o que simplemente no queremos depender de Sharepoint. En estos casos, desarrollar un gestor documental puede ser una buena alternativa y el trabajo para construir este programa lejos de parecer complicado es relativamente sencillo.&lt;/p&gt;
&lt;p&gt;El gestor que os propongo se basa en el mismo sistema que utiliza sharepoint, los ficheros se serializan, se encriptan si es necesario y finalmente se guardan en una tabla de una base de datos tal y como hace sharepoint, posteriormente se leen desde la base de datos y se guardan en una ruta local o se utilizan directamente, aprovech&amp;aacute;ndonos del almacenamiento en la base de datos con todas las ventajas que esto conlleva, copias de seguridad, particionado de tablas, indexaci&amp;oacute;n de contenidos, etc.&lt;/p&gt;
&lt;p&gt;El gestor que vamos a desarrollar debe&amp;nbsp;tener capacidad para almacenar cualquier tipo de fichero, documento Word, hojas de c&amp;aacute;lculo, archivos pdf, archivos comprimidos, emails, jpgs, archivos de autocad, etc.&lt;/p&gt;
&lt;p&gt;Para comenzar hemos creado una tabla llamada Documentaci&amp;oacute;n en una base de datos independiente, porque como supondr&amp;eacute;is esta puede llegar a ser muy grande y en un momento determinado quiz&amp;aacute;s tengamos que alojarla o particionarla en otro servidor por escalabilidad,&amp;nbsp; tama&amp;ntilde;o o rendimiento.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_48AB0C2A.jpg"&gt;&lt;img height="330" width="539" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_thumb_5F00_78A537DE.jpg" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;El campo [documento] (varbinary(max)) ser&amp;aacute; el encargado de almacenar los ficheros serializados.&lt;/p&gt;
&lt;p&gt;Buscamos un m&amp;eacute;todo sencillo para poder subir los archivos a la base de datos, con lo que queremos arrastrar uno o varios ficheros a un contenedor para que la aplicaci&amp;oacute;n pueda traspasarlos posteriormente a la BD.&lt;/p&gt;
&lt;p&gt;Para llevar a cabo esta operaci&amp;oacute;n, hemos creado un formulario con el control System.Windows.Forms.WebBrowser que hace referencia a una ruta temporal en el disco, en este caso hemos mapeado una unidad temporal en nuestro PC &amp;lsquo;c:\temporal&amp;rsquo;, aunque esta podria ser tambien una ruta compartida de red. La configuraci&amp;oacute;n de esta carpeta se realiza a trav&amp;eacute;s de la propiedad &amp;ldquo;Path&amp;rdquo; del control WebBrowser. Este control ya tiene por defecto implementados el sistema Drag &amp;amp; Drop, que nos permite arrastrar, copiar o pegar cualquier tipo de archivo de sistemas Windows, as&amp;iacute; podemos arrastrar varios correos desde Outlook, una hoja de c&amp;aacute;lculo de Excel o cualquier fichero simplemente utilizando el rat&amp;oacute;n, al realizar esta operaci&amp;oacute;n sobre los archivos seleccionados estos se mueven o se copian a la ruta temporal que hemos establecido, podemos adem&amp;aacute;s utilizar los atajos para copiar archivos Ctrl-c / Ctrl-v, etc.&lt;/p&gt;
&lt;p&gt;El control se puede configurar para que muestre diferentes vistas, hemos configurado una que muestra el nombre de los archivos, su tipo, la fecha, el tama&amp;ntilde;o, esta vista se puede alterar cambiando las propiedades de la carpeta temporal.&lt;/p&gt;
&lt;p&gt;Esta primera parte que parec&amp;iacute;a complicada queda resuelta facilmente sin apenas tener que escribir un par de lineas de c&amp;oacute;digo, correspondientes a la configuraci&amp;oacute;n del control Webbrowser.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image004_5F00_5BDB9CFC.jpg"&gt;&lt;img height="276" width="540" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image004_5F00_thumb_5F00_59526B3E.jpg" alt="clip_image004" border="0" title="clip_image004" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Una vez hemos arrastrado los archivos y estos se copian autom&amp;aacute;ticamente a la ruta temporal pasamos al proceso de verificaci&amp;oacute;n, en esta opci&amp;oacute;n se nos permite asociar cada uno de los archivos a varios metadatos, de esta forma podemos a&amp;ntilde;adir informaci&amp;oacute;n adicional a cada elemento como una descripci&amp;oacute;n m&amp;aacute;s detallada, observaciones, usuario, fecha o cualquier informaci&amp;oacute;n que nos parezca relevante.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image006_5F00_21BCAA50.jpg"&gt;&lt;img height="245" width="545" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image006_5F00_thumb_5F00_4CB49855.jpg" alt="clip_image006" border="0" title="clip_image006" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Finalmente los ficheros se procesan uno a uno y se van traspasando a la base de datos, para realizar esta operaci&amp;oacute;n pod&amp;eacute;is utilizar Directory.GetFiles(path) que permite obtener los nombres de los archivos de una ubicaci&amp;oacute;n determinada y FileInfo(file) que permite obtener informaci&amp;oacute;n detallada sobre cada uno de los ficheros, fecha de creaci&amp;oacute;n, tama&amp;ntilde;o, etc. No debemos olvidar guardar el nombre completo con la extensi&amp;oacute;n para identificar su tipo cuando vayamos a utilizarlo.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Con todos estos datos formados por los nombres de los ficheros, sus atributos y los metadatos que podemos variar conformamos una colecci&amp;oacute;n temporal, l&amp;oacute;gicamente estos se grabaran posteriormente en la base de datos con lo que tendr&amp;aacute;n que tener un campo asociado en la tabla que creamos inicialmente.&lt;/p&gt;
&lt;p&gt;Para realizar las operaciones de serializaci&amp;oacute;n de un fichero utilizamos la siguiente funci&amp;oacute;n:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;//Cargar en un array de bytes el documento.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (FileStream archivoStream = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FileStream(file, FileMode.Open, FileAccess.Read))&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[] documento = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;[(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;) archivoStream.Length];&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    archivoStream.Read(documento, 0, (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;) archivoStream.Length);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Despues de realizar este paso, si deseamos encriptar el documento para mayor seguridad podriamos hacerlo en este punto, utilizando las librerias de .net o aprovechando Sql Server para realizar esta operaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Posteriormente grabamos el archivo y todos los datos adjuntos al documento (Metadata) utilizando un Procedimiento almacenado.&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@documento&amp;quot;&lt;/span&gt;, SqlDbType.VarBinary).Value = documento.Archivo;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@descripcion_modulo&amp;quot;&lt;/span&gt;, SqlDbType.NVarChar, 100).Value = documento.Descripcion_modulo;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@descripcion&amp;quot;&lt;/span&gt;, SqlDbType.NVarChar, 200).Value = documento.Descripcion;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@ruta&amp;quot;&lt;/span&gt;, SqlDbType.NVarChar, 200).Value = documento.Ruta;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@archivo&amp;quot;&lt;/span&gt;, SqlDbType.NVarChar, 200).Value = documento.Archivo;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@modulo&amp;quot;&lt;/span&gt;, SqlDbType.NVarChar, 50).Value = documento.Modulo;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@codigoAuxiliar&amp;quot;&lt;/span&gt;, SqlDbType.Int, 10).Value = documento.Codigo_auxiliar;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@codigoAsociado&amp;quot;&lt;/span&gt;, SqlDbType.Int, 10).Value = documento.Codigo_asociado;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@usuario&amp;quot;&lt;/span&gt;, SqlDbType.NChar, 5).Value = documento.Usuario;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@tipo&amp;quot;&lt;/span&gt;, SqlDbType.NVarChar, 100).Value = documento.Tipo;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@observaciones&amp;quot;&lt;/span&gt;, SqlDbType.NVarChar, 1000).Value = documento.Observaciones;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;cmdOrden.Parameters.Add(&lt;span style="color:#006080;"&gt;&amp;quot;@codigo&amp;quot;&lt;/span&gt;, SqlDbType.Int, 10).Direction = ParameterDirection.Output;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;De esta forma tan sencilla los documentos se traspasan a la base de datos. &lt;/p&gt;
&lt;p&gt;Pensando que este proceso puede ser de varios ficheros y que adem&amp;aacute;s algunos pueden tener&amp;nbsp;un tama&amp;ntilde;o considerable, hemos dotado al programa de un mecanismo as&amp;iacute;ncrono utilizando BackGroundWorked, de forma que si el proceso tarda un tiempo la aplicaci&amp;oacute;n nunca llegue a bloquearse y los usuarios puedan continuar realizando su trabajo mientras se trasladan los ficheros a la BD.&lt;/p&gt;
&lt;p&gt;Una vez hemos procesado los ficheros, lo unic&amp;oacute; que nos queda por hacer es explotarlos, para ello tenemos que realizar la operaci&amp;oacute;n inversa:&lt;/p&gt;
&lt;p&gt;Creamos otro formulario, en nuestro caso hemos utilizado un control TreeView para poder visualizar los datos de forma jerarquica, habitualmente los documentos estan relacionados con un registro de una o varias tablas, en la foto de abajo se muestran varios registros relacionados con la ficha de un art&amp;iacute;culo. Si el usuario pulsa abrir, se lee el registro de la base de datos, se deserializa el contenido del campo [documento], se desencripta si fuera necesario y finalmente se guarda en una ruta temporal o se abre directamente en memoria. Para deserializar el documento utilizamos la siguiente funci&amp;oacute;n, donde [doc.Documento] hace referencia al campo de tipo byte[] de nuestra entidad y [fichero] a la ruta y nombre del archivo que se va a crear como por ejemplo &amp;lsquo;c:\temp\estadisticas.xls&amp;rsquo;.&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (FileStream archivoStream = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FileStream(fichero, FileMode.Create))&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    archivoStream.Write(doc.Documento, 0, doc.Documento.Length);&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    archivoStream.Close();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Finalmente abrimos el fichero, para realizar esta operaci&amp;oacute;n y que el programa relacionado (word, excel, outlook),&amp;nbsp;realice esta operaci&amp;oacute;n autom&amp;aacute;ticamente utilizamos la siguiente funci&amp;oacute;n. &lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (File.Exists(fichero))&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    Process process = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Process { StartInfo = { FileName = fichero } };&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    process.Start();&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image008_5F00_62BB03E7.jpg"&gt;&lt;img height="291" width="534" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image008_5F00_thumb_5F00_4DE90B67.jpg" alt="clip_image008" border="0" title="clip_image008" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Y voila, ya tenemos nuestro gestor documental. En nuestro caso para complementar la utilidad vamos a llamar a un webservice que nos permite almacenar el fichero tambi&amp;eacute;n&amp;nbsp;en sharepoint de manera que este accesible en los dos gestores, podemos adem&amp;aacute;s implementar filtros para realizar b&amp;uacute;squedas no solo por los metadatos si no por el contenido de los ficheros, implementar un control de versiones, etc, etc., pero si continuamos al final lo que tendr&amp;iacute;amos es otro &amp;ldquo;Sharepoint&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;La ventaja de esta utilidad adem&amp;aacute;s de la integraci&amp;oacute;n con nuestro sistema y la facilidad de uso es que podemos asociar el contenido a nuestros registros de la base de datos y posteriormente visualizarlos o agruparlos en otro registro para facilitar el acceso a la informaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_5D9C14B1.png"&gt;&lt;img height="227" width="322" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_3112E4CB.png" alt="image" border="0" title="image" style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;En nuestro caso cada registro de cada mantenimiento tiene accesible el gestor documental de manera que en el ejemplo de la foto posterior cada registro de art&amp;iacute;culos tiene asociados varios documentos, otra ventaja es que en&amp;nbsp;ciertos mantenimientos podemos visualizar la informaci&amp;oacute;n de forma jer&amp;aacute;rquica, por ejemplo en un cliente se ver&amp;iacute;an de esta forma, con lo que acceder a la informaci&amp;oacute;n es muy sencillo.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image010_5F00_2B44CCEC.jpg"&gt;&lt;img height="275" width="532" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image010_5F00_thumb_5F00_2E963EC7.jpg" alt="clip_image010" border="0" title="clip_image010" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As&amp;iacute; que animaros, construiros un peque&amp;ntilde;os gestor documental como este es muy sencillo, y permitira dotar a vuestras aplicaciones de una herramiena muy potente para centralizar y acceder a todo tipo de informaci&amp;oacute;n.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=171318" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Software/default.aspx">Software</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Gestor+documental/default.aspx">Gestor documental</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Sharepoint/default.aspx">Sharepoint</category></item><item><title>Macro sustitución en C#</title><link>http://geeks.ms/blogs/jirigoyen/archive/2010/01/22/macro-sustituci-243-n-en-c.aspx</link><pubDate>Fri, 22 Jan 2010 11:43:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:165719</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=165719</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=165719</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2010/01/22/macro-sustituci-243-n-en-c.aspx#comments</comments><description>&lt;p&gt;Una de las caracter&amp;iacute;sticas de Visual Foxpro (mi anterior lenguaje antes de .net) y del que todos los d&amp;iacute;as me acuerdo cuando me peleo con .net, era la utilizaci&amp;oacute;n de macro sustituci&amp;oacute;n, esta permit&amp;iacute;a realizar cosas como la siguiente:&lt;/p&gt;
&lt;div id="codeSnippetWrapper"&gt;
&lt;div class="csharpcode" id="codeSnippet"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum" id="lnum1"&gt;   1:&lt;/span&gt; FOR i = 1 TO 12&lt;/pre&gt;

&lt;pre class="alteven"&gt;&lt;span class="lnum" id="lnum2"&gt;   2:&lt;/span&gt;    xcam = &lt;span class="str"&gt;&amp;#39;Formas_pago.poraplaza&amp;#39;&lt;/span&gt; + ALLTRIM(STR(i))&lt;/pre&gt;

&lt;pre class="alt"&gt;&lt;span class="lnum" id="lnum3"&gt;   3:&lt;/span&gt;    IF &amp;amp;xcam &amp;gt; 0&lt;/pre&gt;

&lt;pre class="alteven"&gt;&lt;span class="lnum" id="lnum4"&gt;   4:&lt;/span&gt;    ENDIF&lt;/pre&gt;

&lt;pre class="alt"&gt;&lt;span class="lnum" id="lnum5"&gt;   5:&lt;/span&gt; ENDFOR&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;De esta forma utilizando el s&amp;iacute;mbolo &amp;amp;, pod&amp;iacute;a evaluar el contenido de los campos sin tener que escribirlos uno a uno y ahorrando&amp;nbsp;l&amp;iacute;neas de c&amp;oacute;digo.&lt;/p&gt;
&lt;p&gt;Por desgracia c# no posee esta caracter&amp;iacute;stica con un uso tan sencillo, se pueden realizar aproximaciones compilando el c&amp;oacute;digo al vuelo con codedoom o similares, pero personalmente evitaria utilizar estas t&amp;eacute;cnicas si no es absolutamente necesario.&lt;/p&gt;
&lt;p&gt;Ya metidos en harina, estaba en .net transcribiendo un bloque de c&amp;oacute;digo desde Fox y claro el peque&amp;ntilde;o programa de arriba daba lugar a un programa similar a este:&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Carga la configuraci&amp;oacute;n dependiente de la forma de pago correspondiente&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(cvc.Forma_pago))&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (ManagerBI&amp;lt;Formas_pago&amp;gt; manager = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ManagerBI&amp;lt;Formas_pago&amp;gt;() )&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (manager.GetRecord(cvc.Forma_pago))&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;         {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_1);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_2);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_3);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_4);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_5);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_6);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_7);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_8);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum16" style="color:#606060;"&gt;  16:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_9);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum17" style="color:#606060;"&gt;  17:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_10);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum18" style="color:#606060;"&gt;  18:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_11);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum19" style="color:#606060;"&gt;  19:&lt;/span&gt;             cvc.PorcentajesAplazamientoAdd(manager.Data.Porcentaje_aplazamiento_12);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum20" style="color:#606060;"&gt;  20:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum21" style="color:#606060;"&gt;  21:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_1);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum22" style="color:#606060;"&gt;  22:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_2);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum23" style="color:#606060;"&gt;  23:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_3);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum24" style="color:#606060;"&gt;  24:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_4);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum25" style="color:#606060;"&gt;  25:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_5);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum26" style="color:#606060;"&gt;  26:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_6);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum27" style="color:#606060;"&gt;  27:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_7);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum28" style="color:#606060;"&gt;  28:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_8);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum29" style="color:#606060;"&gt;  29:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_9);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum30" style="color:#606060;"&gt;  30:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_10);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum31" style="color:#606060;"&gt;  31:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_11);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum32" style="color:#606060;"&gt;  32:&lt;/span&gt;             cvc.DiasPagoAdd(manager.Data.Dia_pago_12);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum33" style="color:#606060;"&gt;  33:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum34" style="color:#606060;"&gt;  34:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_1);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum35" style="color:#606060;"&gt;  35:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_2);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum36" style="color:#606060;"&gt;  36:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_3);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum37" style="color:#606060;"&gt;  37:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_4);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum38" style="color:#606060;"&gt;  38:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_5);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum39" style="color:#606060;"&gt;  39:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_6);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum40" style="color:#606060;"&gt;  40:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_7);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum41" style="color:#606060;"&gt;  41:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_8);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum42" style="color:#606060;"&gt;  42:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_9);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum43" style="color:#606060;"&gt;  43:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_10);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum44" style="color:#606060;"&gt;  44:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_11);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum45" style="color:#606060;"&gt;  45:&lt;/span&gt;             cvc.DiasAplazamientoAdd(manager.Data.Dias_aplazamiento_12);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum46" style="color:#606060;"&gt;  46:&lt;/span&gt;         }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum47" style="color:#606060;"&gt;  47:&lt;/span&gt;     }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum48" style="color:#606060;"&gt;  48:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;

&lt;/p&gt;
&lt;p&gt;Qu&amp;eacute; horror, 36 l&amp;iacute;neas para hacer lo mismo, pero imaginar que en lugar de 36 campos tuvi&amp;eacute;ramos 100. Se me ocurri&amp;oacute; la idea de usar &lt;i&gt;reflection&lt;/i&gt; para poder evitar la escritura de tantas&amp;nbsp; l&amp;iacute;neas y resulto relativamente f&amp;aacute;cil, la soluci&amp;oacute;n es interesante y en casos similares os permitir&amp;aacute; reducir en gran medida vuestro c&amp;oacute;digo. El rendimiento de reflexi&amp;oacute;n apenas penalizar&amp;aacute; la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;div id="codeSnippetWrapper" style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;width:97.5%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;height:273px;max-height:200px;font-size:8pt;overflow:auto;cursor:text;border:silver 1px solid;padding:4px;"&gt;
&lt;div id="codeSnippet" style="text-align:left;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum1" style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Carga la configuraci&amp;oacute;n dependiente de la forma de pago correspondiente&lt;/span&gt;&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum2" style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(cvc.Forma_pago))&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum3" style="color:#606060;"&gt;   3:&lt;/span&gt; {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum4" style="color:#606060;"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (ManagerBI&amp;lt;Formas_pago&amp;gt; manager = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ManagerBI&amp;lt;Formas_pago&amp;gt;() )&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum5" style="color:#606060;"&gt;   5:&lt;/span&gt;     {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum6" style="color:#606060;"&gt;   6:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (manager.GetRecord(cvc.Forma_pago))&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum7" style="color:#606060;"&gt;   7:&lt;/span&gt;         {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum8" style="color:#606060;"&gt;   8:&lt;/span&gt;             Type t = manager.Data.GetType();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum9" style="color:#606060;"&gt;   9:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum10" style="color:#606060;"&gt;  10:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 1; i &amp;lt; 12; i++)&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum11" style="color:#606060;"&gt;  11:&lt;/span&gt;             {&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum12" style="color:#606060;"&gt;  12:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; contador = i.ToString().Trim();&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum13" style="color:#606060;"&gt;  13:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt; porcentajeAplazamiento = (&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;)t.InvokeMember(&lt;span style="color:#006080;"&gt;&amp;quot;Porcentaje_aplazamiento_&amp;quot;&lt;/span&gt; + contador, BindingFlags.GetProperty, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, manager.Data, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, CultureInfo.CurrentCulture);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum14" style="color:#606060;"&gt;  14:&lt;/span&gt;                 cvc.PorcentajesAplazamientoAdd(porcentajeAplazamiento);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum15" style="color:#606060;"&gt;  15:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt; diaPago = (&lt;span style="color:#0000ff;"&gt;byte&lt;/span&gt;)t.InvokeMember(&lt;span style="color:#006080;"&gt;&amp;quot;Dia_pago_&amp;quot;&lt;/span&gt; + contador, BindingFlags.GetProperty, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, manager.Data, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, CultureInfo.CurrentCulture);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum16" style="color:#606060;"&gt;  16:&lt;/span&gt;                 cvc.DiasPagoAdd(diaPago);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum17" style="color:#606060;"&gt;  17:&lt;/span&gt;                 Int16 diasAplazamiento = (Int16)t.InvokeMember(&lt;span style="color:#006080;"&gt;&amp;quot;Dias_aplazamiento_&amp;quot;&lt;/span&gt; + contador, BindingFlags.GetProperty, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, manager.Data, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, CultureInfo.CurrentCulture);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum18" style="color:#606060;"&gt;  18:&lt;/span&gt;                 cvc.DiasAplazamientoAdd(diasAplazamiento);&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum19" style="color:#606060;"&gt;  19:&lt;/span&gt;             }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum20" style="color:#606060;"&gt;  20:&lt;/span&gt;         }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:white;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum21" style="color:#606060;"&gt;  21:&lt;/span&gt;     }&lt;/pre&gt;

&lt;pre style="text-align:left;line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;direction:ltr;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span id="lnum22" style="color:#606060;"&gt;  22:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;pre class="csharpcode"&gt;Espero que os sirva.&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;p&gt;

&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=165719" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Reflexion/default.aspx">Reflexion</category></item><item><title>Database Professionals 2010. Pruebas Unitarias de Bases de datos y materiales de la charla.</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/10/25/database-professionals-2010-pruebas-unitarias-de-bases-de-datos-y-materiales-de-la-charla.aspx</link><pubDate>Sun, 25 Oct 2009 19:30:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:158855</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=158855</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=158855</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/10/25/database-professionals-2010-pruebas-unitarias-de-bases-de-datos-y-materiales-de-la-charla.aspx#comments</comments><description>&lt;p&gt;El otro d&amp;iacute;a tuve el placer de compartir una charla sobre Visual Studio 2010 organizada por &lt;a href="http://geeks.ms/members/jcgonzalez/default.aspx" title="http://geeks.ms/members/jcgonzalez/default.aspx"&gt;Juan Carlos Gonzalez&lt;/a&gt; del &lt;a href="http://www.ciin.es/web/Paginas/default.aspx" title="http://www.ciin.es/web/Paginas/default.aspx"&gt;CIIN&lt;/a&gt; con &lt;a href="http://geeks.ms/blogs/rcorral/" title="http://geeks.ms/blogs/rcorral/"&gt;Rodrigo Corral&lt;/a&gt; e &lt;a href="http://geeks.ms/members/ilanda/default.aspx" title="http://geeks.ms/members/ilanda/default.aspx"&gt;Ibon Landa&lt;/a&gt;.&amp;nbsp;Os dejo los materiales de la charla y un peque&amp;ntilde;o art&amp;iacute;culo sobre las diferentes pruebas de calidad en Base de datos comentado durante la presentaci&amp;oacute;n. Realice tres ejemplos, basados en un procedimiento almacenado que actualizaba un registro en la tabla Employee de AdventureWorks2008. Su definici&amp;oacute;n es la siguiente:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;CREATE PROCEDURE [HumanResources].[uspUpdateEmployeePersonalInfo]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    @BusinessEntityID [&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;], &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    @NationalIDNumber [nvarchar](15), &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    @BirthDate [datetime], &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    @MaritalStatus [nchar](1), &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    @Gender [nchar](1)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WITH EXECUTE AS CALLER&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;AS&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;BEGIN&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    SET NOCOUNT ON;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    BEGIN TRY&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        UPDATE [HumanResources].[Employee] &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        SET [NationalIDNumber] = @NationalIDNumber &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            ,[BirthDate] = @BirthDate &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            ,[MaritalStatus] = @MaritalStatus &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;            ,[Gender] = @Gender &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        WHERE [BusinessEntityID] = @BusinessEntityID;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    END TRY&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    BEGIN CATCH&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        EXECUTE [dbo].[uspLogError];&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;    END CATCH;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;END;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El ejemplo b&amp;aacute;sico consist&amp;iacute;a simplemente en llamar al SP con unos datos ficticios que no realizaba ninguna actualizaci&amp;oacute;n, esta prueba solo cubr&amp;iacute;a que la llamada al SP se realizase de forma correcta.&lt;/p&gt;
&lt;p&gt;El segundo ejemplo consist&amp;iacute;a en insertar un determinado registro antes de la prueba, llamar al SP para que realizase la actualizaci&amp;oacute;n sobre ese registro y finalmente eliminar el registro de prueba insertado, esta prueba cubr&amp;iacute;a que la llamada al SP se realizase de forma correcta y adem&amp;aacute;s permit&amp;iacute;a conocer si el sp funcionaba correctamente actualizando un registro de la BD.&lt;/p&gt;
&lt;p&gt;El tercero y m&amp;aacute;s interesante consist&amp;iacute;a en blindar el SP frente a cualquier cambio, uno de los problemas m&amp;aacute;s habituales que sufrimos es que los SP, se suelen modificar a menudo y muchos de los fallos no detectados vienen derivados al cambiar las longitudes de los campos, el orden, tipo de dato y otros aspectos del procedimiento.&lt;/p&gt;
&lt;p&gt;Para testar el SP, realice la consulta siguiente&amp;nbsp;para&amp;nbsp;averiguar la configuraci&amp;oacute;n completa procedimiento:&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;SELECT DISTINCT dbo.sysobjects.name, dbo.sysobjects.xtype AS type, dbo.syscolumns.name AS param, dbo.syscolumns.colorder AS corder, &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;dbo.syscolumns.length, dbo.syscolumns.colstat AS keyc, dbo.syscolumns.isoutparam AS colisout, dbo.systypes.xtype, dbo.syscolumns.prec &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; precision, &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;dbo.syscolumns.scale, dbo.syscolumns.isnullable, dbo.syscolumns.iscomputed, dbo.syscolumns.number &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;FROM dbo.syscolumns &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;INNER JOIN dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WHERE (dbo.sysobjects.name = &lt;span style="color:#006080;"&gt;&amp;#39;uspUpdateEmployeePersonalInfo&amp;#39;&lt;/span&gt;) AND (dbo.systypes.status &amp;lt;&amp;gt; 1) &lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_7B53A4CF.png"&gt;&lt;img height="107" width="753" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_7C8817E1.png" alt="image" border="0" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Con los datos obtenidos podemos desarrollar una consulta que utilize los valores mostrados para comprobar que el procedimiento almacenado tiene la configuraci&amp;oacute;n mostrada por la consulta.&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;SELECT COUNT(DISTINCT dbo.syscolumns.name) &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;FROM dbo.syscolumns &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;INNER JOIN dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WHERE (dbo.sysobjects.name = &lt;span style="color:#006080;"&gt;&amp;#39;uspUpdateEmployeePersonalInfo&amp;#39;&lt;/span&gt;) AND (dbo.systypes.status &amp;lt;&amp;gt; 1) &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;AND ((dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@BirthDate&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 3 AND dbo.systypes.xtype = 61 AND dbo.syscolumns.length = 8 and dbo.syscolumns.prec = 23 and dbo.syscolumns.scale = 3)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@BusinessEntityID&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 1 AND dbo.systypes.xtype = 56 AND dbo.syscolumns.length = 4 and dbo.syscolumns.prec = 10 and dbo.syscolumns.scale = 0)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@Gender&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 5 AND dbo.systypes.xtype = 239 AND dbo.syscolumns.length = 2)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@MaritalStatus&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 4 AND dbo.systypes.xtype = 239 AND dbo.syscolumns.length = 2)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@NationalIDNumber&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 2 AND dbo.systypes.xtype = 231 AND dbo.syscolumns.length = 30))&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La consulta devuelve (5), el numero de campos del procedimiento uspUpdateEmployeePersonalInfo que cumplen las condiciones especificadas. Si el valor retornado por la consulta no es 5, supondra que hemos alterado algun aspecto de configuraci&amp;oacute;n del procedimiento almacenado, longitud, tipo de valor, orden del campo en el store procedure, etc.&lt;/p&gt;
&lt;p&gt;La prueba completa quedar&amp;iacute;a de esta forma:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PreTest&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;/* Desabilita el trigger que impide el borrado de registro en la tabla .[HumanResources].[Employee] */&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;DISABLE Trigger [HumanResources].[dEmployee] ON [HumanResources].[Employee] &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;/* Borra el registro de pruebas si por alguna razon estuviera ya insertado */&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;DELETE [AdventureWorks2008].[HumanResources].[Employee]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WHERE [BusinessEntityID] = 2292&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;/* Realiza la inserci&amp;oacute;n del registro de pruebas, hay que analizar los datos de la insercci&amp;oacute;n ya que hay campos que tienen restricciones a nivel de tabla&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;como MartitalStatus que slo acepta M (Male)  F (Female) */&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;INSERT INTO [AdventureWorks2008].[HumanResources].[Employee]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ([BusinessEntityID]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[NationalIDNumber]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[LoginID]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[OrganizationNode]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[JobTitle]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[BirthDate]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[MaritalStatus]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[Gender]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[HireDate]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[SalariedFlag]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[VacationHours]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[SickLeaveHours]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[CurrentFlag]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[rowguid]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;           ,[ModifiedDate])&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;     VALUES (2292,&lt;span style="color:#006080;"&gt;&amp;#39;1231231398&amp;#39;&lt;/span&gt;,&lt;span style="color:#006080;"&gt;&amp;#39;adventure-works\lyxnr&amp;#39;&lt;/span&gt;,0x95EF,&lt;span style="color:#006080;"&gt;&amp;#39;Sales Representative&amp;#39;&lt;/span&gt;,cast(&lt;span style="color:#006080;"&gt;&amp;#39;1965-10-31&amp;#39;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; date),&lt;span style="color:#006080;"&gt;&amp;#39;M&amp;#39;&lt;/span&gt;,&lt;span style="color:#006080;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;,cast(&lt;span style="color:#006080;"&gt;&amp;#39;1996-10-31&amp;#39;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; date),1,34,37,1,newid(),getdate())&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;/* Comprueba que el registro de pruebas ha sido insertado correctamente */&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;SELECT [BusinessEntityID] FROM [AdventureWorks2008].[HumanResources].[Employee] WHERE [BusinessEntityID] = 2292 &lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Test&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;DECLARE @return_value &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXEC    @return_value = [HumanResources].[uspUpdateEmployeePersonalInfo]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        @BusinessEntityID = 2292,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        @NationalIDNumber = N&lt;span style="color:#006080;"&gt;&amp;#39;13412343ZN&amp;#39;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        @BirthDate = N&lt;span style="color:#006080;"&gt;&amp;#39;01/01/1934&amp;#39;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        @MaritalStatus = N&lt;span style="color:#006080;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;        @Gender = N&lt;span style="color:#006080;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;SELECT @return_value, COUNT(DISTINCT dbo.syscolumns.name) &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;FROM dbo.syscolumns &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;INNER JOIN dbo.sysobjects ON dbo.syscolumns.id = dbo.sysobjects.id &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;INNER JOIN dbo.systypes ON dbo.syscolumns.xtype = dbo.systypes.xtype &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WHERE (dbo.sysobjects.name = &lt;span style="color:#006080;"&gt;&amp;#39;uspUpdateEmployeePersonalInfo&amp;#39;&lt;/span&gt;) AND (dbo.systypes.status &amp;lt;&amp;gt; 1) &lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;AND ((dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@BirthDate&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 3 AND dbo.systypes.xtype = 61 AND dbo.syscolumns.length = 8 and dbo.syscolumns.prec = 23 and dbo.syscolumns.scale = 3)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@BusinessEntityID&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 1 AND dbo.systypes.xtype = 56 AND dbo.syscolumns.length = 4 and dbo.syscolumns.prec = 10 and dbo.syscolumns.scale = 0)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@Gender&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 5 AND dbo.systypes.xtype = 239 AND dbo.syscolumns.length = 2)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@MaritalStatus&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 4 AND dbo.systypes.xtype = 239 AND dbo.syscolumns.length = 2)&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;OR (dbo.syscolumns.name = &lt;span style="color:#006080;"&gt;&amp;#39;@NationalIDNumber&amp;#39;&lt;/span&gt; AND dbo.syscolumns.colorder = 2 AND dbo.systypes.xtype = 231 AND dbo.syscolumns.length = 30))&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;De esta forma la condici&amp;oacute;n de prueba del segundo valor de la consulta sera 5 (Numero campos que cumplen las condiciones especificadas), si en cualquier momento el valor no es 5, supondra que hemos alterado algun valor de configuraci&amp;oacute;n del procedimiento almacenado, longitud, tipo de valor, orden del campo en el store procedure, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PostTest&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div style="line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;/* Elimina el registro de pruebas insertado */&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;DELETE [AdventureWorks2008].[HumanResources].[Employee]&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;WHERE [BusinessEntityID] = 2292&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:white;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;&lt;span style="color:#008000;"&gt;/* Habilita el trigger, hay que realizarlo sobre la clausula EXEC porque la prueba no acepta &amp;#39;GO&amp;#39;, despues del borrado */&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height:12pt;background-color:#f4f4f4;margin:0em;width:100%;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;color:black;font-size:8pt;overflow:visible;border-style:none;padding:0px;"&gt;EXEC(&lt;span style="color:#006080;"&gt;&amp;#39;ENABLE TRIGGER [HumanResources].[dEmployee] ON [HumanResources].[Employee]&amp;#39;&lt;/span&gt;)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Comprobamos que al alterar la longitud de un campo la prueba fallaba, mientras que las dos primeras pasaban sin problemas. Se garantiza el correcto funcionamiento del SP, ya que inserta un registro de pruebas, testea el SP eliminando el registro de pruebas al finalizar y adem&amp;aacute;s blinda este sobre cualquier cambio en la configuraci&amp;oacute;n del SP.&lt;/p&gt;
&lt;p&gt;Quiero agradecer a los asistentes su presencia, a Juan Carlos Gonzalez por la organizaci&amp;oacute;n y porque gracias a el tenemos un evento cada poco tiempo en Santander y como no, a mis compa&amp;ntilde;eros &lt;a href="http://geeks.ms/blogs/rcorral/" title="http://geeks.ms/blogs/rcorral/"&gt;Rodrigo Corral&lt;/a&gt; e &lt;a href="http://geeks.ms/members/ilanda/default.aspx" title="http://geeks.ms/members/ilanda/default.aspx"&gt;Ibon Landa&lt;/a&gt; tambi&amp;eacute;n conocidos como &lt;a href="http://www.musica.com/wallpapers/2/2_16068_1.jpg"&gt;Grupo Pimpinela&lt;/a&gt;, (haber si adivin&amp;aacute;is &amp;iquest;qui&amp;eacute;n es qui&amp;eacute;n?&amp;hellip;), que animaron la presentaci&amp;oacute;n con sus charlas y desparpajo, debido a la emoci&amp;oacute;n&amp;nbsp;los primeros minutos sufr&amp;iacute; un peque&amp;ntilde;o colapso, me gusto especialmente la &amp;uacute;ltima parte, pude recuperar el &lt;a href="http://www.youtube.com/watch?v=DbESBrDZCbE&amp;amp;feature=related"&gt;video&lt;/a&gt; que hizo uno de los presentes, solo recordalo me emociono&amp;hellip; :)&lt;/p&gt;
&lt;p&gt;Adjunto la PPT de la charla:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/media/p/158829.aspx" title="http://geeks.ms/media/p/158829.aspx"&gt;Presentaci&amp;oacute;n en formato Powerpoint 2003.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/media/p/158828.aspx" title="http://geeks.ms/media/p/158828.aspx"&gt;Presentaci&amp;oacute;n en formato Powerpoint 2007.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/media/p/158827.aspx" title="http://geeks.ms/media/p/158827.aspx"&gt;Presentaci&amp;oacute;n en Adobe Acrobat PDF.&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=158855" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Database+Professionals/default.aspx">Database Professionals</category></item><item><title>Como fracasar con éxito</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/09/27/191-como-fracasar-con-233-xito.aspx</link><pubDate>Sun, 27 Sep 2009 20:21:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:156856</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>19</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=156856</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=156856</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/09/27/191-como-fracasar-con-233-xito.aspx#comments</comments><description>&lt;p&gt;Recuerdo que llev&amp;aacute;bamos varios meses encerrados en una de las habitaciones donde viv&amp;iacute;a con un par de amigos, con la intenci&amp;oacute;n de desarrollar software de gesti&amp;oacute;n, apoyados por una peque&amp;ntilde;a empresa que quer&amp;iacute;a comercializar el producto, ninguno de nosotros cobraba sueldo alguno y manten&amp;iacute;amos un estricto horario, similar al de cualquier otra empresa, ten&amp;iacute;amos el sue&amp;ntilde;o de que alg&amp;uacute;n d&amp;iacute;a podr&amp;iacute;amos ganar lo suficiente como para establecer una empresa que nos permitiera vivir c&amp;oacute;modamente, el trabajo se hac&amp;iacute;a cada d&amp;iacute;a m&amp;aacute;s duro, pues, adem&amp;aacute;s de no contar con ning&amp;uacute;n incentivo, a final de cada mes, deb&amp;iacute;a asumir algunos gastos derivados de nuestro trabajo, tel&amp;eacute;fono, gasolina, luz, etc.. La empresa interesada en el producto, nos surt&amp;iacute;a de material y un poco de equipamiento, alg&amp;uacute;n router para la red, material ofim&amp;aacute;tico y otras cosas. Al cabo de casi un a&amp;ntilde;o de trabajo, uno de los compa&amp;ntilde;eros se fue a realizar el servicio militar y nos quedamos solo dos, encontramos la posibilidad de alquilar un local, para nosotros era pr&amp;aacute;cticamente impensable, ya que no dispon&amp;iacute;amos de ning&amp;uacute;n ingreso, pero el alquiler era muy bajo y busc&amp;aacute;bamos la independencia de un lugar para trabajar m&amp;aacute;s concentrados, el local era simplemente una habitaci&amp;oacute;n sin ventanas de unos 12 metros cuadrados ubicado en la parte baja de un edificio, decidimos arriesgarnos y sacar la licencia fiscal para poder vender software y equipamiento inform&amp;aacute;tico, pensamos que con que logr&amp;aacute;semos vender dos o tres equipos al mes y alg&amp;uacute;n programa, podr&amp;iacute;amos pagar el alquiler y tendr&amp;iacute;amos lo suficiente como para poder continuar con lo que verdaderamente nos gustaba, desarrollar software, fue curioso como, primero a trav&amp;eacute;s de un amigo nos compraron un equipo, luego otro y otro. En poco tiempo las ventas fueron increment&amp;aacute;ndose, aunque segu&amp;iacute;amos sin un nivel de beneficios aceptable, ni siquiera sac&amp;aacute;bamos lo suficiente para asumir un sueldo. Aun con estos problemas y debido a la ilusi&amp;oacute;n que ten&amp;iacute;amos por nuestra empresa, decidimos arriesgarnos y alquilar un local m&amp;aacute;s grande de cara al p&amp;uacute;blico, solicitamos un pr&amp;eacute;stamo avalados por nuestros padres y comenzamos nuestra primera aventura empresarial.&lt;/p&gt;
&lt;p&gt;L&amp;oacute;gicamente los gastos se dispararon, tuvimos que contratar a alguien que estuviera permanentemente en la oficina y asumir diversos impuestos y costes derivados de la actividad, acondicionamiento del local, luz, tel&amp;eacute;fono, etc., as&amp;iacute; que empezamos a salir a la calle en busca de empresas que nos permitiesen aumentar nuestros ingresos, el camino fue muy duro, establecer una simple entrevista era muy complicado ya que normalmente prefer&amp;iacute;an empresas conocidas o consultoras con mayor experiencia, la mayor parte de los empresarios no ve&amp;iacute;an valor a&amp;ntilde;adido al desarrollo de software, prefer&amp;iacute;an un paquete est&amp;aacute;ndar en el que el coste del software fuese menory habitualmente descartaban cualquier tipo de desarrollo que pudiera aportarles mayor valor. Por el medio, intentamos un poco de todo, desde dar cursos de formaci&amp;oacute;n a empresas o cualquier colectivo, hasta llegar a acuerdos comerciales con otras entidades del sector y colaborar en el desarrollo de sus aplicaciones.&lt;/p&gt;
&lt;p&gt;Los clientes entraban en la tienda con el fin de informarse sobre los costes de un ordenador personal y demandaban al mismo tiempo que les instal&amp;aacute;semos todo el software necesario, (sistema operativo, paquete de ofim&amp;aacute;tica, antivirus, etc.), por supuesto totalmente &amp;#39;gratis&amp;#39;, yo me indignaba con esto, pues la mayor parte rehusaban a realizar la compra en nuestra empresa debido a que otras, les ofrec&amp;iacute;an estos servicios de &amp;ldquo;valor a&amp;ntilde;adido&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Recuerdo que yo entonces era un &amp;ldquo;so&amp;ntilde;ador&amp;rdquo;, so&amp;ntilde;aba con tener una empresa, con trabajar duramente y en pocos a&amp;ntilde;os, aspiraba a vivir c&amp;oacute;modamente, cuando me hablaban de dinero yo les respond&amp;iacute;a que para m&amp;iacute; no era importante, que el dinero era lo de menos, el dinero ya vendr&amp;iacute;a despu&amp;eacute;s del trabajo, nunca me preocupo especialmente. Despu&amp;eacute;s de un tiempo, me di cuenta de que la empresa hab&amp;iacute;a tomado un camino muy distinto del que tenia planeado, nos hab&amp;iacute;amos convertido en una empresa de inform&amp;aacute;tica habitual y hab&amp;iacute;amos dejado de lado el desarrollo de software, lo &amp;uacute;nico que podr&amp;iacute;a diferenciarnos y aportarnos valor. Finalmente despu&amp;eacute;s de un tiempo y muchos problemas, abandone la empresa.&lt;/p&gt;
&lt;p&gt;Este fracaso, me permiti&amp;oacute; m&amp;aacute;s adelante, reflexionar sobre los errores que comet&amp;iacute;.&lt;/p&gt;
&lt;p&gt;Cuando conformamos la empresa no ten&amp;iacute;amos una idea clara del negocio, ten&amp;iacute;amos una idea general, pero no cont&amp;aacute;bamos con un proyecto claro, ni siquiera con un peque&amp;ntilde;o estudio de mercado, nos lanzamos con un desconocimiento total, carec&amp;iacute;amos de un plan estrat&amp;eacute;gico, no ten&amp;iacute;amos un sector determinado al que atacar, ni una idea clara que seguir, tan solo, hacer lo que fuera para subsistir y luego, dependiendo de la situaci&amp;oacute;n que alcanz&amp;aacute;semos, tomar&amp;iacute;amos posteriores decisiones.&lt;/p&gt;
&lt;p&gt;En principio, la idea era desarrollar software de gesti&amp;oacute;n y m&amp;aacute;s adelante, aprovecharlo para realizar alg&amp;uacute;n vertical. Desarrollamos un programa&amp;nbsp;similar a otros que ya existian&amp;nbsp;en el mercado y que, aunque no era tan completo como el nuestro, cumpl&amp;iacute;a con los objetivos b&amp;aacute;sicos y logicamente al ser mas sencillo tambi&amp;eacute;n&amp;nbsp;era mucho m&amp;aacute;s barato. &lt;/p&gt;
&lt;p&gt;Destinamos la mayor parte de los recursos a desarrollar el software y posteriormente intentamos comercializarlo. Este fue uno de los mayores errores que cometimos, realizamos un producto, sin analizar el mercado ni a la competencia, sin recursos econ&amp;oacute;micos, sin un sponsor, asumiendo que, como nuestro software ser&amp;iacute;a mucho m&amp;aacute;s completo que los dem&amp;aacute;s, se vender&amp;iacute;a sin problemas. Es decir, primero producimos el producto y posteriormente intentamos comercializarlo. Al cabo de unos a&amp;ntilde;os y&amp;nbsp;debido a este fracaso, deduc&amp;iacute; que lo mas adecuado seria invertir el orden, &amp;ldquo;vender y luego producir&amp;rdquo;, curiosamente el sistema LEAN&amp;nbsp;se basa en una idea similar, fabricar en base a la demanda, es decir &amp;lsquo;vender antes de producir&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;No ten&amp;iacute;amos un plan comercial viable. Contar con un estudio de mercado, para atacar a sectores en los que la competencia no estuviera presente, hubiera sido mucho m&amp;aacute;s inteligente que intentar competir con un producto que ya exist&amp;iacute;a en el mercado contra empresas solventes, mucho mejor posicionadas que nosotros, en un mercado que dominaban desde hac&amp;iacute;a algunos a&amp;ntilde;os. Estoy convencido de que si hubi&amp;eacute;ramos dedicado un poco de tiempo a estudiar y analizar en detalle el mercado, podr&amp;iacute;amos haber llegado a tener una idea clara de negocio, posteriormente lo pude ver claro con empresas que triunfaron, porque orientaron sus desarrollos a hacer programas de gesti&amp;oacute;n a Concesionarios, Hoteles, Abogados, Dentistas y otros sectores que no dispon&amp;iacute;an de ninguna soluci&amp;oacute;n de software.&lt;/p&gt;
&lt;p&gt;El desconocimiento del mercado hizo, que cuando terminamos el desarrollo, nos encontramos con que la mayor parte&amp;nbsp;de nuestros posibles clientes, se hab&amp;iacute;a decantado&amp;nbsp;por otros productos m&amp;aacute;s sencillos y baratos. La competencia opto por hacer&amp;nbsp;todo lo contrario, desarrollo un producto sencillo que no requiriese mucho tiempo y lo puso en el mercado un precio mucho menor, de esa manera, comenzaba a retornar parte de la inversi&amp;oacute;n y poco a poco iban aumentando la funcionalidad, adem&amp;aacute;s, sus clientes se convertir&amp;iacute;an en usuarios potenciales de sus versiones m&amp;aacute;s avanzadas que habitualmente ten&amp;iacute;an precios mucho m&amp;aacute;s elevados. Esto les aporto feedback para mejorar sus versiones, &amp;lsquo;me acuerdo de Scrum con las entregas continuas de software&amp;hellip;&amp;rsquo;, la penetraci&amp;oacute;n era mucho m&amp;aacute;s r&amp;aacute;pida, porque al cliente no le importaba desembolsar un poco de dinero por el software y posteriormente si sus requerimientos aumentaban podr&amp;iacute;an ampliar a versiones m&amp;aacute;s avanzadas, todo esto, hizo que en poco tiempo nuestro producto fuese menos competitivo. La estrateg&amp;iacute;a comercial de nuestros competidores fue mucho mas acertada.&lt;/p&gt;
&lt;p&gt;Los programas que realizaba la competencia, cubr&amp;iacute;an tan solo aspectos b&amp;aacute;sicos que la gente necesitaba, la mayor parte de los clientes empezaba a trabajar con computadoras personales con lo que un programa muy complejo hubiera fracasado. Nos ocurr&amp;iacute;a a menudo que cuando alguien ve&amp;iacute;a nuestro programa comentaba: &amp;lsquo;es excelente, pero tiene demasiadas opciones&amp;hellip;&amp;rsquo;, a mi no me hacen falta tantas, nunca modificare un informe, no s&amp;eacute; si podre manejarlo. Resulto que nuestro mercado, no estaba preparado para un producto tan complejo. Nos olvidamos de estudiar los requerimientos de los clientes, en lugar de esto, intentamos hacer un programa que cubriese todas las necesidades existentes, esto hizo que nuestro producto fuese mucho m&amp;aacute;s complejo de entender y manejar.&lt;/p&gt;
&lt;p&gt;Nos olvidamos de evaluar el tiempo de desarrollo, el tiempo es un factor&amp;nbsp;determinante,&amp;nbsp;el desarrollo duro m&amp;aacute;s de dos a&amp;ntilde;os, en este periodo, la competencia se hizo con un mercado potencial de clientes muy grande y que mas adelante fue&amp;nbsp;imposible de recuperarar, la mayoria ya se hab&amp;iacute;a habituado a su uso, y nuestros competidores iban incrementando la funcionalidad en base a la demanda de los clientes.&lt;/p&gt;
&lt;p&gt;Como necesit&amp;aacute;bamos dinero para mantener la empresa y no logramos que el software desarrollado se vendiese como quer&amp;iacute;amos, intentamos buscar una empresa que estuviera interesada en comercializar el producto, viajamos a Madrid y se lo ofrecimos a varias, la mayor&amp;iacute;a rehusaba, pues ya contaban con alg&amp;uacute;n producto que si ser tan completo, conoc&amp;iacute;an perfectamente y les resultaba f&amp;aacute;cil adaptarlo a las necesidades de sus clientes, aunque hubo un par de ofertas serias de compra que pasaban por hacerse con todo el c&amp;oacute;digo fuente y controlarlo completamente. Las ofertas fueron de bastante dinero, pero no quisimos renunciar a su control, as&amp;iacute; que lo descartamos. Si hubi&amp;eacute;ramos vendido el producto, el dinero nos hubiera permitido continuar, desarrollando la empresa durante unos a&amp;ntilde;os c&amp;oacute;modamente y pod&amp;iacute;amos haber dedicado otros recursos a realizar otros productos, pero no quer&amp;iacute;amos desprendernos de un programa que consider&amp;aacute;bamos como uno de los mejores del mercado y &amp;eacute;ramos demasiado ambiciosos, quer&amp;iacute;amos hacer mucho en muy poco tiempo.&lt;/p&gt;
&lt;p&gt;A partir de aqu&amp;iacute;, para subsistir nos dedicamos a vender hardware, dar soporte y mantenimiento a empresas, formaci&amp;oacute;n, instalaci&amp;oacute;n de redes, etc., en fin todos aquellos servicios que dan las empresas de inform&amp;aacute;tica, pero en esto, no aport&amp;aacute;bamos ning&amp;uacute;n factor diferenciador importante.&lt;/p&gt;
&lt;p&gt;Adem&amp;aacute;s de esto, nuestra inexperiencia hizo que en varias ocasiones, acept&amp;aacute;semos proyectos en los que posteriormente descubrimos que los clientes eran aut&amp;eacute;nticos profesionales del enga&amp;ntilde;o, aceptaban el presupuesto sin pesta&amp;ntilde;ear, pero a la hora de cobrar descubr&amp;iacute;amos que muchos nos enga&amp;ntilde;aban, recuerdo que hubo un proyecto, en el que despu&amp;eacute;s de finalizarlo nos enteramos que el cliente estaba en la ruina y que deb&amp;iacute;a dinero a mucha gente realizando pr&amp;aacute;cticas similares, no cre&amp;aacute;is que fue solo un caso, sufrimos varios, alguno de ellos, de importantes sumas de dinero que nos complicaron mucho la vida. La importancia de realizar un estudio del cliente es fundamental, cobrar a la firma de un contrato un porcentaje del proyecto y asegurarnos de la solvencia del cliente son aspectos muy importantes que se deben realizar antes de aceptar cualquier proyecto, existen empresas como Cr&amp;eacute;dito y Cauci&amp;oacute;n que aseguran el pago de un determinado porcentaje de la cantidad facturada a cambio de un porcentaje de la operaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;No logramos convencer a las empresas de que nuestros servicios ofrec&amp;iacute;an valor a&amp;ntilde;adido, les ofrec&amp;iacute;amos lo mismo que las dem&amp;aacute;s, algo que los dem&amp;aacute;s hac&amp;iacute;an igual que nosotros. Y, &amp;iquest;Por qu&amp;eacute; una empresa va a confiar en alguien que no conoce y que adem&amp;aacute;s no ofrece nada nuevo ?.... Estaba claro,&amp;nbsp;nuestro objetivo inicial hab&amp;iacute;a variado, ahora ya no desarroll&amp;aacute;bamos software, tan solo hac&amp;iacute;amos lo que fuera para subsistir&amp;nbsp;y nos olvidamos del verdadero objetivo de nuestra empresa.&lt;/p&gt;
&lt;p&gt;No supimos analizar bien nuestros costes, cuando comenzamos la actividad nos dimos cuenta de todos los gastos que&amp;nbsp;deb&amp;iacute;amos soportar, pago de aut&amp;oacute;nomos, IAE, gastos de luz, agua, tel&amp;eacute;fono, n&amp;oacute;minas, seguros sociales, mobiliario, acondicionamiento del local, declaraci&amp;oacute;n de IVA, seguro del local, asesor&amp;iacute;a contable, alarma, gastos por l&amp;iacute;neas de cr&amp;eacute;dito y transacciones bancarias, recuerdo que pusimos un aparato para pagar con tarjeta, nos enteramos que VISA llega a cobrar un 4 % por cada transacci&amp;oacute;n que realicen los clientes, recuerdo que algunos productos inform&amp;aacute;ticos apenas ten&amp;iacute;an ese marguen comercial. Os aseguro que, por peque&amp;ntilde;o que sea el negocio, la lista de gastos es interminable, y claro, pod&amp;eacute;is esperar &amp;lsquo;sentados&amp;rsquo; que los Ayuntamientos y otros Organismos Oficiales os ayuden, lo &amp;uacute;nico que les interesa es ampliar sus ingresos. As&amp;iacute; que deb&amp;eacute;is tener claro todos los gastos antes de comenzar vuestra actividad.&lt;/p&gt;
&lt;p&gt;No cont&amp;aacute;bamos con una estrategia comercial seria, no pod&amp;iacute;amos permitirnos un agente comercial especializado, vender software o servicios inform&amp;aacute;ticos requiere profundos conocimientos t&amp;eacute;cnicos y comerciales, encontrar un comercial en este sector es muy complicado, al carecer de medios, hizo que tuvi&amp;eacute;semos que dedicarnos a realizar esta labor, carec&amp;iacute;amos de la suficiente experiencia, el desconocimiento del perfil de los empresarios de la zona, que no cre&amp;iacute;an como yo, en el valor que podr&amp;iacute;a aportarles el software a medida, hizo que la mayor parte de las empresas rehusasen a aceptar nuestros servicios y que posiblemente un comercial con experiencia podr&amp;iacute;a haber triunfado donde yo fracase.&lt;/p&gt;
&lt;p&gt;No cont&amp;aacute;bamos con un sponsor que financiase nuestro proyecto y desde luego no ten&amp;iacute;amos medios econ&amp;oacute;micos, con lo que solamente subsistir mes a mes ya era un logro para nosotros, pero siempre nos obligaba a estar en la cuerda floja, si un mes no realiz&amp;aacute;bamos el objetivo de ventas, la empresa se tambaleaba y varias fueron las veces que estuvimos a punto de cerrar, dedic&amp;aacute;bamos todas nuestras energ&amp;iacute;as a llegar a fin de mes.&lt;/p&gt;
&lt;p&gt;No dedic&amp;aacute;bamos tiempo a innovar, a poner en la mesa ideas diferentes y realizar algo que nos distinguiese de nuestros competidores. Esto hizo que nos incorpor&amp;aacute;semos a un mercado en el que nuestros competidores ten&amp;iacute;an mucha ventaja, dispon&amp;iacute;an de mayor experiencia y habitualmente contaban con una cartera de clientes. La mayor&amp;iacute;a no ten&amp;iacute;an que preocuparse por subsistir, con lo que pod&amp;iacute;an contar con m&amp;aacute;s recursos para competir en el mercado.&lt;/p&gt;
&lt;p&gt;Debido al poco tiempo que ten&amp;iacute;amos, empezamos a dejar de formarnos, tan solo dedic&amp;aacute;bamos un poco de tiempo cuando pod&amp;iacute;amos, as&amp;iacute; que con el tiempo fuimos perdiendo valor en nuestro mercado, pero nuestro trabajo no daba para m&amp;aacute;s, as&amp;iacute; que pasamos de ser desarrolladores a &amp;lsquo;empresarios de poca monta&amp;#39;.&lt;/p&gt;
&lt;p&gt;Los problemas econ&amp;oacute;micos, administrativos y comerciales fueron aumentando y hac&amp;iacute;an que dedic&amp;aacute;semos pr&amp;aacute;cticamente todos nuestros recursos a subsistir y apenas ten&amp;iacute;amos tiempo para pensar, no nos paramos a ver c&amp;oacute;mo mejorar, como hacer cosas que nos aportasen valor, nos mov&amp;iacute;amos por impulsos, a petici&amp;oacute;n de la demanda de algunos clientes que tan solo nos permit&amp;iacute;an subsistir y con el &amp;uacute;nico objetivo de llegar a fin de mes. Nos fue pr&amp;aacute;cticamente contratar personal adicional, desde t&amp;eacute;cnicos especializados hasta comerciales con conocimientos del entorno, esto hacia que tuvi&amp;eacute;semos que hacer de todo, desde barrer hasta encargarnos de realizar presupuestos de equipos inform&amp;aacute;ticos, con lo que fuimos dejando en otro plano aquello que nos podr&amp;iacute;a diferenciar de los dem&amp;aacute;s.&lt;/p&gt;
&lt;p&gt;No logramos convencer a otras empresas del sector de que la colaboraci&amp;oacute;n pod&amp;iacute;a hacer que estableciendo ciertas reglas de compromiso, nuestros m&amp;aacute;rgenes comerciales mejorasen y ofreciesen mayor valor a&amp;ntilde;adido. La incapacidad para llegar a acuerdos con nuestros competidores hizo que tuvi&amp;eacute;semos que renunciar a la mayor&amp;iacute;a de la venta de software&amp;nbsp;y esto elimino un mercado que podr&amp;iacute;a habernos ayudado en nuestros objetivos.&lt;/p&gt;
&lt;p&gt;La parte positiva, es que al final, este y otros fracasos, me ayudaron a lo largo de toda mi trayectoria profesional a entender mejor c&amp;oacute;mo se comportan los mercados, la importancia del cliente y la competencia, de la colaboraci&amp;oacute;n, del trabajo en equipo, de la innovaci&amp;oacute;n, que de otra forma, dif&amp;iacute;cilmente hubiera podido aprender. He tenido el privilegio de poder &amp;ldquo;intentarlo&amp;rdquo;, algo que muchas personas ni siquiera se han atrevido o que su condici&amp;oacute;n econ&amp;oacute;mica no se lo permitir&amp;aacute; a lo largo de su vida, he aprendido mucho de las personas que nos rodean y que los errores, nos ense&amp;ntilde;an aspectos que de otra forma, serian muy dif&amp;iacute;ciles de aprender, por eso pienso, que aquel que ha fracasado, tiene m&amp;aacute;s valor que &amp;eacute;l no lo ha hecho nunca, los errores del pasado, nos ense&amp;ntilde;an c&amp;oacute;mo mejorar nuestro futuro y a no cometer los mismos errores, de ah&amp;iacute; la importancia del conocimiento de la historia.&lt;/p&gt;
&lt;p&gt;He aprendido que en la colaboraci&amp;oacute;n y en el valor de las personas est&amp;aacute; la clave de todo, en que pensar antes de hacer las cosas es mucho m&amp;aacute;s importante que hacerlas y luego pensar&amp;hellip;, aunque a veces haya que arriesgarse, que el trabajo en equipo, la formaci&amp;oacute;n continua, la innovaci&amp;oacute;n y por supuesto, &amp;lsquo;los fracasos&amp;rsquo;, son aspectos que conducen al &amp;eacute;xito. &lt;/p&gt;
&lt;p&gt;Este es un sector proclive al cambio y la innovaci&amp;oacute;n y tenemos un mercado inmenso esperando a ser explotado, as&amp;iacute; que animaros, no teng&amp;aacute;is miedo al fracaso, pero cuidado, no os enga&amp;ntilde;&amp;eacute;is, nadie os va a regalar nada, el dinero es el primer objetivo de una empresa, que una empresa tenga &amp;eacute;xito pasa solo por una cosa: &lt;strong&gt;ganar dinero.&lt;/strong&gt; Si la empresa no gana dinero, no podr&amp;aacute; alcanzar sus objetivos, para poder establecer una empresa debemos tener un plan establecido que asegure la viabilidad de esta, desde el principio, sobre todo al inicio, que es, cuando m&amp;aacute;s falta nos va a hacer. &lt;/p&gt;
&lt;p&gt;Mis fracasos me han ense&amp;ntilde;ado mucho, si tuviera que poner en marcha una nueva empresa de desarrollo de software, desde luego har&amp;iacute;a cosas muy diferentes, algunas de ellas serian:&lt;/p&gt;
&lt;p&gt;Buscar una idea y desarrollarla, intentar que esta sea innovadora o que aporte algo que marque la diferencia frente a vuestros competidores, establecer una l&amp;iacute;nea de negocio clara realizando un plan estrat&amp;eacute;gico con su an&amp;aacute;lisis de costes y beneficios, estudiar las&amp;nbsp;ventajas e inconvenientes del negocio, analizar c&amp;oacute;mo, despu&amp;eacute;s de un tiempo, pod&amp;eacute;is dotar a vuestra idea de mayor valor a&amp;ntilde;adido, trazar un par de planes alternativos por si no funciona como ten&amp;iacute;ais planeado, realizar un peque&amp;ntilde;o estudio de mercado estudiando a vuestros posibles clientes y el entorno en el que se encuentran, si es posible contar con alguno de ellos para comenzar, compartir los riesgos con un sponsor, estudiar a vuestra competencia antes de actuar y el mercado al que va destinado vuestro producto, compartir vuestra idea con alguna persona con experiencia en el sector para obtener otros puntos de vistas y evaluar los posibles riesgos que pueden aparecer y que de otro modo desconocer&amp;iacute;ais, hay que tener en cuenta que cuando alguien tiene ilusi&amp;oacute;n por una idea solo ve la parte positiva, debemos contar con opiniones externas para contar con un punto de vista mas objetivo y me atrever&amp;iacute;a a decir &amp;#39;mas real&amp;#39;. As&amp;iacute; mismo, es muy importante rodearse de un equipo adecuado, contar con personas preparadas que sean innovadoras, proclives al cambio y que compartan la visi&amp;oacute;n de la empresa. Es tambi&amp;eacute;n muy importante que los miembros del equipo mantengan una buena relaci&amp;oacute;n y tengan un nivel de educaci&amp;oacute;n aceptable, pues el acercamiento siempre da lugar a roces. En el &amp;aacute;rea del desarrollo, el tiempo es un factor determinante, apostar por desarrollos de larga duraci&amp;oacute;n es un riesgo muy alto, es mucho mejor resolver las necesidades b&amp;aacute;sicas y posteriormente ir incrementando la funcionalidad y optimizando el producto, esto permitir&amp;aacute; retornar la inversi&amp;oacute;n m&amp;aacute;s r&amp;aacute;pido y disminuir vuestros riesgos. &lt;/p&gt;
&lt;p&gt;En resumen, &amp;lsquo;pensar antes de actuar&amp;rsquo;, &amp;lsquo;vender antes de producir&amp;rsquo;, &amp;lsquo;innovar&amp;rsquo;, &amp;lsquo;apostar por el valor del equipo y la colaboraci&amp;oacute;n&amp;#39;, &amp;lsquo;reducir vuestros riesgos&amp;rsquo;, &amp;#39;tener en cuenta que el tiempo, es un factor determinante&amp;#39;.&lt;/p&gt;
&lt;p&gt;Espero que mis experiencias os ayuden a no cometer los mismos errores, si lo logro, &lt;em&gt;habr&amp;eacute; fracasado con &amp;eacute;xito.&lt;/em&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=156856" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Empresa/default.aspx">Empresa</category></item><item><title>Cuestión de velocidad…</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/09/15/cuesti-243-n-de-velocidad.aspx</link><pubDate>Tue, 15 Sep 2009 14:48:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:155896</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=155896</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=155896</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/09/15/cuesti-243-n-de-velocidad.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Velocimetro_5F00_62ADA469.jpg"&gt;&lt;img height="259" width="344" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Velocimetro_5F00_thumb_5F00_101E9E60.jpg" alt="Velocimetro" border="0" title="Velocimetro" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Creo que todos los desarrolladores, alguna vez hemos estado obsesionados con la velocidad, la velocidad es un tema importante, incide en pr&amp;aacute;cticamente todas las facetas de la computaci&amp;oacute;n, realizar un programa veloz normalmente marcar&amp;aacute; el &amp;eacute;xito o el fracaso de un desarrollo, Google es un claro ejemplo de esto. Si lo comparamos con la velocidad de un coche, la verdad es que no tiene mucho que ver, pr&amp;aacute;cticamente todos los coches pueden viajar a 100-120 km/hora, lo suficiente para realizar cualquier viaje, por grande que sea. &lt;/p&gt;
&lt;p&gt;En el &amp;aacute;mbito de las conexiones de red comenzamos con velocidades de 50 bps que utilizaban los antiguos teletipos, en cambio ahora la mayor&amp;iacute;a de los canales de comunicaciones, desde una simple Ethernet con velocidades de&amp;nbsp; 1000 Mbps full d&amp;uacute;plex, hasta las Wifi que con la nueva norma n podr&amp;aacute;n llegar a los 300 Mbps. El avance es espectacular hemos pasado de 300 bps al descargarnos alg&amp;uacute;n archivo de las primeras BBS a disponer de ADSL con velocidades de hasta 20 Mbs.&lt;/p&gt;
&lt;p&gt;Me pregunto que pasara cuando la velocidad de internet, llegue a ofrecernos una velocidad suficiente para poder ejecutar cualquier tipo de servicio con fluidez, y como sucede hoy en d&amp;iacute;a con las redes de fibra en la que ni los discos duros m&amp;aacute;s veloces sean capaces de procesar. Existe hoy en dia algunos lugares, como Jap&amp;oacute;n, donde se pueden conseguir velocidades de hasta 100 Mbps, lo suficiente como para hacer casi cualquier cosa, es cierto que para ello todas las infraestructuras de internet tendr&amp;aacute;n que readaptarse, pero a la velocidad que esto se mueve apenas notaremos el cambio. &lt;/p&gt;
&lt;p&gt;Pese a que el incremento de la velocidad ha sido paulatina, las necesidades han ido aumentando quiz&amp;aacute;s hasta m&amp;aacute;s que la propia velocidad, pasamos de desc&amp;aacute;rganos alg&amp;uacute;n peque&amp;ntilde;o fichero de 15 Kb desde las antiguas BBS a varios Gygabytes de alguna aplicaci&amp;oacute;n, el video bajo demanda, las redes P2P, voz Ip y otros servicios han ido surgiendo a medida que la velocidad a permitido su funcionamiento. Los avances de velocidad en los procesadores, la utilizaci&amp;oacute;n de m&amp;uacute;ltiples n&amp;uacute;cleos, la incorporaci&amp;oacute;n de grandes procesadores en las tarjetas de video han permitido que en poco tiempo hayamos pasado de programas simples a modernas y complejas aplicaciones que nos permiten trabajar con objetos 3D, video, etc. &lt;/p&gt;
&lt;p&gt;Sin embargo, despu&amp;eacute;s de tantos avances, algunos programas parecen cada vez m&amp;aacute;s lentos, creo que todav&amp;iacute;a hoy en d&amp;iacute;a el &amp;aacute;rea del desarrollo en general no ha sido capaz de asumir la velocidad del hardware, el ejemplo m&amp;aacute;s claro es que las aplicaciones de 64 bits todav&amp;iacute;a no han despegado. Actualmente se acaba de presentar la programaci&amp;oacute;n paralela destinada a aprovechar todos los n&amp;uacute;cleos de los procesadores que nos permitir&amp;aacute; conseguir mejores ratios de rendimiento y aprovechar todas las ventajas de nuestro hardware, veremos c&amp;oacute;mo evoluciona y si le sacaremos el partido que merece.&lt;/p&gt;
&lt;p&gt;Me pregunto, cu&amp;aacute;ndo internet permita conseguir velocidades de 100 Mbps o m&amp;aacute;s como en Jap&amp;oacute;n, si la velocidad dejara de tener tanta relevancia como hoy en d&amp;iacute;a, la mayor&amp;iacute;a de los programas en Internet, incluso ayudados de nuevas tecnolog&amp;iacute;as como Ajax, Silverlight, Flex y otras, todav&amp;iacute;a no permiten una interacci&amp;oacute;n muy fluida con los usuarios, si bien han mejorando mucho, pero en poco tiempo, creo que tal y como sucede con los coches esto dejara de tener tanta relevancia. Pienso que estar&amp;aacute; al alcance de todos obtener la mayor&amp;iacute;a de servicios de una forma fluida, desde tv bajo demanda con alta calidad, algo que hoy en d&amp;iacute;a ya es una realidad con la mayor&amp;iacute;a de proveedores de Internet que ofrecen servicios de TV, manejar objetos 3D, acceder a recursos compartidos como si de una red Ethernet se tratase, utilizar servicios de voz IP sin interferencias y todo el conjunto de servicios que hoy en d&amp;iacute;a utilizamos mejorados por las capacidades de la red.&lt;/p&gt;
&lt;p&gt;En este supuesto, para el que creo, no queda mucho tiempo, pienso que las arquitecturas volver&amp;aacute;n de nuevo a reinventarse ya que la capacidad de comunicaci&amp;oacute;n, permitir&amp;aacute; que cualquier programa tanto Web como de escritorio tenga una capacidad de comunicaci&amp;oacute;n pr&amp;aacute;cticamente ilimitada similar a nuestras redes de trabajo locales. &lt;/p&gt;
&lt;p&gt;Estoy convencido de que el Software as Services (SAAS) es el futuro, y la mayor parte de los programas que existen, pasaran tarde o temprano a alojarse en la red, este paso masivo de aplicaciones marcara un antes y un despu&amp;eacute;s en nuestra vida, ya que la mayor&amp;iacute;a de los servicios pasaran a administrarse por especialistas y el coste de su mantenimiento bajara progresivamente, esto permitir&amp;aacute; que de alg&amp;uacute;n modo nos podamos abstraer de las necesidades de hardware y software necesario (actualizaciones, copias de seguridad, gesti&amp;oacute;n de errores e incidencias, mantenimiento, etc). Creo que estos servicios ser&amp;aacute;n mucho m&amp;aacute;s baratos que contar con una infraestructura propia y por ello ser&amp;aacute;n utilizados de forma masiva.&lt;/p&gt;
&lt;p&gt;Uno de mis sue&amp;ntilde;os y creo que el de mucha gente es la de desarrollar un programa sin demasiado esfuerzo que sea multiplataforma y que funcione por cualquier canal de comunicaci&amp;oacute;n establecido. Espero que con el aumento de la velocidad y de la progresi&amp;oacute;n del SAAS esto se convierta en una realidad muy pronto. &lt;/p&gt;
&lt;p&gt;En Espa&amp;ntilde;a, como no podr&amp;iacute;a ser de otra forma, seguimos por debajo de la media de los pa&amp;iacute;ses Europeos en velocidad y precio del ADSL, incre&amp;iacute;ble, nos gana hasta Portugal, espero que poco a poco nos vayamos poniendo al d&amp;iacute;a, ya que la importancia de la velocidad en Internet va a ser un punto clave para que podamos evolucionar con todas estas tecnolog&amp;iacute;as. Os dejo la tabla comparativa del 2008.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_4C1ABA48.jpg"&gt;&lt;img height="216" width="516" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image001_5F00_thumb_5F00_2E78B97C.jpg" alt="clip_image001" border="0" title="clip_image001" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pienso que el &lt;a href="http://es.wikipedia.org/wiki/Computaci%C3%B3n_grid"&gt;Grid Computing&lt;/a&gt; se vera tambien beneficiado por el aumento de velocidad, como sabeis el Grid Computing es una tecnolog&amp;iacute;a que permite acceder a una gran capacidad de proceso y otros recursos utilizando equipos distribuidos, tal y como realiza Google con sus b&amp;uacute;squedas. Uno de los ejemplos m&amp;aacute;s antiguos es el proyecto SETI para la b&amp;uacute;squeda de vida extraterrestre que utiliza ordenadores personales de la gente que quiera participar en el proyecto, para procesar datos, creo que el aumento de velocidad har&amp;aacute; que esta tecnolog&amp;iacute;a vaya asent&amp;aacute;ndose cada vez m&amp;aacute;s.&lt;/p&gt;
&lt;p&gt;Parece que est&amp;aacute; de moda hablar de la Nube, y a mi juicio todo indica que Azure ser&amp;aacute; el primer paso para asentar todas estas ideas que comenzaron hace algunos a&amp;ntilde;os cuando los Web Services empezaron a tomar mayor relevancia y que ahora&amp;nbsp;debido sobre todo al aumento de la velocidad se pueden hacer realidad.&lt;/p&gt;
&lt;p&gt;Todo indica que Internet continuara progresando de forma exponencial en los pr&amp;oacute;ximos a&amp;ntilde;os y su importancia ser&amp;aacute; cada vez mayor, en pocos a&amp;ntilde;os, quiz&amp;aacute;s, hasta cobre vida propia&amp;hellip;, ya hay televisiones que permiten conectarse a internet, pienso que dentro de poco se conectaran desde los coches hasta las cafeteras y lavadoras, veremos lo que nos depara el futuro. &lt;/p&gt;
&lt;p&gt;A&amp;uacute;n con esto, sigo teniendo mis dudas:&lt;/p&gt;
&lt;p&gt;&amp;iquest;Dejara de tener importancia la velocidad tal y como ha pasado con los coches o el aumento de los requisitos seguir&amp;aacute; aumentando conjuntamente con la mejora de la velocidad como ha sucedido hasta ahora?&lt;/p&gt;
&lt;p&gt;&amp;iquest;Se asentara definitivamente el Grid Computing y dejaran los grandes servidores de tener tanta importancia?&lt;/p&gt;
&lt;p&gt;&amp;iquest;Dejaran de utilizarse masivamente los protocolos de comunicaci&amp;oacute;n soap y tecnolog&amp;iacute;as como http y xml, para dejar paso a protocolos m&amp;aacute;s avanzados en forma binaria?&lt;/p&gt;
&lt;p&gt;&amp;iquest;Lograra el SASS comerle el terreno a las aplicaciones locales y se asentara definitivamente para convertirse en la plataforma m&amp;aacute;s utilizada?&lt;/p&gt;
&lt;p&gt;Espero vuestras opiniones...&lt;/p&gt;
&lt;p&gt;Un saludo.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155896" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Azure/default.aspx">Azure</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Velocidad/default.aspx">Velocidad</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/SAAS/default.aspx">SAAS</category></item><item><title>Innovar sí, pero como…</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/09/14/innovar-s-237-pero-como.aspx</link><pubDate>Sun, 13 Sep 2009 23:55:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:155806</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=155806</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=155806</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/09/14/innovar-s-237-pero-como.aspx#comments</comments><description>&lt;p&gt;A ra&amp;iacute;z del &lt;a href="http://geeks.ms/blogs/rcorral/archive/2009/09/09/software-e-innovaci-243-n-innovaci-243-n-y-software-191-existe-un-proceso.aspx" title="http://geeks.ms/blogs/rcorral/archive/2009/09/09/software-e-innovaci-243-n-innovaci-243-n-y-software-191-existe-un-proceso.aspx"&gt;post&lt;/a&gt; de &lt;a href="http://geeks.ms/blogs/rcorral/"&gt;Rodrigo&lt;/a&gt; hablando sobre innovaci&amp;oacute;n, me he animado a escribir este art&amp;iacute;culo, la verdad es que el tema me apasiona, recuerdo una conferencia sobre trabajo e innovaci&amp;oacute;n hace un par de a&amp;ntilde;os, en el que el ponente , un Consejero de Telef&amp;oacute;nica y varias empresas importantes de Espa&amp;ntilde;a, hablaba sobre la necesidad de innovar, en concreto comento un caso de una Empresa Catalana galardonada con un premio Europeo a la entidad m&amp;aacute;s innovadora, comentaba que la empresa dispon&amp;iacute;a de un equipo de personas que se pasaban el d&amp;iacute;a estudiando la viabilidad de nuevos productos, los desarrollaba y empezaba a comercializarlos, y cuando ve&amp;iacute;an que el producto llegaba al m&amp;aacute;ximo de ventas, es decir su curva de ventas comenzaba a descender autom&amp;aacute;ticamente lo retiraba del mercado, recuerdo que a m&amp;iacute; y creo que a muchos otros, se nos quedo cara de tontos, pensando c&amp;oacute;mo, cuando un producto alcanza su m&amp;aacute;ximo de ventas lo abandonaban, la idea subyacente es sencilla, era en este momento cuando la competencia y otros factores externos empezaban a comerles terreno, y porque luchar contra algo imparable, siempre habr&amp;iacute;a alguien que lograr&amp;iacute;a realizar el producto m&amp;aacute;s barato e incluso mejor, simplemente lo retiraban y pasaban a dedicar todos sus esfuerzos a desarrollar nuevos productos.&lt;/p&gt;
&lt;p&gt;Recuerdo una reuni&amp;oacute;n en una empresa, donde se habr&amp;iacute;a un debate para ver c&amp;oacute;mo entre todos los componentes, la mayor parte responsables de cada uno de los Departamentos pod&amp;iacute;an aportar ideas para intentar mejorar una situaci&amp;oacute;n delicada, la mayor parte de los componentes no dec&amp;iacute;an nada, en cambio, algunos empezaron a lanzar ideas, mejorar el departamento comercial, intentar fabricar otros productos con los medios productivos que ten&amp;iacute;an, abrir nuevos mercados, eliminar los canales de distribuci&amp;oacute;n para llegar al cliente final y obtener mayores beneficios, realizar acuerdos con competidores o con empresas relacionadas con el sector, mejorar la calidad para poder acceder a mercados m&amp;aacute;s exigentes, adquirir alguna empresa de la competencia, etc. La mayor parte de estas ideas eran rebatidas r&amp;aacute;pidamente por algunos miembros descart&amp;aacute;ndolas r&amp;aacute;pidamente aduciendo que algunas se hab&amp;iacute;an puesto en marcha y hab&amp;iacute;an fracasado a&amp;ntilde;os atr&amp;aacute;s, que no ve&amp;iacute;an su rentabilidad inmediata y que otras simplemente eran totalmente err&amp;oacute;neas por el desconocimiento de las personas que las planteaban y que desconoc&amp;iacute;an el mercado. Al final todas y cada una de las ideas se fueron descartando y se llego a la conclusi&amp;oacute;n de que lo mejor ser&amp;iacute;a &amp;lsquo;ahorrar costes&amp;rsquo;, si ahorran costes podr&amp;iacute;an continuar manteniendo un nivel de beneficios aceptable y aguantar el tir&amp;oacute;n en espera de tiempos mejores. Para ello&amp;nbsp;deber&amp;iacute;an optimizar algunos procesos con los que trabajaban, reducir los gastos de algunos departamentos, paralizar ciertas inversiones, seguramente reducir parte de la plantilla, etc. &lt;/p&gt;
&lt;p&gt;No digo que en la reuni&amp;oacute;n no se llegaron a conclusiones que pudieran aportar mejoras a la empresa, pero lo cierto es que la palabra innovaci&amp;oacute;n se esfumo&amp;hellip; y &amp;iquest;por qu&amp;eacute;?, por el miedo a nuevas inversiones de dudosa rentabilidad, a apostar por algo sin la suficiente seguridad, en resumen por el miedo al fracaso.&lt;/p&gt;
&lt;p&gt;Creo que este es un claro ejemplo de lo que ocurre con muchas empresas actualmente, se agarran a un clavo ardiendo con tal de no cambiar su negocio, la resistencia al cambio es el mayor enemigo de la innovaci&amp;oacute;n, aceptar que un negocio que ha funcionado durante muchos a&amp;ntilde;os, ya no es rentable y que hay que hacer cosas diferentes es algo muy dif&amp;iacute;cil de asumir. Incurrir en proyectos que pueden fracasar de dudosa rentabilidad es algo que la mayor&amp;iacute;a suele reusar. Seg&amp;uacute;n mi opini&amp;oacute;n, creo que la mayor parte de las ideas que se presentaron seguramente podr&amp;iacute;an haber fracasado, pero estoy seguro de que si entre todas, solo una llegase a buen fin, seguramente la situaci&amp;oacute;n de la empresa hubiera cambiado considerablemente.&lt;/p&gt;
&lt;p&gt;Para Innovar debemos arriesgarnos, debemos escuchar las ideas de los dem&amp;aacute;s por absurdas que est&amp;aacute;s nos parezcan, debemos eliminar aquellas reglas que dicen, porque hacerlo de otra forma si de esta siempre nos ha funcionado bien o planteamientos como, &amp;lsquo;bueno, nosotros no vamos muy bien pero f&amp;iacute;jate en los dem&amp;aacute;s...&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Para Innovar debemos dedicar parte de nuestro tiempo productivo a pensar c&amp;oacute;mo hacerlo mejor, como sacar valor a&amp;ntilde;adido, como mejorar nuestro trabajo, si no nos paramos a pensar c&amp;oacute;mo mejorar, jam&amp;aacute;s lo haremos.&lt;/p&gt;
&lt;p&gt;Desgraciadamente las empresas suelen tener un objetivo que les impide ver m&amp;aacute;s all&amp;aacute;, &amp;lsquo;la rentabilidad de los proyectos&amp;rsquo;, si de antemano no presentamos un proyecto rentable ser&amp;aacute; muy dif&amp;iacute;cil apostar por &amp;eacute;l, convencer de esto a los directivos de las empresas es algo muy dif&amp;iacute;cil de conseguir. Lo primero que hacen es preguntarse: ya, pero y &amp;iquest;si no sale bien?&amp;hellip; &amp;iquest;cu&amp;aacute;nto dinero nos va a costar?, estoy desacuerdo en que la rentabilidad es un factor muy importante, pero para innovar tampoco es necesario realizar grandes inversiones, hay muchas formas de minimizarlas realizando proyectos pilotos, maquetas, simulaciones, estudios de mercado, o mejor vender la idea, convencer a un sponsor y ll&amp;eacute;vala a cabo, si, se que suena como un sue&amp;ntilde;o de hadas pero muchos proyectos han conseguido ver la luz siguiendo este m&amp;eacute;todo, comparte el beneficio y disminuye tus riesgos, pero si todo esto no es posible, siempre llegara un punto en que habr&amp;aacute; que arriesgarse. Si a&amp;uacute;n as&amp;iacute;, no somos capaces de llevar a cabo el proyecto solo nos quedara una cosa por hacer,&amp;rdquo;nada&amp;rdquo;, esta es la opci&amp;oacute;n m&amp;aacute;s utilizada, y como es gratis y no cuesta ning&amp;uacute;n esfuerzo, a esperar como el avestruz que entierra su cabeza en la tierra cuando viene un le&amp;oacute;n&amp;hellip;&lt;/p&gt;
&lt;p&gt;Todo esto, me hace preguntarme una cosa. &amp;iquest;Somos los desarrolladores innovadores?, en mi opini&amp;oacute;n y despu&amp;eacute;s de m&amp;aacute;s de 20 a&amp;ntilde;os de profesi&amp;oacute;n puedo afirmar que no. Creo que la mayor&amp;iacute;a de nosotros destinamos la mayor parte de nuestro tiempo a aprender a utilizar nuevas tecnolog&amp;iacute;as para no perder el tren, el constante bombardeo de las grandes empresas de Software como Microsoft, Google, Adobe y algunas otras, hace que estemos constantemente estudiando lo que ellos nos proponen, en mis 20 a&amp;ntilde;os, tan solo he realizado 3 o 4 proyectos que pudiesen definirse como innovadores y solo por la aplicaci&amp;oacute;n temprana de nuevas tecnolog&amp;iacute;as de reciente aparici&amp;oacute;n, en contraposici&amp;oacute;n somos muy abiertos al cambio, estamos siempre en predisposici&amp;oacute;n de adoptar nuevas tecnolog&amp;iacute;as y cambios, pues nuestra profesi&amp;oacute;n as&amp;iacute; lo requiere, pero realmente apenas innovamos nada, no hacemos nada diferente, tan solo copiamos aquello que nos proponen las grandes empresas de software, y en el mejor de los casos a veces lo mejoramos un poquito. En mi opini&amp;oacute;n para innovar deber&amp;iacute;amos renunciar a estar siempre a la &amp;uacute;ltima y destinar parte de nuestro tiempo a proponer ideas, escoger alguna interesante y llevarla a cabo, en lugar de dedicar todo nuestro tiempo a aprender lo que nos proponen los dem&amp;aacute;s, si bien es necesario estar al d&amp;iacute;a, para no cometer el error hacer algo que los dem&amp;aacute;s ya han construido, un error muy frecuente en nuestra profesi&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Deber&amp;iacute;amos tambi&amp;eacute;n dejar a un lado muchas de las reglas que aplicamos, cuando desarrollo, sobre todo en estos &amp;uacute;ltimos a&amp;ntilde;os, tengo un pensamiento que constantemente me dice &amp;ldquo;demasiadas reglas&amp;rdquo;, el desarrollo es cada vez menos fluido, menos intuitivo, esto, me hace preguntarme si estar&amp;eacute; haciendo las cosas bien, en mi opini&amp;oacute;n demasiadas reglas limitan la innovaci&amp;oacute;n ya que en muchos casos la rigidez de algunas de ellas y el tiempo que destinamos a aplicarlas, evitan que destinemos nuestros recursos a innovar o ser mas creativos.&lt;/p&gt;
&lt;p&gt;Debemos hacernos estas preguntas de forma habitual, &amp;iquest;C&amp;oacute;mo puedo mejorar?,&amp;iquest;C&amp;oacute;mo puedo hacerlo m&amp;aacute;s r&amp;aacute;pido?, &amp;iquest;C&amp;oacute;mo puedo sacar mayor valor a&amp;ntilde;adido?, y dedicar parte de nuestro recursos a responder a estas preguntas.&lt;/p&gt;
&lt;p&gt;En general, el desarrollo de software de las grandes empresas de desarrollo es un &amp;aacute;rea muy innovadora, ellos han entendido mejor que nadie la necesidad de innovar constantemente y por ello son ellos y no nosotros los que logran el &amp;eacute;xito, y no me refiero solamente a obtener un buen salario&amp;hellip; &lt;/p&gt;
&lt;p&gt;El &amp;aacute;rea del desarrollo de software es un mercado sumamente competitivo, pero con gran potencial, no hay m&amp;aacute;s que fijarse en empresas que en pocos a&amp;ntilde;os pasan de no ser nada a cotizar en bolsa, en ver cu&amp;aacute;ntos productos nuevos aparecen y otros que en poco tiempo desaparecen, como cambiamos de un a&amp;ntilde;o para otro nuestra forma de trabajar, como tenemos que obligatoriamente apostar por una formaci&amp;oacute;n continua para poder mantenernos en este mercado, pero no lo hacemos porque somos innovadores, lo hacemos porque es un requerimiento de mercado, me pregunto cu&amp;aacute;ntos desarrolladores de los que escribimos aqu&amp;iacute; o de los que nos leen, realizan proyectos innovadores si no es por petici&amp;oacute;n de un cliente, creo que muy pocos son los que llegan a alcanzar este status, que envidia tengo de &lt;a href="http://geeks.ms/blogs/mllopis/"&gt;Miguel Llopis&lt;/a&gt; que trabaja en el desarrollo de nuevas tecnolog&amp;iacute;as y puede destinar gran parte de su tiempo a ser innovador.&lt;/p&gt;
&lt;p&gt;Para innovar debemos trabajar en equipo, las relaciones personales son fundamentales para poner una idea en funcionamiento, saber convencer, incentivar y hacer participes a la gente de un equipo con una idea es algo fundamental, y estoy desacuerdo que la mayor parte de las veces hace falta la figura de un L&amp;iacute;der que incentive y mantenga unido al equipo para llegar a obtener mejores resultados, si bien tener un objetivo com&amp;uacute;n en el que todos los componentes creen puede hacer que esta figura se reparta entre todos los miembros del equipo, en un equipo innovador todos deben escuchar y debatir las ideas de los dem&amp;aacute;s, la pol&amp;iacute;tica de la empresa debe otorgar libertad en la toma de decisiones, conozco muchas personas a los que se les limita la capacidad de innovaci&amp;oacute;n en pro de la rentabilidad, as&amp;iacute; pues es necesario que todos desde el primero al &amp;uacute;ltimo apueste por la innovaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;La necesidad es tambi&amp;eacute;n un factor que nos llama a innovar, solo cambiamos cuando tenemos la obligaci&amp;oacute;n de mejorar, ponemos en marcha nuevas ideas cuando las que tenemos no sirven o no nos aportan lo suficiente, desgraciadamente en la mayor&amp;iacute;a de los casos, es, en estos momentos cuando es demasiado tarde.&lt;/p&gt;
&lt;p&gt;Es curioso ver los gr&amp;aacute;ficos de las patentes en Espa&amp;ntilde;a, est&amp;aacute; generalmente admitido que el n&amp;uacute;mero de solicitudes de patentes originadas en un pa&amp;iacute;s constituye un indicador bastante significativo de la situaci&amp;oacute;n de su sistema de I+D+I, &lt;/p&gt;
&lt;p&gt;Fuente: &lt;a href="http://www.oepm.es/cs/Satellite?c=Page&amp;amp;cid=1213455385201&amp;amp;classIdioma=_es_es&amp;amp;idPage=1213455385201&amp;amp;pagename=OEPMSite%2FPage%2FtplListaDocumentos&amp;amp;numPagActual=1" title="http://www.oepm.es/cs/Satellite?c=Page&amp;amp;cid=1213455385201&amp;amp;classIdioma=_es_es&amp;amp;idPage=1213455385201&amp;amp;pagename=OEPMSite%2FPage%2FtplListaDocumentos&amp;amp;numPagActual=1"&gt;http://www.oepm.es/cs/Satellite?c=Page&amp;amp;cid=1213455385201&amp;amp;classIdioma=_es_es&amp;amp;idPage=1213455385201&amp;amp;pagename=OEPMSite%2FPage%2FtplListaDocumentos&amp;amp;numPagActual=1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_1E6EC197.jpg"&gt;&lt;img height="335" width="494" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image002_5F00_thumb_5F00_077FCA4E.jpg" alt="clip_image002" border="0" title="clip_image002" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image004_5F00_640325E8.jpg"&gt;&lt;img height="369" width="494" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/clip_5F00_image004_5F00_thumb_5F00_115495EC.jpg" alt="clip_image004" border="0" title="clip_image004" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;BSH Electrodom&amp;eacute;sticos Espa&amp;ntilde;a es la primera empresa industrial en solicitar patentes, con un total de 65 en 2008.&lt;/p&gt;
&lt;p&gt;Solo la Empresa IBM, la que m&amp;aacute;s patentes realizo en 2008 tiene 4000, observando estos gr&amp;aacute;ficos no me estra&amp;ntilde;a que nos encontremos en la situaci&amp;oacute;n actual, lo extra&amp;ntilde;o es que no hayamos llegado antes.&lt;/p&gt;
&lt;p&gt;Una cosa esta clara, Espa&amp;ntilde;a tiene mucho camino que recorrer y actualmente estamos a la cola de la mayor parte de pa&amp;iacute;ses desarrollados, debido a que las pol&amp;iacute;ticas de formaci&amp;oacute;n y de I+D+I desde el gobierno y las empresas han sido desastrosas.&lt;/p&gt;
&lt;p&gt;En estos tiempos que corren y creo que en un futuro cercano si no somos capaces de innovar, nunca llegaremos a tener &amp;eacute;xito y tarde o temprano fracasaremos, el miedo al cambio, el riesgo de invertir en nuevas ideas nos impiden innovar, hay que enfrentarse a estos miedos para poder llevar a cabo nuevas ideas, la mayor parte seguro que fracasaran, pero con que tan solo una llegue a buen t&amp;eacute;rmino merecer&amp;aacute; la pena.&lt;/p&gt;
&lt;p&gt;Creo que e&lt;b&gt;l fracaso conduce al &amp;eacute;xito&lt;/b&gt;, hace muchos a&amp;ntilde;os que le&amp;iacute;a un art&amp;iacute;culo del &lt;cite&gt;&lt;a href="http://www.newsweek.com/"&gt;Newsweek&lt;/a&gt; &lt;/cite&gt;que dec&amp;iacute;a que los empresarios de EEUU prefer&amp;iacute;an contratar a alguien que hubiera establecido tres empresas y hubiera fracasado que a un candidato que tuviese un Curriculum excelente.&lt;/p&gt;
&lt;p&gt;I&lt;b&gt;nnovar&lt;/b&gt; es hacer cosas diferentes, arriesgarse, no temer a fracasar, cuestionarse que aquello que funciona hoy, no lo har&amp;aacute; ma&amp;ntilde;ana o que siempre se puede mejorar, y como dec&amp;iacute;a Albert Einstein, si quieres cambiar algo no hagas siempre lo mismo&amp;hellip;&lt;/p&gt;
&lt;p&gt;&amp;iquest;Qu&amp;eacute; opin&amp;aacute;is?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=155806" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Innovaci_26002300_243_3B00_n/default.aspx">Innovaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Creatividad/default.aspx">Creatividad</category></item><item><title>Sobre el porqué utilizar metologías Agiles (Scrum) no es una moda...</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/07/14/sobre-el-porqu-233-utilizar-metolog-237-as-agiles-scrum-no-es-una-moda.aspx</link><pubDate>Tue, 14 Jul 2009 12:54:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:152363</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=152363</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=152363</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/07/14/sobre-el-porqu-233-utilizar-metolog-237-as-agiles-scrum-no-es-una-moda.aspx#comments</comments><description>&lt;p&gt;Escrib&amp;iacute;a el otro d&amp;iacute;a &lt;a href="http://geeks.ms/members/ddaz/default.aspx"&gt;David Arrollo (Ddaz)&lt;/a&gt; sobre si las metodolog&amp;iacute;as agiles, en concreto &lt;a href="http://geeks.ms/blogs/ddaz/archive/2009/06/24/sobre-el-por-que-creo-que-si-es-una-moda-esto-de-scrum-la-aguilidad-etc-respuesta-al-post-de-jersson.aspx"&gt;Scrum estaban de moda&lt;/a&gt;, me he animado a realizar este post para plasmar mi opini&amp;oacute;n sobre este tema.&lt;/p&gt;
&lt;p&gt;Como sab&amp;eacute;is las metodolog&amp;iacute;as &amp;aacute;giles evolucionaron sobre el a&amp;ntilde;o 1990 en respuesta a los m&amp;eacute;todos estructurados y estrictos extra&amp;iacute;dos de los modelos de desarrollo en cascada, aunque sus principios se establecen en el a&amp;ntilde;o 1986, no es hasta hace unos pocos a&amp;ntilde;os que se empieza a adoptar por multitud de empresas.&lt;/p&gt;
&lt;p&gt;Pienso que la adopci&amp;oacute;n masiva de metodolog&amp;iacute;as en el &amp;aacute;rea del desarrollo de software no es una moda tal y como comenta Fran en su blog, creo que cada vez mas empresas est&amp;aacute;n adoptando estos m&amp;eacute;todos de trabajo con el &amp;uacute;nico fin de mejorar su gesti&amp;oacute;n optimizando sus procesos para intentar lograr ser m&amp;aacute;s competitivos. Hasta hace relativamente poco&amp;nbsp;a la mayoria de empresas&amp;nbsp; todo esto les daba igual, sobre todo debido a la bonanza econ&amp;oacute;mica, pero los mercados, cada vez m&amp;aacute;s dif&amp;iacute;ciles y competitivos, y&amp;nbsp;la crisis actual&amp;nbsp;estan provocando que algunas entidades se centren en la b&amp;uacute;squeda del ahorro de costes y la mejora de la rentabilidad y poco a poco estas empresas se est&amp;aacute;n dando cuenta de que mejorar su gesti&amp;oacute;n interna es un aspecto cada vez mas importante, que puede llegar a marcar la diferencia, una ahorro de tan solo un 10-20 % puede hacer que la empresa sea competitiva o no.&lt;/p&gt;
&lt;p&gt;No hace muchos a&amp;ntilde;os el conocimiento de los procesos en las empresas era aglutinado por unos pocos, algunas se han comenzado a dar cuenta de que el verdadero valor recae en todas las personas que la conforman y que en la mayor parte de los casos son los operarios de las maquinas, los t&amp;eacute;cnicos cualificados y personas cercanas a los procesos los que m&amp;aacute;s saben del trabajo que est&amp;aacute;n realizando y consecuentemente los que conocen mejor como poder mejorarlo. Esta situaci&amp;oacute;n est&amp;aacute; provocando que las empresas empiecen a contar con la opini&amp;oacute;n de estas personas que antes eran meros ejecutores de los procesos para formar parte activa en la toma de decisiones.&lt;/p&gt;
&lt;p&gt;Algunas metolog&amp;iacute;as de trabajo, en este caso &amp;quot;Scrum&amp;quot;, ya que es la mencionado por Fran, explota precisamente estas ideas, basan su gesti&amp;oacute;n en la creencia de que su valor esta en las personas que conforman los equipos de trabajo tal y como comento en el &lt;a href="http://geeks.ms/blogs/jirigoyen/archive/2008/12/03/scrum-el-valor-esta-en-las-personas.aspx"&gt;post&lt;/a&gt; y la reducci&amp;oacute;n de la burocracia apoyada en la simplicidad.&lt;/p&gt;
&lt;p&gt;Pero esto no es nada nuevo, en los sistemas Lean, los equipos de mejora continua, trabajan con la misma idea que la mayor parte de las metolog&amp;iacute;as agiles, intentan eliminar la burocracia y optimizar los procesos en base a sus objetivos m&amp;aacute;s cercanos ayudados por las personas que realmente los conocen en profundidad.&lt;/p&gt;
&lt;p&gt;Algunas empresas de desarrollo de software est&amp;aacute;n comenzando a adoptar una metodolog&amp;iacute;a por necesidad comercial, porque para sus clientes es un requisito, muchos organismos oficiales est&amp;aacute;n comenzando a demandar la adopci&amp;oacute;n de metodolog&amp;iacute;as de trabajo cuando contratan un desarrollo, pero esto no es por moda, si no por necesidad, por la necesidad de evitar errores cometidos en el pasado, con aplicaciones que han sido un autentico fracaso, que han costado autenticas barbaridades, que han pasado de una empresa a otra y nunca han funcionado, estos errores y fracasos est&amp;aacute;n haciendo que muchos de estos organismos hartos ya de &amp;quot;tirar&amp;quot; el dinero en inform&amp;aacute;tica empiecen a exigir la adopci&amp;oacute;n de mejores sistemas de trabajo que les aseguren la viabilidad de sus proyectos.&lt;/p&gt;
&lt;p&gt;Otras entidades realizan la adopci&amp;oacute;n simplemente, porque obtener un certificado en una determinada metodolog&amp;iacute;a les har&amp;aacute; distinguirse de sus competidores. En este &amp;uacute;ltimo caso lo comparo con la ISO 9001, conozco varias empresas que &amp;uacute;nicamente disponen de este certificado &amp;uacute;nicamente por una raz&amp;oacute;n comercial o porque alguno de sus clientes se lo exige, que lejos de hacerles mejorar tan solo les aporta burocracia y que al final desgraciadamente certificarse se convierte en una cuesti&amp;oacute;n de dinero, con dinero se puede contratar m&amp;aacute;s personal para gestionar todos los requisitos, se puede invitar a comer a buen restaurante al responsable de la certificaci&amp;oacute;n e incluso en algunos casos se puede llegar a &amp;quot;comprar&amp;quot; la certificaci&amp;oacute;n, he visto empresas con la ISO 9001, que ni siquiera son capaces de gestionar el stock de su almac&amp;eacute;n o encontrar un pedido en sus ficheros , desgraciadamente esto ocurre con multitud de empresas y hace que al final el valor de estas &amp;quot;certificaciones&amp;quot; quede en entredicho. Tambi&amp;eacute;n he visto algunas empresas que le han sacado valor a este tipo de certificaciones, con ellas han aprendido a gestionar de forma m&amp;aacute;s adecuada sus recursos. En cualquier caso con certificaci&amp;oacute;n o no, todas tienen una raz&amp;oacute;n para su adopci&amp;oacute;n, si bien es cierto que la mayoria lo &amp;uacute;nico que buscan es un t&amp;iacute;tulo que avale lo bien que trabajan.&lt;/p&gt;
&lt;p&gt;En cambio otras ven en la adopci&amp;oacute;n de las metodolog&amp;iacute;as de trabajo una forma de llegar a ser mas &amp;quot;competitivos&amp;quot;, mejorando su gesti&amp;oacute;n interna y evitando cometer errores. En el &amp;aacute;rea del desarrollo de software venimos arrastrando desde hace mucho tiempo una serie de problemas que adem&amp;aacute;s de ir minando un mercado de clientes cada vez mas descontentos, hacia que el coste de los desarrollos de software aumentase de forma exponencial,&amp;nbsp;en muchos casos los proyectos se convert&amp;iacute;an en trabajos de dudosa rentabilidad y en otros, eran los clientes los que deb&amp;iacute;an asumir los costes derivados de su mala planificaci&amp;oacute;n. Algunos de los problemas m&amp;aacute;s habituales vienen derivados de estimaciones err&amp;oacute;neas, problemas de trabajo en equipo, relaciones con los clientes, gesti&amp;oacute;n de errores, gesti&amp;oacute;n de versiones, cambios de contexto, etc.&lt;/p&gt;
&lt;p&gt;Las metodolog&amp;iacute;as &amp;aacute;giles nacen para dar soluci&amp;oacute;n a todos estos problemas, se conforman como una necesidad para todos aquellos que desarrollamos software, marcan las pautas y las reglas necesarias para poder minimizar todos estos problemas. No quiere decir que se&amp;aacute;n la soluci&amp;oacute;n mas adecuada, ser&amp;aacute;n mejores o peores en base a las necesidades, capacidad y funcionamiento de cada empresa, y estar&amp;aacute; en su mano sacarles verdadero partido.&lt;/p&gt;
&lt;p&gt;Scrum se conforma como una metolog&amp;iacute;a sencilla de aprender, ofrece gran valor a&amp;ntilde;adido sin demasiado esfuerzo, eliminando la burocracia y centr&amp;aacute;ndose en la productividad a trav&amp;eacute;s de iteracciones cortas, el valor del equipo, la gesti&amp;oacute;n de las estimaciones y la relaci&amp;oacute;n con el cliente, hacen de Scrum una metrolog&amp;iacute;a facil que puede resumirse en una hoja y que es simple de adoptar si se cree en ella tal y como explica Jorge Serrano en &lt;a href="http://geeks.ms/blogs/jorge/archive/2007/05/09/explicando-scrum-a-mi-abuela.aspx"&gt;Explicando scrum a mi abuela&lt;/a&gt; o Rodrigo en &lt;a href="http://geeks.ms/blogs/rcorral/archive/2006/10/15/Por-qu_E900_-me-gusta-Scrum.aspx"&gt;Porque me gusta Scrum&lt;/a&gt;, para hacerlo, no es necesario ning&amp;uacute;n tipo de certificaci&amp;oacute;n, cualquiera puede aplicar Scrum, los requisitos son sencillos y las reglas, no demasiadas, es por ello que Scrum es una metodolog&amp;iacute;a que se centra en la mejora continua y que permite gestionar varios proyectos sin una burocracia y costes excesivos. Por estas razones y no por otras, creo que Scrum se est&amp;aacute; empezando a utilizar de forma masiva, aunque todav&amp;iacute;a son muy pocos los que la sacan partido de verdad.&lt;/p&gt;
&lt;p&gt;Por otra parte las nuevas tendencias y formas de trabajar se est&amp;aacute;n empezando a trasladar a muchos sectores industriales y laborales, no solamente a la inform&amp;aacute;tica, en mi empresa, por ejemplo, estamos implantando un sistema LEAN MANUFACTURING, pero no por la moda de Toyota, que desde luego ha influido enormemente en su adopci&amp;oacute;n (de hecho actualmente es el primer fabricante de autom&amp;oacute;viles del mundo), &lt;i&gt;&amp;#39;por algo ser&amp;aacute;&amp;#39;&lt;/i&gt;, si no en la b&amp;uacute;squeda de mejorar nuestro sistema de trabajo y ahorrar costes, en resumen hacer que la empresa sea m&amp;aacute;s competitiva y que tiene muchas similitudes con las metodolog&amp;iacute;as de trabajo que utilizamos en desarrollo, de hecho se utilizo como base de algunas. Al final todos buscamos lo mismo, mejorar la productividad, ahorrar costes, ser m&amp;aacute;s competitivos, mejorar nuestra relaciones laborales con nuestros clientes y el trabajo en equipo, hacer entender a aquellos que nos rodean que el trabajo que realizamos es complejo y dif&amp;iacute;cil y que cada vez es m&amp;aacute;s importante mejorar nuestra gesti&amp;oacute;n de proyectos y evitar muchos de los errores que venimos cometiendo desde hace a&amp;ntilde;os. Que utilicemos Scrum o cualquier otra metolog&amp;iacute;a que nos permita realizar esto es indiferente, la utilizaci&amp;oacute;n de una metolog&amp;iacute;as no garantiza el &amp;eacute;xito del proyecto, tan solo nos marca las pautas para evitar errores e intentar llegar a ser m&amp;aacute;s competitivos.&lt;/p&gt;
&lt;p&gt;Las metodolog&amp;iacute;as de trabajo proponen soluciones para resolver problemas comunes, es algo as&amp;iacute; como la aplicaci&amp;oacute;n de patrones de dise&amp;ntilde;o, &amp;iquest; porque no utilizar una soluci&amp;oacute;n ya probada para resolver un problema similar?. Sin embargo cuando hablamos de diferentes metodolog&amp;iacute;as, parece que se desencadene una guerra, si un fontanero tiene que instalar una tuber&amp;iacute;a de cobre la forma de hacerlo ser&amp;aacute; en base a los elementos y el entorno que tiene delante, en cambio si la tuber&amp;iacute;a es de otro material seguro que el m&amp;eacute;todo es diferente, con las metodolog&amp;iacute;as pasa lo mismo, habr&amp;aacute; metodolog&amp;iacute;as que se adapten mejor a un tipo de cliente y un entorno determinados y en otras que puedan suponer un autentico fracaso ya que las ideas de las metolog&amp;iacute;as deben ser coincidentes con la pol&amp;iacute;tica de la empresa, este es el factor que hace que muchas fracasen en su adopci&amp;oacute;n, &amp;quot;adoptamos algo en lo que no creemos&amp;quot;, pero no tienen porque ser unas mejores que otras, tan solo se adaptaran mejor en base a la forma de trabajar de las empresas, el entorno y otros factores. En todo caso, nacen para ofrecernos soluciones a los problemas con los que tratamos habitualmente, en los que aspectos tan importantes como la estimaci&amp;oacute;n, la colaboraci&amp;oacute;n y mejora del trabajo en equipo son factores fundamentales que nos permitir&amp;aacute;n adaptarnos y ser m&amp;aacute;s competitivos. &lt;/p&gt;
&lt;p&gt;Lo verdaderamente triste es que parece que en algunos pa&amp;iacute;ses estamos a la cola y que hablar de la adopci&amp;oacute;n de metolog&amp;iacute;as de trabajo provoca una gran controversia, creo que la mayor parte de las veces por desconocimiento total de lo que implica la adopci&amp;oacute;n de estos sistemas de trabajo.Sin embargo, algunas personas y empresas, quiz&amp;aacute;s las menos, se han empezado a dar cuenta de la importancia que tiene la adopci&amp;oacute;n de estos m&amp;eacute;todos de trabajo, que nos permiten optimizar y mejorar nuestro &amp;aacute;mbito laboral. Esto es fundamental para el &amp;aacute;rea del desarrollo de software ya que la complejidad de los sistemas y las diferentes tecnolog&amp;iacute;as conjuntamente con el progreso, hacen que el desarrollo de software sea una de las a&amp;eacute;reas que m&amp;aacute;s cambios sufren . Estoy seguro de que aquellas empresas que apuesten por mejorar sus sitemas de trabajo marcaran la diferencia, para las dem&amp;aacute;s creo que sus d&amp;iacute;as est&amp;aacute;n contados, apoyado por la ley de Darwin, &amp;#39;solo los que mejor se adapten al medio sobrevivir&amp;aacute;n&amp;#39;.&lt;/p&gt;
&lt;p&gt;En cualquier caso si quer&amp;eacute;is seguir el ejemplo de General Motors, aquellos que cre&amp;aacute;is que la crisis actual es un invento del gobierno o que las empresas van a seguir exactamente igual, independientemente de su forma de trabajar, no hag&amp;aacute;is nada, seguir trabajando igual. &lt;/p&gt;
&lt;p&gt;No digo que Scrum sea la soluci&amp;oacute;n a todos vuestros problemas, pero que es un buen punto de partida para acercarse a las metolog&amp;iacute;as agiles, robusta y relativamente facil de adoptar frente a otras. Si no us&amp;aacute;is ninguna, har&amp;aacute; que en poco tiempo no pod&amp;iacute;as vivir sin ella, as&amp;iacute; que animaros, esto no es una moda, es una necesidad para todos aquellos que queremos mejorar nuestra forma de trabajar.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=152363" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Metolog_26002300_237_3B00_as+_26002300_193_3B00_giles/default.aspx">Metolog&amp;#237;as &amp;#193;giles</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Scrum/default.aspx">Scrum</category></item><item><title>Asta lax pelotax de lox talivanes ortografikós</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/06/24/asta-lax-pelotax-de-lox-talivanes-ortografik-243-s.aspx</link><pubDate>Wed, 24 Jun 2009 21:28:53 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:151188</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>22</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=151188</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=151188</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/06/24/asta-lax-pelotax-de-lox-talivanes-ortografik-243-s.aspx#comments</comments><description>&lt;p&gt;No púedo entender komo ay jente ke tenga komo unika finalidad en esta bida kritikar ha los démas, sin una pizka de edukakíon y kon el úniko fin de tokar las pelotas, akí no benimos a kritikar, si no a kompartir konocimientos y alludar a los demas, si kereis que algien corriga hun testo con faltas, tan solo deveis decirlo con edukación, si no kompraros un livro, ha ser posivle el Kuijote en berxión horijinal.&lt;/p&gt;  &lt;p&gt;Komo xois tan listos aber si hempezais a heskribir algo y kompartis un poko de buestros koñocimientos, por ke todabía no e bisto a ninguno de bosotros eskribir hun post.&lt;/p&gt;  &lt;p&gt;A ber si empezamos a ser un poko mas konstruktibos kon los komentarios ke dejáis, la jente ke eskribe ace hun gran hesfuerzo y encima no acéis más ke tokar los kojones, no hentiendo los komentarios despektibos kon el úniko fin de desprestijiar a los ke eskriben akí, y komo tengo mukhos años y húltimamente no axumo mui vien las krítikas, a todos akeyos ke kritiken de forma despektiba hel travajo de los démas sín hún mínimo de heducación, solo hos kiero decir una kosa:&lt;/p&gt;  &lt;p&gt;ke hos den… &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=151188" width="1" height="1"&gt;</description></item><item><title>Windows Presentation Foundation. El final de Windows Forms…</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/06/17/windows-presentation-foundati-243-n-el-final-de-windows-forms.aspx</link><pubDate>Tue, 16 Jun 2009 22:56:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:150605</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=150605</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=150605</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/06/17/windows-presentation-foundati-243-n-el-final-de-windows-forms.aspx#comments</comments><description>&lt;p&gt;&amp;Uacute;ltimamente cada vez leo m&amp;aacute;s art&amp;iacute;culos que hablan sobre las ventajas de construir aplicaciones en WPF frente a la utilizaci&amp;oacute;n de Windows Forms, para aquellos que no lo conozcan, WPF es una tecnolog&amp;iacute;a que nos permite aprovechar al m&amp;aacute;ximo las caracter&amp;iacute;sticas gr&amp;aacute;ficas de nuestros equipos ofreciendo interfaces m&amp;aacute;s ricas de las que estamos acostumbrados. El objetivo de Windows Presentation Foundation es proporcionar avances en el entorno de Windows que permitan crear interfaces que incorporen documentos, componentes multimedia, gr&amp;aacute;ficos bidimensionales y tridimensionales, animaciones, caracter&amp;iacute;sticas tipo web, etc.&lt;/p&gt;
&lt;p&gt;Sobre la afirmaci&amp;oacute;n de que WPF marcar&amp;aacute; el final de Windows Forms, me parece arriesgada, aunque la evoluci&amp;oacute;n que est&amp;aacute; teniendo esta tecnolog&amp;iacute;a frente a Windows Forms no solamente desde Microsoft sino de la mayor parte de empresas de controles de terceros, me hace pensar hasta que punto es cierta esta afirmaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;En los &amp;uacute;ltimos a&amp;ntilde;os Microsoft viene acostumbrado a sacar nuevas tecnolog&amp;iacute;as casi por arte de magia y a relegar otras de la misma forma, lo cierto es que el cambio no es tan f&amp;aacute;cil como se pueda pensar, la adopci&amp;oacute;n de una tecnolog&amp;iacute;a como WPF, cambia por completo la forma habitual que ten&amp;iacute;amos para desarrollar aplicaciones Windows Forms. Los dise&amp;ntilde;adores gr&amp;aacute;ficos pasan a formar parte casi indispensable de los equipos de desarrollo si queremos sacarle todo el partido a esta tecnologia, si bien es cierto que la mayor parte de empresas dedicadas a desarrollar controles de terceros como Infragistics, DevExpress y otros est&amp;aacute;n apostando seriamente por esta tecnologia&amp;nbsp; con la inclusi&amp;oacute;n de Skins y controles que nos facilitaran mucho esta labor.&lt;/p&gt;
&lt;p&gt;En mi opini&amp;oacute;n son muy pocos los sistemas de gesti&amp;oacute;n que requieran hacer un uso intensivo de la interface gr&amp;aacute;fica, sin embargo, en algunos &amp;aacute;mbitos como cient&amp;iacute;fico o el m&amp;eacute;dico, las capacidades 3D y las animaciones permiten obtener informaci&amp;oacute;n de forma m&amp;aacute;s eficaz. Tambi&amp;eacute;n es cierto que la mayor parte de los sistemas de gesti&amp;oacute;n actuales suelen tener carencias precisamente en este apartado.&lt;/p&gt;
&lt;p&gt;Glenn Block de &lt;a href="http://www.developersdex.com/"&gt;Microsoft&lt;/a&gt; afirma que WPF es de largo la soluci&amp;oacute;n recomendada para el desarrollo de aplicaciones de l&amp;iacute;nea de negocio para un futuro inmediato. &lt;/p&gt;
&lt;p&gt;Algunas ventajas de WPF son las siguientes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Estilo potente y estructurado. &lt;/li&gt;
&lt;li&gt;Facilidad para crear estilos y aspectos. &lt;/li&gt;
&lt;li&gt;Soporta Windows Forms. &lt;/li&gt;
&lt;li&gt;Es el futuro para el desarrollo de aplicaciones de Vista. &lt;/li&gt;
&lt;li&gt;Tiene capacidad de reutilizaci&amp;oacute;n del c&amp;oacute;digo existente. &lt;/li&gt;
&lt;li&gt;Databinding avanzado, que permite enlazar datos con cualquier control. &lt;/li&gt;
&lt;li&gt;Programaci&amp;oacute;n declarativa vs procedural. &lt;/li&gt;
&lt;li&gt;Capacidades avanzadas para la Web. (WPF/E)&lt;/li&gt;
&lt;li&gt;Apuesta clara de Microsoft para su implantaci&amp;oacute;n.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Desventajas&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En muchas ocasiones vamos a necesitar el trabajo de dise&amp;ntilde;adores gr&amp;aacute;ficos para beneficiarnos del potencial de WPF, l&amp;oacute;gicamente este ser&amp;aacute; un coste que debemos repercutir a nuestros clientes. &lt;/li&gt;
&lt;li&gt;Modificar c&amp;oacute;digo en AXML es un infierno o al menos para m&amp;iacute; es bastante complicado. &lt;/li&gt;
&lt;li&gt;Los requerimientos de los equipos en el apartado gr&amp;aacute;fico ser&amp;aacute;n mayores, deben soportar DirectX y disponer de una tarjeta gr&amp;aacute;fica con suficiente capacidad, sin embargo, estos son la mayor&amp;iacute;a de los pc&amp;acute;s de hoy en d&amp;iacute;a, aunque todav&amp;iacute;a existen muchos equipos, sobre todo port&amp;aacute;tiles que no soportan del todo estos requerimientos. &lt;/li&gt;
&lt;li&gt;Al tratarse de la primera versi&amp;oacute;n, tiene muchos aspectos en los que mejorar sobre todo en el apartado de los dise&amp;ntilde;adores de formularios y entorno gr&amp;aacute;ficos. De hecho se encuentra a&amp;uacute;n en fase de desarrollo. &lt;/li&gt;
&lt;li&gt;La curva de aprendizaje es alta.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;iquest; Debo migrar mi apliaci&amp;oacute;n a WPF ? &lt;/p&gt;
&lt;p&gt;No hace mucho tiempo que Miguel Jim&amp;eacute;nez solicit&amp;oacute; que le enviase algunos formularios de la aplicaci&amp;oacute;n actual que est&amp;aacute;bamos desarrollando para ver la posibilidad de realizar un proyecto paralelo de migraci&amp;oacute;n a WPF, l&amp;oacute;gicamente le envi&amp;eacute; algunos de los formularios m&amp;aacute;s grandes y complejos que ten&amp;iacute;amos, su respuesta fue: buff estas pantallas con tantos controles, pesta&amp;ntilde;as y funcionalidad para realizarlos con WPF, ser&amp;iacute;a un trabajo demasiado arduo, no se hasta que punto merecer&amp;aacute; la pena, tendr&amp;iacute;amos que dividir algunos para integrarlos en WPF, esto me hace pensar, si WPF est&amp;aacute; lo suficientemente maduro para abordar sistemas de gesti&amp;oacute;n complejos y si realmente merece la pena realizar este cambio sin una necesidad comercial seria. Creo que existen muchos desarrolladores migrando sus aplicaciones a WPF, sin una raz&amp;oacute;n que justifique la adopci&amp;oacute;n de esta nueva tecnolog&amp;iacute;a, todav&amp;iacute;a son pocos los entornos de gesti&amp;oacute;n empresarial que necesiten verdaderamente un cambio de arquitectura y que son incapaces de articular una necesidad comercial. &lt;/p&gt;
&lt;p&gt;Lo cierto es que algunas de las interfaces que he probado son verdaderamente impresionantes, no solo en cuando a mejora del interface gr&amp;aacute;fico, la velocidad de refresco y la interacci&amp;oacute;n con el usuario mejoran notablemente. Como ejemplo os dejo un par de pantallas de los controles que usamos.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_30B9E412.png"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_52B21A0B.png" alt="image" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" height="358" width="522" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_4C5B1DB0.png"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_2AEB5247.png" alt="image" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" height="358" width="522" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_7230826C.png"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_49A17A8B.png" alt="image" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" height="395" width="524" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;iquest; Cuanto apoyo le queda a Windows Forms ?, he le&amp;iacute;do en alguna parte que Microsoft solo est&amp;aacute; apostando por WPF ahora y manteniendo Windows Forms, si esto es cierto, WinForms esta condenado a desaparecer y deberemos centrarnos poco a poco en la adopci&amp;oacute;n de WPF, por otra parte el n&amp;uacute;mero de aplicaciones existentes hoy en d&amp;iacute;a, har&amp;aacute; que el soporte de WinForms persista durante mucho tiempo.&lt;/p&gt;
&lt;p&gt;En mi opini&amp;oacute;n WPF es una nueva tecnolog&amp;iacute;a que se est&amp;aacute; asentando en estos momentos y como tal, no carente de problemas. Su curva de aprendizaje para aquellos que venimos de Winforms es alta. Quiz&amp;aacute;s el verdadero reto no este en aprender como usar esta nueva tecnolog&amp;iacute;a, sino en pensar c&amp;oacute;mo, a trav&amp;eacute;s de ella, podemos enriquecer las aplicaciones para alcanzar determinados objetivos, como mejorar la productividad, mejorar la interacci&amp;oacute;n con el usuario, aumentar la satisfacci&amp;oacute;n, mejorar el rendimiento, etc. No debemos olvidar que la adopci&amp;oacute;n de WPF, tendra un coste muy alto si tenemos que incorporar dise&amp;ntilde;adores gr&amp;aacute;ficos a nuestros equipos de desarrollo. En cualquier caso parece que Microsoft ha realizado una apuesta clara por la utilizaci&amp;oacute;n de WPF, su adopci&amp;oacute;n en nuevas herramientas como Visual Studio 2010 y el nuevo dise&amp;ntilde;ador de WorkFlow as&amp;iacute; lo demuestran y que adem&amp;aacute;s de confirmarse, ya habria abandonado la mejora de Winforms, con lo que de una forma u otra estar&amp;iacute;amos abocados a utilizarla tarde o temprando.&lt;/p&gt;
&lt;p&gt;Por otra parte me quedan varias preguntas sin contestar que creo que son comunes a las de muchos desarrolladores y que me gustar&amp;iacute;a con vuestra ayuda resolver:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;iquest; Deberiamos comenzar a estudiar a fondo WPF, para la adopci&amp;oacute;n de esta tecnolog&amp;iacute;a en un futuro cercano ?&lt;/p&gt;
&lt;p&gt;Si tuviera&amp;iacute;s que realizar un nuevo proyecto similar a los anteriores desarrollados en Windows Forms, &amp;iquest; utilizar&amp;iacute;as WPF o esperar&amp;iacute;as a nuevas versiones ?&lt;/p&gt;
&lt;p&gt;&amp;iquest; Sera WPF el sustituto definitivo de Windows Forms o tan solo una nueva tecnolog&amp;iacute;a para realizar programas diferentes ?&lt;/p&gt;
&lt;p&gt;&amp;iquest; Sera WPF una tecnolog&amp;iacute;a m&amp;aacute;s, que quizas en poco tiempo se vea relegada por otras como Silverlight o que debido a su alta curva de aprendizaje o sus costes no lograra asentarse lo suficiente como para convertirse en el sustituto de Windows Forms ?&lt;/p&gt;
&lt;p&gt;&amp;iquest; Esta lista esta tecnologia para abordar desarrollos similares a los que venimos realizando en Windows Forms ? &lt;/p&gt;
&lt;p&gt;&amp;iquest; Si no tenemos ni idea sobre dise&amp;ntilde;o gr&amp;aacute;fico o nuestro equipo no puede disponer de dise&amp;ntilde;adores, podremos sacarle partido a WPF ?, &amp;iquest; Tiene sentido utilizar WPF en estos casos ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En fin, quizas os dejo mas preguntas que respuestas, pero confio que entre todos conformemos una idea mas clara de lo que es WPF y de lo que va a suponer esta tecnolog&amp;iacute;a en los pr&amp;oacute;ximos a&amp;ntilde;os.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pd. Y pensar que todo esto comenzo con CSI&amp;hellip;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=150605" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Manual de detección del Australopithecus</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/06/11/manual-de-detecci-243-n-del-australopithecus.aspx</link><pubDate>Wed, 10 Jun 2009 22:23:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:150305</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>18</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=150305</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=150305</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/06/11/manual-de-detecci-243-n-del-australopithecus.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_2171032B.png"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_44CD5BF6.png" alt="image" title="image" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" border="0" height="203" width="492" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Seg&amp;uacute;n la wikipedia, vivi&amp;oacute; aproximadamente hace 4 millones de a&amp;ntilde;os, al comienzo del Pleistoceno. Creerme todav&amp;iacute;a existe, yo sigo tropezando con alguno de ellos.&lt;/p&gt;
&lt;p&gt;En mis primeros a&amp;ntilde;os profesionales dedicados a la inform&amp;aacute;tica (digo profesionales no porque fuera un profesional, sino porque intentaba ganarme la vida con este trabajo), no s&amp;eacute; si debido a mi juventud o inexperiencia, me tropec&amp;eacute; con innumerables espec&amp;iacute;menes de este g&amp;eacute;nero, la mayor parte convertidos en &amp;ldquo;Empresarios de &amp;eacute;xito&amp;rdquo; con un nivel de formaci&amp;oacute;n y educaci&amp;oacute;n que no sobrepasaba al de los grandes simios.&lt;/p&gt;
&lt;p&gt;Recuerdo una an&amp;eacute;cdota en especial que me llam&amp;oacute; mucho la atenci&amp;oacute;n, todo comenz&amp;oacute; con una reuni&amp;oacute;n con un hom&amp;iacute;nido de esta especie (aunque yo entonces no me hab&amp;iacute;a percatado de nada, es m&amp;aacute;s, me parec&amp;iacute;a incre&amp;iacute;ble todo lo que contaba), despu&amp;eacute;s de haberlo escuchado hablar durante varias horas sobre la importancia que ten&amp;iacute;a la inform&amp;aacute;tica para ellos, la necesidad urgente de dotar a su Empresa de medios adecuados para su gesti&amp;oacute;n y escuchar frases como: &amp;ldquo;yo, me he hecho a m&amp;iacute; mismo&amp;rdquo;, &amp;ldquo;cuando dej&amp;eacute; la cueva, solo me lleve lo puesto&amp;rdquo;, &amp;ldquo;cazaba las aves con tiragomas y no con escopetas calibre 458 como ahora&amp;hellip;&amp;rdquo;, etc.&lt;/p&gt;
&lt;p&gt;Despu&amp;eacute;s de la reuni&amp;oacute;n, la entrega del presupuesto (&amp;ldquo;&amp;iquest;no s&amp;eacute; por qu&amp;eacute;?, si los inform&amp;aacute;ticos no tenemos derecho a cobrar por nuestro trabajo.&amp;rdquo;). Enseguida v&amp;iacute; como frunci&amp;oacute; el ce&amp;ntilde;o, me mir&amp;oacute; con cara de asombro y pocos amigos y me dijo: despu&amp;eacute;s de nuestra conversaci&amp;oacute;n no has entendido nada, (&amp;ldquo;claro, si yo vengo aqu&amp;iacute; a aprender, no a trabajar, gracias Dios por esta oportunidad&amp;hellip;&amp;rdquo;), me dijo: esto no es lo que esperaba de t&amp;iacute;, pensaba que eras un tipo inteligente, este proyecto tiene valor a&amp;ntilde;adido, si realizas el programa podr&amp;aacute;s vend&amp;eacute;rselo a todas las empresas del sector en las que estoy muy bien considerado, tienes que mirar esto con &amp;quot;perspectiva&amp;quot;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;iquest;Pero como podeis cobrar tanto?, joder vosotros los inform&amp;aacute;ticos estais hechos de otra pasta y mirando a la secretaria le comento: &amp;iexcl;mira!, estos &amp;ldquo;ingenieros&amp;rdquo; que acaban de salir de la facultad y no saben hacer la &amp;quot;o&amp;quot; con un canuto, quieren cobrarnos hasta por respirar&amp;hellip;&lt;/p&gt;
&lt;p&gt;Incauto, trate de explicarle las razones del coste del proyecto, y que valorar las 300 horas de trabajo por 4 gallinas, media docena de buitres leonados, un cr&amp;aacute;neo de mapache y un cuerno de alce, no era ni con mucho un gran presupuesto, pero claro no ten&amp;iacute;a &amp;ldquo;perspectiva&amp;quot;, finalmente dijo: bueno ya te llamaremos&amp;hellip; Me fu&amp;iacute; a casa, pensando: &amp;ldquo;joder me habr&amp;eacute; pasado, quiz&amp;aacute;s tuviese raz&amp;oacute;n, tendr&amp;iacute;a que haberle aceptado solamente 1 cabra y el cuerno de alce, al fin y al cabo despu&amp;eacute;s podr&amp;iacute;a comercializarlo en otras aldeas&amp;hellip;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Paso bastante tiempo y el &amp;ldquo;eslab&amp;oacute;n perdido&amp;rdquo; vuelve a llamar y me dice: &amp;iquest;te acuerdas de m&amp;iacute;?, pues nada, que me he decido por fin y voy a contratar tus servicios, y vuelta a otra reuni&amp;oacute;n interminable en la que aguanto estoicamente sus logros y conquistas, ahora la necesidad de tener un sistema inform&amp;aacute;tico es imperiosa, ya que cometi&amp;oacute; el error de &amp;ldquo;contratar&amp;rdquo; a un amigo del primo del t&amp;iacute;o de la novia de su excu&amp;ntilde;ado que hab&amp;iacute;a trabajado en la caba&amp;ntilde;a del Tio Tom y en su tarjeta dec&amp;iacute;a &amp;ldquo;Product Manager&amp;rdquo;, adem&amp;aacute;s, era campe&amp;oacute;n del mundo en tiro con arco. El desgraciado, sin motivo aparente le hab&amp;iacute;a dejado en la estacada. Seguimos hablando y comento: &amp;ldquo;bueno, pero, lo del presupuesto aquel, tendr&amp;iacute;amos que revisarlo&amp;hellip;&amp;rdquo;. Pens&amp;eacute;, (&amp;quot;desde luego, han pasado dos a&amp;ntilde;os y al menos hay que incrementarle el IPC&amp;quot;). Continu&amp;oacute;: pues hoy en d&amp;iacute;a las cosas no son como antes y bla, bla, bla. &lt;/p&gt;
&lt;p&gt;Como mi situaci&amp;oacute;n era complicada decid&amp;iacute; aceptar un generoso descuento, &amp;quot;solo cobrar&amp;iacute;a 1 cabra, las gallinas y el cuerno de alce, que les den a los co&amp;ntilde;o buitres leonados...&amp;quot;, y me puse manos a la obra, de lo malo, malo, al menos, aprender&amp;iacute;a muchas cosas sobre su negocio, ya tendr&amp;iacute;a tiempo de ganar mucho dinero cuando me convirtiera en un buen profesional&amp;hellip;, aprovechar&amp;iacute;a para aplicar alguna nueva tecnolog&amp;iacute;a con la que poder sacar mayor valor a&amp;ntilde;adido al software desarrollado y con suerte quiz&amp;aacute;s, podr&amp;iacute;a venderlo a otras tribus de la zona.&lt;/p&gt;
&lt;p&gt;Esa misma semana me comunica que las reuniones peri&amp;oacute;dicas semanales no iban a poder ser realizadas los lunes, ya que, debido a sus logros en la gesti&amp;oacute;n de la aldea le han hecho jefe de la tribu y tiene que dedicar todo su tiempo productivo a fabricar herramientas, palitos para &amp;quot;pescar&amp;quot; hormigas, tiras de corteza para cazar termitas, martillos para cascar nueces, ramitas para espantar moscas, etc. y que adem&amp;aacute;s el s&amp;aacute;bado tiene que ir al consejo tribal, as&amp;iacute; que solo podr&amp;iacute;a reunirse conmigo el domingo por la ma&amp;ntilde;ana, pues por la tarde tenia la fiesta &amp;quot;canival...&amp;quot;.&lt;/p&gt;
&lt;p&gt;Como ya hab&amp;iacute;a dedicado mucho tiempo al proyecto y&amp;nbsp;debido a mi complicada situaci&amp;oacute;n econ&amp;oacute;mica, decido aceptar y reunirme con &amp;eacute;l todos los domingos por la ma&amp;ntilde;ana para tratar de conocer en detalle los procesos m&amp;aacute;s complejos de su negocio, despu&amp;eacute;s de un par de sesiones domingueras en las que s&amp;oacute;lo me explica c&amp;oacute;mo ha llegado a convertirse en un &amp;ldquo;Empresario de &amp;eacute;xito&amp;rdquo;, me llama diciendo: &amp;ldquo;A partir de ahora no voy a poder atenderte, as&amp;iacute; que mejor trata de todos estos asuntos sin importancia con mi secretaria&amp;rdquo;, &amp;ldquo;&amp;iexcl;Dios! que alivio&amp;rdquo;, por fin voy a tratar con alguien que al menos tiene graduado escolar&amp;hellip; y adem&amp;aacute;s usa minifaldas&amp;hellip;. si, si, en la aldea del tipo este, todas las secretarias iban con minifaldas y ense&amp;ntilde;ando&amp;hellip; bueno mejor me callo, una de sus frases dec&amp;iacute;a: &amp;ldquo;hay que saber sacar verdadero partido de los recursos que disponemos&amp;hellip;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Despu&amp;eacute;s de un par de reuniones con su secretaria, &amp;eacute;sta me comenta que el tal Australopithecus, tiene un tinglado montado de miedo, no paga a nadie, ella lleva seis meses y tan s&amp;oacute;lo ha cobrado el primero y el t&amp;iacute;o se acaba de comprar una balsa supermirafiori, para navegar por el r&amp;iacute;o y visitar a una novia que tiene en la tribu ubicada 10 millas m&amp;aacute;s arriba y que adem&amp;aacute;s no rema, que le duele mucho la espalda y que tiene que venir tarzan con la chita y el elefante para remontarle por el r&amp;iacute;o. El sujeto intenta cada poco tiempo hacer la vida imposible a sus empleados para que muchos se tengan que ir, renunciando incluso a la indemnizaci&amp;oacute;n, y que el &amp;ldquo;inform&amp;aacute;tico&amp;rdquo; que hab&amp;iacute;a estado antes que yo, lo hab&amp;iacute;a dejado porque llevaba m&amp;aacute;s de un a&amp;ntilde;o trabajando y no le hab&amp;iacute;a pagado nada, que unicamente le hab&amp;iacute;a contratado porque exigia 2 buitres leonados menos que yo.&lt;/p&gt;
&lt;p&gt;Ante la situaci&amp;oacute;n, decido paralizar al proyecto hasta no cobrar al menos el trabajo realizado, cuando hablo con &amp;eacute;l para comentarle la situaci&amp;oacute;n, le empieza a salir espuma por la boca, los ojos se le hinchan y enrojecen y los colmillos le crecen 4 cm, tembloroso le digo que tiene que asumir la deuda del trabajo realizado, que no estoy dispuesto a continuar hasta haber cobrado al menos un par de gallinas y el put&amp;iacute;simo cuerno de alce que por supuesto ya formaban parte de mis deudas, responde que no est&amp;aacute; dispuesto a pagarme nada, ya que no ha recibido nada a cambio, es m&amp;aacute;s, que si alguien debe algo, ese soy yo, ya que me ha dedicado gran parte de su valioso tiempo y claro, este, era much&amp;iacute;simo m&amp;aacute;s costoso que el m&amp;iacute;o, ante la peligrosa situaci&amp;oacute;n que se fue agravando poco a poco, decido irme y darle un poco de tiempo para pensar con tranquilidad.&lt;/p&gt;
&lt;p&gt;Al cabo de unos meses y viendo que las gallinas y el cuerno de alce segu&amp;iacute;an sin aparecer, decido armarme de valor y acercarme un domingo por la ma&amp;ntilde;ana a la choza, a ver si pod&amp;iacute;amos solucionar la situaci&amp;oacute;n de alguna forma, cuando lleg&amp;oacute; al lugar, aparece una mujer, le pregunt&amp;oacute; por el sujeto y me dice que ella es su mujer y que este se ha fugado a la tribu del r&amp;iacute;o de arriba dej&amp;aacute;ndola&amp;nbsp;con sus dos hijos, que se ha llevado las dos vacas que ten&amp;iacute;an, para entreg&amp;aacute;rselas al Jefe de la otra tribu y hacerse con los servicios de un par de mujeres y que ha les ha dejado sus deudas y otros problemas, me ense&amp;ntilde;a lo que queda del negocio, los empleados hartos ya de la situaci&amp;oacute;n, hab&amp;iacute;an arramplado con todo y no hab&amp;iacute;an dejado t&amp;iacute;tere con cabeza, incluso la hab&amp;iacute;an amenazado si no aparec&amp;iacute;a pronto&amp;hellip;.&lt;/p&gt;
&lt;p&gt;No pens&amp;eacute;is que esta fue la &amp;uacute;nica vez que me han pasado situaciones similares, de hecho yo pensaba que jam&amp;aacute;s me podr&amp;iacute;a pasar algo parecido, pues este s&amp;oacute;lo fue el comienzo de varios casos que me ocurrieron posteriormente. As&amp;iacute; que he decidi&amp;oacute; redactar un peque&amp;ntilde;o manual para que pod&amp;aacute;is detectar este tipo de hom&amp;iacute;nidos tan perjudiciales para el hombre:&lt;/p&gt;
&lt;p&gt;1 &amp;ndash; El Australopithecus suele comerciar con cuerno de alce, no entiendo&amp;nbsp;como lo hacen, el alce es mucho m&amp;aacute;s inteligente que el&amp;nbsp;Australopithecus ...&lt;/p&gt;
&lt;p&gt;2 &amp;ndash; Suele despreciar a los sujetos de su misma especie, incluso a sus empleados y familiares cercanos, ten cuidado, lo mismo har&amp;aacute; contigo.&lt;/p&gt;
&lt;p&gt;3 &amp;ndash; Se siente el m&amp;aacute;s listo del mundo, es&amp;nbsp;el &amp;uacute;nico que sabe hacer fuego, los que le rodean no tienen ni *** idea de nada, ellos son los mejores.&lt;/p&gt;
&lt;p&gt;4 &amp;ndash; Si oyes frases similares, &amp;iexcl;cuidado!, se trata de la especie m&amp;aacute;s peligrosa:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Me he hecho a m&amp;iacute; mismo...&lt;/li&gt;
&lt;li&gt;Cuando me fu&amp;iacute; de la cueva s&amp;oacute;lo me lleve lo puesto.&lt;/li&gt;
&lt;li&gt;En mis tiempos cazaba los leones a mordiscos&amp;hellip; &lt;/li&gt;
&lt;li&gt;No tengo una empresa, tengo un grupo empresarial.... (El equivalente a una Choza y 4 pringaos distribuidos por la peninsula que no cobran hace 6 meses)&lt;/li&gt;
&lt;li&gt;El nombre de su tribu comienza por &amp;ldquo;Asociaci&amp;oacute;n de &amp;hellip;.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Nosotros somos pioneros en&amp;hellip;.&lt;/li&gt;
&lt;li&gt;El dinero no es importante, yo me fu&amp;iacute; sin nada y mira en lo que me he convertido...&lt;/li&gt;
&lt;li&gt;He construido yo solito este imperio&amp;hellip;&lt;/li&gt;
&lt;li&gt;Tienes que entender que &amp;eacute;sta, no es una empresa cualquiera&amp;hellip;&lt;/li&gt;
&lt;li&gt;Yo invente la rueda...&lt;/li&gt;
&lt;li&gt;Tu, no est&amp;aacute;s aqu&amp;iacute; para pensar...&lt;/li&gt;
&lt;li&gt;Si a un trabajador no le da tiempo a terminar su trabajo, es su deber continuar hasta finalizarlo...&lt;/li&gt;
&lt;li&gt;La formaci&amp;oacute;n no sirve de nada con estos mendrugos..., eso es para intelectuales... &lt;/li&gt;
&lt;li&gt;Si quieren estudiar que lo hagan en casa, que yo les pago por trabajar...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5 &amp;ndash; Los gestos son fundamentales, a veces, echan espuma por la boca, acostumbran a gritar de forma habitual, y si continuas sin entenderlos te atizan un garrotazo.&lt;/p&gt;
&lt;p&gt;6 &amp;ndash; Si sacan fajos de billetes y te dicen: &amp;iquest;cu&amp;aacute;nto necesitas?, c&amp;oacute;gelos r&amp;aacute;pido, suele ser un truco muy habitual. Los sacan y los introducen de nuevo en la billetera a la velocidad del rayo. Pero a ti te queda el mensaje subliminal, cuando te vas solo ves los billetes que te debe...&lt;/p&gt;
&lt;p&gt;7 &amp;ndash; Si quedan contigo el domingo, mucho cuidado, es de los que no van a misa..., adem&amp;aacute;s acostumbran a cazar ese dia.&lt;/p&gt;
&lt;p&gt;8 &amp;ndash; Si se compra una balsa supermirafiori, ojito, est&amp;aacute;s s&amp;oacute;lo se otorgan a los hom&amp;iacute;nidos m&amp;aacute;s peligrosos que militan en alg&amp;uacute;n partido pol&amp;iacute;tico.&lt;/p&gt;
&lt;p&gt;9 &amp;ndash; Hay una prueba que nunca falla, cuando hableis con &amp;eacute;l, decir la palabra &amp;ldquo;gratis&amp;rdquo;, si sus ojos empiezan a dar bandazos de un lado a otro y aparecen d&amp;oacute;lares en la cornea como a t&amp;iacute;o Gilito, es uno de ellos.&lt;/p&gt;
&lt;p&gt;10 &amp;ndash; Cuando le visitas suele hacerte esperar, tranquilo, est&amp;aacute; ocupado con otras cosas mucho m&amp;aacute;s importantes que ni con 20000 a&amp;ntilde;os de evoluci&amp;oacute;n llegariamos a entender.&lt;/p&gt;
&lt;p&gt;11 &amp;ndash; No le dan ninguna importancia al dinero, total ellos disponen de todo el necesario.&lt;/p&gt;
&lt;p&gt;12 &amp;ndash; Sus empleados los &amp;ldquo;adoran&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;13 - Son muy dif&amp;iacute;ciles de reconocer, ahora se depilan con laser y algunos no se parecen a las fotos de carnet de la parte superior.&lt;/p&gt;
&lt;p&gt;14 - Si te invita a la fiesta &amp;quot;canival&amp;quot; y te dice que vas a ser el protagonista, &amp;iexcl;ojito!...&lt;/p&gt;
&lt;p&gt;Si teneis la suerte de tropezaros con alg&amp;uacute;n especimen de este tipo, recordar, nosotros, los simples mortales estamos en este mundo para ayudarlos, nuestro trabajo y sacrificio no tienen ning&amp;uacute;n valor, con esta especie podemos aprender a hacer de todo, he visto inform&amp;aacute;ticos que lo mismo instalan una centralita de tel&amp;eacute;fono, te hacen una paella valenciana o cazan un b&amp;uacute;falo con arco y flechas, si no podeis ganar dinero y vuestros hijos tienen que ponerse a trabajar, pues nada, que dejen los estudios y se pongan, total estudiar no tiene ning&amp;uacute;n sentido, con garrote, mano dura y sin tener ni *** idea de inform&amp;aacute;tica se podr&amp;aacute;n ganar mucho mejor la vida tal y como demuestra esta especie.&lt;/p&gt;
&lt;p&gt;Un &amp;uacute;ltimo consejo, nunca comiences a trabajar bajo ning&amp;uacute;n concepto si al menos no te hace entrega de un peque&amp;ntilde;o porcentaje del coste del proyecto, 4 gallinas o una cabra suelen ser suficientes. Y recordar llevar siempre el garrote a mano, podeis acabar as&amp;iacute;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_6393AA07.png"&gt;&lt;img src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_3953D652.png" alt="image" title="image" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" border="0" height="173" width="538" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=150305" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Pleistoceno/default.aspx">Pleistoceno</category></item><item><title>Recursividad con Sql Server</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/05/22/recursividad-con-sql-server.aspx</link><pubDate>Fri, 22 May 2009 20:25:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:149113</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=149113</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=149113</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/05/22/recursividad-con-sql-server.aspx#comments</comments><description>&lt;p&gt;Una funci&amp;oacute;n muy interesante de Sql Server es la de poder seleccionar un conjunto de datos de forma recursiva de manera que podemos obtener una serie en estructura de arbol.&lt;/p&gt;
&lt;p&gt;Partimos de una tabla que tiene dos campos, llamados clave y padre, el campo clave se relaciona con el padre para formar la estructura en arbol. &lt;/p&gt;
&lt;p&gt;El siguiente procedimiento almacenado muestra un ejemplo de como conseguir esto: &lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;ALTER PROCEDURE [dbo].[Usuarios_seguridad_seleccionar]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;AS&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;BEGIN    &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    DECLARE @minClave &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    SELECT @minClave = MIN(Clave) FROM dbo.Usuarios_seguridad;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    WITH UsuariosAccesos AS&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    (&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        SELECT top 1 us1.Padre,us1.Clave,us1.Variable,us1.Modulo,us1.Contenido,us1.Acceso,us1.Imagen &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        FROM dbo.Usuarios_seguridad us1 &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        WHERE us1.Clave = @minClave&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        UNION ALL&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        SELECT top 100 percent us2.Padre,us2.Clave,us2.Variable,us2.Modulo,us2.Contenido,us2.Acceso,us2.Imagen &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        FROM dbo.Usuarios_seguridad us2 &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        INNER JOIN UsuariosAccesos AS us3 ON us3.Clave = us2.Padre  &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        WHERE us2.Clave &amp;lt;&amp;gt; @minClave &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    )&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    SELECT TOP 100 PERCENT ia.Padre,ia.Clave,ia.Variable,ia.Modulo,ia.Contenido,ia.Acceso,ia.Imagen &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    FROM UsuariosAccesos ia&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    ORDER BY padre, clave&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;END&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;GO&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
La clausula with debe contener un miembro delimitador, en este caso el formado por la&amp;nbsp; primera sentencia Sql que hace referencia al valor m&amp;iacute;nimo (Primer nodo) y el segundo miembro recursivo que hace referencia a la misma tabla definida el la clausula With. 
&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;El procedimiento almacenado calcula el valor m&amp;iacute;nimo del nodo con la clave mas baja, posteriormente va leyendo cada nodo relacionado de forma recursiva ya que en el inner join se relaciona con el conjunto de datos definido en la clausula WiTH, finalmente devuelve el conjunto de datos en un orden determinado, el resultado obtenido es el siguiente:&lt;/div&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_55B7687F.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_70242F0B.png" border="0" width="523" height="387" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;La consulta retorna los datos de forma similar a la estructura de arbol que posteriormente se carga en el tree.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_06B65786.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_2ACB8C48.png" border="0" width="527" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Para cargar los datos en el control, podiamos haberlo hecho sin recurrir a la recursividad en Sql Server y hacerlo directamente con el lenguaje de programaci&amp;oacute;n en el cliente, pero hay veces que puede ser mas interesante recurrir al servidor en lugar de hacerlo en el cliente, por ejemplo para buscar un dato determinado aprovechando las ventajas de las busquedas en el servidor y devolver su nodo, borrar todos los nodos relacionados o simplemente por descargar la tarea del lado del cliente.&lt;/p&gt;
&lt;p&gt;Si quereis mas informaci&amp;oacute;n sobre la clausula WITH que permite realizar este tipo de consultas podeis encontrala en &lt;a title="http://msdn.microsoft.com/en-us/library/ms175972.aspx" href="http://msdn.microsoft.com/en-us/library/ms175972.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms175972.aspx&lt;/a&gt; (Ingles) o &lt;a title="http://technet.microsoft.com/es-es/library/ms175972(SQL.90).aspx" href="http://technet.microsoft.com/es-es/library/ms175972(SQL.90).aspx"&gt;http://technet.microsoft.com/es-es/library/ms175972(SQL.90).aspx&lt;/a&gt; (Espa&amp;ntilde;ol).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=149113" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Sql+Server/default.aspx">Sql Server</category></item><item><title>Calidad de código</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/05/20/calidad-de-c-243-digo.aspx</link><pubDate>Wed, 20 May 2009 20:24:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:148984</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=148984</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=148984</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/05/20/calidad-de-c-243-digo.aspx#comments</comments><description>&lt;p&gt;La calidad de software engloba muchos y diferentes aspectos sobre el desarrollo de aplicaciones, que pasan desde la elecci&amp;oacute;n de una buena arquitectura, hasta utilizaci&amp;oacute;n de diferentes herramientas, la aplicaci&amp;oacute;n de diferentes t&amp;eacute;cnicas y metodolog&amp;iacute;as de trabajo. Creo que todav&amp;iacute;a hoy en d&amp;iacute;a, existe mucha gente reticente a apostar por la calidad de c&amp;oacute;digo, debido a que piensan que&amp;nbsp;su coste es mayor que su beneficio.&lt;/p&gt;
&lt;p&gt;Cuando empec&amp;eacute; a trabajar en equipo, surgieron una serie de problemas de dif&amp;iacute;cil soluci&amp;oacute;n, en seguida me di cuenta de que los programadores escribimos c&amp;oacute;digo de forma muy diferente que realiza las mismas cosas, generalmente algunos, los m&amp;aacute;s experimentados sol&amp;iacute;an redactar un c&amp;oacute;digo mas legible, mejor documentado, necesitaban menos l&amp;iacute;neas para llegar a la misma soluci&amp;oacute;n, ya que sus conocimientos eran mayores, esto originaba muchos problemas cuando tenian que modificar o entender el c&amp;oacute;digo de los dem&amp;aacute;s y es aqu&amp;iacute; cuando empec&amp;eacute; a interesarme por las reglas de estilo, fxcop y otras herramientas que de alguna forma nos permit&amp;iacute;an establecer reglas para que todos pudi&amp;eacute;ramos por decirlo del alguna forma &amp;ldquo;entendernos mejor&amp;rdquo;. Por otra parte en la depuraci&amp;oacute;n de las aplicaciones observe que era mucho menos costoso detectar y corregir un error en una fase temprana que hacerlo posteriormente.&lt;/p&gt;
&lt;p&gt;Para poder entender mejor el trabajo de los otros programadores comenzamos a aplicar algunas de estas reglas, desde normas de estilo, documentaci&amp;oacute;n, desarrollo de pruebas unitarias, aplicaci&amp;oacute;n de patrones de dise&amp;ntilde;o, normativas de base de datos y un largo etc. Esto empez&amp;oacute; a facilitarnos la compresi&amp;oacute;n y la modificaci&amp;oacute;n de programas, en poco tiempo empezamos a tener una visi&amp;oacute;n muy diferente del proyecto, nos aporto m&amp;aacute;s claridad y conocimiento del trabajo de los dem&amp;aacute;s y nos ayudo a detectar gran parte de errores en una fase temprana del desarrollo.&lt;/p&gt;
&lt;p&gt;Algunos de los beneficios m&amp;aacute;s importantes que observo son los siguientes:&lt;/p&gt;
&lt;p&gt;- La aplicaci&amp;oacute;n de patrones de dise&amp;ntilde;o suponen la soluci&amp;oacute;n m&amp;aacute;s adecuada para resolver un problema determinado. Esta ha sido elaborada y seleccionada en base al entendimiento y posibles soluciones propuestas y analizadas&amp;nbsp;por mucha gente. &lt;/p&gt;
&lt;p&gt;- La adopci&amp;oacute;n de herramientas como fxcop, stylecop, resharper, coderush, refactor y otras, permiten minimizar algunos errores en la fase de desarrollo adem&amp;aacute;s de obligar a cumplir ciertas reglas de calidad y estilo, que de no utilizar, provocan si el desarrollador no es un experto, a cometer errores de dif&amp;iacute;cil detecci&amp;oacute;n como fugas de memoria, aprovechamiento &amp;oacute;ptimo de los recursos, localizaci&amp;oacute;n de c&amp;oacute;digo no utilizado, y un largo etc. Por otra parte si todos las adoptan nos habituamos a escribir c&amp;oacute;digo de una manera similar, con lo que nos ser&amp;aacute; m&amp;aacute;s f&amp;aacute;cil comprender el trabajo de los dem&amp;aacute;s. De la informaci&amp;oacute;n de los errores que nos proporcionan aprendemos a programar mejor, liberando y utilizando recursos adecuadamente, con lo que nuestro conocimiento aumenta. Algunas de estas herramientas cuentan con utilidades para ayudarnos a escribir el c&amp;oacute;digo y refactorizar de una forma mucho m&amp;aacute;s r&amp;aacute;pida.&lt;/p&gt;
&lt;p&gt;- El uso de profiles nos permite detectar cuellos de botella y otros problemas que de otra forma serian pr&amp;aacute;cticamente imposible de conocer.&lt;/p&gt;
&lt;p&gt;- La utilizaci&amp;oacute;n de pruebas unitarias y otras t&amp;eacute;cnicas de testeo, nos permiten detectar errores en una fase temprana, si no lo hacemos a tiempo a veces puede implicar que tengamos que modificar m&amp;aacute;s de un m&amp;oacute;dulo relacionado con este, con lo que el coste se incrementa a&amp;uacute;n m&amp;aacute;s. Como dice la frase, &amp;ldquo;m&amp;aacute;s vale prevenir que curar&amp;rdquo;.La ventaja de contar con pruebas unitarias de un m&amp;oacute;dulo que no hemos desarrollado nosotros nos permite entender mejor el comportamiento del programa. La aplicaci&amp;oacute;n es m&amp;aacute;s f&amp;aacute;cil de modificar ya que si alguien altera el programa, por ejemplo cambiando el nombre de un campo de un procedimiento almacenado o alterando alguna funci&amp;oacute;n como el c&amp;aacute;lculo de totales de una factura, detectar&amp;iacute;amos el error mucho antes de ponerlo en producci&amp;oacute;n evitando mayores consecuencias.&lt;/p&gt;
&lt;p&gt;- Se disminuye la dependencia del equipo de desarrollo: Si el d&amp;iacute;a ma&amp;ntilde;ana alguno de los desarrolladores no est&amp;aacute; o la empresa de desarrollo cierra, ser&amp;aacute; mucho m&amp;aacute;s f&amp;aacute;cil encontrar a alguien que entienda el c&amp;oacute;digo que cumple unas determinadas reglas. Si cada miembro del equipo escribe software de forma diferente esto se hace practicamente imposible. Si otra persona o empresa externa cumple nuestros requisitos de calidad esto permite que pueda comprender y extender la aplicaci&amp;oacute;n m&amp;aacute;s f&amp;aacute;cilmente. &lt;/p&gt;
&lt;p&gt;La calidad de c&amp;oacute;digo no es opcional, de no aplicarla el coste de nuestros proyectos con seguridad ser&amp;aacute; mayor. &lt;/p&gt;
&lt;p&gt;Pero no todo es de color de rosa, utilizar estas herramientas requiere tiempo, formaci&amp;oacute;n y sobre todo constancia. Realizar pruebas unitarias adem&amp;aacute;s de ser costoso requiere mucha disciplina y un alto nivel de desarrollo, no solamente debemos preocuparnos de tener la m&amp;aacute;xima cobertura en nuestro c&amp;oacute;digo, si no que debemos intentar probar todos los extremos, valores nulos y otros factores que de no realizarse disminuyen los beneficios de estas. De igual forma aprender a utilizar profiles y otras herramientas llevan mucho tiempo en formaci&amp;oacute;n y desde luego tienen su coste. No debemos obsesionarnos con realizar pruebas unitarias y cumplir con el 85 % de cobertura en todo nuestro proyecto o cumplir a raja tabla todas las reglas que propone fxcop, resharper, coderush, utilizar reglas de estilo, realizar pruebas de carga, utilizar mock objects para crear independencia con nuestro entorno de datos, utilizar profiles para analizar hasta la m&amp;aacute;s m&amp;iacute;nima se&amp;ntilde;al de que algo va mal, etc, debemos comenzar poco a poco implantando alguna y habituarnos a utilizarla. Si hace&amp;iacute;s esto y dedicais un poco de tiempo en aprender a sacarles partido, os puedo asegurar que la mayor&amp;iacute;a se har&amp;aacute;n indispensables en vuestro trabajo.&lt;/p&gt;
&lt;p&gt;Recuerdo que la primera vez que pusimos en marcha fxcopy en uno de los proyectos aparecieron miles de warnings, os aseguro que fue un autentico co&amp;ntilde;azo eliminarlos, ya que lo aplicamos en una fase media del desarrollo, nos cost&amp;oacute; bastante tiempo poner la aplicaci&amp;oacute;n en orden, pero aprendimos un mot&amp;oacute;n de cosas sobre programaci&amp;oacute;n, algunas que nunca hubi&amp;eacute;ramos conocido si no llega a ser por este tipo de herramientas. Ahora no podemos vivir sin &amp;eacute;l y cuando vemos una aplicaci&amp;oacute;n que no lo utiliza en seguida nos damos cuenta de los errores que se cometen.&lt;/p&gt;
&lt;p&gt;Las ventajas de desarrollar c&amp;oacute;digo de calidad son innumerables, se facilita la detecci&amp;oacute;n precoz de errores y nos permite anticiparnos y corregirlos antes de poner el sistema en producci&amp;oacute;n evitando tener que rehacer gran parte de las aplicaciones. Estas herramientas nacen con el objetivo de permitirnos mejorar en nuestros desarrollos, no quiere decir que nuestra aplicaci&amp;oacute;n vaya a estar libre de fallos, pero si que ser&amp;aacute; mejor, que aprovechara mejor los recursos y por supuesto, que tendr&amp;aacute; menos errores, tendremos mayor seguridad a la hora de&amp;nbsp;modificar un programa y reglas de trabajo en equipo que de otra forma serian muy dif&amp;iacute;ciles de controla, se facilita la escritura de c&amp;oacute;digo y la detecci&amp;oacute;n visual de errores en tiempo de dise&amp;ntilde;o, ahorrando mucho tiempo a la hora de programar y depurar la aplicaci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;El esfuerzo que debemos realizar para desarrollar c&amp;oacute;digo de calidad es grande, pero marcara la diferencia y en poco tiempo nos permitir&amp;aacute; recuperar la inversi&amp;oacute;n con creces, as&amp;iacute; que animaros, merecer&amp;aacute; la pena.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=148984" width="1" height="1"&gt;</description></item><item><title>Acelera Visual Studio con Discos Solidos (SSD) y Tarjetas de Memoria</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/04/13/discos-ssd.aspx</link><pubDate>Mon, 13 Apr 2009 10:00:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:146657</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=146657</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=146657</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/04/13/discos-ssd.aspx#comments</comments><description>&lt;p&gt;Despu&amp;eacute;s de leer varios art&amp;iacute;culos sobre los &amp;uacute;ltimos modelos de discos SSD, y con el fin de acelerar mi trabajo con Visual Studio decid&amp;iacute; adquirir un disco SSD modelo &lt;a href="http://www.ocztechnology.com/products/flash_drives/ocz_core_series_v2_sata_ii_2_5-ssd"&gt;&lt;b&gt;OCZ Core Series V2 SATA II 2.5&amp;quot; SSD&lt;/b&gt;&lt;/a&gt; con 120 Gb,&amp;nbsp; las comparativas con los &amp;uacute;ltimos modelos presentados por Intel X25, dec&amp;iacute;an que incluso iban por delante en cuanto a rendimiento, su coste bastante inferior, de unos 340 &amp;euro; frente a los 650 &amp;euro; de un Intel.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Core_5F00_v2_5F00_back_5F00_b_5F00_2AD5E9ED.jpg"&gt;&lt;img height="199" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/Core_5F00_v2_5F00_back_5F00_b_5F00_thumb_5F00_2E938EBD.jpg" alt="Core_v2_back_b" border="0" title="Core_v2_back_b" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;La primera impresi&amp;oacute;n cuando lo tienes en las manos es lo poco que pesa, parece un trozo de pl&amp;aacute;stico. Despu&amp;eacute;s de clonar el equipo e instalar el disco duro, el rendimiento no parece mejorar, es mas en algunas operaciones incluso parece m&amp;aacute;s lento, consultando en los foros del fabricante, leo que hay que hacer varios ajustes relativos al cache, el servicio de indexado, desfragmentaci&amp;oacute;n y otros. Para los interesados dejo los ajustes aqu&amp;iacute; &lt;a href="http://www.ocztechnologyforum.com/forum/showthread.php?t=47212"&gt;http://www.ocztechnologyforum.com/forum/showthread.php?t=47212&lt;/a&gt;, que supongo haya que realizar en todos los discos SSD. Me pregunto si algunos ser&amp;aacute;n correctos, no lo tengo muy claro. &lt;/p&gt;
&lt;p&gt;Lo curioso es que despu&amp;eacute;s de hacerlo las b&amp;uacute;squedas de archivos son espectaculares, sin embargo el rendimiento general aparentemente sigue siendo muy bajo, los tiempos de compilaci&amp;oacute;n con Visual Studio son similares a la utilizaci&amp;oacute;n de un disco SATA de 7200 rpm, incluso en algunos casos m&amp;aacute;s altos, los test de disco me dec&amp;iacute;an que el rendimiento en lecturas secuenciales era espectacular, en cambio en lecturas aleatorias dejaba mucho que desear, la gran ventaja de la utilizaci&amp;oacute;n de este disco es que la bater&amp;iacute;a del port&amp;aacute;til a pasado a durar m&amp;aacute;s del doble, de dos horas a casi 5, sigo haciendo cambios en la configuraci&amp;oacute;n a trav&amp;eacute;s de regedit, pues el fabricante ni siquiera ofrece un programa de configuraci&amp;oacute;n, el disco tiene una conexi&amp;oacute;n USB para actualizar el firmware, pero este brilla por su ausencia, lo curioso es que antes de comprarlo estuve leyendo en varios post, que los resultados obtenidos con este tipo de discos pasaban por un aumento de rendimiento en torno a un 30 % frente a un disco SATA Normal, en resumen toda una decepci&amp;oacute;n, espero que con alguna actualizaci&amp;oacute;n y soporte de Windows 7 para discos SSD el rendimiento pueda mejorar, pero no lo tengo nada claro.&lt;/p&gt;
&lt;p&gt;Quiz&amp;aacute;s, para trabajar con herramientas de dise&amp;ntilde;o grafico como autocad que maneja archivos grandes el rendimiento mejore, pero en mi caso con Visual Studio me temo que con la cantidad de archivos que tiene la soluci&amp;oacute;n y el tama&amp;ntilde;o de estos que normalmente no supera 20 Kb no sea as&amp;iacute;. Lo cierto es que estoy bastante decepcionado con este disco, esperaba al menos cierta mejoria en el rendimiento tal y como se comentaba en los art&amp;iacute;culos.&lt;/p&gt;
&lt;p&gt;Por otra parte acabo de renovar mi antiguo PC, un AMD con doble n&amp;uacute;cleo de los primeros que salieron al mercado, 4 Gb de Ram y un disco serial ata de 250 Gb, adquir&amp;iacute; un equipo &lt;a href="http://www1.euro.dell.com/content/products/productdetails.aspx?c=es&amp;amp;cs=esbsdt1&amp;amp;id=desktop-optiplex-960&amp;amp;l=es&amp;amp;s=bsd" title="http://www1.euro.dell.com/content/products/productdetails.aspx?c=es&amp;amp;cs=esbsdt1&amp;amp;id=desktop-optiplex-960&amp;amp;l=es&amp;amp;s=bsd"&gt;DELL Optiplex 960&lt;/a&gt; con un procesador Intel Quad Core, 8 Gb de Ram, Vista 64 y un disco SSD de 64 Gb de la marca Samsung. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/samsung_5F00_ssd_5F00_001_5F00_0B533024.jpg"&gt;&lt;img height="236" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/samsung_5F00_ssd_5F00_001_5F00_thumb_5F00_27343F4F.jpg" alt="samsung_ssd_001" border="0" title="samsung_ssd_001" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Como sab&amp;eacute;is Visual Studio no permite realizar cambios en tiempo de ejecuci&amp;oacute;n cuando estas depurando en 64 bits, no entiendo porque ni despues del Sp1 han incoporado esta caracter&amp;iacute;stica que es verdaderamente importante. Como trataba de potenciar el rendimiento decidi renunciar a esta opci&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Con esta configuraci&amp;oacute;n los resultados son espectaculares, se reduce el tiempo de compilaci&amp;oacute;n en un 70 %, el equipo abre outlook en decimas de segundo, realmente espectacular, el disco utilizado tiene la mitad de capacidad que el primero, pero en rendimiento nada que ver, impresionante, hay que tener en cuenta de que el procesador tambien hace su trabajo en el proceso de compilaci&amp;oacute;n los cuatro procesadores no bajan del 60 % de rendimiento, el sistema operativo es de 64 bits, el uso de memoria no sobrepasa los 4 gygas. Resharper y Devexpress van como un tiro. Es incre&amp;iacute;ble que en un equipo que ronda los 1200 &amp;euro;, el rendimiento haya mejorado tanto, la verdad merece la pena la inversi&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Aprovechando este post, he realizado otra prueba utilizando una tarjeta de memoria de 4 Gb, similar a esta &lt;a href="http://www.gigabyte.com.tw/Products/Storage/Products_Overview.aspx?ProductID=2180"&gt;http://www.gigabyte.com.tw/Products/Storage/Products_Overview.aspx?ProductID=2180 &lt;/a&gt;Desconozco la marca de la tarjeta que tengo ya que la consigui&amp;oacute; un compa&amp;ntilde;ero a trav&amp;eacute;s de unos proveedores directamente en china, la de la foto es de la marca Gygabyte y es practicamente identica a la mia exceptuando la bateria que es una pila normal recargable de 1,5 V, En Espa&amp;ntilde;a todav&amp;iacute;a no he visto ning&amp;uacute;n sitio donde se comercializa.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/desktop_5F00_productimage_5F00_iram_5F00_1.3_5F00_big_5F00_7E492A45.jpg"&gt;&lt;img height="141" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/desktop_5F00_productimage_5F00_iram_5F00_1.3_5F00_big_5F00_thumb_5F00_09923E83.jpg" alt="desktop_productimage_i-ram_1.3_big" border="0" title="desktop_productimage_i-ram_1.3_big" style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Esta tarjeta te crea un disco virtual de memoria, esta sustentanda por una peque&amp;ntilde;a bater&amp;iacute;a de litio que se recarga a trav&amp;eacute;s del slot PCI, para evitar perder los datos cuando apagamos el equipo, aqu&amp;iacute; tambi&amp;eacute;n los resultados son espectaculares, despu&amp;eacute;s de dejar el proyecto en el disco de memoria que tiene una capacidad de 4 Gygas, suficiente para almacenar varios proyectos, y redirigir los archivos temporales a un directorio del propio disco, las pruebas son verdaderamente asombrosas, el rendimiento en la compilaci&amp;oacute;n es similar al logrado con el nuevo equipo con disco duro SSD. No os puedo poner el precio de esta tarjeta, pero seg&amp;uacute;n he le&amp;iacute;do es cara.&lt;/p&gt;
&lt;p&gt;Otra posible soluci&amp;oacute;n de bajo coste para acelerar Visual Studio pasa por utilizar memorias Flash como las que se usan en las c&amp;aacute;maras r&amp;eacute;flex digitales de alto rendimiento, abra que ver las especificaciones de lectura(escritura, esta es una de las mas r&amp;aacute;pidas actualmente.. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/g_5F00_00014498_5F00_79A2F9BE.jpg"&gt;&lt;img height="208" width="244" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/g_5F00_00014498_5F00_thumb_5F00_05C473E6.jpg" alt="g_00014498" border="0" title="g_00014498" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Se pueden utilizar como un disco mas en un portatil o se pueden conectar a traves de un interface SATA como el de la foto a cualquier PC, no he realizado las pruebas con este tipo de dispositivos, una memoria de 4 Gb similar a la de la foto no costara mas de 70 &amp;euro;, la de la foto de 8 Gb esta sobre los 110 &amp;euro; y el un interface para pc sobre los 20 &amp;euro;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/adsacf_5F00_detail_5F00_15F03BDF.jpg"&gt;&lt;img height="334" width="459" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/adsacf_5F00_detail_5F00_thumb_5F00_11B63E4D.jpg" alt="adsacf_detail" border="0" title="adsacf_detail" style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;El ahorro de costes que puede suponer trabajar con este tipo de dispositivos puede ser espectacular, imaginar un equipo de 8 personas que compilen una media de 10 veces al d&amp;iacute;a y el proceso tome unos 4 minutos, supone que podemos ahorrarnos 4 horas diarias solo en la compilaci&amp;oacute;n, aunque el dispositivo solo mejorase un 30 % el rendimiento, ya merece la pena realizar la inversi&amp;oacute;n.&lt;/p&gt;
&lt;p&gt;Otra soluci&amp;oacute;n muy interesante y gratuita para los que dispongais de suficiente memoria, al menos 3 Gygas, puede ser la utilizaci&amp;oacute;n de este programa gratuito, &lt;a target="_blank" href="https://www.cenatek.com/product_page_ramdisk_download_list.php"&gt;https://www.cenatek.com&lt;/a&gt; llamado RamDiskVe, el programa crea un disco virtual utilizando la memoria ram del equipo, las pruebas que he realizado han logrado mejorar el proceso mas de un 30 %, aunque el rendimiento al guardar el contenido del todo el disco antes de apagar el equipo no es muy bueno y tiene algun problema, de hecho la versi&amp;oacute;n para Windows Vista es beta, pero puede ser una buena alternativa que no nos cuesta nada probar.&lt;/p&gt;
&lt;p&gt;&lt;img height="178" width="454" src="http://www.ocztechnologyforum.com/forum/attachment.php?attachmentid=7562&amp;amp;stc=1&amp;amp;d=1228259387" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;En resumen, cuidado al comprar un disco SSD, no todos son iguales&amp;hellip; los discos de memoria pueden ser una buena alternativa y si tene&amp;iacute;s memoria suficiente probar RamDiskVe.&lt;/p&gt;
&lt;p&gt;Os dejo un video sobre el samsung SSD, tarda un poco, pero merece la pena. http://www.youtube.com/watch?v=pJMGAdpCLVg&lt;/p&gt;
&lt;p&gt;(Por favor, visita la web para ver este medio)&lt;/p&gt;
&lt;p&gt;Espero que el post os resulte &amp;uacute;til.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=146657" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Rendimiento/default.aspx">Rendimiento</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Visual+Studio/default.aspx">Visual Studio</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Discos+SSD/default.aspx">Discos SSD</category></item><item><title>Diseñando controles. Atributo DesignerSerializationVisibility.</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/04/10/dise-241-ando-controles-atributo-designerserializationvisibility.aspx</link><pubDate>Fri, 10 Apr 2009 17:57:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:146573</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=146573</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=146573</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/04/10/dise-241-ando-controles-atributo-designerserializationvisibility.aspx#comments</comments><description>&lt;p&gt;En el siguiente ejemplo hemos encapsulado un texbox dentro de un UserControl y a&amp;ntilde;adido la propiedad MaxLenght para poder modificar la propiedad de control encapsulado.&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;Public &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; UserControl1 : UserControl&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;{&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; UserControl1()&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         InitializeComponent();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MaxLenght&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; textBox1.MaxLength; }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         set&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;             textBox1.MaxLength = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeComponent();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.textBox1 = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Windows.Forms.TextBox();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.SuspendLayout();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#008000;"&gt;// textBox1&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.textBox1.Location = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Drawing.Point(3, 3);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.textBox1.Name = &lt;span style="color:#006080;"&gt;&amp;quot;textBox1&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.textBox1.Size = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Drawing.Size(100, 20);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.textBox1.TabIndex = 0;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#008000;"&gt;// UserControl1&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#008000;"&gt;// &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.AutoScaleDimensions = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Drawing.SizeF(6F, 13F);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Controls.Add(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.textBox1);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Name = &lt;span style="color:#006080;"&gt;&amp;quot;UserControl1&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.Size = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Drawing.Size(108, 27);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.ResumeLayout(&lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;         &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.PerformLayout();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;     &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; System.Windows.Forms.TextBox textBox1;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Si arrastramos el control al formulario, observamos que en el c&amp;oacute;digo del InitialiceComponent del form aparece la siguiente linea:&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.userControl11.MaxLenght = 32767;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El generador de c&amp;oacute;digo ha a&amp;ntilde;adido la propiedad con el valor por defecto en el InitializeComponent del formulario.&lt;/p&gt;
&lt;p&gt;A partir de aqui solo se podra alterar el valor de la propiedad dentro del propio formulario, alterando manualmente su valor, esto obligar&amp;iacute;a a recorrer todos los formularios donde se usa el control.&lt;/p&gt;
&lt;p&gt;El verdadero problema es que hagamos lo que hagamos en nuestro control el valor de la linea del InitializeComponent no cambiar&amp;aacute; ya que esta se introduce solo la primera vez que arrastramos el control al formulario. Con lo que el valor del Maxlengt en el formulario siempre sera 32767.&lt;/p&gt;
&lt;p&gt;Si lo que buscamos es poder establecer a todos los controles una propiedad publica y un valor inicial, deberemos decirle a la propiedad que no se agrege a los contenedores donde se utilize el control. Esto se consigue decorando la propiedad con el atributo DesignerSerializationVisibility. &lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; MaxLenght&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;{&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    get { &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; textBox1.MaxLength; }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    set&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        textBox1.MaxLength = &lt;span style="color:#0000ff;"&gt;value&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;    }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;El atributo utilizado tiene tres valores posibles:&lt;/p&gt;
&lt;p&gt;- Hidden. El generador de c&amp;oacute;digo no produce c&amp;oacute;digo para el objeto &lt;/p&gt;
&lt;p&gt;- Visible. El generador de c&amp;oacute;digo produce c&amp;oacute;digo para el objeto&lt;/p&gt;
&lt;p&gt;- Content. El generador de c&amp;oacute;digo produce c&amp;oacute;digo para el contenido del objeto m&amp;aacute;s que para el objeto en s&amp;iacute;.&lt;/p&gt;
&lt;p&gt;De esta forma la linea del InitializeComponent no se introducira en el formulario, si alteramos el valor de la propiedad en el control, su valor se utilizar&amp;aacute; en todos los contenedores donde le utilicemos excepto en aquellos en que explicitamente cambiemos su valor. &lt;/p&gt;
&lt;p&gt;Si establecemos la propiedad sin atributos debemos tener en cuenta que por cada propiedad se a&amp;ntilde;adira al menos una linea en todos los sitios donde utilizemos el control, esto adem&amp;aacute;s de penalizar el rendimiento, porque el valor ha de ser cargado cada vez que abrimos el formulario, elimina la posibilidad de realizar cambios en el control y propagarlos a todos los sitios donde se utilize. &lt;/p&gt;
&lt;p&gt;En el caso de una propiedad formada por un array inicializado con valores, el problema es mucho mayor, ya que podemos encontrarnos en nuestro formularios casos como este:&lt;/p&gt;
&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;line-height:12pt;background-color:#f4f4f4;width:97.5%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;max-height:200px;font-size:8pt;cursor:text;"&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeComponent();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;{&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;       &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.userControl13.Array = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;2&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;3&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;4&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;5&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;6&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;7&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;8&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;9&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;10&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;11&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;12&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;13&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;14&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;15&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;16&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;17&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;18&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;19&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;20&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;21&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;22&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;23&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;24&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;25&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;26&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;27&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;28&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;29&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;30&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;31&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;32&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;33&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;34&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;35&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;36&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;37&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;38&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;39&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;40&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;41&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;42&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;43&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;44&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;45&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;46&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;47&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;48&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;span style="color:#006080;"&gt;&amp;quot;49&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;        &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;};&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.userControl13.Location = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Drawing.Point(30, 80);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.userControl13.Name = &lt;span style="color:#006080;"&gt;&amp;quot;userControl13&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:#f4f4f4;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.userControl13.Size = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; System.Drawing.Size(108, 27);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;line-height:12pt;background-color:white;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;color:black;font-size:8pt;"&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.userControl13.TabIndex = 2;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Es muy importante entender como funciona el generador de c&amp;oacute;digo de visual studio para decorar las propiedades de controles y formularios que vayan a ser reutilizados de forma adecuada evitando sobrecargar sus contenedores y aprovechar las ventajas de la herencia.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=146573" width="1" height="1"&gt;</description></item><item><title>Cuestión de rendimiento...</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/04/01/innovar-amp-optimizar-amp-depurar.aspx</link><pubDate>Wed, 01 Apr 2009 21:37:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:146061</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>17</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=146061</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=146061</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/04/01/innovar-amp-optimizar-amp-depurar.aspx#comments</comments><description>&lt;p&gt;Recientemente he le&amp;iacute;do varios art&amp;iacute;culos sobre las ventajas de Windows 7, frente a los actuales XP y Windows Vista. Los problemas de rendimiento de Windows Vista en algunos aspectos como la copia de archivos y otros han hecho que los usuarios ni siquiera se planteen el cambio de sistema operativo, personalmente opino que Vista es bastante superior que XP, aun con estos problemas que despu&amp;eacute;s se solucionaron con el sp1. Pero esta situaci&amp;oacute;n ha llevado a que Microsoft haya tenido que dar marcha atr&amp;aacute;s en su pol&amp;iacute;tica, y se ponga manos a la obra para mejorar su Sistema Operativo optimiz&amp;aacute;ndolo para mejorar su rendimiento y cambiar la imagen de su producto m&amp;aacute;s importante.&lt;/p&gt;
&lt;p&gt;En el caso de Office 2007, el cambio radical con la adopci&amp;oacute;n del Ribbon ha provocado que muchos usuarios reh&amp;uacute;sen a usar este producto debido a su coste, la curva de aprendizaje que requiere el cambio de aspecto, adem&amp;aacute;s de que las necesidades de la mayor&amp;iacute;a de los usuarios se encuentran cubiertas en las anteriores versiones, han provocado que el n&amp;uacute;mero de implantaciones de Office 2007 se encuentren lejos de sus versiones anteriores.&lt;/p&gt;
&lt;p&gt;Creo que la velocidad a la que nos viene acostumbrando Microsoft muchas veces solo justificada por la idea de vender nuevos productos al mercado, est&amp;aacute; comenzando a cambiar la forma de pensar de muchos usuarios, se ha creado un clima, en el que muchos piensan &amp;quot;porque cambiar algo que ahora mismo funciona y que cumple con mis necesidades&amp;quot; y que adem&amp;aacute;s cuesta dinero.&lt;/p&gt;
&lt;p&gt;En mi caso, como desarrollador llevo &amp;quot;trabajando sufriendo&amp;quot; con Visual Studio desde hace varios a&amp;ntilde;os, &amp;quot;digo sufriendo porque gran parte mi tiempo estoy esperando...&amp;quot;, en mi opini&amp;oacute;n el dise&amp;ntilde;o, su arquitectura y su integraci&amp;oacute;n con diferentes sistemas es excelente, pero arrastra desde las primeras versiones una serie de problemas que todos los d&amp;iacute;as me hacen pensar si estoy utilizando la herramienta m&amp;aacute;s adecuada, estoy harto de los tiempos de compilaci&amp;oacute;n, harto de los dise&amp;ntilde;adores de formularios lentos, por no hablar del dise&amp;ntilde;o en Asp.net y Wpf&amp;nbsp; y de otros muchos aspectos relacionados con las pruebas unitarias y herramientas de calidad como FxCop que hacen que d&amp;iacute;a a d&amp;iacute;a pierda gran cantidad de tiempo, en esperar a que un proceso finalice. Si comparo mi actual proyecto con el anterior desarrollado en otro entorno tambi&amp;eacute;n de Microsoft similar en cuanto a complejidad y funcionalidad, exceptuando por la calidad de c&amp;oacute;digo, entonces me dan ganas de llorar, un formulario normal con los mismos campos tarda en abrir decimas de segundo, la compilaci&amp;oacute;n con el doble de c&amp;oacute;digo y formularios se realiza en menos de 15 segundos, en cambio en Visual Studio puedo pasar hasta 10 minutos para que finalice el proceso, muchos pensaran quiz&amp;aacute;s no deber&amp;iacute;as compilar tanto o &amp;iquest; Por qu&amp;eacute; no reduces el proyecto para que vaya m&amp;aacute;s deprisa ?, optimizas tus clases, controles, etc. Creerme he hecho de todo desde optimizar, gestionar las builds, hasta utilizar discos SSD, pero hay veces que es necesario compilar a menudo y puedo afirmar que las diferencias de tiempo son abismales, sobre todo en lo que al dise&amp;ntilde;o se refiere. El entorno de producci&amp;oacute;n es incre&amp;iacute;blemente lento, la carga de los controles en el toolbar es desastrosa, en fin, hoy estaba estimando el tiempo que perdemos en estas tareas y la verdad, mejor no contarlo.&lt;/p&gt;
&lt;p&gt;Espero que Microsoft tome nota de estas quejas que afectan todos los d&amp;iacute;as a muchos programadores y que se comprometa tal y como predica, a realizar productos de calidad, en los que el rendimiento sobre todo en herramientas de desarrollo sea un aspecto fundamental, antes de sacar productos nuevos al mercado, estoy harto de los continuos cambios y nuevas tecnolog&amp;iacute;as en las que solo funciona el 70 % de las cosas y que obligan a los desarrolladores a hacer verdaderas virguer&amp;iacute;as para poder desarrollar sus aplicaciones, estoy harto de escuchar frases como &amp;quot;eso se implementara en la siguiente versi&amp;oacute;n&amp;quot;, y ver pasar errores que nunca se corrigen y que consumen mucho de nuestro tiempo productivo.&lt;/p&gt;
&lt;p&gt;No quiero generalizar, considero que Microsoft tiene una amplia gama de productos excelentes, desde Sql Server pasando por Office e incluyendo como no a Visual Studio con el que mantengo desde hace tiempo una relaci&amp;oacute;n amor-odio, pero hay aspectos con los que lucho todos los d&amp;iacute;as, y que versi&amp;oacute;n tras versi&amp;oacute;n siguen arrastrando los mismos errores, me pregunto c&amp;oacute;mo es posible que hace 10 a&amp;ntilde;os mi entorno de desarrollo fuese infinitamente m&amp;aacute;s r&amp;aacute;pido para realizar la misma funcionalidad y hoy en d&amp;iacute;a para realizar tareas cotidianas me encuentre con un entorno tan lento. Pienso que tal y como parece que est&amp;aacute;n haciendo con Windows 7, deben replantearse su pol&amp;iacute;tica y apostar por mejorar el rendimiento de sus productos, creo que hay muchos usuarios hartos ya de tantas versiones e innovaciones y que esperan realizar su trabajo de una forma m&amp;aacute;s efectiva.&lt;/p&gt;
&lt;p&gt;Creo en la innovaci&amp;oacute;n, pero no en la innovaci&amp;oacute;n a costa de no corregir y mejorar aquello que tienes por detr&amp;aacute;s. Como dicen en el desarrollo, los errores y la optimizaci&amp;oacute;n de los m&amp;oacute;dulos que lo requieran deben ser aspectos prioritarios.Creo que Microsoft con algunos productos ha empezado a pagar ya, su decisi&amp;oacute;n de sacar productos cada poco tiempo e innovar a toda costa, y que en los sucesivos a&amp;ntilde;os todav&amp;iacute;a lo har&amp;aacute; m&amp;aacute;s si no cambia de pol&amp;iacute;tica radicalmente.&lt;/p&gt;
&lt;p&gt;Pero esta es solo mi opini&amp;oacute;n, estoy seguro que muchos no estar&amp;eacute;is de acuerdo con estas afirmaciones.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=146061" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Rendimiento/default.aspx">Rendimiento</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item></channel></rss>