<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1580826083962475520</id><updated>2011-11-15T13:08:32.711+01:00</updated><category term='Libros'/><category term='stored procedures'/><category term='javascript'/><category term='visual basic'/><category term='java'/><category term='google maps'/><category term='SOAPHandler'/><category term='photoshop'/><category term='CA'/><category term='.Net'/><category term='scarab'/><category term='pareto'/><category term='NetBeans'/><category term='blog'/><category term='calidad'/><category term='general'/><category term='Web Service'/><category term='SOAP'/><category term='editor'/><category term='sqlserver'/><category term='programación'/><category term='gráfico ABC'/><category term='sql'/><category term='utilidades'/><category term='windows'/><category term='certificados'/><title type='text'>Apaga y vámonos</title><subtitle type='html'>Blog orientado a la programación.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-1138858193517550876</id><published>2011-09-03T16:34:00.000+01:00</published><updated>2011-09-03T16:39:36.319+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scarab'/><title type='text'>Eliminar la vista de módulos de la página de entrada de Scarab</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-bjJy6PWb0sU/TmJKKp0-cAI/AAAAAAAAAn4/E2S0zqbwrZo/s1600/logo.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-bjJy6PWb0sU/TmJKKp0-cAI/AAAAAAAAAn4/E2S0zqbwrZo/s1600/logo.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Entre la infinidad de parámetros que nos proporciona Scarab, resulta a veces complicado encontrar el modo de modificar el comportamiento de alguna funcionalidad.&lt;br /&gt;&lt;br /&gt;En este caso, trataba de buscar la forma que no me apareciesen los módulos dados de alta en la aplicación en la pantalla de bienvenida (y que fueran visibles para cualquier persona que accediese a la página).&lt;br /&gt;&lt;br /&gt;Para ello basta con modificar la siguiente propiedad desde el apartado 'Configuración de la aplicación':&lt;br /&gt;&lt;br /&gt;scarab.anonymous.enable =&amp;gt; false&lt;br /&gt;&lt;br /&gt;De esta forma tan sencilla, eliminamos de la 'home' de Scarab la lista de nuestros módulos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-1138858193517550876?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/1138858193517550876/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=1138858193517550876' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1138858193517550876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1138858193517550876'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2011/09/eliminar-la-vista-de-modulos-de-la.html' title='Eliminar la vista de módulos de la página de entrada de Scarab'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-bjJy6PWb0sU/TmJKKp0-cAI/AAAAAAAAAn4/E2S0zqbwrZo/s72-c/logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-7601140574449537868</id><published>2008-09-22T12:38:00.002+01:00</published><updated>2009-03-26T09:39:12.461+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utilidades'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Algunos comandos útiles en Microsoft Windows</title><content type='html'>En ocasiones hay algunas aplicaciones de Windows que por un motivo u otro desaparecen y resulta complicado encontrarlas.&lt;br /&gt;&lt;br /&gt;Para acceder a estas herramientas, se pueden ejecutar los siguientes comandos (Inicio - Ejecutar...):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;div class="indent"&gt;&lt;span class="userInput"&gt;&lt;strong&gt;Herramienta de restauración del sistema:&lt;/strong&gt; &lt;span class="userInput"&gt;%systemroot%\system32\restore\rstrui.exe&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;li&gt;&lt;div class="indent"&gt;&lt;span class="userInput"&gt;&lt;span class="userInput"&gt;&lt;strong&gt;Hotplug (desconexión de dispositivos externos, usb...):&lt;/strong&gt; &lt;span class="userInput"&gt;%systemroot%\system32\Rundll32.exe shell32.dll,Control_RunDLL hotplug.dll&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;li&gt;&lt;div class="indent"&gt;&lt;span class="userInput"&gt;&lt;span class="userInput"&gt;&lt;span class="userInput"&gt;&lt;strong&gt;Microsoft Word:&lt;/strong&gt; winword&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;li&gt;&lt;div class="indent"&gt;&lt;span class="userInput"&gt;&lt;span class="userInput"&gt;&lt;span class="userInput"&gt;&lt;strong&gt;Microsoft Excel:&lt;/strong&gt; excel&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class="indent"&gt;&lt;strong&gt;Escritorio Remoto:&lt;/strong&gt; mstsc&lt;br clear="all"&gt;&lt;br /&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-7601140574449537868?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/7601140574449537868/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=7601140574449537868' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/7601140574449537868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/7601140574449537868'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2008/09/algunos-comandos-tiles-en-microsoft.html' title='Algunos comandos útiles en Microsoft Windows'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-1693860251892837396</id><published>2008-07-01T09:55:00.002+01:00</published><updated>2008-07-01T10:03:49.970+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='CA'/><category scheme='http://www.blogger.com/atom/ns#' term='certificados'/><title type='text'>Importar certificados en Java</title><content type='html'>Cuando desarrollamos una aplicación en Java que va ha hacer uso de un recurso seguro (mediante un certificado), debemos asegurarnos que este certificado podrá ser validado por una entidad certificadora que reconozca Java. Debido a que Java es un lenguaje multi-plataforma, no utiliza la información de certificados alojada en el Sistema Operativo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5217968148087927186" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://3.bp.blogspot.com/_ifqy8Cf597Y/SGnyYnwVcZI/AAAAAAAAAO0/ioF0CQRqBKE/s400/ConexionHTTPS_Java.jpg" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Por defecto, la máquina virtual de Java dispone de las Entidades Certificadoras (CA) más comunes, como Verisign o Thawte. Sin embargo, suele darse el caso, sobretodo en entornos de desarrollo, que necesitemos utilizar una Entidad Certificadora "de prueba". En este caso, debemos importar esta CA en el almacén de claves de la máquina virtual que estemos utilizando.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Importar Certificado en el almacén de certificados (keystore)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La máquina virtual de Java (JVM) cuenta con un almacén de claves (keystore) que incorpora las entidades más habituales y la posibilidad de agregar aquellas que nos sean necesarias. El &lt;em&gt;keystore&lt;/em&gt; se encuentra en la ruta: &lt;strong&gt;&lt;span style="font-family:courier new,monospace;"&gt;JVM_PATH\lib\security\cacerts&lt;/span&gt;&lt;/strong&gt;. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;strong&gt;C:\Archivos de programa\Java\jre1.6.0_05\lib\security\cacerts&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:courier new,monospace;"&gt;C:\Archivos de programa\Java\jdk1.5.0_15\jre\lib\security&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para añadir una nueva entidad certificadora a la JVM que estemos utilizando, debemos utilizar el comando &lt;span style="font-family:courier new,monospace;"&gt;&lt;em&gt;keytool (JVM_PATH\bin\keytool)&lt;/em&gt;&lt;/span&gt;:&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;keytool -import -keystore "C:\Archivos de&lt;br /&gt;programa\Java\jre1.6.0_05\lib\security\cacerts" -file&lt;br /&gt;c:\NuevaEntidadCertificadora.cer -alias CA_SwitchOffAndLetsGo -storepass&lt;br /&gt;changeit&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Puede observarse que el almacén de certificados contiene la contraseña por defecto '&lt;span style="font-family:Courier New;"&gt;changeit&lt;/span&gt;'. El nombre que especifiquemos en el alias, debe ser único en el keystore y servirá de referencia futura en el almacén. Podemos listar los certificados instalados utilizando la opción &lt;em&gt;list &lt;/em&gt;del &lt;em&gt;keytool:&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;keytool -list -keystore "C:\Archivos de&lt;br /&gt;programa\Java\jre1.6.0_05\lib\security\cacerts" -storepass changeit&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Importar Certificado utilizando el panel de control de Java (Windows)&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;Atención:&lt;/em&gt;&lt;/strong&gt; con esta opción únicamente se añadirán los certificados a la instalación &lt;u&gt;activa&lt;/u&gt; de la JVM en Windows.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Para añadir la nueva entidad, se accederá al Panel de Control de Windows, y se seleccionará la opción "Java". Seguidamente se marcará la pestaña "Seguridad" y se pulsará sobre el botón "Certificados".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En el apartado de Certificados, se seleccionará la opción "Importar" y se localizará el archivo que contiene el certificado (si el certificado tiene extensión .cer se tendrá que seleccionar la opción 'Todos los archivos'). El nuevo certificado aparecerá en la pestaña "Usuario".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_ifqy8Cf597Y/SGnyljCnpuI/AAAAAAAAAO8/rQROa8PtRpk/s1600-h/certJavaWindows.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5217968370160740066" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://1.bp.blogspot.com/_ifqy8Cf597Y/SGnyljCnpuI/AAAAAAAAAO8/rQROa8PtRpk/s400/certJavaWindows.jpg" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-1693860251892837396?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/1693860251892837396/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=1693860251892837396' title='3 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1693860251892837396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1693860251892837396'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2008/07/importar-certificados-en-java.html' title='Importar certificados en Java'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_ifqy8Cf597Y/SGnyYnwVcZI/AAAAAAAAAO0/ioF0CQRqBKE/s72-c/ConexionHTTPS_Java.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-4465779924856007588</id><published>2008-06-10T21:46:00.002+01:00</published><updated>2008-06-11T12:52:31.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Service'/><category scheme='http://www.blogger.com/atom/ns#' term='SOAPHandler'/><category scheme='http://www.blogger.com/atom/ns#' term='NetBeans'/><title type='text'>Modificar un mensaje SOAP desde Java</title><content type='html'>El propósito del siguiente artículo, es explicar el modo en que se puede modificar un mensaje SOAP en una llamada a un Web Service desde NetBeans. Esto es muy útil en aquellos casos en que consumimos un WebService generado en otro lenguaje de programación, y no encontramos la forma de acceder a algún objeto que se encuentra dentro del mensaje.&lt;br /&gt;&lt;br /&gt;Imaginemos que tenemos el siguiente mensaje SOAP para la llamada a un WebService:&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;soap:Envelope xmlns:xsi="&lt;a href="http://www.w3.org/2001/XMLSchema-instance" target="_blank"&gt;http://www.w3.org/2001/XMLSchema-instance&lt;/a&gt;" xmlns:xsd="&lt;a href="http://www.w3.org/2001/XMLSchema" target="_blank"&gt;http://www.w3.org/2001/XMLSchema&lt;/a&gt;" xmlns:soap="&lt;a href="http://schemas.xmlsoap.org/soap/envelope/" target="_blank"&gt;http://schemas.xmlsoap.org/soap/envelope/&lt;/a&gt;"&amp;gt;&lt;br /&gt;&amp;lt;soap:Header&amp;gt;&lt;br /&gt;&amp;lt;cabeceraSOAP xmlns="&lt;a href="http://switchoffandletsgo.blogspot.com/" target="_blank"&gt;http://switchoffandletsgo.blogspot.com/&lt;/a&gt;"&amp;gt;&lt;br /&gt;&amp;lt;ipOrigen&amp;gt;&lt;span style="color:#00008b;"&gt;&lt;strong&gt;string&lt;/strong&gt;&lt;/span&gt;&amp;lt;/ipOrigen&amp;gt;&lt;br /&gt;&amp;lt;/cabeceraSOAP&amp;gt;&lt;br /&gt;&amp;lt;/soap:Header&amp;gt;&lt;br /&gt;&amp;lt;soap:Body&amp;gt;&lt;br /&gt;&amp;lt;SumaNumeros xmlns="&lt;a href="http://switchoffandletsgo.blogspot.com/" target="_blank"&gt;http://switchoffandletsgo.blogspot.com/&lt;/a&gt;"&amp;gt;&lt;br /&gt;&amp;lt;intNum1&amp;gt;&lt;span style="color:#00008b;"&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;/span&gt;&amp;lt;/intNum1&amp;gt;&lt;br /&gt;&amp;lt;intNum2&amp;gt;&lt;span style="color:#00008b;"&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;/span&gt;&amp;lt;/intNum2&amp;gt;&lt;br /&gt;&amp;lt;/SumaNumeros &amp;gt;&lt;br /&gt;&amp;lt;/soap:Body&amp;gt;&lt;br /&gt;&amp;lt;/soap:Envelope&amp;gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;Se puede observar que el WebService tiene un método &lt;em&gt;SumaNumeros &lt;/em&gt;que recibe dos enteros y devolvería la suma de ambos. Además contiene una cabecera SOAP en la que se debe enviar la dirección IP de origen.&lt;br /&gt;&lt;br /&gt;Al generar las clases necesarias para realizar la llamada utilizando el WSDL del WebService, NetBeans no es capaz de reconocer la cabecera del mensaje SOAP, con lo que no podemos establecer directamente la variable &lt;em&gt;cabeceraSOAP&lt;/em&gt;. Por lo tanto, tendremos que agregar un &lt;em&gt;Handler&lt;/em&gt; que intervenga antes de realizar la llamada, y añada al mensaje la cabecera que necesitemos.&lt;br /&gt;&lt;br /&gt;Para ello creamos una nueva clase, por ejemplo &lt;em&gt;SumaNumerosHandler&lt;/em&gt; y pedimos que implemente la clase SOAPHandler&amp;lt;SOAPMessageContext&amp;gt;:&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="color:#000099;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="color:#000099;"&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="color:#000099;"&gt;public class&lt;/span&gt; &lt;strong&gt;SumaNumerosHandler&lt;/strong&gt; &lt;span style="color:#000099;"&gt;implements&lt;/span&gt; SOAPHandler&amp;lt;SOAPMessageContext&amp;gt; {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Después le pedimos a NetBeans que realice los &lt;em&gt;imports&lt;/em&gt; necesarios y que implemente los métodos abstractos, con lo que nos aparecerá la definición de los métodos que tenemos que implementar:&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;"&gt;public Set&amp;lt;QName&amp;gt; getHeaders() {&lt;br /&gt;throw new UnsupportedOperationException("Not supported yet.");&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;public boolean handleMessage(SOAPMessageContext arg0) {&lt;br /&gt;throw new UnsupportedOperationException("Not supported yet.");&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;public boolean handleFault(SOAPMessageContext arg0) {&lt;br /&gt;throw new UnsupportedOperationException("Not supported yet.");&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;public void close(MessageContext arg0) {&lt;br /&gt;throw new UnsupportedOperationException("Not supported yet.");&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;En concreto vamos a centrarnos en el método &lt;span style="font-family:Courier New;"&gt;handleMessage&lt;/span&gt;, que se ocupará de capturar la salida o entrada del mensaje SOAP. Para el resto de métodos que no nos ocupan, vamos a definir una serie de valores de retorno por defecto:&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;"&gt;public Set&amp;lt;QName&amp;gt; getHeaders() {&lt;br /&gt;return Collections.EMPTY_SET;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;public boolean handleFault(SOAPMessageContext messageContext) {&lt;br /&gt;return true;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;public void close(MessageContext context) {&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;u&gt;Método handleMessage&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Como se puede observar, este método recibe un parámetro &lt;em&gt;SOAPMessageContext&lt;/em&gt;. Esta &lt;em&gt;interface&lt;/em&gt; da acceso al mensaje SOAP en cada petición o respuesta que se realiza en la comunicación, pudiendo modificar el contenido de este mensaje.&lt;br /&gt;&lt;br /&gt;Para obtener el mensaje, llamamos al método &lt;em&gt;getMessage()&lt;/em&gt;:&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;"&gt;SOAPMessage msg = messageContext.getMessage();&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;También necesitaremos conocer la dirección en la que viaja el mensaje, esto es, si se trata de un mensaje de salida o de entrada. En nuestro caso, necesitaremos modificar únicamente el mensaje de salida (petición). Podemos obtener esta información mediante el método get(), tal como se ilustra en el siguiente fragmento de código:&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;"&gt;boolean bolMsgSalida= (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); &lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;Por último, para añadir la cabecera a nuestro mensaje de salida, vamos a hacer uso de una serie de objetos que nos permitirán editar y modificar el mensaje SOAP:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;color:#666666;"&gt;// Obtenemos el contenedor del mensaje SOAP&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;SOAPPart sp = msg.getSOAPPart(); &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="color:#666666;"&gt;// A partir del contendor, obtenemos el nodo "Envelope"&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;SOAPEnvelope env = sp.getEnvelope();&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;color:#666666;"&gt;// Instanciamos un objeto SOAPFactory para crear cualquier elemento perteneciente a un mensaje SOAP, en nuestro caso, los nodos que formarán la cabecera&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;SOAPFactory soapFactory = SOAPFactory.newInstance(); &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;color:#666666;"&gt;// Definimos los elementos a incluir en el mensaje&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;SOAPElement soapElementoCabecera = soapFactory.createElement("cabeceraSOAP","","&lt;/span&gt;&lt;a href="http://switchoffandletsgo.blogspot.com/" target="_blank"&gt;&lt;span style="font-family:courier new,monospace;"&gt;http://switchoffandletsgo.blogspot.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:courier new,monospace;"&gt;"); &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;SOAPElement soapIpOrigen= soapFactory.createElement("ipOrigen","", "&lt;/span&gt;&lt;a href="http://switchoffandletsgo.blogspot.com/" target="_blank"&gt;&lt;span style="font-family:courier new,monospace;"&gt;http://switchoffandletsgo.blogspot.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:courier new,monospace;"&gt;"); &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;color:#666666;"&gt;// Rellenamos la información del nodo ipOrigen&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;soapIpOrigen.addTextNode("&lt;a href="http://192.168.0.1/" target="_blank"&gt;192.168.0.1&lt;/a&gt;");&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;color:#666666;"&gt;// Incluimos los elementos dentro de los objetos correspondientes&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;soapElementoCabecera.addChildElement(soapIpOrigen);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;SOAPHeader soapHeader = env.addHeader(); &lt;span style="color:#666666;"&gt;// Crea un elemento cabecera SOAP&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;"&gt;soapHeader.addChildElement(soapElementoCabecera);&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;Si no se ha producido ninguna excepción, el método devolverá &lt;span style="color:#000099;"&gt;&lt;em&gt;true&lt;/em&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Este manejador de mensajes SOAP, debería generar el siguiente nodo dentro del mensaje que se enviará al servidor:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&amp;lt;soap:Header&amp;gt;&lt;br /&gt;&amp;lt;cabeceraSOAP xmlns="&lt;/span&gt;&lt;a href="http://switchoffandletsgo.blogspot.com/" target="_blank"&gt;&lt;span style="font-family:courier new,monospace;"&gt;http://switchoffandletsgo.blogspot.com/&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:courier new,monospace;"&gt;"&amp;gt;&lt;br /&gt;&amp;lt;ipOrigen&amp;gt;&lt;span style="color:#00008b;"&gt;&lt;strong&gt;1921.168.0.1&lt;/strong&gt;&lt;/span&gt;&amp;lt;/ipOrigen&amp;gt;&lt;br /&gt;&amp;lt;/cabeceraSOAP&amp;gt;&lt;br /&gt;&amp;lt;/soap:Header&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Finalmente, debemos asignar el nuevo manejador al Web Service que queremos consumir. Para ello, accederemos a la carpeta "Web Service References" de nuestro proyecto de NetBeans, y pulsaremos con el botón derecho sobre el Web Service que queremos asignar. En el menú desplegable aparecerá la opción "Configure Handlers...".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_ifqy8Cf597Y/SE-7dtNW_TI/AAAAAAAAANw/x09tswO1fjM/s1600-h/netbeans_configurehandlers.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5210589412917181746" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://2.bp.blogspot.com/_ifqy8Cf597Y/SE-7dtNW_TI/AAAAAAAAANw/x09tswO1fjM/s320/netbeans_configurehandlers.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Únicamente tendremos que añadir "Add..." nuestra clase &lt;strong&gt;&lt;span style="font-family:courier new,monospace;"&gt;SumaNumerosHandler&lt;/span&gt;&lt;/strong&gt; y aceptar.&lt;br /&gt;&lt;br /&gt;A partir de este ejemplo, las opciones son infinitas, podemos modificar cualquier parte del mensaje SOAP, entrante o saliente, según sean nuestras necesidades. En todo caso, siempre que sea posible, la mejor opción reside en utilizar las clases y métodos que genera NetBeans a partir del WSDL del Web Service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-4465779924856007588?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/4465779924856007588/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=4465779924856007588' title='9 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4465779924856007588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4465779924856007588'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2008/06/modificar-un-mensaje-soap-desde-java.html' title='Modificar un mensaje SOAP desde Java'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ifqy8Cf597Y/SE-7dtNW_TI/AAAAAAAAANw/x09tswO1fjM/s72-c/netbeans_configurehandlers.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-3555194759770922021</id><published>2008-05-06T15:30:00.007+01:00</published><updated>2008-10-02T07:31:19.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Libros'/><title type='text'>Wish List</title><content type='html'>&lt;p&gt;Siguiendo la línea del post en el que enumero los libros que he leído últimamente, he decidido crear una pequeña lista de aquellos libros que me gustaría leer.&lt;/p&gt;&lt;div id="libros"&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr class="autor"&gt;&lt;td&gt;&lt;a href="http://lh6.ggpht.com/pablo.barrachina/SCGUOWTbqdI/AAAAAAAAAJw/ANMs_5VHQ4U/s144/junot_diaz.jpg"&gt;&lt;img id="idJunotDiaz" style="DISPLAY: block; HEIGHT: 40px" alt="" src="http://lh6.ggpht.com/pablo.barrachina/SCGUOWTbqdI/AAAAAAAAAJw/ANMs_5VHQ4U/s144/junot_diaz.jpg" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td colspan="2"&gt;Junot Díaz&lt;/td&gt;&lt;/tr&gt;&lt;tr class="libro"&gt;&lt;td&gt;&lt;a href="http://lh3.ggpht.com/pablo.barrachina/SCGTemTbqcI/AAAAAAAAAJo/dHnDgARGDyM/s144/junot_wao_cover.jpg"&gt;&lt;img id="idMaravillosaVidaWao" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; HEIGHT: 80px; TEXT-ALIGN: center" alt="" src="http://lh3.ggpht.com/pablo.barrachina/SCGTemTbqcI/AAAAAAAAAJo/dHnDgARGDyM/s144/junot_wao_cover.jpg" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;La maravillosa vida breve de Oscar Wao (Premio Pulitzer 2008).&lt;/b&gt;&lt;br /&gt;Las tribulaciones de un joven latino en Nueva Jersey. La esperada primera novela de Junot Díaz. La vida nunca ha sido fácil para Oscar Wao, un dominicano dulce, obeso y algo desastroso que vive con su madre y su hermana en un gueto de Nueva Jersey. Oscar sueña con convertirse en un J.R.R. Tolkien dominicano y, por encima de todo, con encontrar el amor de su vida. Pero puede que nunca alcance sus metas debido a una extraña maldición presente en su familia desde hace generaciones; enviando a los Wao a prisión, predisponiéndolos a accidentes trágicos y, ante todo, al desamor. Después del éxito internacional de Los Boys (Mondadori, 1996), Junot Díaz recrea, con humor, la experiencia de los dominicanos en Estados Unidos y la capacidad de perseverar en medio del desengaño amoroso y la pérdida.&lt;/td&gt;&lt;/tr&gt;&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr class="autor"&gt;&lt;td&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=1580826083962475520&amp;amp;postID=3555194759770922021#"&gt;&lt;img id="id332" style="DISPLAY: block; HEIGHT: 40px" alt="" src="http://www.blogger.com/post-edit.g?blogID=1580826083962475520&amp;amp;postID=3555194759770922021#" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td colspan="2"&gt;José Saramago&lt;/td&gt;&lt;/tr&gt;&lt;tr class="libro"&gt;&lt;td&gt;&lt;a href="http://www.blogger.com/post-edit.g?blogID=1580826083962475520&amp;amp;postID=3555194759770922021#"&gt;&lt;img id="id2323" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; HEIGHT: 80px; TEXT-ALIGN: center" alt="" src="http://www.blogger.com/post-edit.g?blogID=1580826083962475520&amp;amp;postID=3555194759770922021#" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Ensayo sobre la ceguera.&lt;/b&gt;La novela relata cómo una extraña epidemia de ceguera asola todo un país. Un pobre hombre que espera en su coche frente a un semáforo es el primero en padecerla y a partir de entonces se extiende cada vez más rápidamente entre la población. Los afectados son puestos en cuarentena, pero resulta imposible contener la enfermedad y las calles acaban llenándose de ciegos que son víctimas de este inexplicable mal consistente en una infinita ceguera blanca, como un mar de leche. A medida que aumenta el temor y la crisis en el país, gradualmente las personas se convierten en presa de los más bajos instintos del ser humano, llegando a los extremos más miserables.&lt;br /&gt;El profundo egoísmo que marca a los distintos personajes en la lucha por la supervivencia, se convierte en una parábola de la sociedad actual, trascendiendo así el significado de ceguera más allá de la propia enfermedad física.&lt;/td&gt;&lt;/tr&gt;&lt;/span&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-3555194759770922021?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/3555194759770922021/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=3555194759770922021' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/3555194759770922021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/3555194759770922021'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2008/05/wish-list.html' title='Wish List'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/pablo.barrachina/SCGUOWTbqdI/AAAAAAAAAJw/ANMs_5VHQ4U/s72-c/junot_diaz.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-7744292109920324599</id><published>2008-05-01T10:58:00.003+01:00</published><updated>2008-05-02T10:43:37.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stored procedures'/><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver'/><title type='text'>SQL Server: Metadatos (III) - Aplicación práctica - Buscar una palabra en BBDD</title><content type='html'>Siguiendo la línea de los últimos artículos acerca de la utilidad práctica de los metadatos del SQL Server, vamos a crear un script para buscar una cadena de texto en nuestra base de datos. Con unas pocas modificaciones, nos serviría también para buscar números u otro tipo de datos que admita el SQL Server.&lt;br /&gt;&lt;br /&gt;Para buscar la cadena en nuestra base de datos, vamos a seguir los siguientes pasos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Recorrer las tablas de la base de datos. Para cada tabla:&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Crear consulta de búsqueda sql = "Select count(*) From " + NOM_TABLA + " Where 1=0"&lt;/li&gt;&lt;li&gt;Recorrer los campos de la tabla actual. Para cada campo del tipo "char", "varchar" o "nvarchar":&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Agregar una condición de búsqueda a la cadena SQL (concatenada con OR):&lt;/li&gt;&lt;ol&gt;&lt;li&gt;sql = sql + ' OR ' + NOM_COLUMNA + ' like ''%' + CADENA_BUSCAR + '%'''&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Continuar con el siguiente campo.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Ejecutar la sentencia sql resultante de recorrer los campos de la tabla. &lt;/li&gt;&lt;ol&gt;&lt;li&gt;Si el resultado de la ejecución (count(*)) es mayor que cero, se ha encontrado el valor buscado.&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Continuar con la siguiente tabla.&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;Se puede observar que en la SQL que vamos a crear, se añade como condición WHERE la sentencia 1=0. Esto se hace porque se puede dar el caso que una tabla no tenga campos de texto, en ese caso, la única condición sería 1=0 que no se cumple nunca, y que no nos devolvería ningún registro (count = 0).&lt;br /&gt;En caso que la tabla contenga algún campo de tipo texto, se añadiría a la condición WHERE con el operador OR, y si se cumple que el campo contiene la cadena a buscar, el resultado de la condición WHERE sería true, con lo que el count(*) devolvería uno o más registros. Por ej.:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#006600;"&gt;Select count(*) From Usuarios Where 1=0&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;OR Nombre like '%Pablo%'&lt;/span&gt;&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;En este caso, el texto coloreado en verde es añadido por el script como un literal, mientras que el texto rojo se añade en función de los campos que tiene cada tabla. Si la condición marcada en rojo se cumple, toda la condición WHERE será verdadera.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como siempre, debemos incluir al inicio del script, la instrucción Use, con tal de seleccionar la BBDD en la que queremos trabajar: &lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:courier new,monospace;color:#3333ff;"&gt;Use [miBaseDeDatos]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;1. Recorrer las tablas de la Base de datos.&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para recorrer las tablas de nuestra base de datos, vamos a hacer uso de la información de Metadatos contenida en &lt;span style="font-size:85%;color:#008000;"&gt;information_schema.tables&lt;/span&gt;. Podemos añadir una condición &lt;span style="font-size:85%;color:#0000ff;"&gt;WHERE &lt;/span&gt;para filtrar las tablas en las que queremos buscar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;DECLARE&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt; CURSOR_SELECT&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;CURSOR&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:blue;"&gt;FOR&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;SELECT&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt; TABLE_NAME&lt;/span&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;FROM&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;information_schema.tables&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;span style="color:green;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;OPEN&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;span style="color:#000000;"&gt; CURSOR_SELECT &lt;/span&gt;&lt;span style="color:blue;"&gt;FETCH&lt;/span&gt;&lt;span style="color:#000000;"&gt; NEXT &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt;&lt;span style="color:#000000;"&gt; CURSOR_SELECT &lt;/span&gt;&lt;span style="color:blue;"&gt;INTO&lt;/span&gt;&lt;span style="color:#000000;"&gt; @NOM_TABLA&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-size:10;color:green;"&gt;-- Recorre las tablas de la base de datos&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;WHILE&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:fuchsia;"&gt;@@FETCH_STATUS&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;=&lt;/span&gt;&lt;span style="color:#000000;"&gt; 0 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;BEGIN&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-family:Times New Roman;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-size:10;color:green;"&gt;&lt;span style="font-size:0;"&gt;&lt;/span&gt;/* Realiza las operaciones necesarias */&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"   style="font-size:10;color:blue;"&gt;FETCH&lt;/span&gt;&lt;span lang="EN-GB"  style="font-size:10;"&gt;&lt;span style="color:#000000;"&gt; NEXT &lt;/span&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt;&lt;span style="color:#000000;"&gt; CURSOR_SELECT &lt;/span&gt;&lt;span style="color:blue;"&gt;INTO&lt;/span&gt;&lt;span style="color:#000000;"&gt; @NOM_TABLA&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-size:10;color:blue;"&gt;END&lt;/span&gt;&lt;span style="font-size:10;color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-size:10;color:blue;"&gt;&lt;/span&gt;&lt;span style="font-size:10;color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-size:10;color:green;"&gt;/* Libera la memoria */&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-size:10;color:blue;"&gt;CLOSE&lt;/span&gt;&lt;span style="color:#000000;"&gt;&lt;span style="font-size:10;"&gt; CURSOR_SELECT&lt;/span&gt;&lt;span style="font-size:10;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-size:10;color:blue;"&gt;DEALLOCATE&lt;/span&gt;&lt;span style="font-size:10;"&gt;&lt;span style="color:#000000;"&gt; CURSOR_SELECT&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color:#000000;"&gt;1.1. Crear consulta de búsqueda.&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;/span&gt;Por&lt;span style="font-size:85%;"&gt; cada tabla, vamos a crear una consulta SQL que servirá para localizar la palabra que estamos buscando dentro de la tabla actual. Para ello constuiremos una cadena que se compone de u&lt;/span&gt;&lt;span style="font-size:85%;"&gt;na parte fija #&lt;strong&gt;&lt;span style="color:#006600;"&gt;Select count(*) From NOM_TABLA Where 1=0&lt;/span&gt;&lt;/strong&gt; # y a la que añadiremos los distintos campos de la base de datos.&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;p&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;print&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; &lt;span style="color:red;"&gt;'-----------------------'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;print&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; &lt;span style="color:red;"&gt;'TABLA: '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; @NOM_TABLA&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:blue;"   &gt;print&lt;/span&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt; &lt;span style="color:red;"&gt;'-----------------------'&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:green;"   &gt;-- Crea la cadena de búsqueda&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;SET&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; @PROXIMA_SENTENCIA &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;'SELECT Count(*) FROM '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; @NOM_TABLA &lt;span style="color:gray;"&gt;+&lt;/span&gt; &lt;span style="color:red;"&gt;' WHERE 1=0'&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;Además aprovechamos para imprimir por consola el nombre de la tabla.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.2. Recorrer los campos de la tabla actual.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para recorrer los campos de una tabla, vamos a hacer uso de la información contenida en &lt;span style="font-size:85%;color:#008000;"&gt;information_schema.columns&lt;/span&gt;. Por simplificar, vamos a limitar la búsqueda a campos de tipo texto (nvarchar, varchar y char).&lt;br /&gt;En cada iteración, se añade una condición de búsqueda del tipo " &lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="color:#3333ff;"&gt;OR &lt;/span&gt;&lt;span style="font-family:arial,sans-serif;"&gt;Nombre_Columna&lt;/span&gt; &lt;span style="color:#6633ff;"&gt;like&lt;/span&gt; &lt;span style="color:#3333ff;"&gt;'%&lt;/span&gt;&lt;span style="font-family:arial,sans-serif;"&gt;Cadena a buscar&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;%'&lt;/span&gt;&lt;/span&gt; ".&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:green;"   &gt;-- Crea el cursor de campos de búsqueda&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;DECLARE&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; CURSOR_CAMPOS&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;CURSOR&lt;/span&gt; &lt;span style="color:blue;"&gt;FOR&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; COLUMN_NAME&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; &lt;span style="color:green;"&gt;information_schema.columns&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;WHERE&lt;/span&gt; TABLE_NAME &lt;span style="color:gray;"&gt;like&lt;/span&gt; @NOM_TABLA &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-tab-count: 1"&gt;&lt;/span&gt;&lt;span style="color:gray;"&gt;AND&lt;/span&gt; &lt;span style="color:gray;"&gt;(&lt;/span&gt;DATA_TYPE &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;'nvarchar'&lt;/span&gt; &lt;span style="color:gray;"&gt;OR&lt;/span&gt; DATA_TYPE &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;'varchar'&lt;/span&gt; &lt;span style="color:gray;"&gt;OR&lt;/span&gt; DATA_TYPE &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;'char'&lt;/span&gt;&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:gray;"   &gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;OPEN&lt;/span&gt; CURSOR_CAMPOS &lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_CAMPOS &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @NOM_COLUMNA&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;WHILE&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;@@FETCH_STATUS&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 0 &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;BEGIN&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-tab-count: 1"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;SET&lt;/span&gt; @PROXIMA_SENTENCIA &lt;span style="color:gray;"&gt;=&lt;/span&gt; @PROXIMA_SENTENCIA &lt;span style="color:gray;"&gt;+&lt;/span&gt; &lt;span style="color:red;"&gt;' OR '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; @NOM_COLUMNA &lt;span style="color:gray;"&gt;+&lt;/span&gt; &lt;span style="color:red;"&gt;' like ''%'&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; @CADENA_BUSCAR &lt;span style="color:gray;"&gt;+&lt;/span&gt; &lt;span style="color:red;"&gt;'%'''&lt;/span&gt;&lt;span style="mso-tab-count: 2"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_CAMPOS &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @NOM_COLUMNA&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:blue;"   &gt;END&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:green;"&gt;-- Libera memoria&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;CLOSE&lt;/span&gt; CURSOR_CAMPOS&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt;&lt;span style="color:blue;"&gt;DEALLOCATE&lt;/span&gt; CURSOR_CAMPOS&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.3. Ejecutar sentencia.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;El siguiente paso, será ejecutar la sentencia que se ha construido para la tabla actual. Se imprimirá el resultado de registros obtenidos, si el resultado es mayor de cero, se habrá encontrado la palabra buscada.&lt;br /&gt;&lt;br /&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:green;"   &gt;-- Ejecuta la sentencia para comprobar si obtiene algún resultado&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:blue;"   &gt;SELECT&lt;/span&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt; @sql &lt;span style="color:gray;"&gt;=&lt;/span&gt; &lt;span style="color:red;"&gt;'DECLARE CURSOR_SENTENCIA CURSOR FOR '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; @PROXIMA_SENTENCIA&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;EXEC&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; &lt;span style="color:maroon;"&gt;sp_executesql&lt;/span&gt; @sql&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;OPEN&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; CURSOR_SENTENCIA &lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_SENTENCIA &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @REGISTROS&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;WHILE&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; &lt;span style="color:fuchsia;"&gt;@@FETCH_STATUS&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 0 &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;color:blue;"   &gt;BEGIN&lt;/span&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt; &lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;print&lt;/span&gt; &lt;span style="color:red;"&gt;'Registros '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;str&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@REGISTROS&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB; mso-no-proof: yesfont-family:'Courier New';font-size:10;"  &gt;&lt;span style="mso-spacerun: yes"&gt;&lt;/span&gt;&lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_SENTENCIA &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @REGISTROS&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:blue;"   &gt;END&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:green;"   &gt;-- Libera memoria&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; mso-layout-grid-align: none"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:blue;"   &gt;CLOSE&lt;/span&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt; CURSOR_SENTENCIA&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;color:blue;"   &gt;DEALLOCATE&lt;/span&gt;&lt;span style="mso-no-proof: yes;font-family:'Courier New';font-size:10;"  &gt; CURSOR_SENTENCIA&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1.4. Continuar con la siguiente tabla.&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;Continuará con la siguiente tabla, repitiendo los pasos 1.1., 1.2. y 1.3.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Este ejemplo puede completarse con otros tipos de datos, seleccionando la manera adecuada para compararlos con el tipo de datos buscado.&lt;br /&gt;&lt;br /&gt;Espero que os sea de utilidad!!&lt;br /&gt;&lt;br /&gt;Código completo:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Use [miBaseDeDatos]&lt;br /&gt;&lt;br /&gt;DECLARE @SQL NVARCHAR(4000)&lt;br /&gt;DECLARE @PROXIMA_SENTENCIA NVARCHAR(3500)&lt;br /&gt;DECLARE @NOM_TABLA NVARCHAR(255)&lt;br /&gt;DECLARE @NOM_COLUMNA NVARCHAR(255)&lt;br /&gt;DECLARE @REGISTROS int&lt;br /&gt;DECLARE @CADENA_BUSCAR NVARCHAR(255)&lt;br /&gt;SET @CADENA_BUSCAR = 'prueba'&lt;br /&gt;&lt;br /&gt;DECLARE CURSOR_SELECT&lt;br /&gt;CURSOR FOR&lt;br /&gt;SELECT TABLE_NAME&lt;br /&gt;FROM information_schema.tables&lt;br /&gt;&lt;br /&gt;OPEN CURSOR_SELECT FETCH NEXT FROM CURSOR_SELECT INTO @NOM_TABLA&lt;br /&gt;-- Recorre las tablas de la base de datos&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;BEGIN&lt;br /&gt;print '-----------------------'&lt;br /&gt;print 'TABLA: ' + @NOM_TABLA&lt;br /&gt;print '-----------------------'&lt;br /&gt;-- Crea la cadena de búsqueda&lt;br /&gt;SET @PROXIMA_SENTENCIA = 'SELECT Count(*) FROM ' + @NOM_TABLA + ' WHERE 1=0'&lt;br /&gt;-- Crea el cursor de campos de búsqueda&lt;br /&gt;DECLARE CURSOR_CAMPOS&lt;br /&gt;CURSOR FOR&lt;br /&gt;SELECT COLUMN_NAME&lt;br /&gt;FROM information_schema.columns&lt;br /&gt;WHERE TABLE_NAME like @NOM_TABLA&lt;br /&gt;AND (DATA_TYPE = 'nvarchar' OR DATA_TYPE = 'varchar' OR DATA_TYPE = 'char')&lt;br /&gt;OPEN CURSOR_CAMPOS FETCH NEXT FROM CURSOR_CAMPOS INTO @NOM_COLUMNA&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;BEGIN&lt;br /&gt;SET @PROXIMA_SENTENCIA = @PROXIMA_SENTENCIA + ' OR ' + @NOM_COLUMNA + ' like ''%' + @CADENA_BUSCAR + '%'''&lt;br /&gt;FETCH NEXT FROM CURSOR_CAMPOS INTO @NOM_COLUMNA&lt;br /&gt;END&lt;br /&gt;-- Libera memoria&lt;br /&gt;CLOSE CURSOR_CAMPOS&lt;br /&gt;DEALLOCATE CURSOR_CAMPOS&lt;br /&gt;print @PROXIMA_SENTENCIA&lt;br /&gt;-- Ejecuta la sentencia para comprobar si obtiene algún resultado&lt;br /&gt;SELECT @sql = 'DECLARE CURSOR_SENTENCIA CURSOR FOR ' + @PROXIMA_SENTENCIA&lt;br /&gt;EXEC sp_executesql @sql&lt;br /&gt;OPEN CURSOR_SENTENCIA FETCH NEXT FROM CURSOR_SENTENCIA INTO @REGISTROS&lt;br /&gt;WHILE @@FETCH_STATUS = 0&lt;br /&gt;BEGIN&lt;br /&gt;print 'Registros ' + str(@REGISTROS)&lt;br /&gt;FETCH NEXT FROM CURSOR_SENTENCIA INTO @REGISTROS&lt;br /&gt;END&lt;br /&gt;-- Libera memoria&lt;br /&gt;CLOSE CURSOR_SENTENCIA&lt;br /&gt;DEALLOCATE CURSOR_SENTENCIA&lt;br /&gt;FETCH NEXT FROM CURSOR_SELECT INTO @NOM_TABLA&lt;br /&gt;END&lt;br /&gt;&lt;br /&gt;/* Libera la memoria */&lt;br /&gt;CLOSE CURSOR_SELECT&lt;br /&gt;DEALLOCATE CURSOR_SELECT &lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-7744292109920324599?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/7744292109920324599/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=7744292109920324599' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/7744292109920324599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/7744292109920324599'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2008/05/sql-server-metadatos-iii-aplicacin.html' title='SQL Server: Metadatos (III) - Aplicación práctica - Buscar una palabra en BBDD'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-3264390479113303164</id><published>2008-04-02T21:50:00.001+01:00</published><updated>2008-04-02T15:56:14.226+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stored procedures'/><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver'/><title type='text'>SQL Server: Metadatos (II) - Aplicación práctica - Vaciar base de datos</title><content type='html'>&lt;span style="font-size:85%;"&gt;Continuando con el artículo en el que hablaba de la utilidad de los Metadatos para obtener información de nuestra base de datos, vamos a escribir un procedimiento almacenado cuya finalidad será la de vaciar todo el contenido (datos) de nuestra base de datos.&lt;br /&gt;&lt;br /&gt;Este procedimiento resultará muy útil en aquellas bases de datos que contengan multitud de tablas relacionadas entre si. En estos casos, nos vemos obligados a ir eliminando los datos tabla a tabla, respetando las reglas de integridad, lo cual se convierte en una tarea muy complicada. Para automatizar este proceso seguiremos los siguientes pasos:&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Deshabilitar las restricciones de cada tabla de la base de datos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Vaciar los registros de las distintas tablas de la base de datos.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;Volver a habilitar las restricciones definidas en las tablas de la base de datos.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:85%;"&gt;Y por supuesto, realizar una copia de seguridad de nuestra base de datos antes de ejecutar el script, por si algo fuese mal. Además como medida de seguridad adicional, podemos incluir al inicio del script, la instrucción Use, con tal de seleccionar la BBDD en la que queremos trabajar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;color:#3333ff;"&gt;Use [miBaseDeDatos]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;1. Deshabilitar restricciones de las tablas de la BBDD.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para ello vamos a recorrer todas las restricciones de nuestra base de datos con la ayuda de la información contenida en &lt;span style="font-family:courier new,monospace;color:#008000;"&gt;information_schema.table_constraints&lt;/span&gt;. Además vamos a aprovechar para deshabilitar cada restricción a medida que vamos recorriendo el cursor.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="EN-GB"  style="color:blue;"&gt;DECLARE&lt;/span&gt;&lt;span lang="EN-GB"&gt; CURSOR_ALTER &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;CURSOR&lt;/span&gt; &lt;span style="color:blue;"&gt;FOR&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:red;"&gt;'ALTER TABLE '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; TABLE_NAME &lt;span style="color:gray;"&gt;+&lt;/span&gt; &lt;span style="color:red;"&gt;' NOCHECK CONSTRAINT '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; CONSTRAINT_NAME&lt;span style="color:gray;"&gt;,&lt;/span&gt; TABLE_NAME&lt;span style="color:gray;"&gt;,&lt;/span&gt; CONSTRAINT_NAME &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; &lt;span style="color:green;"&gt;information_schema.table_constraints&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;ORDER&lt;/span&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; TABLE_NAME&lt;span style="color:gray;"&gt;,&lt;/span&gt; CONSTRAINT_NAME&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;OPEN&lt;/span&gt; CURSOR_ALTER &lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_ALTER &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @PROXIMA_SENTENCIA&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_TABLA&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_CONSTRAINT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;WHILE&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;@@FETCH_STATUS&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 0 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="color:blue;"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;exec&lt;/span&gt; &lt;span style="color:gray;"&gt;(&lt;/span&gt;@PROXIMA_SENTENCIA&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_ALTER &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @PROXIMA_SENTENCIA &lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_TABLA&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_CONSTRAINT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:blue;"&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="color:blue;"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="color:green;"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;/* Libera la memoria */&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;CLOSE&lt;/span&gt; CURSOR_ALTER&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;DEALLOCATE&lt;/span&gt; CURSOR_ALTER&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;2. Vaciar los registros de las distintas tablas de la base de datos.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;De igual forma que en el paso anterior, vamos a recorrer todas las tablas de nuestra base de datos y eliminar sus registros. Para ello, utilizaremos la información que nos brinda &lt;span style="font-family:courier new,monospace;color:#008000;"&gt;information_schema.tables&lt;/span&gt;. Es muy importante que limitemos de alguna forma las tablas que se van a vaciar, por ejemplo, si las tablas de nuestra aplicación empiezan por &lt;span style="font-family:Courier New;color:#0000ff;"&gt;TBL_&lt;/span&gt; podríamos especificar en la condición &lt;span style="font-family:courier new,monospace;color:#0000ff;"&gt;WHERE&lt;/span&gt; que filtre por aquellas tablas que empiezan con este nombre. En el código que tenemos a continuación, se eliminarán los registros de todas las tablas excepto de &lt;span style="color:#ff0000;"&gt;sysdiagrams&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="EN-GB"  style="color:blue;"&gt;DECLARE&lt;/span&gt;&lt;span lang="EN-GB"&gt; CURSOR_DELETE&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;CURSOR&lt;/span&gt; &lt;span style="color:blue;"&gt;FOR&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:red;"&gt;'DELETE FROM '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; TABLE_NAME, TABLE_NAME &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; &lt;span style="color:green;"&gt;information_schema.tables&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="color:green;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:#0000ff;"&gt;WHERE&lt;/span&gt; TABLE_NAME &lt;span style="color:#808080;"&gt;not&lt;/span&gt; &lt;span style="color:#808080;"&gt;like&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;'sysdiagrams'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;ORDER&lt;/span&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; TABLE_NAME&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;OPEN&lt;/span&gt; CURSOR_DELETE &lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_DELETE &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @SQL_DELETE&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_TABLA&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;WHILE&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;@@FETCH_STATUS&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 0 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="color:blue;"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;exec&lt;/span&gt; &lt;span style="color:gray;"&gt;(&lt;/span&gt;@SQL_DELETE&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_DELETE &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @SQL_DELETE&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_TABLA&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:blue;"&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="color:blue;"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="color:green;"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;/* Libera la memoria */&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;CLOSE&lt;/span&gt; CURSOR_DELETE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;DEALLOCATE&lt;/span&gt; CURSOR_DELETE&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-size:85%;"&gt;&lt;strong&gt;3. Habilitar restricciones de las tablas de la BBDD.&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;Vamos a realizar el proceso inverso al seguido en el paso 1. De nuevo, haremos uso de la información contenida en &lt;span style="font-family:Courier New;"&gt;&lt;span style="font-family:courier new,monospace;color:#008000;"&gt;information_schema.table_constraints&lt;/span&gt;&lt;/span&gt;. En este caso, utilizaremos la instrucción &lt;span style="font-family:courier new,monospace;color:#ff0000;"&gt;CHECK CONSTRAINT&lt;/span&gt;, que vuelve a activar la restricción.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span lang="EN-GB"   style="font-size:85%;color:blue;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family:Courier New;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="EN-GB"  style="color:blue;"&gt;DECLARE&lt;/span&gt;&lt;span lang="EN-GB"&gt; CURSOR_ALTER &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;CURSOR&lt;/span&gt; &lt;span style="color:blue;"&gt;FOR&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;SELECT&lt;/span&gt; &lt;span style="color:red;"&gt;'ALTER TABLE '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; TABLE_NAME &lt;span style="color:gray;"&gt;+&lt;/span&gt; &lt;span style="color:red;"&gt;' CHECK CONSTRAINT '&lt;/span&gt; &lt;span style="color:gray;"&gt;+&lt;/span&gt; CONSTRAINT_NAME&lt;span style="color:gray;"&gt;,&lt;/span&gt; TABLE_NAME&lt;span style="color:gray;"&gt;,&lt;/span&gt; CONSTRAINT_NAME &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;FROM&lt;/span&gt; &lt;span style="color:green;"&gt;information_schema.table_constraints&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;ORDER&lt;/span&gt; &lt;span style="color:blue;"&gt;BY&lt;/span&gt; TABLE_NAME&lt;span style="color:gray;"&gt;,&lt;/span&gt; CONSTRAINT_NAME&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;OPEN&lt;/span&gt; CURSOR_ALTER &lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_ALTER &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @PROXIMA_SENTENCIA&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_TABLA&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_CONSTRAINT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;WHILE&lt;/span&gt; &lt;span style="color:fuchsia;"&gt;@@FETCH_STATUS&lt;/span&gt; &lt;span style="color:gray;"&gt;=&lt;/span&gt; 0 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="color:blue;"&gt;BEGIN&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-GB"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;exec&lt;/span&gt; &lt;span style="color:gray;"&gt;(&lt;/span&gt;@PROXIMA_SENTENCIA&lt;span style="color:gray;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;FETCH&lt;/span&gt; NEXT &lt;span style="color:blue;"&gt;FROM&lt;/span&gt; CURSOR_ALTER &lt;span style="color:blue;"&gt;INTO&lt;/span&gt; @PROXIMA_SENTENCIA &lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_TABLA&lt;span style="color:gray;"&gt;,&lt;/span&gt; @NOM_CONSTRAINT&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span lang="EN-GB"&gt;&lt;/span&gt;&lt;span style="font-size:85%;color:blue;"&gt;END&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="color:blue;"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="color:green;"&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;"&gt;/* Libera la memoria */&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;CLOSE&lt;/span&gt; CURSOR_ALTER&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color:blue;"&gt;DEALLOCATE&lt;/span&gt; CURSOR_ALTER&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Una vez ejecutados los tres pasos, habremos vaciado toda la información de nuestra base de datos. Como recomendación, se deberían limitar aquellas tablas de las que vamos a borrar los registros mediante la correspondiente instrucción dentro de la clausula &lt;span style="font-family:Courier New;color:#0000ff;"&gt;WHERE&lt;/span&gt; (en el paso 2). También es interesante incluir comentarios y sentencias &lt;span style="color:#0000ff;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;print&lt;/span&gt; &lt;/span&gt;que nos den una idea de la acción que esta realizando en cada momento el script, y de aquellas tablas que han sufrido cambios.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-3264390479113303164?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/3264390479113303164/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=3264390479113303164' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/3264390479113303164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/3264390479113303164'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2008/04/sql-server-metadatos-ii-aplicacin.html' title='SQL Server: Metadatos (II) - Aplicación práctica - Vaciar base de datos'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-6381014725235523099</id><published>2008-01-22T13:12:00.007+01:00</published><updated>2008-09-24T19:39:12.617+01:00</updated><title type='text'>Libros</title><content type='html'>&lt;p&gt;No todo iba a ser programación... Aprovecho este blog para añadir algunos libros que he leído, así como una valoración (muy personal) del mismo. Que nadie piense que quiero hacer critica literaria, simplemente quiero reflejar si me ha gustado.&lt;/p&gt; &lt;div id="libros"&gt; &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr class="autor"&gt; &lt;td&gt;&lt;a href="http://2.bp.blogspot.com/_ifqy8Cf597Y/R6Y73gev0eI/AAAAAAAAAFw/HEMpZPI-PAg/s1600-h/20060321142503-eslava.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162879847624593890" style="display: block; height: 40px" alt="" src="http://2.bp.blogspot.com/_ifqy8Cf597Y/R6Y73gev0eI/AAAAAAAAAFw/HEMpZPI-PAg/s320/20060321142503-eslava.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td colspan="2"&gt;Juan Eslava Galán&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y7Zwev0dI/AAAAAAAAAFo/3vUBEL7cwEc/s1600-h/en+busca+del+unicornio.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162879336523485650" style="display: block; margin: 0px auto 10px; cursor: hand; height: 80px; text-align: center" alt="" src="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y7Zwev0dI/AAAAAAAAAFo/3vUBEL7cwEc/s320/en+busca+del+unicornio.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;En busca del Unicornio.&lt;/b&gt;&lt;br&gt;La novela, ambientada a fines del siglo XV, narra la historia de un personaje ficticio a quien se envía en busca del cuerno del unicornio, que se supone aumentará la virilidad del rey Enrique IV de Castilla, llamado el Impotente. En la trama argumental, habilísima y muy amena, dentro de una escrupulosa fidelidad a la ambientación histórica, se suceden las más curiosas e inesperadas peripecias, siempre con un fondo emotivo y poético que da fuerza y encanto mítico al relato. El autor ha logrado un estilo que es un maravilloso equilibrio entre la soltura y agilidad narrativa y el sabor arcaico que requería el tema. En suma, una deliciosa novela de aventuras en donde coexisten lo fantástico, lo humorístico y lo dramático.&lt;br&gt;&lt;/td&gt; &lt;td&gt;10/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr class="autor"&gt; &lt;td&gt;&lt;a href="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y8nwev0gI/AAAAAAAAAGA/NGsmz17dTGM/s1600-h/kenfollet.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162880676553282050" style="display: block; height: 40px" alt="" src="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y8nwev0gI/AAAAAAAAAGA/NGsmz17dTGM/s320/kenfollet.JPG" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td colspan="2"&gt;Ken Follet&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://1.bp.blogspot.com/_ifqy8Cf597Y/R6Y6qQev0cI/AAAAAAAAAFg/kFHMOElDLNU/s1600-h/libro4.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162878520479699394" style="display: block; margin: 0px auto 10px; cursor: hand; height: 80px; text-align: center" alt="" src="http://1.bp.blogspot.com/_ifqy8Cf597Y/R6Y6qQev0cI/AAAAAAAAAFg/kFHMOElDLNU/s320/libro4.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Los pilares de la Tierra.&lt;/b&gt;&lt;br&gt;El gran maestro de la narrativa y el suspense nos transporta a la Edad Media, a un fascinante mundo de reyes, damas, caballeros, pugnas feudales, castillos y ciudades amuralladas. El amor y la muerte se entrecruzan vibrantemente en este magistral tapiz cuyo centro es la construcción de una catedral gótica. La historia se inicia con el ahorcamiento público de un inocente y finaliza con la humillación de un rey. Los pilares de la tierra es la obra maestra de Ken Follett y constituye una excepcional evocación de una época de violentas pasiones.&lt;/td&gt; &lt;td&gt;10/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr class="autor"&gt; &lt;td&gt;&lt;a href="http://4.bp.blogspot.com/_ifqy8Cf597Y/R6Y8xAev0hI/AAAAAAAAAGI/N4JPlWsdG70/s1600-h/matilde_asensi.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162880835467072018" style="display: block; height: 40px" alt="" src="http://4.bp.blogspot.com/_ifqy8Cf597Y/R6Y8xAev0hI/AAAAAAAAAGI/N4JPlWsdG70/s320/matilde_asensi.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td colspan="2"&gt;Matilde Asensi&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y6Swev0bI/AAAAAAAAAFY/9j8DHEK8akA/s1600-h/iacobus.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162878116752773554" style="display: block; margin: 0px auto 10px; cursor: hand; height: 80px; text-align: center" alt="" src="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y6Swev0bI/AAAAAAAAAFY/9j8DHEK8akA/s320/iacobus.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Iacobus.&lt;/b&gt;&lt;br&gt;Galcerán de Born; monje de una orden militar, es enviado por el papa Juan XXII a investirgar la misteriosa muerte de su antecesor Clemente V y la del rey Feliope IV de Francia, tras la ejecución del Gran Maestre de la Orden del Temple. a partir de aquí se inicia una vertiginosa aventura que nos conducirá de la sede papal de Aviñon a París y de allí, a lo largo del Camino de santiago, hasta el confín del mundo, Finisterre.&lt;br&gt;&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y5cwev0aI/AAAAAAAAAFQ/MF0c89kvumo/s1600-h/caton.gif"&gt;&lt;img id="BLOGGER_PHOTO_ID_5162877189039837602" style="display: block; margin: 0px auto 10px; cursor: hand; height: 80px; text-align: center" alt="" src="http://3.bp.blogspot.com/_ifqy8Cf597Y/R6Y5cwev0aI/AAAAAAAAAFQ/MF0c89kvumo/s320/caton.gif" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;El último Catón.&lt;/b&gt;&lt;br&gt;Tras el éxito de El salón de ámbar e Iacobus, Matilde Asensi nos presenta una nueva novela tan impactante como aquellas. Todo comienza cuando una científica que trabaja para el Vaticano es llamada para descifrar las extrañas señales aparecidas en el cuerpo de un etíope fallecido en extrañas circunstancias. A partir de aquí se desplegará una trama trepidante y que pondrá al descubierto una siniestra conspiración para atentar contra las reliquias más sagradas de la Iglesia.&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://1.bp.blogspot.com/_ifqy8Cf597Y/R5XeVrO3Z3I/AAAAAAAAAEw/MQYjf2rBW90/s1600-h/216VIc7t9oL.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5158273412186466162" style="display: block; margin: 0px auto 10px; cursor: hand; height: 80px; text-align: center" alt="" src="http://1.bp.blogspot.com/_ifqy8Cf597Y/R5XeVrO3Z3I/AAAAAAAAAEw/MQYjf2rBW90/s200/216VIc7t9oL.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Todo bajo el cielo.&lt;/b&gt;&lt;br&gt;Elvira, una pintora española afincada en el París de las vanguardias, recibe la noticia de que su marido, con el que está casada por amistad, ha muerto en su casa de Shanghai en extrañas circunstancias.&lt;br&gt;Acompañada por su sobrina, zarpa desde Marsella en barco para recuperar el cadáver de Remy sin saber que éste es sólo el principio de una gran aventura por China en busca del tesoro del Primer Emperador. Sin tiempo para reaccionar se verá perseguida por los mafiosos de la Banda Verde y los eunucos imperiales, y contará con la ayuda del anticuario Lao Jiang y su sabiduría oriental en un gran recorrido que les llevará desde Shangai hasta Xián.&lt;/td&gt; &lt;td&gt;8/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr class="autor"&gt; &lt;td&gt;&lt;a href="http://1.bp.blogspot.com/_ifqy8Cf597Y/R_yMbcMNcRI/AAAAAAAAAIY/h9vGk41-PgA/s320/john_boyne.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5187175273875730706" style="display: block; height: 40px" alt="" src="http://1.bp.blogspot.com/_ifqy8Cf597Y/R_yMbcMNcRI/AAAAAAAAAIY/h9vGk41-PgA/s320/john_boyne.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td colspan="2"&gt;John Boyne&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="httphttp://lh6.ggpht.com/pablo.barrachina/R_yNCMMNcSI/AAAAAAAAAIg/Myx-z6p-O3Q/s144/pijama_rayas.JPG"&gt;&lt;img id="imgPijamaRayas" style="display: block; margin: 0px auto 10px; cursor: hand; height: 80px; text-align: center" alt="" src="http://lh6.ggpht.com/pablo.barrachina/R_yNCMMNcSI/AAAAAAAAAIg/Myx-z6p-O3Q/s144/pijama_rayas.JPG" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;El niño con el pijama de rayas.&lt;/b&gt;&lt;br&gt;Aunque el uso habitual de un texto como éste es describir las características de la obra, por una vez nos tomaremos la libertad de hacer una excepción a la norma establecida. No sólo porque el libro que tienes en tus manos es muy difícil de definir, sino porque estamos convencidos de que explicar su contenido estropearía la experiencia de la lectura. Creemos que es importante empezar esta novela sin saber de qué trata.&lt;br&gt;No obstante, si decides embarcarte en la aventura, debes saber que acompañarás a Bruno, un niño de nueve años, cuando se muda con su familia a una casa junto a una cerca. Cercas como ésa existen en muchos sitios del mundo, sólo deseamos que no te encuentres nunca con una. Por último, cabe aclarar que este libro no es sólo para adultos; también lo pueden leer, y sería recomendable que lo hicieran, niños a partir de los trece años de edad.&lt;/td&gt; &lt;td&gt;7/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr class="autor"&gt; &lt;td&gt;&lt;a href="http://lh3.ggpht.com/pablo.barrachina/SBrMF-ulykI/AAAAAAAAAIw/DETf88U-tz0/s144/mendoza.jpg"&gt;&lt;img id="EduardoMendoza" style="display: block; height: 40px" alt="" src="http://lh3.ggpht.com/pablo.barrachina/SBrMF-ulykI/AAAAAAAAAIw/DETf88U-tz0/s144/mendoza.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td colspan="2"&gt;Eduardo Mendoza&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://lh6.ggpht.com/pablo.barrachina/SBrMBuulyjI/AAAAAAAAAIo/8VIsTzYkVZI/s144/_medel_asombroso_viaje_de_pomponio.jpg"&gt;&lt;img id="imgPomponioFlato" style="display: block; margin: 0px auto 10px; cursor: hand; height: 80px; text-align: center" alt="" src="http://lh6.ggpht.com/pablo.barrachina/SBrMBuulyjI/AAAAAAAAAIo/8VIsTzYkVZI/s144/_medel_asombroso_viaje_de_pomponio.jpg" border="0"&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;El asombroso viaje de Pomponio Flato&lt;/b&gt;&lt;br&gt;En el siglo I de nuestra era, Pomponio Flato viaja por los confines del Imperio romano en busca de unas aguas de efectos portentosos. El azar y la precariedad de su fortuna lo llevan a Nazaret, donde va a ser ejecutado el carpintero del pueblo, convicto del brutal asesinato de un rico ciudadano. Muy a su pesar, Pomponio se ve inmerso en la solución del crimen, contratado por el más extraordinario de los clientes: el hijo del carpintero, un niño candoroso y singular, convencido de la inocencia de su padre, hombre en apariencia pacífico y taciturno, que oculta, sin embargo, un gran secreto. Cruce de novela histórica, novela policíaca, hagiografía y parodia de todas ellas, 'El asombroso viaje de Pomponio Flato' es la obra más insólita e inesperada de Eduardo Mendoza, y también una de las más ferozmente divertidas. Como en el Quijote se ponían en solfa los libros de caballerías, aquí se ajustan las cuentas a muchas novelas de consumo, y se construye, al mismo tiempo, una nueva modalidad del género más característico de Eduardo Mendoza: la trama detectivesca original e irónica, que desemboca en una sátira literaria y en una desternillante creación de inagotable vitalidad novelesca.&lt;/td&gt; &lt;td&gt;8/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr class="autor"&gt; &lt;td&gt;&lt;a href="http://lh4.ggpht.com/pablo.barrachina/SNqJQcVQoFI/AAAAAAAAAbU/mS7-1T-s93Y/HermanHesse%5B10%5D.jpg"&gt;&lt;img height="52" alt="HermanHesse" src="http://lh6.ggpht.com/pablo.barrachina/SNqJQ_Wkr_I/AAAAAAAAAbY/IdJcw9AtJOc/HermanHesse_thumb%5B6%5D.jpg" width="34"&gt;&lt;/a&gt; &lt;/td&gt; &lt;td colspan="2"&gt;Hermann Hesse&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://lh3.ggpht.com/pablo.barrachina/SNqJRuHS7dI/AAAAAAAAAbc/_YQTt4nsuBg/siddhartha1%5B4%5D.jpg"&gt;&lt;img height="89" alt="siddhartha1" src="http://lh3.ggpht.com/pablo.barrachina/SNqJRz5FMGI/AAAAAAAAAbg/kl6uwqOoeWo/siddhartha1_thumb%5B2%5D.jpg" width="59"&gt;&lt;/a&gt; &lt;/td&gt; &lt;td&gt;&lt;b&gt;Siddharta.&lt;/b&gt;&lt;br&gt;Novela de aprendizaje espiritual del hijo de un brahman. Se trata más de una novela de evolución interior que de una novela de acción. A través del encuentro con diferentes personajes, asistimos al desarrollo personal del protagonista hacia la pureza espiritual y la paz interior.&lt;/td&gt; &lt;td&gt;8/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;table cellspacing="0" cellpadding="0"&gt; &lt;tbody&gt; &lt;tr class="autor"&gt; &lt;td&gt;&lt;a href="http://lh4.ggpht.com/pablo.barrachina/SNqJSRggZGI/AAAAAAAAAbk/GS4V94oy3cI/flann.obrien%5B4%5D.jpg"&gt;&lt;img height="52" alt="flann.obrien" src="http://lh3.ggpht.com/pablo.barrachina/SNqJSjJGlAI/AAAAAAAAAbo/V1PJI8tUcDQ/flann.obrien_thumb%5B2%5D.jpg" width="36"&gt;&lt;/a&gt; &lt;/td&gt; &lt;td colspan="2"&gt;Flann O'Brien&lt;/td&gt;&lt;/tr&gt; &lt;tr class="libro"&gt; &lt;td&gt;&lt;a href="http://lh3.ggpht.com/pablo.barrachina/SNqJTRM_XFI/AAAAAAAAAbs/_FlwcI605Mk/lavidadura%5B4%5D.jpg"&gt;&lt;img height="89" alt="lavidadura" src="http://lh6.ggpht.com/pablo.barrachina/SNqJTyH4NiI/AAAAAAAAAbw/7UUiCiZ43Js/lavidadura_thumb%5B2%5D.jpg" width="59"&gt;&lt;/a&gt; &lt;/td&gt; &lt;td&gt;&lt;b&gt;La vida dura. Una exégesis de lo escuálido.&lt;/b&gt;&lt;br&gt;A la casa del disputador señor Collopy arriban dos niños huérfanos. Mientras el señor Collopy se dedica a una misteriosa y humanitaria labor en favor de las mujeres, los chicos crecen entre los aromas del buen whisky y de la mala cocina. Manus, el hermano, pronto demuestra ser un maestro en los negocios. Con virtuoso y cruel ingenio, Flann O' Brien nos ofrece un argumento a escala clásica; su economía es incomparable, su inventiva desbordante.&lt;/td&gt; &lt;td&gt;6/10&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-famlily: verdana, arial, sans"&gt;Fuente comentarios:&lt;a href="http://www.lecturalia.com/"&gt;http://www.lecturalia.com/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-6381014725235523099?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/6381014725235523099/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=6381014725235523099' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/6381014725235523099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/6381014725235523099'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2008/01/libros.html' title='Libros'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ifqy8Cf597Y/R6Y73gev0eI/AAAAAAAAAFw/HEMpZPI-PAg/s72-c/20060321142503-eslava.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-4304722025704247004</id><published>2007-09-25T13:13:00.001+01:00</published><updated>2007-09-25T15:07:44.328+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Reflection con VB.Net (I): Instanciar objetos</title><content type='html'>En algunas ocasiones, podemos querer crear objetos de forma dinámica, de forma que no necesitemos conocer el nombre de la clase a instanciar durante el desarrollo. Para ello, podemos utilizar las clases del &lt;em&gt;namespace &lt;/em&gt;&lt;strong&gt;Reflection&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Vamos a realizar un ejemplo en el que queremos instanciar una clase de la que no conocemos el nombre, y que dicha clase tiene que ejecutar un método X que devolverá un resultado en una propiedad Y. Definimos un formulario web con 5 textBox y un botón:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;txtLibreria: dónde se encuentra la clase.&lt;/li&gt;&lt;li&gt;txtClase: nombre de la clase a instanciar&lt;/li&gt;&lt;li&gt;txtMetodo: nombre del método a ejecutar&lt;/li&gt;&lt;li&gt;txtPropiedad: propiedad que contiene el resultado&lt;/li&gt;&lt;li&gt;txtResultado: mostrará el resultado obtenido&lt;/li&gt;&lt;li&gt;btnEjecutar: ejecuta el método&lt;/li&gt;&lt;/ol&gt;Para simplificar el ejemplo, consideramos las siguientes restricciones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El método no tiene parámetros&lt;/li&gt;&lt;li&gt;La propiedad que contiene el resultado es de tipo String&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En el evento onClick del botón, insertamos el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="margin-top:0;margin-bottom:0;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;&lt;p&gt;&lt;span style="font-family:courier new,monospace;"&gt;Dim&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;objectType &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Type = Type.GetType(txtLibreria.Text + &lt;span style="color:#990000;"&gt;"."&lt;/span&gt; + txtClase.Text + &lt;/span&gt;&lt;span style="font-size:85%;color:#a31515;"&gt;", "&lt;span style="color:#000000;"&gt; + txtLibreria.Text&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;True&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;)&lt;/span&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt; myObject &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;Object &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;= Activator.CreateInstance(objectType) &lt;span style="color:#006600;"&gt;' Crea la instancia del objeto&lt;/span&gt;&lt;/span&gt; &lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt; mi &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Reflection.MethodInfo = myObject.GetType().GetMethod( &lt;/span&gt;&lt;span style="font-size:85%;color:#000000;"&gt;txtMetodo.Text&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;)&lt;/span&gt; &lt;p&gt;&lt;span style="font-family:courier new,monospace;"&gt;mi.Invoke(myObject, &lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span style="font-family:courier new,monospace;font-size:85%;color:#0000ff;"&gt;Nothing&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;) &lt;span style="font-family:Courier New;font-size:85%;color:#006600;"&gt;' Invoca al método (sin parámetros)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;p&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt; pi &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Reflection.PropertyInfo = myObject.GetType.GetProperty(&lt;/span&gt; &lt;span style="font-size:85%;color:#000000;"&gt;txtPropiedad&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new,monospace;"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;Dim&lt;/span&gt;&lt;span style="font-size:85%;"&gt; strResultado &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;As&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;String&lt;/span&gt; &lt;span style="font-size:85%;"&gt;= pi.GetValue(myObject, &lt;/span&gt;&lt;span style="font-size:85%;color:#0000ff;"&gt;Nothing&lt;/span&gt;&lt;span style="font-size:85%;"&gt;) &lt;span style="font-family:Courier New;font-size:85%;color:#006600;"&gt;' Recupera el valor de la propiedad&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new,monospace;"&gt;&lt;span style="font-size:85%;"&gt;txtResultado.Text = strResultado&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;En siguientes entregas, veremos la forma de llamar a un método con parámetros, y de obtener toda la información de una clase. &lt;/p&gt;&lt;p&gt;&lt;em&gt;Referencias:&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Grupos Google: &lt;a href="http://groups.google.com/group/microsoft.public.dotnet.framework.compactframework/browse_thread/thread/668c115b28857b49/10cea7f28e039c35?lnk=st&amp;amp;q=System.Reflection.Assembly.GetExecutingAssembly+Type.GetType&amp;amp;rnum=8#10cea7f28e039c35"&gt;http://groups.google.com/group/microsoft.public.dotnet.framework.compactframework/browse_thread/thread/668c115b28857b49/10cea7f28e039c35?lnk=st&amp;amp;q=System.Reflection.Assembly.GetExecutingAssembly+Type.GetType&amp;amp;rnum=8#10cea7f28e039c35&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;El Guille: &lt;a href="http://www.elguille.info/NET/dotnet/reflectioninfotipo.htm"&gt;http://www.elguille.info/NET/dotnet/reflectioninfotipo.htm&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;em&gt;Microsoft: &lt;a href="http://msdn2.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx"&gt;http://msdn2.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx&lt;/a&gt;&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-4304722025704247004?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/4304722025704247004/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=4304722025704247004' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4304722025704247004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4304722025704247004'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/09/reflection-con-vbnet-i-instanciar.html' title='Reflection con VB.Net (I): Instanciar objetos'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-6480007053794411958</id><published>2007-07-12T12:47:00.001+01:00</published><updated>2007-09-25T15:03:25.038+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver'/><title type='text'>SQL Server: Metadatos (I) - Procedimientos Almacenados</title><content type='html'>&lt;div&gt;Cuando una base de datos alcanza un tamaño significativo en lo relativo a procedimientos almacenados, se hace muy complicado tener una visión general de dichos procedimientos junto con los parámetros que aceptan. Es por ello que sería muy interesante obtener todos los procedimientos junto con sus parámetros y tipos de datos en una consulta SQL, con el fin de poder tratar esta información desde una aplicación externa, por ej. desde Excel o Access. &lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;SQL Server nos brinda esta información en lo que se suele denominar &lt;em&gt;metadata&lt;/em&gt;. Dentro del espacio &lt;em&gt;INFORMATION_SCHEMA &lt;/em&gt;encontramos información relativa a los objetos de la base de datos. Para el caso que nos ocupa, utilizaremos la tabla  &lt;em&gt;PARAMETERS:&lt;/em&gt;&lt;/div&gt; &lt;div&gt;&lt;em&gt;&lt;/em&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt; &lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt; &lt;div&gt;&lt;font face="courier new,monospace" size="2"&gt;&lt;font size="1"&gt; &lt;p&gt;&lt;font face="courier new,monospace" size="2"&gt;SELECT &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;SPECIFIC_SCHEMA, &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;SPECIFIC_NAME, &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt; PARAMETER_NAME, &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;DATA_TYPE, &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;PARAMETER_MODE &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="courier new,monospace" size="2"&gt;FROM INFORMATION_SCHEMA.PARAMETERS &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="courier new,monospace" size="2"&gt;WHERE &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="courier new,monospace" size="2"&gt;OBJECTPROPERTY &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;( &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;OBJECT_ID &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt; ( &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;QUOTENAME(SPECIFIC_SCHEMA) + &amp;#39;.&amp;#39; + &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;QUOTENAME(SPECIFIC_NAME) &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt; ), &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;&amp;#39;IsMsShipped&amp;#39; &lt;/font&gt;&lt;font face="courier new,monospace" size="2"&gt;) = 0 &lt;/font&gt;&lt;/p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;Ejecutando la SQL en nuestra base de datos, obtendremos todos los procedimientos almacenados del sistema ordenados por la fecha de última modificación (descendente).&lt;/div&gt;&lt;br&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-6480007053794411958?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/6480007053794411958/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=6480007053794411958' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/6480007053794411958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/6480007053794411958'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/07/sql-server-metadatos-i-procedimientos.html' title='SQL Server: Metadatos (I) - Procedimientos Almacenados'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-487610875315320618</id><published>2007-05-25T08:14:00.001+01:00</published><updated>2007-05-25T08:15:01.065+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver'/><title type='text'>Regenerar identity en SQL Server</title><content type='html'>&lt;div&gt;En ocasiones nos encontramos con una tabla que contiene datos y queremos vaciarla y volverla a rellenar por algún motivo. Si la tabla tiene una columna &lt;em&gt;identity&lt;/em&gt;, al rellenarla de nuevo, empezará por el último identificador que tenía asignado. Para inicializar de nuevo la columna  &lt;em&gt;identity&lt;/em&gt; ejecutaremos la siguiente instrucción desde una consola de SQL:&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt; &lt;blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"&gt; &lt;div&gt;&amp;nbsp;&lt;font color="#0000ff" size="2"&gt;dbcc&lt;/font&gt;&lt;font size="2"&gt; checkident &lt;/font&gt;&lt;font color="#808080" size="2"&gt;(&lt;/font&gt;&lt;font size="2"&gt;nombre_tabla&lt;/font&gt;&lt;font color="#808080" size="2"&gt;,&lt;/font&gt;&lt;font size="2"&gt; reseed&lt;/font&gt; &lt;font color="#808080" size="2"&gt;,&lt;/font&gt;&lt;font size="2"&gt; 0&lt;/font&gt;&lt;font color="#808080" size="2"&gt;)&lt;/font&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt; &lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;br&gt;&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-487610875315320618?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/487610875315320618/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=487610875315320618' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/487610875315320618'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/487610875315320618'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/05/regenerar-identity-en-sql-server.html' title='Regenerar identity en SQL Server'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-1172038621457343896</id><published>2007-03-27T13:51:00.001+01:00</published><updated>2007-03-28T12:57:20.068+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='editor'/><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Eligiendo un cliente de publicación</title><content type='html'>Casi me vuelvo loco para encontrar un programa que me permita publicar artículos de una manera sencilla. Parece ser que los más utlizados son: &lt;ul&gt;&lt;li&gt;Qumana&lt;/li&gt;&lt;li&gt;w.bloggar&lt;/li&gt;&lt;/ul&gt;&lt;p align="left"&gt;Los he descargado, pero por lo que he podido observar w.bloggar funciona muy bien con Wordpress y Qumana me falla al arrancar (excepción de Java) y no hay forma de probarlo. Así que buscando por del.icio.us he encontrado Bleezer. No puedo comparar con los otros, pero aparentemente es muy fácil de utilizar, que a fin de cuentas, es lo que interesa.&lt;/p&gt;&lt;p align="left"&gt;He estado tentado de pasar el blog a Wordpress, pero no he podido porque no permite código javascript, lo que es necesario para los ejemplos que he realizado con Google Maps. Así que, de momento, a continuar con Blogger...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-1172038621457343896?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/1172038621457343896/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=1172038621457343896' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1172038621457343896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1172038621457343896'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/03/eligiendo-un-cliente-de-publicacin.html' title='Eligiendo un cliente de publicación'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-4576057423913315056</id><published>2007-03-07T13:32:00.001+01:00</published><updated>2007-03-07T13:39:38.495+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pareto'/><category scheme='http://www.blogger.com/atom/ns#' term='gráfico ABC'/><category scheme='http://www.blogger.com/atom/ns#' term='calidad'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><title type='text'>Gráficos ABC</title><content type='html'>Los gráficos ABC se pueden utilizar para obtener una información clara de aquellos elementos a los que necesitamos prestar una mayor atención dentro de un conjunto de datos. Para aclarar un poco este tema, pongamos un ejemplo. Supongamos que tenemos una lista de fallos que se producen en la cadena de producción:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Fallo de color&lt;/li&gt;   &lt;li&gt;Fallo de dibujo&lt;/li&gt;   &lt;li&gt;Fallo de tela&lt;/li&gt;   &lt;li&gt;Fallo de presentación&lt;/li&gt; &lt;/ul&gt; Estos fallos queremos clasificarlos dentro de tres grupos:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Grupo A:&lt;/span&gt; los que más nos interesa controlar. Son aquellos que representarán el 75% de los fallos que tiene nuestra empresa y que debemos solucionar urgentemente.&lt;/li&gt;   &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Grupo B:&lt;/span&gt; aquellos defectos que tienen una importancia secundaria.&lt;/li&gt;   &lt;li&gt;&lt;span style="font-weight: bold;"&gt;Grupo C:&lt;/span&gt; son defectos que podemos despreciar, ya que ocurren ocasionalmente.&lt;/li&gt; &lt;/ul&gt; Pongamos que tenemos la siguiente clasificación:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="1" cellpadding="0" cellspacing="0" width="30%"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;td bg="" style="color: rgb(0, 0, 0);" align="center" valign="top"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Defecto&lt;/span&gt;&lt;br /&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;       &lt;td bg="" style="color: rgb(0, 0, 0);" align="center" valign="top"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Cantidad&lt;/span&gt;&lt;br /&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Color&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;4&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Dibujo&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;3&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Presentación&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;1&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Color&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;1&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Tela&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;8&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Presentación&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;1&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;Para obtener el gráfico necesitamos dos columnas más, una que representará el tanto por cien del número de fallos sobre el total y otra que contendrá el tanto por cien acumulado:&lt;br /&gt;&lt;br /&gt;&lt;table align="center" border="1" cellpadding="0" cellspacing="0" width="60%"&gt;   &lt;tbody&gt;     &lt;tr&gt;       &lt;th bg="" style="color: rgb(102, 102, 102);" align="center" valign="top"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;b&gt;&lt;span style="color: rgb(51, 0, 0);"&gt;Defecto&lt;/span&gt;&lt;br /&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/th&gt;       &lt;th bg="" style="color: rgb(102, 102, 102);" align="center" valign="top"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Cantidad&lt;/span&gt;&lt;br /&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/th&gt;       &lt;th bg="" style="color: rgb(102, 102, 102);" align="center" valign="top"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Porcentaje&lt;/span&gt;&lt;br /&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/th&gt;       &lt;th bg="" style="color: rgb(102, 102, 102);" align="center" valign="top"&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Acumulado&lt;/span&gt;&lt;br /&gt;  &lt;/b&gt;&lt;/span&gt;&lt;/th&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td bgcolor="#99ff99" valign="top"&gt;Tela&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" bgcolor="#99ff99" valign="top"&gt;8&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" bgcolor="#99ff99" valign="top"&gt;44.4&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" bgcolor="#99ff99" valign="top"&gt;44.4&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td bgcolor="#99ff99" valign="top"&gt;Color&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" bgcolor="#99ff99" valign="top"&gt;5&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" bgcolor="#99ff99" valign="top"&gt;27.7&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" bgcolor="#99ff99" valign="top"&gt;72.1&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Dibujo&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;3&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;16.6&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;88.7&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;Presentación&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;2&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;11.1&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;100&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;18&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;100&lt;br /&gt;  &lt;/td&gt;       &lt;td align="right" valign="top"&gt;&lt;br /&gt;  &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt; &lt;/table&gt;&lt;br /&gt;Como se puede observar, hemos ordenado la tabla con la cantidad Porcentaje en orden descendente.&lt;br /&gt;&lt;br /&gt;Los dos primeros defectos (tela y color) serían los que entrarían en el &lt;span style="font-weight: bold;"&gt;grupo A&lt;/span&gt;, ya que se encuentran por debajo del 75% de la columna acumulado.&lt;br /&gt;&lt;br /&gt;El segundo grupo (&lt;span style="font-weight: bold;"&gt;grupo B&lt;/span&gt;), lo formarían aquellos defecto del 75% al 90% (dibujo) y el &lt;span style="font-weight: bold;"&gt;grupo C &lt;/span&gt;aquellos que estén por encima del 90%.&lt;br /&gt;&lt;br /&gt;Por lo tanto controlando los defectos de tela y color, estamos controlando el 75% de los defectos de nuestra empresa.&lt;br /&gt;&lt;br /&gt;Si aplicamos este concepto con más datos, los resultados son más claros. En el siguiente gráfico se han introducido 20 defectos. Como se puede ver en la gráfica, controlando 4 de los 20 defectos (linea azul), podemos solucionar el 75% de los defectos de nuestra empresa.&lt;br /&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_ifqy8Cf597Y/Re6xTFsdJtI/AAAAAAAAAAU/jiStPMB6wkc/s1600-h/pareto.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_ifqy8Cf597Y/Re6xTFsdJtI/AAAAAAAAAAU/jiStPMB6wkc/s320/pareto.gif" alt="" id="BLOGGER_PHOTO_ID_5039159974578431698" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div align="left"&gt;En conclusión, podemos utilizar los gráficos ABC en multitud de escenarios, dedicando el esfuerzo de control a un grupo reducido de elementos.&lt;br /&gt;&lt;/div&gt; &lt;/div&gt;&lt;br /&gt;El autor de esta teoría es Vilfredo Pareto (&lt;a href="http://es.wikipedia.org/wiki/Pareto"&gt;http://es.wikipedia.org/wiki/Pareto&lt;/a&gt;), por lo que, en ocasiones, se puede referir a este gráfico como Pareto de Defectos, etc.&lt;br /&gt;&lt;br /&gt;Por último, agradecer a mi amigo José Martín Ferre que fue quien me introdujo este concepto que en su día aplicamos en tantas y tantas empresas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-4576057423913315056?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/4576057423913315056/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=4576057423913315056' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4576057423913315056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4576057423913315056'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/03/grficos-abc_07.html' title='Gráficos ABC'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_ifqy8Cf597Y/Re6xTFsdJtI/AAAAAAAAAAU/jiStPMB6wkc/s72-c/pareto.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-7662478610474944834</id><published>2007-02-28T12:13:00.001+01:00</published><updated>2007-02-28T13:46:03.870+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photoshop'/><category scheme='http://www.blogger.com/atom/ns#' term='visual basic'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Google Maps (III)</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;h2&gt;Crear imágenes para las flechas de dirección&lt;/h2&gt;Las flechas de dirección que hemos puesto sobre el mapa, son un conjunto de imágenes cuya rotación varia en 3º a la derecha. La creación de estas imágenes nos llevaría mucho tiempo, pero, por suerte, existen programas como el Photoshop que permiten automatizar tareas con programación en Visual Basic.&lt;br /&gt;&lt;br /&gt;Para este caso, he utilizado las librerías que ofrece Photoshop CS2, pero supongo que la sintaxis es muy parecida en versiones anteriores. La especificación de los objetos la podéis encontrar en la &lt;a href="http://partners.adobe.com/public/developer/photoshop/sdk/index_scripting.html"&gt;web de Adobe&lt;/a&gt;. También se podría haber hecho algo parecido con CorelDraw o AutoCad.&lt;br /&gt;&lt;br /&gt;Se podría utilizar cualquier programa que admita la programación VBA, en mi caso utilicé Microsoft Excel porque era lo que tenía más a mano. Simplemente creo un botón y le asigno el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Public Sub generaImagen()&lt;br /&gt;Dim appRef, doc, opciones&lt;br /&gt;&lt;br /&gt;Set appRef = CreateObject("Photoshop.Application")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Set opciones = CreateObject("Photoshop.ExportOptionsSaveForWeb")&lt;br /&gt;opciones.PNG8 = False&lt;br /&gt;opciones.Format = psPNGSave&lt;br /&gt;&lt;br /&gt;For i = 1 To 119&lt;br /&gt;    doc = "C:\dir\dir_0.psd"&lt;br /&gt;    appRef.Open doc&lt;br /&gt;    appRef.ActiveDocument.ActiveLayer.Rotate (i * 3), psMiddleCenter  ' Rotar 3º con bloqueo en el centro&lt;br /&gt;    appRef.ActiveDocument.Export "C:\dir\dir_" &amp; (i * 3) &amp;amp; ".png", psSaveForWeb, opciones&lt;br /&gt;    appRef.ActiveDocument.Close psDoNotSaveChanges&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;Set opciones = Nothing&lt;br /&gt;Set appRef = Nothing&lt;br /&gt;End Sub&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Además &lt;span style="font-weight: bold;"&gt;es muy importante&lt;/span&gt; añadir las referencias a las bibliotecas de Photoshop. Para ello accedo al menú Herramientas, Referencias desde el editor de código y selecciono:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Adobe Photoshop 9.0 Object Library.&lt;/li&gt;&lt;/ul&gt;En este caso se crearán imagenes png de 24 bits a partir de una imagen en formato Photoshop (PSD) &lt;span style="font-weight: bold;"&gt;dir_0.psd. &lt;/span&gt;Las imágenes se irán nombrando como dir_XX.png, siendo XX el grado de rotación hasta llegar a 357.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-7662478610474944834?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/7662478610474944834/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=7662478610474944834' title='6 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/7662478610474944834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/7662478610474944834'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/02/google-maps-iii_28.html' title='Google Maps (III)'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-749903556183333928</id><published>2007-02-28T09:57:00.000+01:00</published><updated>2007-03-28T12:52:58.513+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Google Maps (II)</title><content type='html'>&lt;h2&gt;Crear ruta&lt;/h2&gt;&lt;br /&gt;Para crear la ruta codificada utilizaremos una herramienta de Google llamada "&lt;a href="http://www.google.com/apis/maps/documentation/polylineutility.html"&gt;Interactive Polyline Encoder Utility&lt;/a&gt;" en la que podemos dibujar la ruta directamente sobre el mapa.&lt;br /&gt;&lt;br /&gt;Esta utilidad nos proporciona dos cadenas de texto que deberemos incluir en nuestro código. En el mapa que tenemos debajo, se ha creado la siguiente ruta (ver &lt;i&gt;&lt;span&gt;points &lt;/span&gt;&lt;/i&gt;y &lt;i&gt;&lt;span&gt;levels&lt;/span&gt;&lt;/i&gt;):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;strong&gt;function&lt;span style="color: rgb(255, 0, 0);"&gt; barranc&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;()&lt;/span&gt;{&lt;/strong&gt;&lt;br /&gt;limpiaMapa()&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; infoInicio &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; [ &lt;strong&gt;new&lt;/strong&gt; GInfoWindowTab(&lt;span style="color: rgb(0, 128, 0);"&gt;"Tab #1"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Inicio del recorrido"&lt;/span&gt;) ]&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; infoFin &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; [ &lt;strong&gt;new&lt;/strong&gt; GInfoWindowTab(&lt;span style="color: rgb(0, 128, 0);"&gt;"Tab #1"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;"Fin del recorrido"&lt;/span&gt;) ]&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; ePoly &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GPolyline.fromEncoded(&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;color: &lt;span style="color: rgb(0, 128, 0);"&gt;"&lt;span style="color: rgb(32, 64, 160);"&gt;#FF0000&lt;/span&gt;"&lt;/span&gt;,&lt;br /&gt;weight: &lt;span style="color: rgb(255, 0, 0);"&gt;10&lt;/span&gt;,&lt;br /&gt;points: &lt;span style="color: rgb(0, 128, 0);"&gt;"ggekFnm{AIbAmDfDuMjM|CjDcKpPyPaTwH~@g@bU~@~IrBjFJpAy@hGwApAyCE?xB"&lt;/span&gt;,&lt;br /&gt;levels: &lt;span style="color: rgb(0, 128, 0);"&gt;"BBBBBBBBBBBBBBBB"&lt;/span&gt;,&lt;br /&gt;zoomFactor: &lt;span style="color: rgb(255, 0, 0);"&gt;32&lt;/span&gt;,&lt;br /&gt;numLevels: &lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;map.addOverlay(ePoly)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// Inicio&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; inicio &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GMarker(&lt;strong&gt;new&lt;/strong&gt; GLatLng(&lt;span style="color: rgb(255, 0, 0);"&gt;38.69828857&lt;/span&gt;, -&lt;span style="color: rgb(255, 0, 0);"&gt;0.4733562469&lt;/span&gt;))&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GEvent.addListener(inicio, &lt;span style="color: rgb(0, 128, 0);"&gt;"click"&lt;/span&gt;, function()&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; inicio.openInfoWindowTabsHtml(infoInicio)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;map.addOverlay(inicio)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// Fin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; fin&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GMarker(&lt;strong&gt;new&lt;/strong&gt; GLatLng(&lt;span style="color: rgb(255, 0, 0);"&gt;38.707850253909&lt;/span&gt;, -&lt;span style="color: rgb(255, 0, 0);"&gt;0.4866600036621094&lt;/span&gt;))&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;GEvent.addListener(fin, &lt;span style="color: rgb(0, 128, 0);"&gt;"click"&lt;/span&gt;, function()&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; fin.openInfoWindowTabsHtml(infoFin)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;map.addOverlay(fin)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;También hemos marcado en la ruta el punto de partida y el punto de llegada. Para ello, hemos utilizado el objeto GMarker, al que le pasaremos las coordenadas del punto. Posteriormente, añadimos un &lt;i&gt;&lt;span&gt;listener&lt;/span&gt;&lt;/i&gt;, para que al pinchar sobre el marcador, nos muestre un diálogo con la información del punto. Este diálogo lo hemos creado con &lt;i&gt;&lt;span&gt;GInfoWindowTab.&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Marcar la dirección de la ruta&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;Por desgracia, la API de Google no permite crear las flechas de dirección para que quede más clara la ruta. Buscando por internet, encontré algunas funciones que me han ayudado para esta tarea.&lt;br /&gt;Para marcar la ruta vamos a necesitar un conjunto de imágenes que marquen cierto grado respecto al norte, una función que nos calcule el grado adecuado entre dos puntos y otra que ponga la imagen sobre el mapa.&lt;br /&gt;&lt;br /&gt;&lt;p align="left"&gt;Empecemos con la función que nos calcula el grado de rotación que debemos aplicar entre dos puntos del mapa:&lt;/p&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// === Returns the bearing in degrees between two points. ===&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// North = 0, East = 90, South = 180, West = 270.&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; degreesPerRadian &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;180.0&lt;/span&gt; &lt;span style="color: rgb(68, 68, 255);"&gt;/&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;PI&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;function&lt;span style="color: rgb(255, 0, 0);"&gt; bearing&lt;/span&gt;&lt;span style="color: rgb(32, 64, 160);"&gt;( from, to )&lt;/span&gt; {&lt;/strong&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// See T. Vincenty, Survey Review, 23, No 176, p 88-93,1975.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// Convert to radians.&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; lat1 &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; from.latRadians()&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; lon1 &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; from.lngRadians()&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; lat2 &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; to.latRadians()&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; lon2 &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; to.lngRadians()&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// Compute the angle.&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;var&lt;/strong&gt; angle &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; - &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;atan2&lt;/strong&gt;&lt;/span&gt;( &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;sin&lt;/strong&gt;&lt;/span&gt;( lon1 - lon2 ) * &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;cos&lt;/strong&gt;&lt;/span&gt;( lat2 ), &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;cos&lt;/strong&gt;&lt;/span&gt;( lat1 ) * &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;sin&lt;/strong&gt;&lt;/span&gt;( lat2 ) - &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;sin&lt;/strong&gt;&lt;/span&gt;( lat1 ) * &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;cos&lt;/strong&gt;&lt;/span&gt;( lat2 ) * &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(165, 42, 42);"&gt;&lt;strong&gt;cos&lt;/strong&gt;&lt;/span&gt;( lon1 - lon2 ) )&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;if&lt;/strong&gt; ( angle &lt;span style="color: rgb(68, 68, 255);"&gt;&amp;&lt;/span&gt;lt&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;0.0&lt;/span&gt; )&lt;br /&gt;angle  +&lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; &lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color: rgb(32, 64, 160);"&gt;&lt;strong&gt;PI&lt;/strong&gt;&lt;/span&gt; * &lt;span style="color: rgb(255, 0, 0);"&gt;2.0&lt;/span&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;// And convert result to degrees.&lt;/span&gt;&lt;br /&gt;angle &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; angle * degreesPerRadian&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;angle &lt;span style="color: rgb(68, 68, 255);"&gt;=&lt;/span&gt; angle.toFixed(&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;)&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;return&lt;/strong&gt; angle&lt;span style="color: rgb(68, 68, 255);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(68, 68, 255);"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Encontré esta función en un foro, por lo que no puedo poner ninguna referencia a su autor. Se puede observar la siguiente referencia en los comentarios: &lt;span style="color: rgb(68, 68, 68);"&gt;See T. Vincenty, Survey Review, 23, No 176, p 88-93,1975.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(68, 68, 68);"&gt;&lt;br /&gt;&lt;/span&gt;También necesitamos una función que seleccione la imagen a utilizar dependiendo del grado que nos devuelva la función anterior:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;       &lt;strong&gt;var&lt;/strong&gt; arrowIcon &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GIcon()&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; arrowIcon.iconSize &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GSize(&lt;span style="color:#ff0000;"&gt;21&lt;/span&gt;,&lt;span style="color:#ff0000;"&gt;21&lt;/span&gt;)&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt; arrowIcon.shadowSize &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GSize(&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;,&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;)&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; arrowIcon.iconAnchor &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GPoint(&lt;span style="color:#ff0000;"&gt;12&lt;/span&gt;,&lt;span style="color:#ff0000;"&gt;12&lt;/span&gt;)&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt; arrowIcon.infoWindowAnchor &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;strong&gt;new&lt;/strong&gt; GPoint(&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;,&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;)&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; &lt;strong&gt;function&lt;span style="color:#ff0000;"&gt; direccion&lt;/span&gt;&lt;span style="color:#2040a0;"&gt;(points)&lt;/span&gt; {&lt;/strong&gt;       &lt;br /&gt;       &lt;strong&gt;var&lt;/strong&gt; p1&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;points[&lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;]&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;strong&gt;var&lt;/strong&gt; p2&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;points[&lt;span style="color:#ff0000;"&gt;1&lt;/span&gt;]&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;      &lt;br /&gt;  &lt;span style="color:#444444;"&gt;// Obtiene la direccion de la flecha (bearing) entre los dos puntos&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;var&lt;/strong&gt; dir &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; bearing(p1,p2)&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:#444444;"&gt;// lo redondea para que sea multiplo de 3 ya que las imagenes se han creado en diferenciales de 3 grados&lt;/span&gt;&lt;br /&gt;       &lt;strong&gt;var&lt;/strong&gt; dir &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#2040a0;"&gt;&lt;strong&gt;Math&lt;/strong&gt;&lt;/span&gt;.&lt;span style="color:#a52a2a;"&gt;&lt;strong&gt;round&lt;/strong&gt;&lt;/span&gt;(dir&lt;span style="color:#4444ff;"&gt;/&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;3&lt;/span&gt;) * &lt;span style="color:#ff0000;"&gt;3&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;br /&gt;  &lt;strong&gt;if&lt;/strong&gt; (dir&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;360&lt;/span&gt;) &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/span&gt; dir &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;0&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt; &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span style="color:#444444;"&gt;// Busca el punto medio entre los dos puntos&lt;/span&gt;&lt;br /&gt;  &lt;strong&gt;var&lt;/strong&gt; p1x, p1y, p2x, p2y, pmidxy, pmid&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  p1x&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;map.fromLatLngToDivPixel(p1).x&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  p1y&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;map.fromLatLngToDivPixel(p1).y&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  p2x&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;map.fromLatLngToDivPixel(p2).x&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  p2y&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;map.fromLatLngToDivPixel(p2).y&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#444444;"&gt;// busca el punto medio&lt;/span&gt;&lt;br /&gt;  pmidxy&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;&lt;strong&gt;new&lt;/strong&gt; GPoint((p1x+p2x)&lt;span style="color:#4444ff;"&gt;/&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;,(p1y+p2y)&lt;span style="color:#4444ff;"&gt;/&lt;/span&gt;&lt;span style="color:#ff0000;"&gt;2&lt;/span&gt;)&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;  &lt;br /&gt;  &lt;span style="color:#444444;"&gt;// convierte la posición en pixel a geo-coordenadas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  pmid&lt;span style="color:#4444ff;"&gt;=&lt;/span&gt;map.fromDivPixelToLatLng(pmidxy)&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       &lt;span style="color:#444444;"&gt;// selecciona la imagen correspondiente&lt;/span&gt;&lt;br /&gt;       arrowIcon.image &lt;span style="color:#4444ff;"&gt;=&lt;/span&gt; &lt;span style="color:#008000;"&gt;"img/gmaps/dir_"&lt;/span&gt;+dir+&lt;span style="color:#008000;"&gt;".png"&lt;/span&gt;&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;       map.addOverlay(&lt;strong&gt;new&lt;/strong&gt; GMarker(pmid, arrowIcon))&lt;span style="color:#4444ff;"&gt;;&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:#4444ff;"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Para ello se busca el punto medio de los puntos pasados como parámetros y obtiene el grado de rotación de la flecha a mostrar en el mapa. Por último crea un GMarker (un marcador) con la imagen y el punto medio obtenidos.&lt;br /&gt;&lt;br /&gt;En el ejemplo, se puede observar que las imágenes se encuentran en &lt;span style="font-style: italic;"&gt;/img/gmaps/ &lt;/span&gt;y se han nombrado siguiendo el patrón dir_XXX.png, dónde XXX es el grado de rotación. Para crear estas imágenes, podéis consultar el siguiente artículo del blog 'Google Maps(III)'.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-749903556183333928?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/749903556183333928/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=749903556183333928' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/749903556183333928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/749903556183333928'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/02/google-maps-ii.html' title='Google Maps (II)'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-1081490538858331444</id><published>2007-02-27T12:51:00.000+01:00</published><updated>2008-01-16T15:46:19.331+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='programación'/><category scheme='http://www.blogger.com/atom/ns#' term='google maps'/><title type='text'>Google Maps (I)</title><content type='html'>Ya se que está muy visto el incluir mapas en las web, y que hay mucha documentación al respecto, pero me costó bastante encontrar ciertas funcionalidades en lo que se refiere a marcar rutas sobre el mapa. Así que aquí tenéis un pequeño resumen en varias entregas.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Crear mapa&lt;/h2&gt;&lt;br /&gt;Lo primero que necesitamos, es un mapa, para ello necesitamos registrarnos en la API de Google en &lt;a href="http://www.google.com/apis/maps/signup.html"&gt;http://www.google.com/apis/maps/signup.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Incluiremos el enlace a la API en la cabecera (head) con la clave que nos han proporcionado:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;script src="http://maps.google.com/maps?file=api&amp;v=2&amp;amp;key=PONER_AQUI_LA_CLAVE" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Después añadiremos el código&lt;br /&gt;javascript para mostar el mapa:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;br /&gt;//&amp;lt;![CDATA[&lt;br /&gt;var map;&lt;br /&gt;&lt;br /&gt;function load() {&lt;br /&gt;  if (GBrowserIsCompatible()) {           &lt;br /&gt;    map = new GMap2(document.getElementById("map"));&lt;br /&gt;&lt;br /&gt;    map.addControl(new GSmallMapControl());&lt;br /&gt;    map.addControl(new GMapTypeControl());   &lt;br /&gt;&lt;br /&gt;    basico();&lt;br /&gt;  }&lt;br /&gt;}javascript:void(0)&lt;br /&gt;Publicar&lt;br /&gt;&lt;br /&gt;function basico() {&lt;br /&gt;    map.setCenter(new GLatLng(38.697789, -0.473302), 15);&lt;br /&gt;}&lt;br /&gt;//]]&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Sólo nos falta crear un div en nuestra página para que pueda contener el mapa y llamar a los métodos de inicialización de la API de Google Maps:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;body onload="load()" onunload="GUnload()"&amp;gt;&lt;br /&gt;  &amp;lt;div id="map" style="width: 27em; height: 27em"&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Aquí tendríamos el resultado, un mapa centrado en Alcoi a una altura definida (15):&lt;br /&gt;&lt;div id="map" style="width: 27em; height: 27em;"&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-1081490538858331444?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/1081490538858331444/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=1081490538858331444' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1081490538858331444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/1081490538858331444'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/02/google-maps.html' title='Google Maps (I)'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1580826083962475520.post-4074216693953975841</id><published>2007-02-27T12:39:00.000+01:00</published><updated>2007-02-27T12:47:42.000+01:00</updated><title type='text'>Primer post</title><content type='html'>Más pronto o más tarde esto tenia que pasar... Siempre he pensado que crear un blog era algo muy interesante, sobretodo desde el punto de vista de ayudar a otras personas en el desarrollo de aplicaciones (a mi desde luego me ha venido muy bien), aunque temía no darle una continuidad.&lt;br /&gt;En fin, allá vamos, a ver si hay suerte...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1580826083962475520-4074216693953975841?l=switchoffandletsgo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://switchoffandletsgo.blogspot.com/feeds/4074216693953975841/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1580826083962475520&amp;postID=4074216693953975841' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4074216693953975841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1580826083962475520/posts/default/4074216693953975841'/><link rel='alternate' type='text/html' href='http://switchoffandletsgo.blogspot.com/2007/02/primer-post.html' title='Primer post'/><author><name>Pablo Barrachina</name><uri>http://www.blogger.com/profile/17123322806235909702</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
