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

<channel>
	<title>Quemando cromo</title>
	<atom:link href="http://cromo.cda-ie.es/feed/" rel="self" type="application/rss+xml" />
	<link>http://cromo.cda-ie.es</link>
	<description>Hacía calor, la noche que quemamos a Cromo</description>
	<lastBuildDate>Fri, 04 May 2012 19:05:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Hola, si lo hacemos mal os las apañáis vosotros</title>
		<link>http://cromo.cda-ie.es/2012/05/04/hola-si-lo-hacemos-mal-os-las-apanais-vosotros/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hola-si-lo-hacemos-mal-os-las-apanais-vosotros</link>
		<comments>http://cromo.cda-ie.es/2012/05/04/hola-si-lo-hacemos-mal-os-las-apanais-vosotros/#comments</comments>
		<pubDate>Fri, 04 May 2012 19:05:25 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=414</guid>
		<description><![CDATA[Tengo un amigo que trabaja en un distribuidor de cierta compañía de telefonía. Oírle hablar de los programas informáticos que usan para hacer su trabajo me demuestra que no sólo es el trato al cliente lo que falla en las empresas de telefonía y que la externalización a bajo coste de los servicios incluye algunas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Tengo un amigo que trabaja en un distribuidor de cierta compañía de telefonía. Oírle hablar de los programas informáticos que usan para hacer su trabajo me demuestra que no sólo es el trato al cliente lo que falla en las empresas de telefonía y que la externalización a bajo coste de los servicios incluye algunas áreas que debieran ser básicas para el funcionamiento de la empresa. La última que me ha contado va de un problema para dar de alta un servicio a un cliente. Un problema que, tras pruebas varias y la intervención del soporte técnico que, como distribuidor, tiene a su disposición, tiene todas y cada una de las papeletas de ser un <em>bug</em> del programa. Así que se abre una incidencia a los responsables del susodicho programa.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Que empiezan a marear la perdiz. Lo suficiente como para que la promoción caduque y se retire dicha opción del programa. Dado lo que sé del programa, me imagino una subcontrata con becarios y picacódigos con poca experiencia, mal pagados y echando horas a manta, con una motivación por los suelos y una productividad e interés por hacer bien su trabajo en consonancia (modificada a la baja por la falta de respeto que puedan recibir de sus jefes). Ante la queja del usuario y para dos días que faltan del tema, que le den a él y a su cliente. Y luego, todos, así te las apañes con tu cliente, que no es problema nuestro.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2012/05/04/hola-si-lo-hacemos-mal-os-las-apanais-vosotros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ya la versión 2… cómo pasa el tiempo</title>
		<link>http://cromo.cda-ie.es/2012/04/05/ya-la-version-2-como-pasa-el-tiempo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ya-la-version-2-como-pasa-el-tiempo</link>
		<comments>http://cromo.cda-ie.es/2012/04/05/ya-la-version-2-como-pasa-el-tiempo/#comments</comments>
		<pubDate>Thu, 05 Apr 2012 06:28:16 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=404</guid>
		<description><![CDATA[La semana pasada cerré el diseño de la versión 2.0 (nombre clave &#8220;La Cigala&#8221;) de nuestro gestor de incidencias, ahora ampliado también a gestor de proyectos. Dos meses de trabajo para una versión preliminar a la que aún tengo que echarle mucho trabajo. Pero ya casi está. Ahora tengo que preparar un par de programitas [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">La semana pasada cerré el diseño de la versión 2.0 (nombre clave &#8220;La Cigala&#8221;) de nuestro gestor de incidencias, ahora ampliado también a gestor de proyectos. Dos meses de trabajo para una versión preliminar a la que aún tengo que echarle mucho trabajo. Pero ya casi está. Ahora tengo que preparar un par de programitas auxiliares para importar datos a cascoporro desde unos Excel que se usan ahora y a quienes mi criaturita va a jubilar.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Da gusto ver el trabajo de uno en funcionamiento y que los usuarios lo acepten y usen.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2012/04/05/ya-la-version-2-como-pasa-el-tiempo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>No debería haber pasado</title>
		<link>http://cromo.cda-ie.es/2012/04/03/no-deberia-haber-pasado/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=no-deberia-haber-pasado</link>
		<comments>http://cromo.cda-ie.es/2012/04/03/no-deberia-haber-pasado/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 06:45:24 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=407</guid>
		<description><![CDATA[—¡Permiso para ir a Donde-sale-el-sol y caparle, señor! —Ya lo haré yo el lunes. Los viernes son terroríficos. Siempre pasa algo. Que además de viernes sea el día en que sensei empieza vacaciones es tentar al diablo, así que senpai y yo estábamos con la mosca detrás de la oreja y esperando… Esperando… A media [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">—¡Permiso para ir a Donde-sale-el-sol y caparle, señor!<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">—Ya lo haré yo el lunes.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Los viernes son terroríficos. Siempre pasa algo. Que además de viernes sea el día en que sensei empieza vacaciones es tentar al diablo, así que senpai y yo estábamos con la mosca detrás de la oreja y esperando… Esperando…<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">A media mañana, el caos: los usuarios avisan de que no pueden entrar en SAP. Donde-sale-el-sol ha desaparecido del mapa. Y bien desaparecido: no responde ni por MPLS ni por ADSL. ¡Ni siquiera por teléfono! ¡Un meteorito ha arrasado la fábrica! ¡Nos invaden los extraterrestres!<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">La cara de sensei, al móvil, mientras le van dando partes, es todo un poema. Un lumbreras de mantenimiento, sin avisar, se ha puesto a hacer pruebas con las líneas eléctricas. Como resultado, ha tumbado la luz en la fábrica.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">—No lo entiendo. No debería haber pasado.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Y la línea de los SAIs. Y con ella, los routers, los switches, el MPLS, la centralita… y todos y cada uno de los servidores.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">—Pero si no debería haber pasado nada.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Y mientras intentábamos arrancar todo y lo chequeábamos, yo iba haciendo mentalmente la lista de cosas que necesitaba para un fin de semana de trabajo no planeado, por si las moscas. E incluía una escopeta.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2012/04/03/no-deberia-haber-pasado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aghhhh, quiero morir</title>
		<link>http://cromo.cda-ie.es/2012/03/29/aghhhh-quiero-morir/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=aghhhh-quiero-morir</link>
		<comments>http://cromo.cda-ie.es/2012/03/29/aghhhh-quiero-morir/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 06:35:22 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>
		<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=409</guid>
		<description><![CDATA[En algún momento, pareció buena idea. Desdoblar incidencias para cubrir también peticiones de servicio. Se trataba sólo de añadir un campo a tres tablas y luego gestionarlo en tres formularios. Ya, claro. Pero había cuatro vistas de esas tablas. Y luego procedimientos almacenados sobre esas vistas y esas tablas. Que eran llamados por los tableadapters [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En algún momento, pareció buena idea. Desdoblar incidencias para cubrir también peticiones de servicio. Se trataba sólo de añadir un campo a tres tablas y luego gestionarlo en tres formularios.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Ya, claro.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Pero había cuatro vistas de esas tablas. Y luego procedimientos almacenados sobre esas vistas y esas tablas. Que eran llamados por los tableadapters de cinco datasets tipados, que los usaban para trabajar con esas vistas y esas tablas. Una docena de tableadapters, más o menos. Muchos métodos llamados (por fortuna) desde unos pocos sitios bien controlados.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Un horror de día.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2012/03/29/aghhhh-quiero-morir/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Las datarow pasan a modificadas al navegar entre registros</title>
		<link>http://cromo.cda-ie.es/2012/03/27/las-datarow-pasan-a-modificadas-al-navegar-entre-registros/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=las-datarow-pasan-a-modificadas-al-navegar-entre-registros</link>
		<comments>http://cromo.cda-ie.es/2012/03/27/las-datarow-pasan-a-modificadas-al-navegar-entre-registros/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 07:48:28 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=390</guid>
		<description><![CDATA[He tenido durante meses un problema pintoresco: en una aplicación de Windows Forms con enlace de datos (datasets tipados, BindingSource y demás) se me cambiaba el estado de las datarow a modificadas sólo con navegar entre los registros. Dado cómo se actualizaban los datos a la base de datos, resultó ser un problema menor, pero [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><span style="font-family: Verdana; font-size: 10pt;">He tenido durante meses un problema pintoresco: en una aplicación de Windows Forms con enlace de datos (datasets tipados, BindingSource y demás) se me cambiaba el estado de las datarow a modificadas sólo con navegar entre los registros. Dado cómo se actualizaban los datos a la base de datos, resultó ser un problema menor, pero molesto. El problema parecía estar en el enlace de datos (binding) de usercontrols. En su día no encontré nada en MSDN y lo dejé para otra ocasión. Ayer, buscando otra cosa, encontré la solución al problema.</span></p>
<p style="text-align: justify;"><span style="font-size: 10pt;"><span style="font-family: Verdana;">Resumiendo: si buscamos ayuda sobre cómo hacer un enlace de datos simple en nuestro control personalizado, nos dicen que usemos </span><span style="font-family: Consolas;">&lt;BindableAttribute(True)&gt;:</span></span></p>
<pre style="font-family: 'Courier New', Courier, monospace; font-size: 9pt;">&lt;BindableAttribute(<span style="color: #0000ff;">True</span>)&gt;
<span style="color: #0000ff;">Public</span> <span style="color: #0000ff;">Property</span> IdAccion <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">Integer</span></pre>
<p style="text-align: justify;"><span style="font-size: 10pt;"><span style="font-family: Verdana;">Pero resulta que, con sólo eso, el BindingSource supone que siempre cambian los valores enlazados y actualiza el origen de datos. Resulta que además debemos implementar la interface </span><span style="font-family: Consolas;">INotifyPropertyChanged</span><span style="font-family: Verdana;"> y notificar cuándo cambia el valor, tal que de esta forma:</span></span></p>
<pre style="font-family: 'Courier New', Courier, monospace; font-size: 9pt;">&lt;BindableAttribute(<span style="color: #0000ff;">True</span>)&gt;
<span style="color: #0000ff;">Public</span> <span style="color: #0000ff;">Property</span> IdAccion <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">Integer</span>
    <span style="color: #0000ff;">Get</span>
        <span style="color: #0000ff;">Return</span> <span style="color: #0000ff;">Me</span>._IdAccion
    <span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Get</span>
    <span style="color: #0000ff;">Set</span>(<span style="color: #0000ff;">value</span> <span style="color: #0000ff;">As</span> <span style="color: #0000ff;">Integer</span>)
        <span style="color: #0000ff;">If</span> _IdAccion &lt;&gt; <span style="color: #0000ff;">value</span> <span style="color: #0000ff;">Then</span>
            <span style="color: #0000ff;">Me</span>._IdAccion = <span style="color: #0000ff;">value</span>
            <span style="color: #0000ff;">RaiseEvent</span> PropertyChanged(<span style="color: #0000ff;">Me</span>, _
                    <span style="color: #0000ff;">New</span> PropertyChangedEventArgs(<span style="color: #b22222;">"IdAccion"</span>))
            <span style="color: #0000ff;">Me</span>._IdAccion = <span style="color: #0000ff;">value</span>
        <span style="color: #0000ff;">End</span> <span style="color: #0000ff;">If</span>
    <span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Set</span>
<span style="color: #0000ff;">End</span> <span style="color: #0000ff;">Property</span></pre>
<p style="text-align: justify;"><span style="font-family: Verdana; font-size: 10pt;">Sigo, eso sí, sin haberlo visto tan bien explicado en la documentación. Menos mal que existen los foros y los blogs.</span></p>
<p style="text-align: justify;"><span style="font-family: Verdana; font-size: 10pt;">Pero, ajá, no es la panacea. Ahora me encuentro con que, a veces, el valor no cambia aunque debería. Por ejemplo, al añadir un nuevo registro que tiene (o tendrá) el mismo valor de la propiedad que el anterior. Hay que revisar estos casos con cuidado para, o bien asegurarnos de que cambia el valor de la propiedad o bien provocar a mano el evento cuando lo creamos necesario. En fin, problemas del enlace a datos.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2012/03/27/las-datarow-pasan-a-modificadas-al-navegar-entre-registros/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Datasets tipados, amor y odio</title>
		<link>http://cromo.cda-ie.es/2012/03/15/datasets-tipados-amor-y-odio/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=datasets-tipados-amor-y-odio</link>
		<comments>http://cromo.cda-ie.es/2012/03/15/datasets-tipados-amor-y-odio/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 07:52:50 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>
		<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=388</guid>
		<description><![CDATA[Llevo varios meses con un proyecto que empezó siendo algo pequeño (sustituir una aplicación Access de gestión de incidencias por un desarrollo en .NET, por temas de falta de licencias de Access para todos los usuarios) y ha ido creciendo hasta el punto que mataría por tener una semana para documentar con calma todo lo [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Llevo varios meses con un proyecto que empezó siendo algo pequeño (sustituir una aplicación Access de gestión de incidencias por un desarrollo en .NET, por temas de falta de licencias de Access para todos los usuarios) y ha ido creciendo hasta el punto que mataría por tener una semana para documentar con calma todo lo que llevo hecho. Este crecimiento, aunque lo tenía en mente (no tanto, claro) cuando diseñé la aplicación, me hace dudar de ciertas decisiones que tomé en su día, como el uso de datasets tipados.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Supongo que la idea de usar datasets tipados con VB2010 teniendo Entity Framework puede parecer rara o anacrónica, pero llevo usando datasets desde 2005 y tirar de ellos me ahorraba un tiempo de aprendizaje que no tenía. Ahora, con 17 datasets tipados (y creciendo) no sé hasta qué punto fue buena idea.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Entendámonos, me gustan porque el asistente es cómodo y puedo personalizarlos rápida y fácilmente. Se han convertido en poderosas (y pesadas, me temo) entidades que se mueven entre la aplicación tanto con los datos como con las órdenes de qué hacer con ellos.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El problema viene cuando tengo que reconfigurar alguno, porque se ha añadido algún campo a la base de datos o, como está pasando estos días, ha habido que hacer cirugía mayor y donde antes tiraban de una tabla ahora lo hacen de una vista. Esa forma de machacarse la configuración de los campos existentes, esos problemas con el AllowDBNull y con los NullValue…<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">A veces odio los datasets tipados.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2012/03/15/datasets-tipados-amor-y-odio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El problema de la barra de progreso</title>
		<link>http://cromo.cda-ie.es/2011/12/27/el-problema-de-la-barra-de-progreso/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=el-problema-de-la-barra-de-progreso</link>
		<comments>http://cromo.cda-ie.es/2011/12/27/el-problema-de-la-barra-de-progreso/#comments</comments>
		<pubDate>Tue, 27 Dec 2011 08:07:53 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2005]]></category>
		<category><![CDATA[Visual Basic 2008]]></category>
		<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=382</guid>
		<description><![CDATA[El año pasado, intentando desembarazarme de una tarea tediosa que dejaba frito mi equipo, usé mi primera función recursiva con utilidad práctica. Como la tarea consumía su tiempo, tiré de un BackGroundWorker. Componente sencillo de usar y con ejemplos bastante claros en la ayuda de Visual Studio. No problem: tenía un valor de entrada pedido [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">El año pasado, intentando desembarazarme de una tarea tediosa que dejaba frito mi equipo, usé mi primera función recursiva con utilidad práctica. Como la tarea consumía su tiempo, tiré de un </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana">. Componente sencillo de usar y con ejemplos bastante claros en la ayuda de Visual Studio. No problem: tenía un valor de entrada pedido por el usuario, se realizaban n operaciones de forma recursiva, se obtenía un valor de salida.<br />
</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Como el proceso era algo largo (mínimo unos diez segundos, pero podía llegar superar el minuto en la versión 2, que admitía de entrada una serie de valores), se me ocurrió usar una barra de progreso para mantener informado al usuario.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Entonces empezaron los problemas.<br />
</span></p>
<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">Todos los ejemplos que he visto que usan el evento </span><span style="font-family:Courier New"><strong>ProgressChanged</strong></span><span style="font-family:Verdana"> del </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana"> para alimentar una barra de progreso presentan una serie de operaciones en secuencia con llamadas a </span><span style="font-family:Courier New"><strong>ProgressChanged</strong></span><span style="font-family:Verdana"> entre ellas, es decir: hago paso 1; progreso cambiado; hago paso 2; progreso cambiado… Sin embargo, mi problema era otro: tengo una instancia de mi clase de trabajo, cojo los valores del usuario (a través de </span><span style="font-family:Courier New"><strong>DoWorkEventArgs.Argument</strong></span><span style="font-family:Verdana">), se los paso, y le digo &#8220;ea, majo. Tú puedes&#8221; llamando al método </span><span style="font-family:Courier New"><strong>MiClase.HacerCurro</strong></span><span style="font-family:Verdana">. Ahí dentro se harán las n operaciones (recursivas), número desconocido hasta que se hagan.<br />
</span></span></p>
<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">Vale, pensé. Puedo provocar un evento </span><span style="font-family:Courier New"><strong>OperaciónCompletada</strong></span><span style="font-family:Verdana"> cada vez que complete una operación. Pero la instancia de </span><span style="font-family:Courier New"><strong>MiClase</strong></span><span style="font-family:Verdana"> está declarada dentro del </span><span style="font-family:Courier New"><strong>DoWork</strong></span><span style="font-family:Verdana"> del </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana">. No tengo acceso desde fuera. ¿Cómo lo hago?<br />
</span></span></p>
<p style="text-align: justify"><span style="font-size:10pt"><span style="font-family:Verdana">¿Y si meto alguien que escuche en el </span><span style="font-family:Courier New"><strong>DoWork</strong></span><span style="font-family:Verdana">? De esta forma tendría mi &#8220;escuchador&#8221; de eventos en el mismo hilo. Es decir, una clase, digamos </span><span style="font-family:Courier New"><strong>Escuchante</strong></span><span style="font-family:Verdana">, a la que le paso mi instancia de </span><span style="font-family:Courier New"><strong>MiClase</strong></span><span style="font-family:Verdana"> y la del </span><span style="font-family:Courier New"><strong>BackGroundWorker</strong></span><span style="font-family:Verdana">. Escuchante gestiona el evento </span><span style="font-family:Courier New"><strong>OperacionCompletada</strong></span><span style="font-family:Verdana"> provocando a su vez el </span><span style="font-family:Courier New"><strong>ProgressChanged</strong></span><span style="font-family:Verdana">, que actualiza la barra de progreso.<br />
</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">No sé si será una solución muy limpia, pero funcionó.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En resumen, algo así:<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Public Class Escuchante<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Private WithEvents _MiClase as MiClase<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Private _MiBGW as BackGroundWorker<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Public Sub New(mc as MiClase, bw as BackGroundWorker)<br />
</span></p>
<p style="margin-left: 36pt"><span style="font-family:Courier New; font-size:10pt">_MiClase=mc<br />
</span></p>
<p style="margin-left: 36pt"><span style="font-family:Courier New; font-size:10pt">_MiBGW=bw<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">End Sub<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">Private Sub OpCompletada(sender as Object, e as OperacionCompletadaEventArgs) _<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">                                    Handles _MiClase.OperacionCompletada<br />
</span></p>
<p style="margin-left: 36pt"><span style="font-family:Courier New; font-size:10pt">_MiBGW.ReportProgress=e.NumOp<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">End Sub<br />
</span></p>
<p ><span style="font-family:Courier New; font-size:10pt">End Class</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/12/27/el-problema-de-la-barra-de-progreso/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calc es para los pobres</title>
		<link>http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=calc-es-para-los-pobres</link>
		<comments>http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 12:26:35 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Cuentos desde la Cripta]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/</guid>
		<description><![CDATA[Este año he sido especialmente parco en entradas en este blog. Lo tengo casi abandonado, con entradas a medio redactar, distintos temas por probar para cambiar el que tiene… Ha sido un año lleno de historias y de material que publicar, no ha faltado el trabajo: una migración a SAP B1, nuevos equipos, programación a [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Este año he sido especialmente parco en entradas en este blog. Lo tengo casi abandonado, con entradas a medio redactar, distintos temas por probar para cambiar el que tiene… Ha sido un año lleno de historias y de material que publicar, no ha faltado el trabajo: una migración a SAP B1, nuevos equipos, programación a saco, anécdotas varias… Un año completo y divertido en el curro. También muy cansado, que me dejaba sin ganas de tocar otro ordenador al llegar a casa. Intentaré estos pocos días que tengo de vacaciones contar algunas y que no parezca Quemando Cromo un blog abandonado.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El título de la entrada de hoy es una frase lapidaria de mi jefe de departamento cuyo origen hay que buscarlo en un problema de licencias que nos encontramos a principios de año: los puestos de trabajo crecían y faltaban licencias de Microsoft Office (el 2000 teníamos). Teníamos entonces una gran dependencia de Outlook, Excel y Access, pero el precio de las licencias de Office resultaba prohibitivo para todos los puestos que teníamos, así que estudiamos alternativas.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Outlook fue sustituido sin más problemas por Thunderbird + Lightning. Necesitábamos un cliente de correo con calendario y tareas y el pájaro de trueno cumplió con creces. Con Access el problema desapareció por sí solo: había muchos aplicativos en Access que atacaban la base de datos del ERP. Pero este iba a ser sustituido por SAP B1, así que muerto el perro…<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El tercer problema era Excel. Probamos tanto OpenOffice.org como LibreOffice como Lotus Symphony. Elegimos finalmente LibreOffice confiando en su futuro frente a OpenOffice.org y tras tener graves problemas de estabilidad con Lotus Symphony. Migramos con ilusión intentando contagiar nuestro entusiasmo para cortar las quejas tontas (tal opción se llama distinta, los botones no son iguales, el desplegable de colores es peor porque es distinto…).<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Después de varios desesperantes meses, hubo que claudicar, re-evaluar y adquirir cierto número de licencias para algunos puestos claves. Simplemente, Calc no está a la altura. Tuvimos unos meses de horror, plagados de archivos corruptos al guardar y de pérdida de información (hiperenlaces y vínculos externos). A la hora de buscar cómo migrar ciertos libros de Excel complejos a Calc nos topamos con la falta de documentación, falta de movimiento en los foros oficiales… Cuando llegamos a las tablas dinámicas y las conexiones a SQL Server, tiramos la toalla. Salía más caro intentar usar Calc (tiempo perdido en varios departamentos, falta de información en el momento clave o inconsistencia de la misma) que volver a Excel.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">A fin de cuentas, Excel es Dios.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">PD: como yo no ocupo un puesto clave, uso Calc. Total, para lo que sé y necesito hacer me basta. Voy más lento de lo que podría ir con Excel 2007-2010 (falta de herramientas, están más ocultas), pero para una vez al mes que lo uso me vale.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/12/24/calc-es-para-los-pobres/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quiero mi Date Null, gracias</title>
		<link>http://cromo.cda-ie.es/2011/09/27/quiero-mi-date-null-gracias/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=quiero-mi-date-null-gracias</link>
		<comments>http://cromo.cda-ie.es/2011/09/27/quiero-mi-date-null-gracias/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 15:13:48 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/?p=365</guid>
		<description><![CDATA[Quiero mi bo cadillo decía ese gran filósofo moderno que es Homer Simpson. Algo parecido he estado yo pidiendo estos días. El problema se me ha presentado en una aplicación con acceso a datos, con un montaje convencional: dataset tipado + bindingsource + controles en el formulario. Uno de los campos era una fecha y [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt"><em>Quiero mi bo cadillo</em> decía ese gran filósofo moderno que es Homer Simpson. Algo parecido he estado yo pidiendo estos días. El problema se me ha presentado en una aplicación con acceso a datos, con un montaje convencional: dataset tipado + bindingsource + controles en el formulario. Uno de los campos era una fecha y podía tener valores nulos. Hasta ahí bien. El problema es que en ediciones podía recuperar el valor nulo. En esos casos, fallaba la validación de datos y no se guardaba nada, aunque tampoco conseguía saber por qué: tuve que echar mano del evento BindingComplete del BindingSource para enterarme que se producía un error en la conversión de tipos. El tipo Date no acepta nulos.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Tras una larga búsqueda en internet, casi todo en inglés, averigüé dos cosas: que era un problema común y muy molesto y que no tenía solución fácil. También hallé <a href="http://blogs.msdn.com/b/dchandnani/archive/2005/08/15/451979.aspx">unas pistas</a> que me indicaron el camino. Un trabajo no muy limpio, pero que funciona, dividido en dos partes: el enlace al control y la datatable correspondiente.</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">En enlace, usando el diseñador (DataBindings, Avanzado) para asignar un formato de fecha corta, queda así:</span></p>
<p><span id="more-365"></span></p>
<p style="text-align: left"><span style="font-size:10pt"><span style="color:blue; font-family:Courier New">Me</span><span style="font-family:Courier New">.txtFecha.DataBindings.Add(<span style="color:blue">New</span> Binding(<span style="color:#a31515">&#8220;Text&#8221;</span>, <span style="color:blue">Me</span>.bsDatos, <span style="color:#a31515">&#8220;Fecha&#8221;</span>, <span style="color:blue">True</span>, DataSourceUpdateMode.OnValidation, <span style="color:blue">Nothing</span>, <span style="color:#a31515">&#8220;d&#8221;</span>))</span><span style="font-family:Verdana"></span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Donde Nothing representa cómo se van a mostrar los valores nulos de la base de datos, la propiedad NullValue del Binding. Ésa sabemos que funciona bien, nos interesa gestionar el otro sentido de la actualización, hacia el origen de datos. Para ello tenemos la propiedad <strong>DataSourceNullValue</strong>. Sacamos el enlace del designer y lo gestionamos a mano, creándonos el Binding:<br />
</span></p>
<p style="text-align: left"><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">Dim</span> mBinding <span style="color:blue">As</span>	<span style="color:blue">New</span> Binding(<span style="color:#a31515">&#8220;Text&#8221;</span>, <span style="color:blue">Me</span>.bsDatos, <span style="color:#a31515">&#8220;Fecha&#8221;</span>, <span style="color:blue">True</span>, DataSourceUpdateMode.OnValidation, <span style="color:#a31515">&#8220;&#8221;</span>, <span style="color:#a31515">&#8220;d&#8221;</span>)<br />
</span><span style="font-family:Courier New; font-size:10pt">mBinding.DataSourceNullValue = <span style="color:blue">Date</span>.MinValue</span><br />
<span style="font-size:10pt"><span style="color:blue; font-family:Courier New">Me</span><span style="font-family:Courier New">.txtFecha.DataBindings.Add(mBinding)</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Primer punto: indicamos que el NullValue para el origen de datos no va a ser DBNull (por defecto y causa de los errores), sino un valor de fecha válido, en este caso el menor valor posible (Date.MinValue).</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Segundo punto: cambiamos el Nothing del NullValue por String.Empty o &#8220;&#8221;. La razón es muy sencilla: NullValue nos indica dos cosas. Por una parte, si (en este caso) la fecha en la DataTable es DBNull, lo representa por lo que le indiquemos ahí. Lo segundo, si el valor de la propiedad del control (Text, en este caso) coincide con el NullValue en un cambio de datos (altas, modificaciones), le pasa al origen de datos (la DataTable) lo que le tengamos dicho en DataSourceNullValue. Y el Nothing ahí no nos vale: si no hay nada en Text, obtenemos una cadena vacía, String.Empty o &#8220;&#8221;, no un valor Nothing.</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Con esto, pues, si dejamos el textbox txtFecha vacío, obtendremos en el campo Fecha de la fila correspondiente un valor fecha igual a Date.MinValue. Que no es lo que queremos: buscamos un DBNull.</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Eso lo hacemos en otra parte: gestionando el evento <strong>ColumChanging</strong> del DataTable. Modo rápido: en el diseñador del dataset tipado hacemos doble click sobre la columna en cuestión y nos genera el código automáticamente. En la gestión del evento incluimos el código para que nos filtre la fecha y si es igual a Date.MinValue, cambie el valor propuesto del campo a DBNull.value:</span></p>
<p style="text-align: left"><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">If</span> (e.Column.ColumnName = <span style="color:blue">Me</span>.FechaColumn.ColumnName) <span style="color:blue">Then<br />
</span></span><br />
       <span style="font-family:Courier New; font-size:10pt"><span style="color:blue">If</span> IsDate(e.ProposedValue) <span style="color:blue">AndAlso</span><br />
			<span style="color:blue">CDate</span>(e.ProposedValue) = <span style="color:blue">Date</span>.MinValue <span style="color:blue">Then<br />
</span></span><span style="font-family:Courier New; font-size:10pt">        e.ProposedValue = DBNull.Value<br />
</span><span style="font-family:Courier New; font-size:10pt"><br />
			<span style="color:blue">End If<br />
</span></span><span style="font-size:10pt"><span style="color:blue; font-family:Courier New">End If</span></span><span style="font-family:Verdana"><br />
			</span></span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">Con esto, ya tenemos nuestro campo fecha que acepta valores nulos. No es muy elegante, quizás, pero no se me ha ocurrido ninguna otra forma.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/09/27/quiero-mi-date-null-gracias/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El valor no puede ser nulo. Nombre del parámetro: objectType</title>
		<link>http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype</link>
		<comments>http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/#comments</comments>
		<pubDate>Thu, 22 Sep 2011 08:57:24 +0000</pubDate>
		<dc:creator>Cubano</dc:creator>
				<category><![CDATA[Visual Basic 2010]]></category>

		<guid isPermaLink="false">http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/</guid>
		<description><![CDATA[El error en cuestión me salía en el diseñador de Visual Basic Express 2010 de forma insistente. Una molestia a la hora de trabajar con el diseñador, más que nada, porque luego la aplicación funcionaba sin problemas. Ayer me dediqué a buscarle solución, tirando de Google. El problema, apuntaban en varios sitios, se daba en [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El error en cuestión me salía en el diseñador de Visual Basic Express 2010 de forma insistente. Una molestia a la hora de trabajar con el diseñador, más que nada, porque luego la aplicación funcionaba sin problemas. Ayer me dediqué a buscarle solución, tirando de Google.<br />
</span></p>
<p style="text-align: justify"><span style="font-family:Verdana; font-size:10pt">El problema, apuntaban en varios sitios, se daba en formularios o controles de usuario heredados y estaba causado al gestionar eventos de objetos de alguna de las clases padre con la cláusula Handles en la clase hija. Tras investigar con calma mi usercontrol, encontré que el causante del desaguisado era, efectivamente, una cláusula handles que apuntaba a un evento de un BindingSource del abuelo del usercontrol. Quité el Handles y lo sustituí por un AddHandler en el constructor y todo funciona con suavidad.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://cromo.cda-ie.es/2011/09/22/el-valor-no-puede-ser-nulo-nombre-del-parametro-objecttype/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

