<?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>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>17</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>2</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>16</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>20</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>3</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>5</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>15</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><item><title>El poder de las expresiones regulares</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/03/16/el-poder-de-las-expresiones-regulares.aspx</link><pubDate>Mon, 16 Mar 2009 19:17:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:145042</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=145042</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=145042</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/03/16/el-poder-de-las-expresiones-regulares.aspx#comments</comments><description>&lt;p&gt;Creo no conocer a ning&amp;uacute;n programador que no odie enfrentarse a las expresiones regulares, lo cierto es que tienen su complejidad, aunque si te habit&amp;uacute;as a utilizarlas en m&amp;aacute;s de una ocasi&amp;oacute;n te pueden sacar de un apuro.&lt;/p&gt;
&lt;p&gt;En nuestra aplicaci&amp;oacute;n detectamos un error procedente de un control muy utilizado en nuestros formularios, el caso es que eliminamos una propiedad p&amp;uacute;blica que utiliz&amp;aacute;bamos para su configuraci&amp;oacute;n, como era de esperar el &amp;ldquo;find usages&amp;rdquo;, nos dec&amp;iacute;a que esta era utilizada por infinidad de formularios de la aplicaci&amp;oacute;n, aparec&amp;iacute;an unas 2000 referencias, despu&amp;eacute;s de eliminar varias recorde que en cierta ocasi&amp;oacute;n hab&amp;iacute;a podido solucionar un problema similar utilizando expresiones regulares.&lt;/p&gt;
&lt;p&gt;Tenia que eliminar de los formularios todas las l&amp;iacute;neas similares a &lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; ((System.ComponentModel.ISupportInitialize)(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.bPorcentaje7.Properties)).BeginInit();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.bPorcentaje7.Properties.MaxLength = 6;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; ((System.ComponentModel.ISupportInitialize)(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.bPorcentaje7.Properties)).EndInit();&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Utilizando la herramienta find and replace del visual studio configure las siguientes expresiones:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_7D1D34C0.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_173D524B.png" border="0" width="505" height="350" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; ^(.*){ComponentModel.ISupportInitialize}(.*){Porcentaje}(.*){Properties}(.*)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; ^(.*){porcentaje}(.*){Properties}(.*){ MaxLength }(.*)&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La primera expresi&amp;oacute;n regular eliminar&amp;iacute;a dos l&amp;iacute;neas, la primera y la tercera correspondientes a BeginInit y EndInit y la segunda eliminar&amp;iacute;a la l&amp;iacute;nea del maxlenght.&lt;/p&gt;
&lt;p&gt;Su traduci&amp;oacute;n seria as&amp;iacute;: Busca desde el principio de la l&amp;iacute;nea una cadena que comience con cualquier car&amp;aacute;cter y que seguidamente tenga la cadena &amp;ldquo;ComponentModel.ISupportInitialize&amp;rdquo;, despu&amp;eacute;s cualquier cadena, seguido de la palabra &amp;ldquo;porcentaje&amp;rdquo; seguida de cualquier cadena, seguida de la palabra &amp;ldquo;properties&amp;rdquo; y que finalice con cualquier cadena.&lt;/p&gt;
&lt;p&gt;Una vez escrito, solo bastaba reemplazar todas las cadenas, y voila, el trabajo de varias horas hecho en tan solo unos segundos.&lt;/p&gt;
&lt;p&gt;La documentaci&amp;oacute;n de Visual Studio se encuentra disponible en &lt;a href="http://msdn.microsoft.com/en-us/library/az24scfc(VS.80).aspx"&gt;http://msdn.microsoft.com/en-us/library/az24scfc(VS.80).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Existen adem&amp;aacute;s varios generadores de expresiones regulares en la web y programas para ayudarnos a escribirlas.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=145042" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Entity FrameWork – Metadata</title><link>http://geeks.ms/blogs/jirigoyen/archive/2009/03/10/entity-framework-metadata.aspx</link><pubDate>Tue, 10 Mar 2009 19:27:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:144605</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=144605</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=144605</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2009/03/10/entity-framework-metadata.aspx#comments</comments><description>&lt;p&gt;Como sab&amp;eacute;is la metadata se define como la informaci&amp;oacute;n que se conoce sobre los propios datos, cuando hablamos de entity framework, esta contendr&amp;aacute; informaci&amp;oacute;n sobre las entidades, campos y relaciones. En este ejemplo estaba buscando la posibilidad de conocer el maxLength de un campo de una entidad determinada, de esta forma podria configurar algunos de mis controles en tiempo de ejecuci&amp;oacute;n. &lt;/p&gt;
&lt;p&gt;Cuando configuramos un grid necesitamos configurar el maxLength de cada campo para impedir un desbordamiento en la actualizaci&amp;oacute;n, para evitar establecer el valor de forma manual en cada columna, pues si en alg&amp;uacute;n momento cambio este valor, estar&amp;iacute;a obligado a variar esta informaci&amp;oacute;n en todos los controles de mi aplicaci&amp;oacute;n donde utilice este campo. La metadata puede proporcionar esta informaci&amp;oacute;n para configurar los controles en tiempo de ejecuci&amp;oacute;n evitando cambiar estos datos si en el alg&amp;uacute;n momento altero la estructura de mis tablas. De la misma forma podemos configurar la precisi&amp;oacute;n y la escala en valores decimales, nombre de los campos para el databinding, aceptaci&amp;oacute;n de valores nulos, configuraci&amp;oacute;n de campos de solo lectura, etc.&lt;/p&gt;
&lt;p&gt;La automatizaci&amp;oacute;n de estos procesos a traves de los metadatos evitara numerosos errores y nos permitir&amp;aacute; realizar cambios de una forma m&amp;aacute;s eficaz.&lt;/p&gt;
&lt;p&gt;En otras ocasiones esta informaci&amp;oacute;n nos permitira generar sentencias Sql en tiempo de ejecuci&amp;oacute;n, generalizar consultas y funciones en nuestros proyectos.&lt;/p&gt;
&lt;p&gt;En Entity framework la metadata esta almacenada en el archivo edmx en formato xml. En este ejemplo el archivo xml contiene informaci&amp;oacute;n diversa en cada uno de los campos, maxlenght en los casos que utilizemos cadenas, precision y escala en los valores decimales.&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &amp;lt;Property Name=&lt;span style="color:#006080;"&gt;&amp;quot;Empresa&amp;quot;&lt;/span&gt; Type=&lt;span style="color:#006080;"&gt;&amp;quot;nvarchar&amp;quot;&lt;/span&gt; MaxLength=&lt;span style="color:#006080;"&gt;&amp;quot;50&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &amp;lt;Property Name=&lt;span style="color:#006080;"&gt;&amp;quot;Transporte_factor&amp;quot;&lt;/span&gt; Type=&lt;span style="color:#006080;"&gt;&amp;quot;decimal&amp;quot;&lt;/span&gt; Nullable=&lt;span style="color:#006080;"&gt;&amp;quot;false&amp;quot;&lt;/span&gt; Precision=&lt;span style="color:#006080;"&gt;&amp;quot;6&amp;quot;&lt;/span&gt; Scale=&lt;span style="color:#006080;"&gt;&amp;quot;2&amp;quot;&lt;/span&gt; /&amp;gt;        &lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;He desarrollado este peque&amp;ntilde;o programa que nos permitir&amp;aacute; conocer el maxLength de cualquier campo de una entidad,&lt;/p&gt;
&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;height:285px;background-color:#f4f4f4;"&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#008000;"&gt;/// Retorna el maxlenght de un campo de una entidad y un contexto determinados&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;context&amp;quot;&amp;gt;Contexto del que se quieren recuperar las entidades&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;entity&amp;quot;&amp;gt;Nombre de la entidad&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;field&amp;quot;&amp;gt;Nombre del campo&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Retorna la longitud de la entidad, en caso de no encontrarlo retorna -1&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; GetMaxlenght(ObjectContext context, EntityObject entity, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; field)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;{&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (context != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; entity != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; !&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(field))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;    {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;        EntityContainer container;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (context.MetadataWorkspace.TryGetEntityContainer(context.DefaultContainerName, DataSpace.CSpace, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; container))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;        {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;            EntitySet entitySet;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;            &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (container.TryGetEntitySetByName(entity.ToString().Split(&lt;span style="color:#006080;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;)[1], &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; entitySet))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;            {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;                &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; mlenght = &lt;span style="color:#006080;"&gt;&amp;quot;MaxLength&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (entitySet.ElementType.Members.Contains(field) &amp;amp;&amp;amp; entitySet.ElementType.Members[field].TypeUsage.Facets.Contains(mlenght))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;                {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;                    &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; smaxlenght = entitySet.ElementType.Members[field].TypeUsage.Facets[mlenght].Value;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (smaxlenght != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;                    {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&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;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;                        &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(smaxlenght.ToString(), &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; maxlenght))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;                        {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;                            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; maxlenght;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;                        }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;                    }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;                }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;            }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;        }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;    }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;    &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; -1;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;El ejemplo de uso seria algo as&amp;iacute;:&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; (NorthwindEFEntities context = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; NorthwindEFEntities())&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     Employees employees = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Employees();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;     EdmTools.GetMaxlenght(context, employees, &lt;span style="color:#006080;"&gt;&amp;quot;FirstName&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Si quisieramos conocer otro factor, tan solo tendriamos que alterar el valor de la constante definida en:&lt;/p&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; mlenght = &lt;span style="color:#006080;"&gt;&amp;quot;MaxLength&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Aunque para el ejemplo anterior quiz&amp;aacute;s lo m&amp;aacute;s l&amp;oacute;gico ser&amp;iacute;a realizar un m&amp;eacute;todo extensor para acceder a este tipo de informaci&amp;oacute;n para poder hacer algo asi:&lt;/p&gt;
&lt;p&gt;int maxlenght = employess.GetMetadata(employess.FirstName, Attributes.Maxlenght);&lt;/p&gt;
&lt;p&gt;Cuando lo desarrolle pondr&amp;eacute; este ejemplo.&lt;/p&gt;
&lt;p&gt;Como veis en el depurador las facetas pueden proporcionarnos m&amp;aacute;s informaci&amp;oacute;n, default value, nullable, etc.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_0324E08F.png"&gt;&lt;img title="image" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" alt="image" src="http://geeks.ms/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/jirigoyen/image_5F00_thumb_5F00_3EB4C982.png" border="0" width="517" height="89" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;El siguiente ejemplo est&amp;aacute; basado en el mismo proceso y devuelve informaci&amp;oacute;n a trav&amp;eacute;s de un array con el contenido del maxLength de todas las columnas:&lt;/p&gt;
&lt;div style="border:1px solid gray;margin:20px 0px 10px;padding:4px;overflow:auto;font-size:8pt;width:97.5%;cursor:text;max-height:200px;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// Retorna una colecci&amp;oacute;n de campos valor con el maxlenght de cada uno de los campos de una entidad&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;context&amp;quot;&amp;gt;Contexto del que se quieren recuperar las entidades&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;param name=&amp;quot;entity&amp;quot;&amp;gt;Entidad&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt; &lt;span style="color:#008000;"&gt;/// &amp;lt;returns&amp;gt;Retorna un diccionario campo valor con la longitud de cada uno de los campos, en caso de no encontrarlo retorna -1&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; Dictionary&amp;lt;EdmMember, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt; GetMaxlenght(ObjectContext context, EntityObject entity)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;     Dictionary&amp;lt;EdmMember, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt; edmFieldsMaxlenght = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Dictionary&amp;lt;EdmMember, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&amp;gt;();&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (context != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; entity != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;     {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;         EntityContainer container;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (context.MetadataWorkspace.TryGetEntityContainer(context.DefaultContainerName, DataSpace.CSpace, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; container))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;         {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;             EntitySet entitySet;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (container.TryGetEntitySetByName(entity.ToString().Split(&lt;span style="color:#006080;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;)[1], &lt;span style="color:#0000ff;"&gt;false&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; entitySet))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;             {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (EdmMember member &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; entitySet.ElementType.Members)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;                 {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; mlenght = &lt;span style="color:#006080;"&gt;&amp;quot;MaxLength&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  21:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  22:&lt;/span&gt;                     &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (entitySet.ElementType.Members.Contains(member.Name) &amp;amp;&amp;amp; entitySet.ElementType.Members[member.Name].TypeUsage.Facets.Contains(mlenght))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  23:&lt;/span&gt;                     {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  24:&lt;/span&gt;                         &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; smaxlenght = entitySet.ElementType.Members[member.Name].TypeUsage.Facets[mlenght].Value;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  25:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  26:&lt;/span&gt;                         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (smaxlenght != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  27:&lt;/span&gt;                         {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  28:&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;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  29:&lt;/span&gt;                             &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;.TryParse(smaxlenght.ToString(), &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; maxlenght))&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  30:&lt;/span&gt;                             {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  31:&lt;/span&gt;                                 edmFieldsMaxlenght.Add(member, maxlenght);&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  32:&lt;/span&gt;                             }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  33:&lt;/span&gt;                         }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  34:&lt;/span&gt;                     }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  35:&lt;/span&gt;                 }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  36:&lt;/span&gt;             }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  37:&lt;/span&gt;         }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  38:&lt;/span&gt;     }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  39:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; edmFieldsMaxlenght;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  40:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;Buscando informaci&amp;oacute;n encontr&amp;eacute; este blog &lt;a href="http://www.scip.be/index.php?Page=ArticlesNET24"&gt;http://www.scip.be/index.php?Page=ArticlesNET24&lt;/a&gt;, en el que proponen otro ejemplo muy interesante. Solo que aqu&amp;iacute; no puede acceder al maxlengh, es curioso, &amp;uacute;nicamente a los valores por defecto, si es nullable, etc.&lt;/div&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;&lt;br /&gt;   1:&lt;/span&gt; var query = from meta &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; context.MetadataWorkspace.GetItems(DataSpace.CSpace)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt;                 .Where(m =&amp;gt; m.BuiltInTypeKind == BuiltInTypeKind.EntityType)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;             let m = (meta &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; EntityType)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;             let properties = m.Properties&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;             select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;             {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;&amp;nbsp; &lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;                 EntityName = m.Name,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;                 MembersCount = m.Members.Count,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                 KeyMembersCount = m.KeyMembers.Count,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;                 PropertyNames = from p &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; properties&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;                                 select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt;                                 {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  14:&lt;/span&gt;                                     p.Name,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  15:&lt;/span&gt;                                     p.Nullable,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  16:&lt;/span&gt;                                     p.DefaultValue,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  17:&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Documentation,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  18:&lt;/span&gt;                                     Type = p.TypeUsage.EdmType.Name&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  19:&lt;/span&gt;                                 }&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  20:&lt;/span&gt;             };&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;No he probado a leer los metadatos de una entidad heredada, aunque en este caso podriamos averiguar su base y realizar la consulta. Utilizando como base el ejemplo anterior podemos facilmente ver todas la entidades que est&amp;aacute;n derivadas.&lt;/p&gt;
&lt;div&gt;
&lt;div style="border-style:none;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; IEnumerable GetEntityNamesBaseNames(ObjectContext context)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   3:&lt;/span&gt;     var query = from meta &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; context.MetadataWorkspace.GetItems(DataSpace.CSpace)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   4:&lt;/span&gt;                     .Where(m =&amp;gt; m.BuiltInTypeKind == BuiltInTypeKind.EntityType)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   5:&lt;/span&gt;                 let m = (meta &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; EntityType)&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   6:&lt;/span&gt;                 &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; m.BaseType != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   7:&lt;/span&gt;                 select &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;   8:&lt;/span&gt;                 {&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;   9:&lt;/span&gt;                     m.Name,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  10:&lt;/span&gt;                     BaseTypeName = m.BaseType != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt; ? m.BaseType.Name : &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  11:&lt;/span&gt;                 };&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:#f4f4f4;"&gt;&lt;span style="color:#606060;"&gt;  12:&lt;/span&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; query;&lt;/pre&gt;
&lt;pre style="border-style:none;margin:0em;padding:0px;overflow:visible;font-size:8pt;width:100%;color:black;line-height:12pt;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;background-color:white;"&gt;&lt;span style="color:#606060;"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Espero que os sirva&amp;hellip;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=144605" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Metadata/default.aspx">Metadata</category></item><item><title>Especialización vs Polivalencía</title><link>http://geeks.ms/blogs/jirigoyen/archive/2008/12/28/polivalencia-vs-especializaci-243-n.aspx</link><pubDate>Sun, 28 Dec 2008 17:08:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:136215</guid><dc:creator>Juan Irigoyen</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/rsscomments.aspx?PostID=136215</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=136215</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2008/12/28/polivalencia-vs-especializaci-243-n.aspx#comments</comments><description>&lt;p&gt;No hace mucho tiempo, pensaba que la única salida que teníamos los desarrolladores era la de especializarnos en una tecnología determinada para poder asegurar nuestro futuro. Los continuos cambios y las nuevas tecnologías hacen que cada vez sea mas difícil mantenernos &amp;quot;actualizados&amp;quot; para ser competitivos en el mercado que nos rodea. Esta es una pregunta que desde hace tiempo me quita el sueño y de la que no logro obtener una respuesta clara. Esta claro que ser un experto en una determinada tecnología, puede aportarnos muchas ventajas. Para las pequeñas empresas de desarrollo de software obtener personal especializado en una determinada área es prácticamente imposible, ya que, para ello deberíamos contar con medios y con multitud de personas para conformar un equipo de trabajo.&lt;/p&gt; &lt;p&gt;En mi empresa desde hace tiempo observo que cada vez se da mas importancia a la obtención de personas con perfiles polivalentes, que según las necesidades de esta normalmente delimitadas por las situaciones de un mercado cada vez mas dinámico, sean capaz de adaptarse y asumir roles diferentes a los que están habituados con el fin de conseguir que estas, sean mas competitivas, pero los trabajos son, relativamente mas sencillos, en ningún caso, comparables al desarrollo de software.&lt;/p&gt; &lt;p&gt;Un simple desarrollador en asp.net debe ser capaz de conocer diferentes tecnologías, desde xml, ado, html, servicios web, iis, conocimientos de seguridad, etc. Creo que, una de las características mas valiosa de las personas en el área del desarrollo es la &amp;quot;capacidad de adaptación&amp;quot;, ser capaz de asumir una tecnología en poco tiempo y sacarla partido es algo cada vez mas importante en nuestro trabajo, para ello no basta con estar preparados, estudiar o realizar diferentes cursos, hay que tener un nivel de predisposición al cambio, y esto es algo que rara vez se encuentra en las personas, es lógico, cualquier cambio, por pequeño que sea, siempre traerá consigo un sinfín de problemas que debemos solucionar. Por otra parte, estas personas tendrán que renunciar a cierta especialización para ser mas polivalentes. En el área del desarrollo de software es cada vez mas difícil obtener perfiles polivalentes ya que llegar a dominar una sola de las tecnologías con las que trabajamos puede suponer años de estudio y experiencia.&lt;/p&gt; &lt;p&gt;Por otra parte, creo que muchas veces, olvidamos el verdadero sentido de nuestro trabajo, este no es el de realizar aplicaciones utilizando las últimas tendencias y tecnologías, sino el de dar una &amp;quot;solución&amp;quot; a un problema especifico. Desde luego la solución debe combinar muchas factores importantes entre los que destaco el &amp;quot;tiempo&amp;quot;, en la mayoría de los casos la introducción de una nueva tecnología frente a una solución ya conocida tendrá inicialmente un coste superior que debemos valorar y que muchas veces olvidamos, para dotar a nuestras aplicaciones de una arquitectura mas moderna, versátil y adaptable, pero que requiere mucho mas tiempo de desarrollo. Uno de los mayores problemas que observo en los desarrolladores, y me incluyo, es que normalmente buscamos que nuestra aplicación sea lo mas perfecta posible, esto incluye la adopción de las mas modernas tecnologías.&lt;/p&gt; &lt;p&gt;Especializarnos en un determinado área pueda hacer que en determinados casos seamos mas competitivos además de ser los únicos capaces de solucionar determinados problemas. Hablando con &lt;a href="http://blogs.solidq.com/ES/fguerrero/default.aspx" title="http://blogs.solidq.com/ES/fguerrero/default.aspx"&gt;Fernando Guerrero&lt;/a&gt;, me comentaba que su empresa se había especializado en ofrecer soluciones muy determinadas, por ejemplo le llamaban para dar solución a un cliente que tenia una pagina web y que recibía mas de un millón de visitas semanales y en puntas de acceso los servidores se colapsaban, desde luego dar una solución adecuada para un problema similar normalmente pasa por disponer dentro de la empresa a personas con perfiles muy especializados, comentaba que ellos se dedicaban a ofrecer soluciones de problemas muy determinados y que estos suponían un porcentaje ridículo dentro del ámbito del desarrollo de software, y me aseguraba que estaban saturados de trabajo. En este caso contar con perfiles especializados hacia que su empresa podía ofrecer soluciones que otras nunca podrían resolver en un corto periodo de tiempo.&lt;/p&gt; &lt;p&gt;Por otra parte, en mi trabajo, la necesidad de obtener perfiles polivalentes es cada vez mas importante, un simple desarrollador debe conocer diferentes tecnologías y llegar a conocer alguna de ellas en detalle puede llevar mucho tiempo. Ser capaz de conocer a fondo una sola de las tecnologías que utilizamos, por ejemplo &amp;quot;Sql Server&amp;quot;, nos puede llevar años de trabajo.&lt;/p&gt; &lt;p&gt;El otro día &lt;a href="http://geeks.ms/blogs/rcorral/" title="http://geeks.ms/blogs/rcorral/"&gt;Rodrigo Corral&lt;/a&gt; escribía un &lt;a href="http://geeks.ms/blogs/rcorral/archive/2008/12/22/161-la-broma-ha-terminado.aspx" title="http://geeks.ms/blogs/rcorral/archive/2008/12/22/161-la-broma-ha-terminado.aspx"&gt;post&lt;/a&gt; hablando de la importancia de aprender a desarrollar en entornos con multiples procesadores para aprovechar las características del nuevo hardware, comentaba que si somos capaces de aprender y dominar estas nuevas tecnologías tendremos un mercado que nos permitirá marcar la diferencia frente a otros desarrolladores. Lo cierto es que incluso, asumir una nueva tecnología como de las que habla en su post, pasa por conocer muchas otras y que el nivel necesario para poder entender aspectos como la multitarea es algo que no todos están capacitados para realizar. &lt;/p&gt; &lt;p&gt;Quizás la decisión mas adecuada pase por escoger lo mejor de ambos mundos, dominar una o dos areas e intentar ser polivalentes estudiando otras tecnologías para ser capaces de asumir cambios con rapidez, aunque todo dependerá de las necesidades de la empresa para la que trabajemos, por otro lado la especialización en un determinada tecnologia podría ayudarnos en la búsqueda de un futuro profesional mejor. &lt;/p&gt; &lt;p&gt;Así que sigo preguntándome que será mejor: Especializarse o ser polivalente y saber un poco de todo. ¿ Son areas diferenciadas o se pueden&amp;nbsp; complementar ?... Espero con vuestras opiniones poder aproximarme a la solución mas adecuada. Como decía Malder, &amp;quot;La verdad esta ahí fuera...&amp;quot;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=136215" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Especializaci_26002300_243_3B00_n+Polivalencia/default.aspx">Especializaci&amp;#243;n Polivalencia</category></item><item><title>¿ Sabes jugar al pocker ?</title><link>http://geeks.ms/blogs/jirigoyen/archive/2008/12/09/191-sabes-jugar-al-poker.aspx</link><pubDate>Tue, 09 Dec 2008 05:15:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:126204</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=126204</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=126204</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2008/12/09/191-sabes-jugar-al-poker.aspx#comments</comments><description>&lt;table border="0" cellpadding="2" cellspacing="0" width="511"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="222"&gt;&lt;a href="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Sabesjugaralpoker_14B8D/keith-sexton-1_4.jpg"&gt;&lt;img src="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Sabesjugaralpoker_14B8D/keith-sexton-1_thumb_1.jpg" style="border-width:0px;" alt="keith-sexton-1" border="0" width="213" height="143" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td valign="top" width="287"&gt;He le&amp;iacute;do varios comentarios, sobre la importancia del valor del equipo en los departamentos de desarrollo. En el &amp;aacute;mbito de las empresas que conozco, normalmente el equipo viene conformado de antemano, a veces porque la empresa cuenta ya con personal, otras porque el proceso de selecci&amp;oacute;n se lo encargan a una empresa externa que lo unico que tiene es un perfil predeterminado, son muchos los factores impiden seleccionar al equipo mas adecuado.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Por otro lado, te puedes encontrar que alguna de las personas del grupo no cumple las expectativas esperadas. Llegados a este punto, muchos piensan &amp;quot;Si un desarrollador en un momento determinado no cumple las expectativas lo mejor es deshacerse de el lo antes posible&amp;quot;, en este caso, la empresa tendr&amp;aacute; un alto precio que pagar ya que normalmente habr&amp;aacute; invertido en formaci&amp;oacute;n y recursos para mejorar la calidad de su personal y debe buscar a alguien capaz de asumir el trabajo. En el mundo en que nos movemos, si la empresa utiliza tecnolog&amp;iacute;as de &amp;uacute;ltima generaci&amp;oacute;n o el conocimiento de los procesos internos es complejo, esto se puede convertir en algo sumamente complicado, adem&amp;aacute;s de asumir el coste de echar al empleado, debemos formar de nuevo a otra persona e introducirla en el &amp;aacute;mbito laboral. Normalmente esta tarea no se realiza en periodos cortos de tiempo y corremos el riesgo de volver a encontrarnos con alguien que no cumple nuestras expectativas y vuelta a empezar....&lt;/p&gt;
&lt;table border="0" cellpadding="0" cellspacing="0" width="512"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="346"&gt;Comparo algunos equipos de desarrollo con una partida de pocker por la singularidad de sus miembros, en este caso los jefes de proyecto aspiran a recibir una escalera real.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Muchos son los motivos que hacen que una persona no desarrolle su trabajo de forma eficaz, cuando indagas un poco, descubres que algunos tienen problemas familiares,otros se consideran mal pagados y no estan dispuestos a esforzarse mas, en otros casos sus jefes no&lt;br /&gt;&lt;/td&gt;
&lt;td valign="top" width="164"&gt;&lt;a href="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Sabesjugaralpoker_14B8D/Pocker1_2.jpg"&gt;&lt;img src="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Sabesjugaralpoker_14B8D/Pocker1_thumb.jpg" style="border-width:0px;" alt="Pocker1" border="0" width="163" height="140" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;saben delegar y se limitan a darles el trabajo basura... Podr&amp;iacute;amos escribir las causas utilizando los doce tomos de la biblia y nos quedar&amp;iacute;amos cortos. &lt;/p&gt;
&lt;p&gt;Creo que los responsables de un equipo cuentan con recursos para mejorar esta situaci&amp;oacute;n. Una palmadita en la espalda de vez en cuando, mostrar cierto inter&amp;eacute;s hacia la persona, puede hacer que esta se sienta completamente motivada y valorada en su entorno. Ponernos de vez en cuando en el lugar de los dem&amp;aacute;s es algo que debemos intentar para comprender mejor a las personas. &lt;/p&gt;
&lt;p&gt;Como responsables de un equipo de trabajo, nuestro cometido pasa por conocer bien a las personas, debemos hacer de psic&amp;oacute;logos para entender su comportamiento. Un responsable de equipo en cualquier &amp;aacute;mbito debe ser capaz de escuchar, comunicar, delegar, incentivar, transmitir, compartir, ense&amp;ntilde;ar, bromear, irse a tomar unas cervezas o a cenar de vez en cuando con su equipo..... , etc, etc. Despu&amp;eacute;s de leer esta frase, alguno en mi oficina se estar&amp;aacute; descojonando de la risa..... &amp;quot;capaz de escuchar,&amp;nbsp; motivar.... jajajajajaja....&amp;quot;, tambi&amp;eacute;n es importante asumir nuestros errores, limitaciones y debilidades para tratar de corregirlas, al fin y al cabo, nadie es perfecto. &lt;/p&gt;
&lt;p&gt;Existen muchas t&amp;eacute;cnicas para mejorar la relaci&amp;oacute;n en un equipo de trabajo, recuerdo tres en especial que me llamaron mucho la atenci&amp;oacute;n, la primera era algo as&amp;iacute;: &amp;quot;Tenemos un grupo de 5 personas, cuatro de las cuales realizan el trabajo de una forma correcta pero el quinto no hace mas que darnos problemas&amp;quot;, el proceso de mejora consist&amp;iacute;a en aplicar dos reglas, primero explicar detalladamente al equipo las ventajas de realizar su trabajo de una forma determinada y la dependencia que ten&amp;iacute;an los unos de los otros para realizar su cometido y segundo, poner al mas problem&amp;aacute;tico a cargo del equipo. Habitualmente se detectaba que este, cuando comprend&amp;iacute;a que su trabajo afectaba a los dem&amp;aacute;s y asum&amp;iacute;a su nuevo Rol se convert&amp;iacute;a en la persona que mas aportaba cambiando su actitud de rechazo hacia el equipo.&lt;/p&gt;
&lt;p&gt;La segunda es bastante conocida y esta basada en la rotaci&amp;oacute;n, de vez en cuando los roles del equipo se invert&amp;iacute;an, un operario pasaba a ser jefe de equipo y al contrario...&lt;/p&gt;
&lt;p&gt;La tercera t&amp;eacute;cnica la vi en el programa &amp;quot;el encantador de perros&amp;quot;, que pasaba por introducir a un perro inadaptado en una manada estable, al cabo de una semana este abandonaba su actitud y pasaba a formar parte de la manada, haciendo lo mismo que los dem&amp;aacute;s cuando otro perro en su misma situaci&amp;oacute;n llegaba. Desde luego contar con un buen equipo que camina en una &amp;uacute;nica direcci&amp;oacute;n har&amp;aacute; que cualquier persona que se integre en el, se adapte mas f&amp;aacute;cilmente a sus reglas. Desgraciadamente algunos animales son mas inteligentes que los hombres.&lt;/p&gt;
&lt;p&gt;El trabajo en equipo es una aptitud, independiente del nivel profesional que se pueda tener. Lo malo es que desde peque&amp;ntilde;os nos han educado a ser individualistas. Cuando vamos al colegio o a la universidad lo &amp;uacute;nico que pensamos es en aprobar, muy pocos acuden con el &amp;uacute;nico fin de aprender, tan solo es un proceso de selecci&amp;oacute;n que si pasamos, nos permitir&amp;aacute; acceder a una vida mejor. Frases como &amp;quot;tienes que ser mejor que los dem&amp;aacute;s o similares...&amp;quot; son las ense&amp;ntilde;anzas de la sociedad actual. Los trabajos en equipo desde el colegio, bachillerato pasando por la universidad brillan por su ausencia y claro, cuando nos incorporamos al mercado laboral desconocemos como trabajar con mas personas. Aprender algo basado en todo lo contrario a lo que nos han ense&amp;ntilde;ado desde peque&amp;ntilde;os es muy complicado, y no seremos capaces de hacerlo si no tenemos plena confianza en el valor de las personas. Muchos responsables no creen en esto, porque jam&amp;aacute;s se lo han ense&amp;ntilde;ado, as&amp;iacute; que lo tendr&amp;aacute;n muy dif&amp;iacute;cil para conformar un buen equipo de trabajo.&lt;/p&gt;
&lt;p&gt;Por otro lado, algunos de los genios mas grandes de la historia han ofrecido al mundo sus avances desde la soledad de su trabajo, he conocido personas brillantes que se adaptan muy mal a las reglas del trabajo en equipo o les resulta muy dif&amp;iacute;cil relacionarse con los dem&amp;aacute;s, estas logran su m&amp;aacute;xima capacidad productiva cuando no tienen reglas que acatar. Detectar a estas personas y dotarlas de capacidad de independencia puede llegar a ser una mejor pr&amp;aacute;ctica que obligarla a acatar todas las reglas de un equipo.&lt;/p&gt;
&lt;p&gt;La mayor&amp;iacute;a de la gente no sabe trabajar en equipo simplemente porque nadie les a ense&amp;ntilde;ado la forma de hacerlo, explicar el porque de las cosas, escuchar a todos los componentes, ayudarles y motivarles ser&amp;aacute; el primer paso para transmitir las ventajas del trabajo en equipo. He descubierto a lo largo de mi experiencia, que conocer a las personas nos aporta una visi&amp;oacute;n &amp;uacute;nica, que nos permitir&amp;aacute; corregir y mejorar determinados comportamientos, si optamos por la v&amp;iacute;a mas f&amp;aacute;cil cuando detectamos problemas, habremos fracasado en nuestro cometido, un jugador de pocker juega con las cartas que recibe.Los buenos jugadores de pocker no basan su juego en las cartas. Los buenos jugadores de pocker analizan la mesa, cada gesto, cada mirada, estudian sus probabilidades e intentan conocer al contrario, aunque contar con buenas cartas hace que sus probabilidades de ganar sean mayores.&lt;/p&gt;
&lt;p&gt;Para los buenos jugadores de pocker, las cartas ser&amp;aacute;n un factor importante, pero no determinante.&lt;/p&gt;
&lt;p&gt;No puedo resistir dejaros esta foto, que nadie se lo tome a mal....&lt;/p&gt;
&lt;p&gt;&lt;a href="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Sabesjugaralpoker_14B8D/20080129poker-electoral_2.jpg"&gt;&lt;img src="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Sabesjugaralpoker_14B8D/20080129poker-electoral_thumb.jpg" style="border-width:0px;" alt="20080129poker-electoral" border="0" width="524" height="394" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pd. Recuerdo de la &amp;uacute;ltima partida, jejejeje..., gane...... lo siento Francisco, Victor, Garris,&amp;nbsp; jajajajajajaja......&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=126204" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/jirigoyen/archive/tags/Trabajo+en+equipo/default.aspx">Trabajo en equipo</category></item><item><title>Scrum – El valor esta en las personas</title><link>http://geeks.ms/blogs/jirigoyen/archive/2008/12/03/scrum-el-valor-esta-en-las-personas.aspx</link><pubDate>Wed, 03 Dec 2008 20:58:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:124026</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=124026</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=124026</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2008/12/03/scrum-el-valor-esta-en-las-personas.aspx#comments</comments><description>&lt;p&gt;En mis primeros años de desarrollo estaba solo, habitualmente desarrollaba mis proyectos como quería, con el paso del tiempo y el aumento de las funcionalidades de los programas y de los avances en los lenguajes de programación, empecé a darme cuenta que pronto no iba a poder desarrollar sistemas de cierto nivel yo solo, en ese momento comencé un nuevo proyecto y me anime con unos amigos a conformar una pequeña empresa dedicada a ofrecer todo tipo de servicios informáticos, hacíamos de todo, desde vender equipos e instalarlos hasta desarrollar pequeñas aplicaciones y algunas páginas web, cuando la empresa fue prosperando necesitamos incorporar más gente al equipo de desarrollo, habitualmente cada uno se iba dedicando a un proyecto de forma individual, observaba a unos desarrolladores que les gustaba el trabajo que hacían y otros que solo trabajaban, digamos, para subsistir, los que verdaderamente aportaban valor eran aquellos que veían su trabajo como un hobbie, a partir de entonces, cuando seleccionaba a alguien, me importaba mas si verdaderamente le gustaba el trabajo que iba a realizar, que las titulaciones y los conocimientos técnicos que tenía. Para mi estaba claro, el valor estaba en las personas que tenían interés por su trabajo. Normalmente los programas no eran muy grandes, hacíamos pequeños análisis y desarrollábamos los proyectos, cuando procedíamos a su instalación el cliente nos hacia observaciones y correcciones, que de forma inmediata se iban resolviendo para adaptarlo completamente a sus especificaciones. El cliente no solamente se limitaba a hacerme correcciones, sino que me proporcionaba ideas para mejorar mis desarrollos, el problema era que esto normalmente lo hacia al final de la implantación y muchas veces tenia que rehacer gran parte de los proyectos asumiendo el coste originado. Habitualmente nos reuníamos con los desarrolladores y hablábamos de cómo realizar el trabajo, ellos proponían sus ideas y compartíamos diferentes puntos de vistas, como dice el refrán “dos ojos ven más que uno”, otras veces me sentaba con algún programador e intentábamos
corregir un error. Para gestionar los proyectos solíamos utilizar excel, project o la lista de tareas de outlook, estas se escribían y se iban tachando a medida que se iban completando.  &lt;/p&gt;&lt;p&gt;Cuando comencé a trabajar en equipo, empezaron a aflorar una serie de problemas, los desarrolladores que tenían un nivel más bajo, demandaban de forma constante mi ayuda, y me interrumpían constantemente cuando trabajaba, observaba que dedicaba mucho tiempo a enseñar, corregir e indicar como tenían que realizarse los desarrollos, cuando me preguntaban ¿como vais?, yo estaba totalmente descolocado, en mi caso, conocía la velocidad del trabajo que realizaba, pero no sabía cuánto podrían tardar las personas que tenían otros conocimientos y habilidades. El número de tareas creció mucho mas y su gestión me llevaba mucho tiempo. Me encontraba perdido, porque mis estimaciones fallaban constantemente.  &lt;/p&gt;&lt;p&gt;Buscando una solución para estos problemas y gracias a &lt;a href="http://www.migueljimenez.net/" title="http://www.migueljimenez.net/"&gt;Miguel Jimenez&lt;/a&gt; comencé a interesarme por nuevas tendencias en el área del desarrollo de software, empecé a leer sobre desarrollo ágil, en concreto me gustaron las que hablaban de programación extrema o XP, en las que se hablaba de pruebas unitarias, programación en parejas, priorización en la corrección de errores, entregas frecuentes, refactorización, integración del cliente como parte fundamental del equipo, propiedad de código compartida y simplicidad, alguna de las prácticas que se recomendaban eran utilizadas por mi desde hacia tiempo, así que me gustaron especialmente y comencé a estudiarlas un poco más en detalle.  &lt;/p&gt;&lt;p&gt;Fue en este momento cuando me tropecé con Scrum y CMMI, buscando información me encontré con el magnífico trabajo realizado en &lt;a href="http://www.navegapolis.net"&gt;Navegapolis&lt;/a&gt; por &lt;a href="http://vegapolis.net/content/view/25/45/uan" title="http://www.navegapolis.net/content/view/25/45/"&gt;Juan Palacio&lt;/a&gt; y por supuesto, con los post de &lt;a href="http://geeks.ms/blogs/rcorral/" title="http://geeks.ms/blogs/rcorral/"&gt;Rodrigo Corral&lt;/a&gt;.  &lt;/p&gt;&lt;p&gt;Cuando conocí Scrum, observe que alguno de los factores que me habían llevado a realizar proyectos exitosos estaban ahí, y que además, me proporcionaba una solución para aquellos problemas que estaba tratando de resolver, mejoras en la planificación y la estimación, evitar las constantes interrupciones, mejorar la comunicación con el equipo, involucrar más a las personas, etc.  &lt;/p&gt;&lt;p&gt;Las constantes reuniones diarias son la base de la metodología y nos proporcionaban varias ventajas:  &lt;/p&gt;&lt;blockquote&gt; &lt;p&gt;- Muchas veces ocurría que cuando hablabas con un desarrollador al cabo un tiempo observaba que llevaba unos días desarrollando de forma incorrecta algún modulo. La falta de comunicación hacia que los retrasos por estas causas aumentasen, con la reunión diaria evitabas enterarte de esto al cabo de un tiempo, reduciendo retrasos y errores en la planificación. Estos se identificaban al principio y permitían mantener el ritmo de desarrollo. &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;- Al realizar la reunión diaria podías atender todas las dudas y consultas del equipo de desarrollo en ese periodo, con lo que las constantes interrupciones se evitaban, cuando un desarrollador preguntaba algo, se le decía: &amp;quot;eso se atenderá en la reunión de Scrum.&amp;quot; &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;- El equipo tenía constancia del trabajo que realizaban los demás, redundando en un mejor conocimiento de la aplicación. Ocurría muchas veces que los desarrolladores que realizaban un determinado módulo desconocían el trabajo de los demás, cuando se intentaban enlazar dos módulos aparecían problemas que no se habían tenido en cuenta por falta de información.&lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;- El equipo aporta valor, ya no era el único que resolvía las dudas o decía como tenían que realizarse las cosas, los propios integrantes del equipo ayudaban a sus compañeros a resolver sus problemas y a mí, aportándome ideas y otros puntos de vista sobre cómo llegar a soluciones más óptimas. Esto mejoraba la relación del equipo y el desarrollo del proyecto. &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;- Resultaba ser una eficaz herramienta de control, como sabéis en la reunión de Scrum se responde a tres preguntas. &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿Qué hicistes desde el último Scrum Diario respecto al proyecto? &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿Qué harás desde ahora y hasta el próximo Scrum Diario? &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ¿Qué te está impidiendo hacer tu trabajo lo mejor posible o que necesidades tienes para realizar el desarrollo? &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;La reunión permite conocer el trabajo de cada desarrollador, las dudas y los impedimentos que tienen para realizar su trabajo ademas de la evaluación continua de su trabajo diario. Es como cuando íbamos al colegio y nos preguntaban por la tarea del día anterior, desde luego no hacer la tarea es un riesgo, ya que todo el equipo sabe que nos has realizado tu cometido. Se mejora la productividad, al tener una presión inconsciente por el hecho de tener que pararse frente al resto del equipo y contar en lo que se estuvo trabajando. &lt;/p&gt;&lt;/blockquote&gt; &lt;blockquote&gt; &lt;/blockquote&gt;&lt;p&gt;Como sabéis en Scrum se planifican los llamados &amp;quot;sprints&amp;quot; que tienen una duración de entre 20-40 días, en ellos de definen las tareas que vamos a ser capaces de realizar en el periodo determinado. La planificación de cada uno marcaba una dirección clara para el equipo, todos conocen los objetivos y saben que van a obtener al final de cada sprint. En la conformación de los sprints cada miembro del equipo realiza la
estimación y gestión de sus tareas, ellos son los mejores conocedores
de su velocidad, esto hace que el control sea relativamente sencillo de
realizar. En un equipo realizar este proceso era muy complicado, ya que
los desarrolladores no tenían el mismo nivel, por otra parte, un
desarrollador no programa siempre igual, la adopción de nuevas
tecnologías, el progreso y las habilidades de cada uno, hacen que este
sea un factor muy cambiante. Es el desarrollador el que se impone la
tarea y el periodo determinado para desarrollarla, este hecho aporta
gran valor, pues solo se le exige aquello que se ha comprometido a
realizar. Aqui radica una de las premisas de Scrum, la confianza en las
personas es una de las bases de la metologia, si bien puedes ayudar en
las estimaciones al final el desarrollador es el que se compromete.&lt;/p&gt;&lt;p&gt;Posteriormente la evaluación en el sprint review nos permitía
corregir aquello que se había realizado mal en el sprint anterior
evitando incurrir en errores mas de una vez.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;  &lt;/blockquote&gt;&lt;p&gt;Las constantes entregas permiten al cliente evaluar el trabajo realizado, como se intentan desarrollar módulos &amp;quot;independientes&amp;quot;, estos se pueden comenzar a amortizar la aplicación mucho antes de finalizarla.&lt;/p&gt;&lt;p&gt;El feedback del cliente permite realizar cambios mucho mas temprano, evitando rehacer gran parte del proyecto.&lt;/p&gt; &lt;p&gt;Cuando analizaba procesos, comencé a darme cuenta de que la mayoría de los problemas que detectaba, habitualmente, estaban derivados directamente de las relaciones interpersonales, la mayor parte de los responsables desconocía cómo había que trabajar en equipo, esto derivaba en consecuencias verdaderamente catastróficas, normalmente acostumbraban a dar órdenes y eran los únicos que aglutinaban la información de cómo se debían ejecutar los procesos. Cuando hablabas con las personas que realizaban el trabajo, te dabas cuenta de que sus jefes carecían de mucha de la información que ellos manejaban y consecuentemente no podían tomar las decisiones adecuadas, si la comunicación no era fluida entre el responsable y su equipo de trabajo, nunca podrían llegar a mejorar los procesos en los cuales trabajaban. Esto generaba un malestar general entre el equipo que sentía como sus valoraciones no eran escuchadas y redundaba en la bajada de la autoestima y consecuentemente en su rendimiento. Desgraciadamente todavía son muchos, incluidos los jefes de proyecto y las empresas de desarrollo los que no ven a las “personas” como su principal valor. Piensan que las infraestructuras, las máquinas, los procesos y ciertas &amp;quot;&lt;i&gt;certificaciones&lt;/i&gt;&amp;quot; son la base de sus negocios. Me cuesta entender que a día de hoy, una gran mayoría de empresas sigan aplicando el método &lt;a href="http://joelonsoftware.com/items/2006/08/08.html" title="http://joelonsoftware.com/items/2006/08/08.html"&gt;dirigir y controlar&lt;/a&gt; o el de &lt;a href="http://www.joelonsoftware.com/items/2006/08/09.html" title="http://www.joelonsoftware.com/items/2006/08/09.html"&gt;Economia 101&lt;/a&gt;&amp;nbsp;&lt;i&gt;tal y como cuenta &lt;a href="http://www.joelonsoftware.com" title="http://www.joelonsoftware.com"&gt;J&lt;i&gt;oel Spolsky&lt;/i&gt;&lt;/a&gt;.&lt;/i&gt; &lt;/p&gt;&lt;p&gt;Por otra parte, cada día encuentro mas empresas que adoptan una metología simplemente por estrategia, para vender software a terceros que tienen esa exigencia o por disponer de una certificación que avala lo bien que trabajan, recuerdo cuando se puso de moda la Iso 9001...., no estoy diciendo que no aporten cierto valor, pero creo que tienen un precio muy alto que pagar. &lt;/p&gt;&lt;p&gt;Scrum proporciona un método sencillo para estimar, controlar y dirigir proyectos minimizando la burocracia, centrándose y adaptándose a las necesidades de cada momento.&amp;nbsp; &lt;/p&gt;&lt;p&gt;En Scrum se trabaja en equipo, todos tienen voz y voto, sus opiniones se toman en cuenta y pasan a formar parte del proyecto. Para todos aquellos que crean que su principal valor esta en las &amp;quot;personas&amp;quot;, Scrum será una excelente metología.  &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=124026" 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>Depurando, depurando y con el mazo dando...</title><link>http://geeks.ms/blogs/jirigoyen/archive/2008/11/24/depurando-depurando-y-con-el-mazo-dando.aspx</link><pubDate>Mon, 24 Nov 2008 06:16:00 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:119716</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=119716</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/jirigoyen/commentapi.aspx?PostID=119716</wfw:comment><comments>http://geeks.ms/blogs/jirigoyen/archive/2008/11/24/depurando-depurando-y-con-el-mazo-dando.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Depurandodepurandoyconelmazodando_110F8/image_6.png"&gt;&lt;img src="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Depurandodepurandoyconelmazodando_110F8/image_thumb_2.png" style="border:0px none;" alt="image" width="537" border="0" height="352" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Un día, un usuario me llama por el teléfono rojo, &amp;quot;oye Juan, resulta que estaba yo en tal formulario y de repente no se donde he pulsado y creo que se me ha borrado el texto en las observaciones....&amp;quot;, incrédulo empiezo a pensar... ¿ lunes ?, este no sabe que ha pasado.... a saber que ha estado haciendo el fin de semana... por si acaso activo Defcon 1...&lt;/p&gt; &lt;p&gt;Después de un tiempo, me llama otro usuario y me dice: &amp;quot;Juan, resulta que estaba yo en tal formulario y de repente no se donde he pulsado y parece que se ha borrado el texto en las observaciones....&amp;quot;, &amp;quot;Joder como me suena.... &amp;quot;, tendré que revisar el código... pasamos a Defcon 2....&lt;/p&gt; &lt;p&gt;Abro el formulario, empiezo a investigar, buscando las dichosas &amp;quot;observaciones&amp;quot;, después de un tiempo nada, ninguna referencia...., lo dejo estar... ¿ será un virus o una rata que se ha comido un trozo de fibra?....&lt;/p&gt; &lt;p&gt;De nuevo otro día recibo la dichosa llamada. Decido activar todas las alarmas.... ¡¡¡¡señores!!!! estamos en !!!!!!!!!!!!!!!!! DEFCON 3 ¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡&lt;/p&gt; &lt;p&gt;¿ Será un trigger que se activa por algún motivo ? Buscando en la base de datos nada, ni rastro..., continuo indagando y por fin veo en un menú una opción &amp;quot;Actualizar datos...&amp;quot;, me pregunto ¿quien ha introducido esto aquí... ?, desde luego llama a un Store Procedure que actualiza las observaciones dejándolas en blanco, fue una opción que solicitaron años atrás cuando se traspasaron los datos de un sistema anterior, y claro seguía activa, muy cerca en el menú, de otra bastante utilizada, los usuarios a veces se equivocaban y pulsaban esta opción eliminando el texto, me digo: no la voy a eliminar, no vaya a ser que el usuario X la utilice algún día, introduciré un messagebox que le pregunte ¿ Si pulsa &amp;quot;si&amp;quot;, las observaciones se irán al carajo.... ? y voila....&lt;/p&gt; &lt;p&gt;Al cabo de unos días me llama un usuario y me dice: &amp;quot;oye Juan, resulta que estaba yo en tal formulario y de repente, no se donde he pulsado, me ha salido un mensaje &amp;quot;no se que del carajo...&amp;quot;, he dado enter, y resulta que me han desaparecido las observaciones. Pienso &amp;quot;arghghghghghghgh,&amp;nbsp; te vas a enterar....&amp;quot;, entro al código, introduzco 10 messageBox mas, le añado una clave de encriptación basada en CuaimaCrypt y lo pongo en producción.&lt;/p&gt; &lt;p&gt;Después de cierto tiempo, me llama otro usuario y me dice: &amp;quot;oye Juan, resulta que estoy intentando borrar las observaciones con la utilidad que me hicistes y llevo pulsando no se cuantas veces al si para se vayan al carajo de una vez, después de media hora, me aparece una pantalla para que introduzca una clave de 200 dígitos alfanuméricos..., pero no me acuerdo del dígito 199, ¿era una z o una p?....... y nada, que no me deja eliminar las p%$tas.... observaciones estas.....&amp;quot;. Con la soga al cuello y a punto de saltar por la ventana... decido utilizar el control usuarios, habilito la opción para el usuario que la utiliza, elimino los mensajes y la clave y deshabilito la opción para todos los demás, haciéndola invisible en el menú.&lt;/p&gt; &lt;p&gt;Este tipo de situaciones se dan a menudo en los procesos de depuración y desarrollo, a veces, cuando desarrollamos, nos centramos en realizar validaciones para evitar errores y no nos damos cuenta que es mucho mas fácil evitar el error eliminando la posibilidad de cometerlo. La utilización de una simple mascara evitara varias operaciones posteriores, validación, notificación al usuario de su error, limpiar el campo, situar de nuevo el foco en el control, etc. &lt;/p&gt; &lt;p&gt;Debemos centrarnos en evitar el error, no en controlarlo y sobre todo &amp;quot;utilizar el sentido común&amp;quot;....&amp;nbsp;&amp;nbsp; desgraciadamente algunos carecemos de esto...&lt;/p&gt; &lt;p&gt;&lt;a href="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Depurandodepurandoyconelmazodando_110F8/image_4.png"&gt;&lt;img src="http://geeks.ms/blogs/jirigoyen/WindowsLiveWriter/Depurandodepurandoyconelmazodando_110F8/image_thumb_1.png" style="border:0px none;" alt="image" width="304" border="0" height="426" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Por cierto..., deja de mirar a la chica y ponte a trabajar... que es lunes....&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=119716" width="1" height="1"&gt;</description></item></channel></rss>