<?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-7141294</id><updated>2011-04-21T22:49:31.455+01:00</updated><title type='text'>El Blog de Carlos. I.</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://carloszcom.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>28</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7141294.post-114813142656941597</id><published>2005-08-13T10:00:00.000+01:00</published><updated>2006-12-13T17:06:42.646Z</updated><title type='text'>Chamberí.</title><content type='html'>&lt;table align="center" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="middle"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="middle"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/08/chamber.html"&gt;&lt;img height="62" alt="Tu opinión sobre este artículo." hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Europa, España y Madrid envejecen a la vez que aumenta la proporción de mujeres sobre el total de la población. Chamberí es el distrito de la capital de España con mayor cantidad de ancianos. Muchos de los edificios están destinados oficinas y la mayoría de locales a pie de calle orientados a satisfacer las necesidades de los empleados -la mayoría de ellos con ingresos inferiores a los 900 € brutos al mes- de las empresas que los ocupan. A simple vista no se aprecia ventaja alguna para los mayores que todavía residen en el barrio. El precio de los inmuebles resulta demasiado alto y en cambio las familias padecen todas las incomodidades de vivir en el agitado corazón de la gran ciudad que no se ha adaptado a ser el centro de una comunidad de seis millones de habitantes y sigue creciendo. El paisaje urbano se renueva contínuamente; raro es el mes que un nuevo negocio sustituye a otro en uno de los enclaves privilegiados para el ejercicio del comercio. Sobre todo es la hostelería el sector preferido por los emprendedores en busca de fortuna quienes deciden establecerse en este concurrido rincón de Madrid. Qué podemos encontrar en estos establecimientos: precios caros, mal servicio y escasa calidad. No podía ser de otra forma. Los alquileres acaparan tal cantidad de recursos que apenas queda algo para destinar a la satisfacción de los consumidores. Pero los precios lejos de estabilizarse continuan subiendo y paralelamente se van estableciendo más y más negocios nuevos en locales de segunda fila, lo que al parecer provoca un efecto llamada de mayor eco. Por la noche es habitual ver a grupos de personas buscando en los cubos de basura de los restaurantes, ante la mirada indiferente, o tal vez el breve comentario, de los espectadores que salen de la última sesión de uno de los cines espcializados en ofrecer productos de moda en versión doblada. Si lo que busca es ocio nocturno lo encontrará en cualquiera de los establecimientos abiertos hasta altas horas de la madrugada, en sus alrededores se pueden adquirir todo tipo de drogas, tanto las clásicas como las de nuevo diseño, y en su interior consumir bebidas alcohólicas de las primeras marcas, a la vez que apreciar la habilidad de los mejores pinchadiscos mezclando las últimas tendencias musicales. Llegar a Chamberí es fácil a cualquier hora del día, o de la noche si su visita es en fin de semana. Puede hacerlo en metro o autobús. Utilizar automóvil privado es desaconsejado. Con el uso del transporte público se contribuye a remediar la permanente congestión del tráfico y de las vías respiratorias de los vecinos, de edad avanzada en su mayoría como ya hemos dicho. Chamberí es uno de los pocos sitios de Madrid libre de prostitución. Si lo que busca es sexo de pago, cualquiera que sea su tendencia, le diré donde encontrarlo en otro artículo.&lt;br /&gt;&lt;br /&gt;Hasta pronto con amor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;table cellpadding="6" align="center" bgcolor="#800000" border="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a class="b" onmouseover="window.status='Haz clic para seguir el hipervículo.'; return true" href="http://www.carloszcom.com/pafoto/marco_fotos_1.html" target="_blank"&gt;Mira las fotografías.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-114813142656941597?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/114813142656941597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/114813142656941597'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/08/chamber.html' title='Chamberí.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-112532397256971629</id><published>2005-07-23T10:20:00.000+01:00</published><updated>2005-08-29T15:03:04.540+01:00</updated><title type='text'>PHP. Seguridad II.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/07/php-seguridad-ii.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;He perfeccionado el sistema de permisos básicos MySQL en mi primera base de datos con PHP y Mysql. Todas las explicaciones están en la página de bienvenida del subdominio &lt;a class="b" href="http://www.carloszcom.com/base5/index.php"&gt;Base de datos --5--&lt;/a&gt; en la &lt;a class="b" href="http://www.carloszcom.com"&gt;Página Oficial de Carlos&lt;/a&gt; (mira en el menú flotante). Con el usuario "invitado" y la clave "navajito" tendrás acceso con los permisos más restringidos. Para agregar, modificar o eliminar registros son necesarios otros usuarios y claves que estaré encantado de facilitarte si te pones en contacto conmigo aunque lo mejor es que te registres como alumno, como profesor o, como ambas cosas. Ya tengo algunas ideas para la próxima versión, y, espero recibir algunas sugerencias.&lt;br /&gt;&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td&gt;&lt;a target="_blank" class="b" href="http://www.carloszcom.com/base5" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt; Entra en Base de Datos --5--.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-112532397256971629?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112532397256971629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112532397256971629'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/07/php-seguridad-ii.html' title='PHP. Seguridad II.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-112532205071768274</id><published>2005-06-25T10:20:00.000+01:00</published><updated>2005-08-29T14:45:10.586+01:00</updated><title type='text'>PHP. Seguridad I.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/06/php-seguridad-i.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;He recurrido a copiar un script para controlar la seguridad por usuarios en lugar de hacerlo con un código de mi invención. El autor es &lt;a class="b" href="http://www.phpSecurePages.com"&gt;Paul Kruyt.&lt;/a&gt; El script ofrece la posibilidad de guardar los usuarios y las claves como texto o, en una base de datos. En esta versión he utilizado la primera opción.&lt;br /&gt;&lt;br /&gt;Todas las explicaciones están en la página de bienvenida del subdominio &lt;a class="b" href="http://www.carloszcom.com/base4/index.php"&gt;Base de datos --4--&lt;/a&gt; en la &lt;a class="b" href="http://www.carloszcom.com"&gt;Página Oficial de Carlos&lt;/a&gt; (mira en el menú flotante). Con el usuario "invitado" y la clave "navajito" tendrás acceso con los permisos más restringidos. Para agregar, modificar o eliminar registros son necesarios otros usuarios y claves que estaré encantado de facilitarte si te pones en contacto conmigo aunque lo mejor es que te registres como alumno, como profesor o, como ambas cosas. Ya tengo algunas ideas para la próxima versión, y, espero recibir algunas sugerencias.&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td&gt;&lt;a target="_blank" class="b" href="http://www.carloszcom.com/base4" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt; Entra en Base de Datos --4--.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-112532205071768274?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112532205071768274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112532205071768274'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/06/php-seguridad-i.html' title='PHP. Seguridad I.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-112170475114501061</id><published>2005-05-28T10:20:00.000+01:00</published><updated>2005-07-19T12:07:42.633+01:00</updated><title type='text'>PHP y MySQL, permisos básicos.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/05/php-y-mysql-permisos-bsicos.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;He añadido un sistema de permisos básicos MySQL a mi primera base de datos con PHP y Mysql. Todas las explicaciones están en la página de bienvenida del subdominio &lt;a class="b" href="http://www.carloszcom.com/base3/index.html"&gt;Base de datos --3--&lt;/a&gt; en la &lt;a class="b" href="http://www.carloszcom.com"&gt;Página Oficial de Carlos&lt;/a&gt; (mira en el menú flotante). Con el usuario "invitado" y la clave "navajito" tendrás acceso con los permisos más restringidos, solo podrás ver datos y comprobar que funcionan los permisos MySQL. Para agregar, modificar o eliminar registros son necesarios otros usuarios y claves que estaré encantado de facilitarte si te pones en contacto conmigo. Ya tengo algunas ideas para la próxima versión, y, espero recibir algunas sugerencias.&lt;br /&gt;&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td&gt;&lt;a target="_blank" class="b" href="http://www.carloszcom.com/base3" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt; Entra en Base de Datos --3--.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-112170475114501061?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112170475114501061'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112170475114501061'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/05/php-y-mysql-permisos-bsicos.html' title='PHP y MySQL, permisos básicos.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-112057992546004855</id><published>2005-04-30T10:20:00.000+01:00</published><updated>2005-07-18T17:45:49.430+01:00</updated><title type='text'>PHP y MySQL, mejoras básicas.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/05/php-y-mysql-mejoras-bsicas.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;He añadido algunas mejoras muy básicas a mi primera base de datos con PHP y Mysql. Todas las explicaciones están en la página de bienvenida del subdominio &lt;a class="b" href="http://www.carloszcom.com/base2/index.html"&gt;Base de datos --2--&lt;/a&gt; en la &lt;a class="b" href="http://www.carloszcom.com"&gt;Página Oficial de Carlos&lt;/a&gt; (mira en el menú flotante). No es necesario utilizar contraseña para entrar pero sí para agregar, modificar o eliminar datos. Ya tengo algunas ideas para la próxima versión, y, espero recibir algunas sugerencias.&lt;br /&gt;&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td&gt;&lt;a target="_blank" class="b" href="http://www.carloszcom.com/base2" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt; Entra en Base de Datos --2--.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-112057992546004855?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112057992546004855'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/112057992546004855'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/04/php-y-mysql-mejoras-bsicas.html' title='PHP y MySQL, mejoras básicas.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-111753314780652850</id><published>2005-04-02T10:20:00.000+01:00</published><updated>2005-05-31T11:18:55.580+01:00</updated><title type='text'>PHP y MySQL, mi primera experiencia.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/04/php-y-mysql-mi-primera-experiencia.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;De las cuatro tecnologías utilizadas para acceder a bases de datos a través de la Red, CGI, PHP, ASP y JSP, parece ser que la más utilizada es PHP con MySQL. Ya tengo una base de datos realizada con esta tecnología, puedes verla &lt;a target="_blank" class="b" href="http://www.carloszcom.com/base1" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;aquí&lt;/a&gt;. La contraseña es carlos y la palabra de paso carlos. A medida que vayas pidiendo páginas necesitarás nuevas contraseñas que te iré facilitando. No se trata de una primera versión, es un primer borrador muy rudimentario que iré mejorando, ya tengo algunas ideas para la próxima versión, y espero recibir algunas sugerencias. &lt;br /&gt;Me llevé una gran alegría cuando vi que las relaciones entre las tablas de la base de datos de ejemplo utilizada por &lt;a target="_blank" class="b" href="http://www3.fnac.com/item/author.do?id=504771&amp;RNID=%2D13&amp;Recherche=%2D2&amp;Origin=FnacAff&amp;OriginClick=Yes" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Petra Bilke&lt;/a&gt; en su cuaderno PHP y MySQL de &lt;a target="_blank" class="b" href="http://www.pc-cuadernos.com/" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;pc-Cuadernos&lt;/a&gt; es idéntica a la que yo he utilizado en artículos anteriores.&lt;br /&gt;Encontrarás toda la documentación necesaria, que no es mucha, en la página de bienvenida del subdominio Base de datos --1-- en la &lt;a target="_blank" class="b" href="http://www.carloszcom.com" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Página Oficial de Carlos&lt;/a&gt; (mira en el menú flotante).&lt;br /&gt;Esta base de datos es la que se utiliza con los apuntes PHP I por ese motivo pueden aparecer algunas cosas totalmente inesperadas.&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td&gt;&lt;a target="_blank" class="b" href="http://www.carloszcom.com/base1" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt; Entra en Base de Datos --1--.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-111753314780652850?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/111753314780652850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/111753314780652850'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/04/php-y-mysql-mi-primera-experiencia.html' title='PHP y MySQL, mi primera experiencia.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-111106859012918804</id><published>2005-03-05T10:20:00.000Z</published><updated>2005-05-31T10:50:51.503+01:00</updated><title type='text'>Descargar la base de datos. IV.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/03/descargar-la-base-de-datos-iv.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Deberías de leer esto antes de descargar la base de datos.&lt;br /&gt;&lt;br /&gt;Las explicaciones que vienen a continuación puede que sean algo confusas para alguien que no tenga ninguna experiencia en diseño de bases de datos con Access o cualquier otra herramienta, si tienes alguna idea te recomiendo que leas tanto estas como las explicaciones de los artículos: &lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a class="b" href="http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-i.html"&gt;Descargar la base de datos. I.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a class="b" href="http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-ii.html"&gt;Descargar la base de datos. II.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a class="b" href="http://carloszcom.blogspot.com/2005/02/descargar-la-base-de-datos-iii.html"&gt;Descargar la base de datos. III.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Pero si no es así, si no tienes ni idea, olvídate de las explicaciones y &lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/base.zip')"&gt;descarga la  base de datos ahora mismo.&lt;/a&gt; Estoy convencido de que con un poco de práctica le sacarás todo el partido posible, y además, siempre podrás contactar conmigo por teléfono o correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;He sustituido los formularios Agregar y eliminar trabajadores a un proyecto utilizando opciones, y, utilizando parámetros por uno solo, al que llamo Participación, en el que se recogen todas las opciones de los dos anteriores. Este formulario tiene una cantidad de código exagerada pero ya lo iré mejorando e incorporando nuevas opciones.&lt;br /&gt;&lt;br /&gt;En el formulario Participación he resuelto el problema que se produce cuando dos trabajadores tienen los mismos apellidos, el número de identificación también se filtra con todas las opciones.&lt;br /&gt;&lt;br /&gt;He hecho un nuevo formulario basado en el formulario Composit, se trata de un formulario emergente que muestra solo las fotografías de los trabajadores y está relacionado con el número de idnetificación del trabajador seleccionado en el formulario Participación.&lt;br /&gt;&lt;br /&gt;El formulario participación solo presenta la opción de agregar o eliminar registros mediante botón de comando, no existe la posibilidad de hacerlo también mediante la barra de herramientas.&lt;br /&gt;&lt;br /&gt;Ahora se puede acceder a un formulario desde distintos puntos de la aplicación.&lt;br /&gt;&lt;br /&gt;A pesar de todo la aplicación ha aumentado de tamaño.&lt;br /&gt;&lt;br /&gt;Para cualquier duda tienes abundantes explicaciones en artículos precedentes pero francamente te aconsejo que practiques por tu cuenta.&lt;br /&gt;&lt;br /&gt;Siempre podrás contactar conmigo por teléfono o por correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;Una vez que esta versión se haya mejorado no volverá a estar disponible. Sigo manteniendo el artículo porque contiene explicaciones útiles.&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/base.zip')"&gt; Descarga la carpeta que contiene la base de datos.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-111106859012918804?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/111106859012918804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/111106859012918804'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/03/descargar-la-base-de-datos-iv.html' title='Descargar la base de datos. IV.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-111106832683889181</id><published>2005-02-12T10:20:00.000Z</published><updated>2005-04-05T10:48:49.363+01:00</updated><title type='text'>Descargar la base de datos. III.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/02/descargar-la-base-de-datos-iii.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Deberías de leer esto antes de descargar la base de datos.&lt;br /&gt;&lt;br /&gt;Las explicaciones que vienen a continuación puede que sean algo confusas para alguien que no tenga ninguna experiencia en diseño de bases de datos con Access o cualquier otra herramienta, si tienes alguna idea te recomiendo que leas tanto estas como las explicaciones de los artículos: &lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a class="b" href="http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-i.html"&gt;Descargar la base de datos. I.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a class="b" href="http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-ii.html"&gt;Descargar la base de datos. II.&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Pero si no es así, si no tienes ni idea, olvídate de las explicaciones y &lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/comentario_1.html')"&gt;descarga la  base de datos ahora mismo.&lt;/a&gt; Estoy convencido de que con un poco de práctica le sacarás todo el partido posible, y además, siempre podrás contactar conmigo por teléfono o correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;He mejorado la legibilidad del código, he quitado comentarios incomprensibles y lo he reducido considerablemente. Por ejemplo, el formulario Información Rápida ha pasado de tener 29 páginas a 11. Esta diferencia es debida tanto a mejoras como a eliminación de soluciones alternativas.&lt;br /&gt;&lt;br /&gt;He eliminado el cuadro combinado que permitía la ordenación ascendente y descendente en el formulario Información Rápida. Lo considero innecesario teniendo el comando del sistema que se puede acoplar en la barra de herramientas.&lt;br /&gt;&lt;br /&gt;En los formularios con los Agretar o eliminar trabajadores a un proyecto utilizando opcinoes, y, utlizando parámetros, he eliminado el comando de la barra de herramientas que permite agregar y eliminar registros así como ver todos los registros, teniendo los botones de comando que hacen las mismas funciones lo considero innecesario. He eliminado también el menú estadísticas de la barra de menús por ser igualmente innecesario que dos controles hagan la misma función.&lt;br /&gt;&lt;br /&gt;Los formularios composit, rodajes, productoras y trabajadroes tenían un diseño y un código muy complicados, tan complicados que a mí me costaba mucho trabajo comprender como funcionaban, a pesar de lo cual todos ellos tenían el comportamiento que se esperaba de ellos. Para hacer el código más legible he optado por la solución de hacer dos formularios distintos en lugar de dos versiones del mismo formulario que se activan dependiendo de las acciones del usuario. La aplicación tiene cuatro formularios más pero el código está mucho más claro. Desde un principio me empeñé en programar los formularios de forma que se mostrara una versión u otra dependiendo de la acción que se realizara, creo que esto no es práctico. Hay una extensa explicación de como lo hacía en el artículo Versiones de un formulario al que te aconsejo que no te acerques, con toda franqueza lo considero una pérdida de tiempo. &lt;br /&gt;&lt;br /&gt;He modificado practicamente todas las barras de herramientas de los formularios añadiéndo o quitando  funciones. Te resultará muy cómodo ver la ventana de propiedades, los formularios en vista de diseño y el editor de Visual Basic haciendo clic desde el formulario donde te encuentres.&lt;br /&gt;&lt;br /&gt;He pasado todas las funciones que se activaban desde las barras de herramientas a un módulo independiente. También he pasado algunas variables a este módulo y me quedan por pasar más cosas. En las próximas versiones irá aumentando el código de este módulo mientras disminuye el correspondiente a los formularios.&lt;br /&gt;&lt;br /&gt;Los títulos de los formularios son más descriptivos que antes.&lt;br /&gt;&lt;br /&gt;He añadido tres controles al formulario Información Rápida en los que muestro el nombre, el teléfono y la persona de contacto de la productora correspondiente al registro activo.&lt;br /&gt;&lt;br /&gt;He puesto algo de color en los formularios, pero la verdad es que no sé si están ahora peor que antes.&lt;br /&gt;&lt;br /&gt;A pesar de todo la aplicación ha aumentado de tamaño debido a que tiene más formularios en vista formulario.&lt;br /&gt;&lt;br /&gt;Para cualquier duda tienes abundantes explicaciones en artículos precedentes pero francamente te aconsejo que practiques por tu cuenta.&lt;br /&gt;&lt;br /&gt;Siempre podrás contactar conmigo por teléfono o por correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;Una vez que esta versión se haya mejorado no volverá a estar disponible. Sigo manteniendo el artículo porque contiene explicaciones útiles.&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/comentario_1.html')"&gt; Descarga la carpeta que contiene la base de datos.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-111106832683889181?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/111106832683889181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/111106832683889181'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/02/descargar-la-base-de-datos-iii.html' title='Descargar la base de datos. III.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-110899730007836124</id><published>2005-01-22T10:20:00.000Z</published><updated>2005-04-05T10:48:06.633+01:00</updated><title type='text'>Descargar la base de datos. II.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-ii.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Deberías de leer esto antes de descargar la base de datos.&lt;br /&gt;&lt;br /&gt;Las explicaciones que vienen a continuación puede que sean algo confusas para alguien que no tenga ninguna experiencia en diseño de bases de datos con Access o cualquier otra herramienta, si tienes alguna idea te recomiendo que leas tanto estas como las explicaciones de del artículo:&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;a class="b" href="http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-i.html"&gt;Descargar la base de datos. I.&lt;/a&gt;&lt;/li&gt; &lt;br /&gt;&lt;br /&gt;pero si no es así, si no tienes ni idea, olvídate de las explicaciones y &lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/comentario_1.html')"&gt;descarga la  base de datos ahora mismo.&lt;/a&gt; Estoy convencido de que con un poco de práctica le sacarás todo el partido posible, y además, siempre podrás contactar conmigo por teléfono o correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;Mejor que de una versión definitiva debería de hablar del segundo borrador de la base datos. Las explicaciones dadas en artículos precedentes complementan a las que vienen a continuación. &lt;br /&gt;&lt;br /&gt;El código que contienen los primeros artículos de este blog corresponde lógicamente a esta base de datos pero se trata de las primeras pruebas, no voy a ofrecer el código mejorado, la verdad es que me da mucho trabajo, es mucho más complicado explicar porqué se hacen las cosas que hacerlas directamente, pero de todas maneras estos artículos siguen siendo una buena fuente de explicaciones.&lt;br /&gt;&lt;br /&gt;He mejorado el diseño de las tablas sustituyendo tres tablas que tenían una relación uno a uno por una sola tabla. De esta manera evito dos índices en muchísimas consultas y procedimientos. Se trata de las tablas personal, parametros y vestuario que han sido sustituidas por la tabla per_pa_ves que contiene todos los campos de las tablas mencionadas. Antes las relaciones entre las tablas eran así:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/descargar_2_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver las relaciones de la versión anterior.]&lt;br /&gt;&lt;br /&gt;Y ahora son así:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/descargar_2_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver las relaciones de esta versión.]&lt;br /&gt;&lt;br /&gt;He añadido un nuevo usuario, benjamin, manteniendo los usuarios anteriores, usuario_1 y usuario_2. El usuario benjamin, también tiene contraseña en blanco. Te darás cuenta de que este usuario no tiene acceso a todos los formularios y de que algunos formularios aparecen para él modificados, con menos campos visibles de los que disponen los usuarios usuario_1 y usuario_2. Esencialmente a benjamin, que es un cliente, se le oculta la información correspondiente a otros clientes, no tiene la posibilidad de añadir registros en ninguna tabla, y no tiene acceso a los datos personales de los artistas que le facilitamos, pero, sí tiene acceso a ciertos parámetros y fotografías de ellos, por ejemplo, a benjamin le ocultamos los teléfonos, la dirección y el nombre del personal que le proponemos para trabajar en la próxima película, así como las fotografías más recientes, pero no puede ver algunos datos personales. Ya sabes que la base de datos la utilizamos entre otras cosas para ofrecer un catálogo de actores a productoras de cine. Actores de los que nosotros tenemos la representación. Se trata de un funcionamiento muy parecido al que puede tener una E.T.T., una empresa de servicios externos o una empresa privada de seguridad. También sería muy fácil adaptar esta estructura a la gestión de servicios de un ayuntamiento, una clínica veterinaria, la consulta de un dentista, un taller de reparación de coches, o una agencia de la propiedad inmobiliaria. Más cosas acerca del usuario benjamin: pertenece a los grupos del sistema Usuarios y Actualizar, y, al grupo clientes que es el grupo sobre el que se aplican todas estas restricciones que he mencionado. Los formularios a los que tiene acceso el usuario benjamin tienen todos los controles bloqueados excepto uno, la casilla de verificación Descartar del formulario Información Rápida. Parece una contradicción darle a un usuario permiso para actualizar y bloquearle todos lo controles pero es que solo le vamos a permitir al cliente que exprese su opinión sobre la selección que hemos hecho para él. Activando la casilla de verificación Descartar del formulario Información Rápida, el cliente nos informa de que ha rechazado al candidato correspondiente a ese registro, esperemos que no haga lo mismo en todos los registros. La mencionada casilla de verificación también es accesible por los usuarios usuario_1 y usuario_2 que, cuando se encuentren haciendo llamadas teléfonicas para concertar citas la podrán activar igualmente para descartar a los candidatos no interesados en el proyecto. Pero todo esto se ve mucho mejor practicando.&lt;br /&gt;&lt;br /&gt;Para cualquier duda tienes abundantes explicaciones en artículos precedentes pero francamente te aconsejo que practiques por tu cuenta.&lt;br /&gt;&lt;br /&gt;Siempre podrás contactar conmigo por teléfono o por correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;Una vez que esta versión se haya mejorado no volverá a estar disponible. Sigo manteniendo el artículo porque contiene explicaciones útiles.&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/comentario_1.html')"&gt; Descarga la carpeta que contiene la base de datos.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-110899730007836124?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110899730007836124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110899730007836124'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-ii.html' title='Descargar la base de datos. II.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-110898995700343010</id><published>2005-01-01T10:20:00.000Z</published><updated>2005-04-05T10:43:40.883+01:00</updated><title type='text'>Descargar la base de datos. I.</title><content type='html'>&lt;table border="0" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-i.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Deberías de leer esto antes de descargar la base de datos.&lt;br /&gt;&lt;br /&gt;Las explicaciones que vienen a continuación puede que sean algo confusas para alguien que no tenga ninguna experiencia en diseño de bases de datos con Access o cualquier otra herramienta, si tienes alguna idea te recomiendo que las leas, pero si no es así, si no tienes ni idea, olvídate de las explicaciones y &lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/comentario_1.html')"&gt;descarga la base de datos ahora mismo.&lt;/a&gt; Estoy convencido de que con un poco de práctica le sacarás todo el partido posible, y además, siempre podrás contactar conmigo por teléfono o correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;Mejor que una primera versión debería de hablar de un primer borrador. Cuando hay tantas posibilidades el bosque te impide ver el árbol.&lt;br /&gt;&lt;br /&gt;En sucesivos artículos iré ofreciendo nuevas versiones mejoradas en tres aspectos:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Mejoras del código y del diseño de las tablas y relaciones.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mejoras del diseño de los formularios.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Mejoras de funcionalidad para que se pueda adaptar fácilmente a un problema distinto de gestión de la información.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;La carpeta que vas a descargar pesa algo menos de 30 megas y contiene:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Un archivo con extensión mdw al que debes unirte.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dos carpetas con imágenes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;La base de datos propiamente dicha en un archivo mde.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Dependiendo de la versión de Access que utilices deberás usar un procedimiento u otro para unirte al archivo mdw. Consulta la ayuda de Access si lo necesitas.&lt;br /&gt;&lt;br /&gt;Las carpetas de imágenes continen 36 imágenes pero hubiera necesitado 18 imágenes para cada registro añadido en la tabla trabajadores que en este momento cuenta con 18 registros, es decir, si no repitiera ninguna imagen necesitaría 18*18=324 imágenes, una exageración de espacio en disco. Te recomiendo que si añades más registros copies el campo vestuario -el campo que contiene la ruta de imagen- de un registro ya existente, así te ahorrarás espacio y tiempo y podrás ver los resultados igualmente.&lt;br /&gt;&lt;br /&gt;Deberás tener activadas las siguientes referencias. Busca la entrada Referencias... del menú Herramientas del editor de Visual Basic, haz una marca y coloca en en este orden las siguientes librerías.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Visual Basic for Applications.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Microsoft Access 9.0 Object Library.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;OLE Automation.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Microsoft ActiveX Data Objects 2.1 Library.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Microsoft DAO 3.6 Object Library.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;He utilizado Office XP y Office 2000 para el diseño de esta aplicación y la he probado sobre Windows XP.&lt;br /&gt;&lt;br /&gt;El botón  Borrar todos los registros del formulario de bienvenida hace precisamente eso, deja la base de datos completamente en blanco, no te recomiendo que lo hagas hasta que no tengas soltura añadiendo, eliminando y modificando registros.&lt;br /&gt;&lt;br /&gt;Si no obtienes los resultados esperados después de añadir un registro comprueba que has introducido un valor en todos los campos. No siempre se da el aviso de que se trata de un campo que no puede contener valor nulo. Esto es así porque  pudiendo contener algunos campos valor nulo es necesario que contengan algún valor para obtener los resultados esperados. Por ejemplo, algunos de estos campos puede formar parte de la cadena SQL origen de un formulario en la que la claúsula WHERE incluya este campo.&lt;br /&gt;&lt;br /&gt;En esta versión ofrezco la posibilidad de entrar a la base de datos con dos usuarios:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;usuario_1&lt;/li&gt;&lt;br /&gt;&lt;li&gt;usuario_2&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Ambos con contraseña en blanco y pertenecientes a los grupos del sistema:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Copia de Seguridad.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Acceso total a datos.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Pero usuario_2 pertenece también al grupo boton. Para los usuarios pertenecientes a este grupo el botón del formulario de bienvenida permanece invisible. De esta forma voy mostrando las posibilidades de seguridad que pueden implementarse utilizando grupos de usuarios que no pertenecen al sistema.&lt;br /&gt;&lt;br /&gt;Las casillas de verificación Descartar y Faltas del formulario Información Rápida no están terminadas de diseñar. Todavía tengo dudas de cómo hacerlo pero esto no impide el funcionamiento coherente de la aplicación.&lt;br /&gt;&lt;br /&gt;El formulario Información Rápida es el corazón de la aplicación. No estoy convencido de que sea fácil de comprender su uso al principio pero practicando un poco, guiándote por los cambios de color de los combos de la cabecera y viendo como cambia el número de registros captarás en poco tiempo todo el potencial de esta herramienta.&lt;br /&gt;&lt;br /&gt;Los formularios a los que se accede através de la opción Participación de la barra de menús del formulario Información Rápida son el sisitema nervioso de la aplicación. Piensa que sirven para localizar registros de dos tablas extremo y añadir sus correspondientes ids a una tabla puente.&lt;br /&gt;&lt;br /&gt;Para cualquier duda tienes abundantes explicaciones en  artículos precedentes pero francamente te aconsejo que practiques por tu cuenta.&lt;br /&gt;&lt;br /&gt;Siempre podrás contactar conmigo por teléfono o por correo. Quedo a la espera de tus comentarios.&lt;br /&gt;&lt;br /&gt;Una vez que esta versión se haya mejorado no volverá a estar disponible. Sigo manteniendo el artículo porque contiene explicaciones útiles.&lt;/br&gt;&lt;/br&gt;&lt;table align="center" border="0" cellpadding="6"  bgcolor="#800000"&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a class="b" href="javascript:cuatro_ventana('http://www.carloszcom.com/comentario_1.html')"&gt; Descarga la carpeta que contiene la base de datos.&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-110898995700343010?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110898995700343010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110898995700343010'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2005/01/descargar-la-base-de-datos-i.html' title='Descargar la base de datos. I.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-110364228571330662</id><published>2004-12-11T10:20:00.000Z</published><updated>2005-04-06T12:31:23.740+01:00</updated><title type='text'>Bibliografía III.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (1).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/11/bibliografa-iii.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_bibliografia_iii_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;En otros artículos, &lt;a class="b" onmouseover="window.status='Haz clic para seguir el hipervículo.'; return true" href="http://www.carloszcom.blogspot.com/2004/06/bibliografa-i.html" target="_blank"&gt;Bibliografía I&lt;/a&gt; y &lt;a class="b" onmouseover="window.status='Haz clic para seguir el hipervículo.'; return true" href="http://www.carloszcom.blogspot.com/2004/09/bibliografa-ii.html" target="_blank"&gt;Bibliografía II&lt;/a&gt;, ya he hablado de los libros que he utilizado -con más pena que gloria- para intentar aprender informática. He seguido comprando libros y he seguido decepcionándome. Cuando era niño y adolescente las matemáticas me producía terror, un día llegó a mis manos un libro de la editorial McGraw-Hill, se titulaba Álgebra Elemental o algo parecido, no recuerdo el autor, en el que me aclaraban que quería decir esto a + 5 = 8. Me pareció mágico y me ayudó a sufrir menos. Años después me encontré con Manual de Automóviles de Manuel Arias-Paz Guitián sobre mecánica, otro tema que me parecía reservado a mentes privilegiadas. En el momento de escribir este artículo está a la venta la edición número 55 que vio la luz hace unos meses mientras que el primer ejemplar se puso a la venta en el año 1940. No he encontrado esta sensación de ayuda, de descubrir algo nuevo y bonito en ningún libro de informática de los que he comprado. Será que la informática no me gusta, será que estoy mayor.&lt;br /&gt;&lt;br /&gt;A continuación pego la carta que le escribí al autor del último libro de informática que he comprado.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Su libro contiene una gran cantidad de desinformación. Deliberadamente o no, pero en cualquier caso con el apoyo de la editorial, ustedes ocultan información vital para usuarios con poca experiencia. Su libro, como la mayoría de los trabajos de divulgación de informática, está redactado en un tono paternalista, y también, como en la mayoría de estos trabajos hacen ustedes un formidable trabajo de desorientación. Lo dicho hasta ahora es lo peor, lo más deshonesto, pero no quiero terminar sin recordar la cantidad de inexactitudes y de imprecisiones que se pueden descubrir en su libro a poco que se interese uno en la materia. Deshonestidad e impericia es lo que mayormente podemos encontrar en las obras de divulgación informática. Estas obras a pesar de todo sirven de ayuda, como en otros tiempos la Iglesia ayudaba a los pobres, colaborando con el poder para mantenerlos en la ignorancia.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p align="right"&gt;&lt;strong&gt;&lt;em&gt;atentamente: carlos zapata company&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Dicho esto que podría enviar a otro muchos autores, llego a las siguientes conclusiones. &lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;La gente que sabe informática no escribe libros.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Los que escriben libros de informática cobran poco dinero por su trabajo.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las editoriales persiguen publicar novedades mejor que obras verdaderamente útiles.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Participar en la elaboración de estos productos novedosos es lo que motiva a los autores a trabajar en obras de divulgación sobre informática. Esto les aporta cierto prestigio en su círculo de amistades y puede abrirle otras puertas sin que hayan demostrado efectivamente su verdadero nivel de conocimientos.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Las librerías están obligadas por las editoriales a mantener ciertos libros realmente inútiles a la venta.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Puedo dudar y dudo que las recomendaciones que se hacen sobre hardware y software sean desinteresadas.&lt;/ul&gt;&lt;p&gt;&lt;br /&gt;La verdad es que algunos de los libros que he recomendado son realmente útiles pero prefiero comentaros mi último descubrimiento: &lt;a class="b" onmouseover="window.status='Haz clic para seguir el hipervículo.'; return true" href="http://www.pc-cuadernos.com" target="_blank"&gt;PC Cuadernos.&lt;/a&gt; Se trata de una revista especializada en divulgación de temas sobre informática, cada mes se trata un tema diferente y se pueden encontrar números atrasados o comprarlos a la editorial directamente. Cuesta 5 €. Los contenidos están expuestos con gran claridad y precisión. Aunque tiene algunos defectos os hago la recomendación con verdadero entusiasmo.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-110364228571330662?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110364228571330662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110364228571330662'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/12/bibliografa-iii.html' title='Bibliografía III.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-110546120523280386</id><published>2004-11-13T10:20:00.000Z</published><updated>2005-04-06T12:28:42.130+01:00</updated><title type='text'>Burocracia en la empresa moderna.</title><content type='html'>&lt;table border="0" width="100%" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/10/burocracia-en-la-empresa-moderna.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Para tomarse una cerveza en el barrio de Chamberí tienes que rellenar un formulario, entregarlo al encargado del local, pagar y esperar a ser llamado por tu nombre para recoger el pedido. El diseño ha llegado también al sector servicios más tradicional, el camarero, el tabernero, ese señor que se conocía a todo el barrio, va desapareciendo y dejando paso a expertos en mercadotecnia, decoradores, arquitectos,  y también a empleados con un contrato precario. En la sociedad neoliberal la rentabilidad es la medida de todas las cosas. El fondo de la cuestión es que  el consumidor no está bien atendido ni la calidad es mejor que  en el establecimiento tradicional, mientras que las economías no se traducen en precios más bajos. Los establecimientos modernos derrochan energía, tienen una decoración no ya moderna, llena de detalles superfluos, en realidad se comprueba con un simple golpe de vista que no es el ahorro lo que prevalece en la organización. La burocracia no ha sido nunca sinónimo de buen funcionamiento sino un método eficaz para perpetuar el poder de la clase dominante. El clérigo que vende bulas, el funcionario que reparte cupones de racionamiento, el comisario que hace favores no son sino burócratas que, pueden llegar a estar convencidos de proporcionar un gran beneficio a la sociedad, pero en realidad son grandes parásitos innecesarios. La empresa privada está creando una clase de funcionariado con escasa capacidad para resolver imprevistos pero muy dócil. De esta manera el poder se blinda. Las nuevas tecnologías deberían emplearse para conseguir mejores condiciones tanto para los consumidores como para los trabajadores.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-110546120523280386?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110546120523280386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/110546120523280386'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/11/burocracia-en-la-empresa-moderna.html' title='Burocracia en la empresa moderna.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109663471063888323</id><published>2004-10-16T10:20:00.000+01:00</published><updated>2005-04-06T12:33:30.660+01:00</updated><title type='text'>Mantenimiento de las tablas puente IV.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (4).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/10/mantenimiento-de-las-tablas-puente-iv.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_mantenimiento_iv_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Este artículo es muy parecido a &lt;a target="_blank" class="b" href="http://carloszcom.blogspot.com/2004/10/mantenimiento-de-las-tablas-puente-iii.html"&gt;Mantenimiento de las tablas puente III&lt;/a&gt;. Ahora vamos a ver una mejora en uno de los formularios que utilizamos para agregar datos a la tabla puente, concretamente al formulario llamado Agregar o eliminar trabajadores a un proyecto utilizando parámetros.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_iv_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Ya vimos detalladamente en el artículo &lt;a target="_blank" class="b"  href="http://carloszcom.blogspot.com/2004/07/mantenimiento-de-las-tablas-puente-ii.html"&gt;Mantenimiento de las tablas puente II&lt;/a&gt;. Es una mejora muy pequeña, se trata de una casilla de verificación.  &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62"hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_iv_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Hay que reconocer que el diseño no es muy elegante pero se ha ganado mucho en claridad. &lt;br /&gt;&lt;br /&gt;Lo que estamos haciendo es añadir una condición más al filtro que aplicabamos en &lt;a target="_blank" class="b" href="http://carloszcom/blogima.blogspot.com/2004/07/mantenimiento-de-las-tablas-puente-ii.html"&gt;Mantenimiento de las tablas puente II.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62"hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_iv_3.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Pego el código de los dos procedimientos que he modificado, el resto sigue igual que en Mantenimiento de las tablas puente II.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado20_GotFocus()&lt;br /&gt;&lt;br /&gt;Dim elect As String&lt;br /&gt;Dim rom As String&lt;br /&gt;Dim here As String&lt;br /&gt;Dim rder As String&lt;br /&gt;Dim fin As String&lt;br /&gt;&lt;br /&gt;Me.Cuadro_combinado26 = ""&lt;br /&gt;&lt;br /&gt;    Comando61.Visible = False&lt;br /&gt;    Comando62.Visible = False&lt;br /&gt;    Comando67.Visible = False&lt;br /&gt;    Comando68.Visible = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(3).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;Dim owsource20 As String&lt;br /&gt;&lt;br /&gt;       &lt;br /&gt;&lt;br /&gt;    elect = "SELECT DISTINCT  [personal].[APELLIDOS]"&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Añado esta estructura condicional.]&lt;br /&gt;    &lt;br /&gt;    If Verificación89 = 0 Then&lt;br /&gt;    &lt;br /&gt;    rom = " FROM personal INNER JOIN parametros ON [personal].[IDPERSONAL] =[parametros].[IDPERSONAL]"&lt;br /&gt;    &lt;br /&gt;    If Cuadro_combinado64 = "Femenino." Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((SEXO)='" &amp; "mujer" &amp; "') AND ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])"&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    ElseIf Cuadro_combinado64 = "Masculino." Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((SEXO)='" &amp; "hombre" &amp; "') AND ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])"&lt;br /&gt; &lt;br /&gt;    ElseIf Cuadro_combinado64 = "Ambos." Or Cuadro_combinado64 = Null Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])"&lt;br /&gt;            &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    ElseIf Verificación89 = -1 Then&lt;br /&gt; &lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82"hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[En el código que viene a continuación no solo se añade una condición WHERE. También se modifica el origen de datos. La variable rom que corresponde con el fragmento de cadena SQL que viene detrás de FROM es distinta en este bloque de la estructura condicional ya que en el pimer bloque no era necesario tener en cuenta la tabla participa. Veamos el diagrama de relaciones.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62"hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_iv_4.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver las relaciones.]&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;    rom = " FROM (personal INNER JOIN parametros ON personal.IDPERSONAL = parametros.IDPERSONAL) INNER JOIN       participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;    &lt;br /&gt;    If Cuadro_combinado64 = "Femenino." Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((SEXO)='" &amp; "mujer" &amp; "') AND ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])" &amp; _&lt;br /&gt;        " AND (IDRODAJE)=[Forms]![participa9]![Cuadro combinado18]"&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82"hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Añado la línea anterior.]&lt;br /&gt;           &lt;br /&gt;    ElseIf Cuadro_combinado64 = "Masculino." Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((SEXO)='" &amp; "hombre" &amp; "') AND ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])" &amp; _&lt;br /&gt;        " AND (IDRODAJE)=[Forms]![participa9]![Cuadro combinado18]"&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82"hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Añado la línea anterior.]&lt;br /&gt; &lt;br /&gt;    ElseIf Cuadro_combinado64 = "Ambos." Or Cuadro_combinado64 = Null Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])" &amp; _&lt;br /&gt;        " AND (IDRODAJE)=[Forms]![participa9]![Cuadro combinado18]"&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82"hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Añado la línea anterior.]&lt;br /&gt;            &lt;br /&gt;    End If&lt;br /&gt;        &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;        rder = " ORDER BY [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;        fin = ";"&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;    owsource20 = elect + rom + here + rder + fin&lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;    Me.Cuadro_combinado20.RowSource = owsource20&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Y esto es todo. La sintaxis es tortuosísima, hay que hacer pruebas y pruebas hasta dar con lo que queremos. Se podría intentar hacer un formulario que una los que he explicado en &lt;a target="_blank" class="b" href="http://carloszcom.blogspot.com/2004/10/mantenimiento-de-las-tablas-puente-iii.html"&gt; Mantenimiento  de las tablas puente III&lt;/a&gt; y &lt;a target="_blank" class="b" href="http://carloszcom.blogspot.com/2004/10/mantenimiento-de-las-tablas-puente-iv.html"&gt;Mantenimiento de las tablas puente IV&lt;/a&gt;, pero de momento hay otras prioridades. Hasta aquí he expuesto lo más interesante que he descubierto en Access. Faltan muchas cosas debido a mi ignorancia o, a que  las considero poco importantes. Mi próximo objetivo es hacer que todo esto funcione en la Red de la misma manera que funciona en un ordenador.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109663471063888323?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109663471063888323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109663471063888323'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/10/mantenimiento-de-las-tablas-puente-iv.html' title='Mantenimiento de las tablas puente IV.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109630397314779365</id><published>2004-10-09T10:20:00.000+01:00</published><updated>2005-04-06T12:34:45.743+01:00</updated><title type='text'>Mantenimiento de las tablas puente III</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (9).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/10/mantenimiento-de-las-tablas-puente-iii.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_mantenimiento_iii_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Ahora vamos a ver una mejora en uno de los formularios que utilizamos para agregar datos a la tabla puente, concretamente al formulario llamado Agregar o eliminar trabajadores a un proyecto utilizando opciones.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_iii_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Ya vimos detalladamente en el artículo &lt;a target="_blank" class="b"  href="http://carloszcom.blogspot.com/2004/06/mantenimiento-de-las-tablas-puente-i.html"&gt;Mantenimiento de las tablas puente I&lt;/a&gt; el código y todos los procedimientos. Es una mejora muy pequeña, se trata de una casilla de verificación.  &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_iii_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Hay que reconocer que el diseño no es muy elegante pero se ha ganado mucho en claridad. Otra pequeña diferencia con el formulario anterior es que el combo "Trabajadroes. Opciones." ha cambiado de tamaño, se ha hecho un poco más grande. Este combo ahora tiene RowSource dinámico dependiendo de la selección en la nueva casilla de verificación.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_iii_3.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Lo que estamos haciendo es añadir una condición más al filtro que aplicabamos en &lt;a target="_blank" class="b"  href="http://carloszcom.blogspot.com/2004/06/mantenimiento-de-las-tablas-puente-i.html"&gt;Mantenimiento de las tablas puente I.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pego el código de los dos procedimientos que he modificado, el resto sigue igual que en Mantenimiento de las tablas puente I.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado24_GotFocus()&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Añado esta variable.]&lt;br /&gt;&lt;br /&gt;Dim owsource24 As String&lt;br /&gt;&lt;br /&gt;    Me.Cuadro_combinado20 = ""&lt;br /&gt;    Me.Cuadro_combinado26 = ""&lt;br /&gt;    &lt;br /&gt;             Comando61.Visible = False&lt;br /&gt;             Comando62.Visible = False&lt;br /&gt;             Comando67.Visible = False&lt;br /&gt;             Comando68.Visible = False&lt;br /&gt;                                                        &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Añado esta estructura de control.]&lt;br /&gt;&lt;br /&gt;If Verificación89 = 0 Then&lt;br /&gt;&lt;br /&gt;owsource24 = "SELECT opciones.opciones" &amp; _&lt;br /&gt;" FROM opciones WHERE (((opciones.opciones) ='" &amp; "Todos los trabajadores." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación desde 30 días atrás en adelante." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación desde 60 días atrás en adelante." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación desde 90 días atrás en adelante." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Con participación desde 30 días atrás en adelante." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Con participación desde 60 días atrás en adelante." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Con participación desde 90 días atrás en adelante." &amp; "'))" &amp; _&lt;br /&gt;" ORDER BY opciones.opciones;"&lt;br /&gt;&lt;br /&gt;ElseIf Verificación89 = -1 Then&lt;br /&gt;&lt;br /&gt;owsource24 = "SELECT opciones.opciones" &amp; _&lt;br /&gt;" FROM opciones WHERE (((opciones.opciones) ='" &amp; "Todos los trabajadores del proyecto seleccionado." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación desde 30 días atrás en adelante en el proyecto seleccionado." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación desde 60 días atrás en adelante en el proyecto seleccionado." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación desde 90 días atrás en adelante en el proyecto seleccionado." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Sin participación en el proyecto seleccionado." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Con participación desde 30 días atrás en adelante en el proyecto seleccionado." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Con participación desde 60 días atrás en adelante en el proyecto seleccionado." &amp; "'" &amp; _&lt;br /&gt;" Or (opciones.opciones) ='" &amp; "Con participación desde 90 días atrás en adelante en el proyecto seleccionado." &amp; "'))" &amp; _&lt;br /&gt;" ORDER BY opciones.opciones;"&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;  Me.Cuadro_combinado24.RowSource = owsource24&lt;br /&gt;  &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado20_GotFocus()&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    Me.Cuadro_combinado26 = ""&lt;br /&gt;&lt;br /&gt;If Cuadro_combinado24 &lt;&gt; "" Then&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Añado esta estructura de control.]&lt;br /&gt;&lt;br /&gt;  If Verificación89 = 0 Then&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado24 = "Todos los trabajadores." Then&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[En la primera condición el código no varía.]&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal LEFT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = ""&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;  &lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 30 días atrás en adelante." Then&lt;br /&gt; &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal" 'WHERE [participa].[FECHA]&gt;Date()&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-30));)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 60 días atrás en adelante." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-60));)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 90 días atrás en adelante." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-90));)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;    &lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL;)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 30 días atrás en adelante." Then&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [participa].[FECHA]&gt;Date()-30"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 60 días atrás en adelante." Then&lt;br /&gt;    &lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [participa].[FECHA]&gt;Date()-60"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 90 días atrás en adelante." Then&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [participa].[FECHA]&gt;Date()-90"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;    &lt;br /&gt;        fin = ";"&lt;br /&gt;        &lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[A partir de aquí el código que contiene la nueva condición de filtrado.]    &lt;br /&gt;    &lt;br /&gt; ElseIf Verificación89 = -1 Then&lt;br /&gt;   &lt;br /&gt;    If Cuadro_combinado24 = "Todos los trabajadores del proyecto seleccionado." Then&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal LEFT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18]"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;  &lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 30 días atrás en adelante en el proyecto seleccionado." Then&lt;br /&gt; &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal" 'WHERE [participa].[FECHA]&gt;Date()&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-30)) And [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18];)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 60 días atrás en adelante en el proyecto seleccionado." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-60)) And [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18];)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 90 días atrás en adelante en el proyecto seleccionado." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-90)) And [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18];)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;    &lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación en el proyecto seleccionado." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL WHERE [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18];)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 30 días atrás en adelante en el proyecto seleccionado." Then&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [participa].[FECHA]&gt;Date()-30 And [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18]"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 60 días atrás en adelante en el proyecto seleccionado." Then&lt;br /&gt;    &lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [participa].[FECHA]&gt;Date()-60 And [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18]"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 90 días atrás en adelante en el proyecto seleccionado." Then&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [participa].[FECHA]&gt;Date()-90 And [participa].[IDRODAJE]=[Forms]![participa6]![Cuadro combinado18]"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;    &lt;br /&gt;        fin = ";"&lt;br /&gt;        &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;            Me.Cuadro_combinado20.RowSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;                                                                Comando61.Visible = False&lt;br /&gt;                                                                Comando62.Visible = False&lt;br /&gt;                                                                Comando67.Visible = False&lt;br /&gt;                                                                Comando68.Visible = False&lt;br /&gt;                                                                &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;            &lt;br /&gt;End Sub&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109630397314779365?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109630397314779365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109630397314779365'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/10/mantenimiento-de-las-tablas-puente-iii.html' title='Mantenimiento de las tablas puente III'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109593453497485612</id><published>2004-10-02T10:20:00.000+01:00</published><updated>2005-04-06T12:37:34.040+01:00</updated><title type='text'>Versiones de un formulario</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (4).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/10/versiones-de-un-formulario.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_versiones_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Para comprender lo que trato de explicar hay que tener en cuenta el diagrama de relaciones entre tablas de nuestra aplicación.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver las relaciones.]&lt;br /&gt;&lt;br /&gt;La forma más habitual de mostrar el contenido de dos tablas que mantienen una relación uno a varios es usando un formularios como el que describía en el artículo &lt;a target="_blank" class="b"   href="http://carloszcom.blogspot.com/2004/07/uno-varios.html"&gt;Relaciones uno a varios.&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras."onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Es una opción muy eficaz para añadir registros. En nuestra aplicación consultamos el contenido de la tabla rodajes cuando la información que queremos obtener está afectada por la relación que mantiene con la tabla productoras haciendo uso del mencionado formulario.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras."onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_3.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Pero puede ocurrir y de hecho ocurre que queremos obtener información que amplía la que nos proporciona un registro del formulario que nos muestra una relación varios a varios -el formulario información rápida-. En este caso lo que necesitamos es que la aplicación nos seleccione un solo registro de la tabla rodajes.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras."onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_4.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario Información rápida.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras."onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_5.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario Rodajes.]&lt;br /&gt;&lt;br /&gt;Para resolver este problema lo que hago es un formulario basado en la tabla rodajes con RecordSource dinámico dependiendo del formulario donde se realiza la petición.&lt;br /&gt;Si la petición se hace desde el formulario productoras se muestran todos los registros. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras."onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_6.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario Productoras.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras."onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_7.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario Rodajes.]&lt;br /&gt;&lt;br /&gt;Si la petición se hace desde Información Rápida se muestra un solo registro.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras."onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/versiones_8.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Para conseguir estos efectos lo primero que tenemos que hacer es declarar unas variables públicas en un módulo independiente.&lt;br /&gt;&lt;br /&gt;Public ecordSource_participa3_rodaje3 As Boolean&lt;br /&gt;Public ecordSource_productora2_rodaje3 As Boolean&lt;br /&gt;Public ecordSource_personal1_rodaje3 As Boolean&lt;br /&gt;Public ecordSource_llamada2_rodaje3 As Boolean&lt;br /&gt;&lt;br /&gt;En el formulario participa3 escribimos el siguiente código&lt;br /&gt;&lt;br /&gt;Private Function rodajes()&lt;br /&gt;                                                     &lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;    &lt;br /&gt;    ecordSource_participa3_rodaje3 = True&lt;br /&gt;    ecordSource_productora2_rodaje3 = False&lt;br /&gt;    ecordSource_personal1_rodaje3 = False&lt;br /&gt;    ecordSource_llamada2_rodaje3 = False&lt;br /&gt;    &lt;br /&gt;    stDocName = "rodaje3"&lt;br /&gt;    DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;que nos permite abir el formulario Rodajes.&lt;br /&gt;&lt;br /&gt;En el formulario Rodajes &lt;br /&gt;&lt;br /&gt;Private Sub Form_Activate()&lt;br /&gt;&lt;br /&gt;elect = "SELECT DISTINCT [participa].[FECHA] As participa_FECHA," &amp; _&lt;br /&gt;" [productora].[NOMBRE_PRODUCTORA], [rodaje].[IDRODAJE] AS rodaje_IDRODAJE," &amp; _&lt;br /&gt;" [rodaje].[IDPRODUCTORA], [rodaje].[PRODUCCION],  [rodaje].[FECHA], [rodaje].[HORA_CITA]," &amp; _&lt;br /&gt;" [rodaje].[HORA_FIN], [rodaje].[LUGAR_CITA], [rodaje].[LUGAR_RODAJE], [rodaje].[VESTUARIO]," &amp; _&lt;br /&gt;" [rodaje].[CATERING], [rodaje].[DETALLE], [rodaje].[COMENTARIOS]"&lt;br /&gt;    &lt;br /&gt;rom = " FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE)" &amp; _&lt;br /&gt;" ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA"&lt;br /&gt;        &lt;br /&gt;        If ecordSource_participa3_rodaje3 = True Then&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [rodaje].[IDRODAJE]=[Forms]![participa3]![rodaje_IDRODAJE]" &amp; _&lt;br /&gt;        " And [participa].[FECHA]=[Forms]![participa3]![participa_FECHA]"&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        ElseIf ecordSource_llamada2_rodaje3 = True Then&lt;br /&gt;       &lt;br /&gt;        here = " WHERE [rodaje].[IDRODAJE]=[Forms]![participa3]![rodaje_IDRODAJE]" &amp; _&lt;br /&gt;        " And [participa].[FECHA]=[Forms]![participa3]![participa_FECHA]"&lt;br /&gt;        &lt;br /&gt;       &lt;br /&gt;         &lt;br /&gt;        ElseIf ecordSource_personal1_rodaje3 = True Then&lt;br /&gt;       &lt;br /&gt;        here = " WHERE [rodaje].[IDRODAJE]=[Forms]![participa3]![rodaje_IDRODAJE]" &amp; _&lt;br /&gt;        " And [participa].[FECHA]=[Forms]![participa3]![participa_FECHA]"&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        ElseIf ecordSource_productora2_rodaje3 = True Then&lt;br /&gt;        &lt;br /&gt;        here = " WHERE [rodaje].[IDPRODUCTORA]=[Forms]![productora2]![IDPRODUCTORA]"&lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        &lt;br /&gt;        End If&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;rder = " ORDER BY [participa].[FECHA] DESC , [rodaje].[PRODUCCION]"&lt;br /&gt;&lt;br /&gt;fin = ";"&lt;br /&gt;&lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Private Function rodajes() se adapta a cada formulario para obtener el resultado deseado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109593453497485612?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109593453497485612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109593453497485612'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/10/versiones-de-un-formulario.html' title='Versiones de un formulario'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109587302276510459</id><published>2004-09-18T10:20:00.000+01:00</published><updated>2005-04-06T12:39:21.613+01:00</updated><title type='text'>Bibliografía II</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (2).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/09/bibliografa-ii.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_bibliografia_ii_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Te digo lo mismo de estos libros que te decía en &lt;a target="_blank" class="b" href="http://carloszcom.blogspot.com/2004/06/bibliografa-i.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Bibliografía I.&lt;/a&gt; En este caso intento aprender diseño de páginas web que  como tema principal contengan bases de datos.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_2.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para tener una idea general de lo que es el diseño de una página web.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Descubre HTML4.&lt;br /&gt;&lt;br /&gt;Autor: Anne Philips.&lt;br /&gt;&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.pearsoneducacion.com/default.asp" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Prentice Hall.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ISBN 84-8322-132-2&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_4.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Introducción a JavaScript y CSS.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Diseño de páginas web interactivas con JavaScript y CSS.&lt;br /&gt;&lt;br /&gt;Autor: &lt;a target="_blank" class="b" href="http://www.carlosys.com/principal.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Juan Carlos Orós.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.ra-ma.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Ra-Ma&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ISBN 84-7897-491-1&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_6.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para profundizar en JavaScript.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Descubre JavaScript.&lt;br /&gt;&lt;br /&gt;Autor: &lt;a target="_blank" class="b" href="http://www.htmlgoodies.com/" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Joe Burns&lt;/a&gt;, &lt;a target="_blank" class="b" href="http://www.computer-mentors.co.uk/cgi-bin/a/amazon_products_feed.cgi?mode=books&amp;search_type=AuthorSearch&amp;input_string=Andree+Growney&amp;locale=us" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Andree Growney.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.pearsoneducacion.com/default.asp" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Prentice Hall.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ISBN 84-205-3010-7&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_8.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para tener una idea básica de XML.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;XML.&lt;br /&gt;&lt;br /&gt;Autor: Ramón Montero Ayala.&lt;br /&gt;&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://shop.osborne.com/cgi-bin/osborne/" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Osborne McGraw-Hill.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ISBN 84-481-2894-x&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_10.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para profundizar en CSS.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;Cascading Style Sheets. Aprenda a crear páginas web basadas en CSS.&lt;br /&gt;&lt;br /&gt;Autores: Steven Champeon, &lt;a target="_blank" class="b" href="http://www.thenoodleincident.com/" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Owen Briggs&lt;/a&gt;, &lt;a target="_blank" class="b" href="http://glish.com/css/" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Eric Costello&lt;/a&gt;, Matt Patterson.&lt;br /&gt;&lt;br /&gt;Editorial:&lt;a target="_blank" class="b" href="http://www.anayamultimedia.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt; Anaya Multimedia.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ISBN 84-415-1497-6&lt;/br&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_12.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para profundizar en JavaScript e introducirse en ASP.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;HTML Dinámico, ASP y JavaScript a través de ejemplos.&lt;br /&gt;&lt;br /&gt;Autores: &lt;a target="_blank" class="b" href="http://www.dia.eui.upm.es/personas/jbobi.htm" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Jesús Bobadilla&lt;/a&gt;, Alejandro Alcolea, Santiago Alonso, &lt;a target="_blank" class="b" href="http://www.dia.eui.upm.es/personas/abraham.htm" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Abraham Gutiérrez.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.ra-ma.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Ra-Ma&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;ISBN 84-7897-388-5&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109587302276510459?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109587302276510459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109587302276510459'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/09/bibliografa-ii.html' title='Bibliografía II'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109541921275069516</id><published>2004-09-04T10:20:00.000+01:00</published><updated>2005-04-08T13:39:12.596+01:00</updated><title type='text'>Otros formularios basados en tablas puente.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (5).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/09/otros-formularios-basados-en-tablas.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_otros_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Haciendo un resumen de lo que hemos visto hasta ahora tenemos un formulario que nos permite ver una &lt;a class="b" href="javascript:cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_1.html')"&gt;relación varios a varios&lt;/a&gt; y otros formularios que nos permiten &lt;a class="b" href="javascript:cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_1.html')"&gt;agregar registros a la tabla puente&lt;/a&gt; de la relación varios a varios mencionada. Ahora vamos a relacionar cada uno de los registros de la tabla puente con otros formularios que nos amplian información. Volvemos a echar un vistazo al esquema de relaciones de la aplicación, y, al origen de datos del formulario.&lt;br /&gt;&lt;br /&gt;SELECT llamada.IDTRABAJADOR, llamada.IDRODAJE, llamada.FECHA_LLAMADA, llamada.FECHA_RODAJE, llamada.HORA, llamada.INCIDENCIAS&lt;br /&gt;FROM llamada&lt;br /&gt;WHERE (((llamada.IDTRABAJADOR)=[Forms]![participa3]![participa_IDPERSONAL]) AND ((llamada.IDRODAJE)=[Forms]![participa3]![participa_IDRODAJE]))&lt;br /&gt;ORDER BY llamada.FECHA_LLAMADA DESC , llamada.HORA DESC;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;La tabla "participa" es la que interviene en el origen de datos del formulario que muestra la relación varios a varios. Las otras tablas puente son una ampliación de información de cada uno de sus registros. A primera vista puede parecer que sería mejor agrupar todas las tablas puente en una sola pero hay que tener en cuenta que esto provocaría muchas redundancias y campos en blanco, cosa que hay que evitar a toda costa según nos dicen en la teoría de diseño de bases de datos todos los autores.&lt;br /&gt;&lt;br /&gt;Si alguna vez has tenido o tienes que concertar cientos de entrevistas todos los días agradecerás tener una herramienta  como este formulario que vamos a comentar. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Como ves se recogen las incidencias de cada llamada para cada trabajador y proyecto. No deja de asombrarme la facilidad con que se almacena la información y puede ser utilizada posteriormente. El usuario guarda las incidencias haciendo dos clic y cada vez que necesite la información el formulario, que tiene RecordSource dinámico dependiendo del registro que esté seleccionado en el formulario que muestra la relación varios a varios, le muestra los registros que permiten al usuario tomar una decisión. Se distinguen dos zonas en el formulario, Encabazado y Detalle.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_3.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;La llamada se realiza con un solo clic.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_4.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;La sección encabezado copia los campos más descriptivos del registro que tenemos seleccionado en el formulario que muestra la relación varios a varios mediante el código del siguiente procedimiento. Vemos también que el formulario tiene RecordSource dinámico dependiendo del registro seleccionado en el formulario que muestra la relación varios a varios.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Activate()&lt;br /&gt;&lt;br /&gt;[La función de estas tres variables la explicaré en otro artículo, de momento su presencia no debe de preocuparte.]&lt;br /&gt;&lt;br /&gt;         abrir_faltas_llamadas = True&lt;br /&gt;         abrir_faltas_agregarparametros = False&lt;br /&gt;         abrir_faltas_agregaropciones = False&lt;br /&gt;&lt;br /&gt;elect = "SELECT [llamada].[IDTRABAJADOR], [llamada].[IDRODAJE], [llamada].[FECHA_LLAMADA]," &amp; _&lt;br /&gt;" [llamada].[FECHA_RODAJE], [llamada].[HORA], [llamada].[INCIDENCIAS]"&lt;br /&gt;&lt;br /&gt;rom = " FROM llamada"&lt;br /&gt;&lt;br /&gt;here = " WHERE [llamada].[IDRODAJE]=[Forms]![participa3]![participa_IDRODAJE] And" &amp; _&lt;br /&gt;" [llamada].[IDTRABAJADOR]=[Forms]![participa3]![participa_IDPERSONAL]"&lt;br /&gt;&lt;br /&gt;rder = " ORDER BY [llamada].[FECHA_LLAMADA] DESC , [llamada].[HORA] DESC"&lt;br /&gt;&lt;br /&gt;fin = ";"&lt;br /&gt;&lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;[los controles independientes muestran datos del registro activo del formulario que muestra la relación varios a varios.]&lt;br /&gt;&lt;br /&gt;            Me.[Texto10] = [Forms]![participa3]![NOMBRE]&lt;br /&gt;            Me.[Texto12] = [Forms]![participa3]![APELLIDOS]&lt;br /&gt;            Me.[Texto14] = [Forms]![participa3]![PRODUCCION]&lt;br /&gt;            Me.[Texto16] = [Forms]![participa3]![FECHA]&lt;br /&gt;            Me.Texto30 = [Forms]![participa3]![TELEFONO]&lt;br /&gt;            Me.Texto28 = [Forms]![participa3]![TELEFONO_1]&lt;br /&gt;            Me.Texto26 = [Forms]![participa3]![TELEFONO_2]&lt;br /&gt;            &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Hacemos uso de las funciones del sistema HoraActual() y Fecha() para pasarlas como valor predeterminado a los campos "HORA" y "FECHA_LLAMADA" de la tabla "llamadas" respectivamente.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_5.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;A continuación pego y comento el resto del código.&lt;br /&gt;&lt;br /&gt;Option Compare Database&lt;br /&gt;Option Explicit&lt;br /&gt;&lt;br /&gt;[variables que intervienen en el RecordSource de este formulario.]&lt;br /&gt;&lt;br /&gt;Dim elect As String&lt;br /&gt;Dim rom As String&lt;br /&gt;Dim here As String&lt;br /&gt;Dim rder As String&lt;br /&gt;Dim fin As String&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub FECHA_RODAJE_GotFocus()&lt;br /&gt;&lt;br /&gt;[Añade un registro al formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_6.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Recordset.AddNew&lt;br /&gt;          &lt;br /&gt;Me.IDRODAJE = [Forms]![participa3]![participa_IDRODAJE]&lt;br /&gt;Me.IDTRABAJADOR = [Forms]![participa3]![participa_IDPERSONAL]&lt;br /&gt;Me.FECHA_RODAJE = [Forms]![participa3]![participa_FECHA]&lt;br /&gt;            &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub INCIDENCIAS_Change()&lt;br /&gt;&lt;br /&gt;[Abre el outlook.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_7.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;If INCIDENCIAS = "mensaje buzon" Then&lt;br /&gt;&lt;br /&gt;FollowHyperlink "mailto:" &amp; [Forms]![participa3]![CORREO_ELECTRONICO]&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;[Las siguientes funciones nos permiten abrir otros formularios con información adicional. Todos ellos tienen una estructura similar al que estamos estudiando y por supuesto su origen de datos está relacionado con el registro seleccionado en el formulario que muestra la relación varios a varios.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_8.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function composit()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;                                                                                                             &lt;br /&gt;    stDocName = "composit"&lt;br /&gt;    DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function i_rapida()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;           &lt;br /&gt;    stDocName = "participa3"&lt;br /&gt;    DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;            &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function parametros()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;    stDocName = "parametros"&lt;br /&gt;    DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt; &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function rodajes()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;                &lt;br /&gt;    ecordSource_llamada2_rodaje3 = True&lt;br /&gt;    ecordSource_personal1_rodaje3 = False&lt;br /&gt;    ecordSource_productora2_rodaje3 = False&lt;br /&gt;    ecordSource_participa3_rodaje3 = False&lt;br /&gt;        &lt;br /&gt;    stDocName = "rodaje3"&lt;br /&gt;    DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function trabajadores()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;         &lt;br /&gt;    stDocName = "personal1"&lt;br /&gt;    DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;            &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function FALTAS()&lt;br /&gt;     &lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;                                                                                                                   &lt;br /&gt;    stDocName = "faltas"&lt;br /&gt;    DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;        &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Para terminar puedes ver dos formularios de un diseño practicamente igual utilizados para registrar operaciones contables y su origen de datos.&lt;br /&gt;&lt;br /&gt;SELECT rodaje.PRODUCCION, cuenta_trabajadores.FECHA_RODAJE, productora.IDPRODUCTORA, productora.NOMBRE_PRODUCTORA, cuenta_trabajadores.IDPERSONAL, cuenta_trabajadores.IDRODAJE, cuenta_trabajadores.ABONO, cuenta_trabajadores.COMENTARIOS, cuenta_trabajadores.FECHA_APUNTE FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA=rodaje.IDPRODUCTORA) INNER JOIN cuenta_trabajadores ON rodaje.IDRODAJE=cuenta_trabajadores.IDRODAJE WHERE (((cuenta_trabajadores.IDPERSONAL)=Forms!participa3!participa_IDPERSONAL) And ((cuenta_trabajadores.IDRODAJE)=Forms!participa3!participa_IDRODAJE)); &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_9.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;SELECT cuenta_productoras.IDPERSONAL, cuenta_productoras.IDRODAJE, cuenta_productoras.CARGO, cuenta_productoras.COMENTARIOS, rodaje.PRODUCCION, cuenta_productoras.FECHA_RODAJE, productora.IDPRODUCTORA, productora.NOMBRE_PRODUCTORA, cuenta_productoras.FECHA_APUNTE FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA=rodaje.IDPRODUCTORA) INNER JOIN cuenta_productoras ON rodaje.IDRODAJE=cuenta_productoras.IDRODAJE WHERE (((cuenta_productoras.IDPERSONAL)=Forms!participa3!participa_IDPERSONAL) And ((cuenta_productoras.IDRODAJE)=Forms!participa3!participa_IDRODAJE)); &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/otrofor_10.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109541921275069516?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109541921275069516'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109541921275069516'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/09/otros-formularios-basados-en-tablas.html' title='Otros formularios basados en tablas puente.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109541897444071575</id><published>2004-07-31T10:20:00.000+01:00</published><updated>2005-04-06T12:43:24.126+01:00</updated><title type='text'>Uno  a varios.</title><content type='html'>&lt;table border="0" width="100%" align="center"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/07/uno-varios.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Después de todo lo que llevamos visto hablar ahora de relaciones uno a varios debe de parecer un juego de niños innecesario. Me limito a mostrar unas imágenes de un formulario y a comentar brevemente los campos relacionados.  No perdamos de vista la relaciones entre las tablas.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/unova_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Este es el aspecto que tiene un formulario que muestra una relación uno a varios y las propiedades que hay que tener en cuenta.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/unova_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Y esto es todo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109541897444071575?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109541897444071575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109541897444071575'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/07/uno-varios.html' title='Uno  a varios.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109524342487228141</id><published>2004-07-24T10:15:00.000+01:00</published><updated>2005-04-07T14:41:08.980+01:00</updated><title type='text'>Mantenimiento de las tablas puente II</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (6).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/07/mantenimiento-de-las-tablas-puente-ii.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_mantenimiento_ii_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Este formulario tiene un gran parecido con el que se describe en el artículo &lt;a target="_blank" class="b" href="http://carloszcom.blogspot.com/2004/06/mantenimiento-de-las-tablas-puente-i.html"&gt;Mantenimiento de tablas puente I&lt;/a&gt;. La barra de menús y la primera línea son idénticas. La diferencia está en las dos líneas que vienen a continuación que nos permiten seleccionar trabajadores en base a los parámetros que introduzcamos. Las fotografías, la Sección Detalle, donde se ven los registros,  y los botones que permiten agregar o eliminar trabajadores, y, ver todos los registros son idénticos al formulario ya descrito, por eso no haré ningún comentario sobre ellos. Estoy convencido de que esta parte de la aplicación no debe darse nunca por concluída del todo, atendiendo a las indicaciones de los usuarios se pueden ir diseñando nuevos formularios o mejorar los existentes. El motivo de emplear varios formularios es que resulta muy farragoso un formulario con todas las opciones de discriminación tanto a la hora de diseñarlo como a la hora de ser utilizado por el usuario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_ii_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;[A este formulario le llamo "Agregar o eliminar trabajadores a un proyecto utilizando parámetros." A continuación pego el código correspondiente a los controles que diferencian este formulario del anterior, que llamo "Agregar o eliminar trabajadores a un proyecto utilizando opciones." Hago algunos comentarios personales entre corchetes para aclarar el diseño.] &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Comando83_Click()&lt;br /&gt;&lt;br /&gt;[Este botón reemplaza los valores seleccionados por el usuario por los valores por defecto que se han asignado a los controles que muestran el mayor rango para los parámetros. Acotar los parámetros es una forma suministrar información al usuario sobre las posibilidades de la aplicación.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_ii_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;            &lt;br /&gt;            Texto66 = "1"&lt;br /&gt;            Texto70 = "99"&lt;br /&gt;            Texto72 = "50"&lt;br /&gt;            Texto75 = "250"&lt;br /&gt;            Texto78 = "40"&lt;br /&gt;            Texto81 = "150"&lt;br /&gt;            Cuadro_combinado64 = "Ambos."&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Creo conveniente aclarar las propiedades de algunos de los controles.&lt;br /&gt;&lt;br /&gt;Texto66. [Edad comprendida entre]&lt;br /&gt;&lt;br /&gt;Máscara de entrada. 99.&lt;br /&gt;Valor predeterminado. 1.&lt;br /&gt;Regla de validación. &gt;0 Y &lt;100.&lt;br /&gt;Texto de validación. Los campos edad sólo admiten valores comprendidos entre 1 y 99.&lt;br /&gt;&lt;br /&gt;Texto70. [y]&lt;br /&gt;&lt;br /&gt;Máscara de entrada. 99.&lt;br /&gt;Valor predeterminado. 99.&lt;br /&gt;Regla de validación. (&gt;0 Y &lt;100) Y (&gt;=[Forms]![participa9]![Texto66]).&lt;br /&gt;Texto de validación.Los campos Edad admiten valores comprendidos entre 1 y 99. El segundo campo debe ser igual o mayor que el primero.&lt;br /&gt;&lt;br /&gt;Texto72. [Estatura mínima.]&lt;br /&gt;&lt;br /&gt;Máscara de entrada. 999.&lt;br /&gt;Valor predeterminado. 50.&lt;br /&gt;Regla de validación. (&gt;49 Y &lt;251).&lt;br /&gt;Texto de validación. Los campos Estatura sólo admiten valores comprendidos entre 50 y 250. El campo Estatura máxima debe ser igual o mayor que el campo Estatura mínima.&lt;br /&gt;&lt;br /&gt;Texto75. [Estatura máxima.]&lt;br /&gt;&lt;br /&gt;Máscara de entrada. 999.&lt;br /&gt;Valor predeterminado. 250.&lt;br /&gt;Regla de validación. (&gt;49 Y &lt;251) Y (&gt;=[Forms]![participa9]![Texto72]).&lt;br /&gt;Texto de validación. Los campos Estatura admiten valores comprendidos entre 50 y 250. El campo Estatura máxima debe ser igual o mayor que el campo Estatura mínima.&lt;br /&gt;&lt;br /&gt;Texto78. [Peso comprendido entre.]&lt;br /&gt;&lt;br /&gt;Máscara de entrada. 999.&lt;br /&gt;Valor predeterminado. 40.&lt;br /&gt;Regla de validación. &gt;39 Y &lt;151.&lt;br /&gt;Texto de validación. Los campos Peso admiten valores comprendidos entre 40 y 150. Es posible activar una Selección cuando haya dos cantidades iguales en ambos campos o,  cuando la cantidad del segundo campo sea igual o superior a la del primer campo.&lt;br /&gt;&lt;br /&gt;Texto81. [y]&lt;br /&gt;&lt;br /&gt;Máscara de entrada. 999.&lt;br /&gt;Valor predeterminado. 150.&lt;br /&gt;Regla de validación. (&gt;39 Y &lt;151) Y (&gt;=[Forms]![participa9]![Texto78]).&lt;br /&gt;Texto de validación. Los campos Peso admiten valores comprendidos entre 40 y 150. Es posible activar una Selección cuando haya dos cantidades iguales en ambos campos o,  cuando la cantidad del segundo campo sea igual o superior a la del primer campo.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Comando63_Click()&lt;br /&gt;&lt;br /&gt;[Este botón no hace nada, no sé por qué no lo quito.]&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado20_GotFocus()&lt;br /&gt;&lt;br /&gt;Dim elect As String&lt;br /&gt;Dim rom As String&lt;br /&gt;Dim here As String&lt;br /&gt;Dim rder As String&lt;br /&gt;Dim fin As String&lt;br /&gt;&lt;br /&gt;Me.Cuadro_combinado26 = ""&lt;br /&gt;&lt;br /&gt;[Algunos controles permanecen ocultos  para evitar incongruencias. El control tiene RowSource dinámico dependiendo de todas las opciones anteriores, edad, estatura y peso. Si el usuario no introduce valores en alguno de estos  controles siempre permanecerán los valores por defecto que como ya he dicho proporcionan el mayor rango posible de datos.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_ii_3.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Comando61.Visible = False&lt;br /&gt;    Comando62.Visible = False&lt;br /&gt;    Comando67.Visible = False&lt;br /&gt;    Comando68.Visible = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(3).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;Dim owsource20 As String&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    elect = "SELECT DISTINCT  [personal].[APELLIDOS]"&lt;br /&gt;    rom = " FROM personal INNER JOIN parametros ON [personal].[IDPERSONAL] =[parametros].[IDPERSONAL]"&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    If Cuadro_combinado64 = "Femenino." Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((SEXO)='" &amp; "mujer" &amp; "') AND ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])"&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    ElseIf Cuadro_combinado64 = "Masculino." Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((SEXO)='" &amp; "hombre" &amp; "') AND ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])"&lt;br /&gt; &lt;br /&gt;    ElseIf Cuadro_combinado64 = "Ambos." Or Cuadro_combinado64 = Null Then&lt;br /&gt;    &lt;br /&gt;        here = " WHERE ((CByte((Date()-[personal].[FECHA_NACIMIENTO])/365))" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto66] And [Forms]![participa9]![Texto70])" &amp; _&lt;br /&gt;        " AND ((ESTATURA)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto72] And [Forms]![participa9]![Texto75]) AND ((PESO)" &amp; _&lt;br /&gt;        " Between [Forms]![participa9]![Texto78] And [Forms]![participa9]![Texto81])"&lt;br /&gt;            &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;        rder = " ORDER BY [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;        fin = ";"&lt;br /&gt;    &lt;br /&gt;            Me.Cuadro_combinado20.RowSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado26_GotFocus()&lt;br /&gt;&lt;br /&gt;[El control tiene RowSource dinámico dependiendo de la selección hecha en Cuadro combinado20, Trabajadores. Si se da el caso de que se muestre más de un id el usuario cuenta con las fotografías que le pueden ayudar a decidir.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_ii_4.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado20 &lt;&gt; "" Then&lt;br /&gt;       &lt;br /&gt;    &lt;br /&gt;            elect = "SELECT personal.IDPERSONAL, personal.APELLIDOS"&lt;br /&gt;            &lt;br /&gt;            rom = " FROM personal"&lt;br /&gt;            &lt;br /&gt;            here = " WHERE (((personal.APELLIDOS) ='" &amp; [Forms]![participa9]![Cuadro combinado20] &amp; "'))"&lt;br /&gt;            &lt;br /&gt;            rder = " ORDER BY personal.IDPERSONAL"&lt;br /&gt;            &lt;br /&gt;            fin = ";"&lt;br /&gt;    &lt;br /&gt;        &lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;        Me.Cuadro_combinado26.RowSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado26_Change()&lt;br /&gt;&lt;br /&gt;[Se muestran los controles que permiten agregar o eliminar registros.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_ii_5.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;        If Cuadro_combinado18 &lt;&gt; "" Then&lt;br /&gt;            If Cuadro_combinado26 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;                Comando61.Visible = True&lt;br /&gt;                Comando62.Visible = True&lt;br /&gt;                Comando67.Visible = True&lt;br /&gt;                Comando68.Visible = True&lt;br /&gt;                &lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(2).Controls(2).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(2).Controls(3).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(3).Controls(1).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_parametros").Controls(3).Controls(2).Enabled = True&lt;br /&gt;                &lt;br /&gt;            End If&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109524342487228141?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109524342487228141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109524342487228141'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/07/mantenimiento-de-las-tablas-puente-ii.html' title='Mantenimiento de las tablas puente II'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108790559469070937</id><published>2004-07-17T10:15:00.000+01:00</published><updated>2005-04-06T12:48:13.413+01:00</updated><title type='text'>La función perteneceagrupo()</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (3).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/07/la-funcin-perteneceagrupo.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_perteneceagrupo_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://www.carloszcom.com/blogima/idea.gif" align="right" hspace="5" vspace="5" alt="Los grupos de noticias son una buena fuente de información."&gt;Esta función me la pasó CarCar en el &lt;a target="_blank"  class="b" href="http://support.microsoft.com/newsgroups/default.aspx" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;grupo de noticias de Access de Microsoft.&lt;/a&gt; Pego su post sin quitarle una coma. Esta función es imprescindible para comprender el funcionamiento de mi formulario participa3, el que tengo como ejemplo en el artículo &lt;a target="_blank" class="b"   href="http://carloszcom.blogspot.com/2004/07/mostrar-el-resultado-de-una-relacin.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Mostrar una relación varios a varios.&lt;/a&gt; Como siempre los comentarios van entre corchetes.&lt;br /&gt;&lt;br /&gt;Hola Carlos:&lt;br /&gt;&lt;br /&gt;Voy a explicar instrucción por instruccion el código de la función que te dice si un usuario pertenece a un grupo, escribiendo los comentarios me he dado cuenta de que no era eficiente, así que está tiene una pequeña corrección.&lt;br /&gt;&lt;br /&gt;[Aquí definimos la función que se llama "PerteneceaGrupo", la función requiere que se le pasen 2 parámetros: "Usuario" y "Grupo", la función devuelve un valor booleano que nos dirá si el Usuario pertenece al Grupo.]&lt;br /&gt;&lt;br /&gt;Public Function PerteneceaGrupo(Usuario As String, Grupo As String) As Boolean&lt;br /&gt;&lt;br /&gt;[Defines un espacio de trabajo, cuando alguien se conecta a una base de datos lo hace a través de un Workspace.]&lt;br /&gt; &lt;br /&gt;Dim Wk As Workspace&lt;br /&gt;&lt;br /&gt;[Para un espacio de trabajo existen unos grupos de usarios definimos un objeto de tipo "Grupo de usuarios" para poder acceder a los datos que pertenecen a cada grupo.] &lt;br /&gt;&lt;br /&gt;Dim Gr As Group&lt;br /&gt;&lt;br /&gt;[Definimos un objeto de tipo "Usuario" para poder acceder a datos como el nombre de los usuarios.]&lt;br /&gt;&lt;br /&gt;Dim Us As User&lt;br /&gt;&lt;br /&gt;[Inicialmente decimos que "PerteneceaGrupo" vale "False", si posteriormente resulta que el usario si pertenece al grupo le pondremos el valor "True".]&lt;br /&gt;&lt;br /&gt;PerteneceaGrupo = False&lt;br /&gt;&lt;br /&gt;[Asignamos a nuestra variable "Wk" el espacio de trabajo "por defecto", el "DBEngine" es el motor de Access, en este se abre cuando te conectas un espacio de trabajo, que siempre es el primero y puedes acceder a él a través de su índice 0 (cero). En access los índice de todas las colecciones empiezan en cero y no en 1.]&lt;br /&gt;&lt;br /&gt;Set Wk = DBEngine.Workspaces(0)&lt;br /&gt;&lt;br /&gt;[&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profunco, dedícale tiempo."&gt;La instrucción "For Each" (Para cada) hace varias cosas a la vez: Nos mete en un bucle con el que recorremos todos los grupos de usuarios existentes en el espacio de trabajo, además "Gr" se convierte en el Grupo de usuarios activos y podemos acceder a múltiples propiedades y métodos para actuar, puedes comprobar todas a las que tienes acceso tecleando dentreo del código simplemente Gr. y aparecerán... una de ellas es la propiedad "Name" que luego usaremos, otra la colección de usuarios que pertenecen al grupo.]&lt;br /&gt;&lt;br /&gt;For Each Gr In Wk.Groups&lt;br /&gt;&lt;br /&gt;[Comprobamos si el grupo que acabamos de obtener es el que hemos recibido como parámetro, si no lo es la ejecución del código saltará al "End If" y leerá otro Grupo, el nombre del grupo se encuentra en la propiedad "Name".]&lt;br /&gt;&lt;br /&gt;If Gr.Name = Grupo Then&lt;br /&gt;&lt;br /&gt;[Estando en un grupo determinado, con este nuevo "For each", vamos a recorrer todos los usuarios que pertenecen al grupo "Gr" para ver si entre ellos está nuestro usuario.]&lt;br /&gt;&lt;br /&gt;For Each Us In Gr.Users&lt;br /&gt;&lt;br /&gt;[En este punto de la función estamos en un usuario "Us", el nombre del usuario está en "Us.Name". En este "If" preguntamos si el nombre del usuario que teneos que comprobar, que está en la variable "Usuario" es igual al nombre del usuario que estamos leyendo...]&lt;br /&gt;&lt;br /&gt;If Us.Name = Usuario Then&lt;br /&gt; &lt;br /&gt;[Si estamos aquí es porque resulta que nuestro Usuario pertenece al Grupo, por lo tanto damos a la función el valor de True.]&lt;br /&gt;&lt;br /&gt;PerteneceaGrupo = True&lt;br /&gt;&lt;br /&gt;[Como ya sabemos que el usuario pertenece al grupo no tenemos que hacer nada más en la función, así que con el Set del Wk a Nothing lo que hacemos es liberar la memoria utilizada.]&lt;br /&gt; &lt;br /&gt;Set Wk = Nothing&lt;br /&gt;&lt;br /&gt;[Y salimos directamente de la función.]&lt;br /&gt;&lt;br /&gt;Exit Function&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Si el nombre del usuario asignado no coincide con el nuestro pasamos al siguiente usuario dentro de la colección de usuarios del grupo asignado con un "Next".]&lt;br /&gt;&lt;br /&gt;Next&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Si el nombre del grupo asignado no coincide con el que debemos comprobar pasamos a procesar el siguiente grupo con este "Next".]&lt;br /&gt;&lt;br /&gt;Next&lt;br /&gt;&lt;br /&gt;[Si la función ha llegado hasta aquí es porque no ha encontrado la correspondencia entre usuario y grupo, simplemente liberamos la memoria asignada.]&lt;br /&gt;&lt;br /&gt;Set Wk = Nothing&lt;br /&gt;    &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Saludos, &lt;br /&gt;CarCar&lt;br /&gt;MVP-Access&lt;br /&gt;&lt;br /&gt;PD: Si te da cualquier tipo de error indica la sentencia en la que se produce.&lt;br /&gt;&lt;br /&gt;PD2: Todo el código anterior trabaja con los objetos de DAO por lo que debes de tener referenciada dicha librería y que esté por encima de la de ADO.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108790559469070937?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108790559469070937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108790559469070937'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/07/la-funcin-perteneceagrupo.html' title='La función perteneceagrupo()'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108688550501619449</id><published>2004-07-10T10:15:00.000+01:00</published><updated>2005-04-08T13:21:40.400+01:00</updated><title type='text'>Mostrar el resultado de una relación varios a varios.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (26).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/07/mostrar-el-resultado-de-una-relacin.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_mostrar_varios_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Yo utilizo para esto un formulario en vista formulario basado en una consulta en la que intervienen&lt;a target="_blank" class="b"   href="http://carloszcom.blogspot.com/2004/05/diseo-de-bases-de-datos.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt; las tablas "extremos" y la tabla "puente"&lt;/a&gt;, la forma de mostrar los registros sería de uno en uno por la tabla "puente" pero, para que el resultado sea elocuente hay que instalar combos que filtren por campos de las tablas "extremos" y también por campos de la tabla "puente". En nuestro &lt;a target="_blank" class="b"  href="http://carloszcom.blogspot.com/2004/05/diseo-de-bases-de-datos.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;centro de atención primaria&lt;/a&gt;, un combo mostraría los médicos y mediante selección obtendríamos todos los pacientes que  ha atendido y los resultados de cada consulta. Otro combo mostraría los pacientes y seleccionando obtendríamos los médicos que lo han atendido e igulamente los resultados de la consulta correspondiente. Instalaríamos otros combos que discriminarían por  campos de la tabla "puente", es decir, de la tabla "consultas", como fecha o, por diagnóstico. Podemos conseguir también filtros acumulativos por un campo de una tabla "extremo" y un campo, o varios, de la tabla "puente". Por ejemplo, las consultas del doctor x (tabla "extremo") en el día d (tabla "puente"), la estructura de la consulta en que está basado el formulario y el diseño del formulario devolverían también el nombre de los pacientes. Otro ejemplo, las consultas del doctor x (tabla "extremo") en las que  el diagnóstico ha sido gripe (tabla "puente") como en el caso anterior obtendríamos el nombre de los pacientes. Otro ejemplo, consultas a las que ha asistido un paciente (tabla "extremo") en las que se ha diagnosticado una misma enfermedad (tabla "puente"), en este caso la estructura del formulario devolvería también el nombre del médico que emitió el diagnóstico. Puede resultar muy conveniente mezclar o, alternar el resultado de estos filtros con otros que proporciona Acces. Hay que tener en cuenta que en este formulario no se mostrarían los pacientes que nunca han asistido a una consulta ni han participado en ningún plan de salud, ni los médicos que no han estado nunca en activo.&lt;br /&gt;&lt;br /&gt;A continuación pego el código de un formulario diseñado para este propósito. Este formulario es el corazón de la aplicación mientras que los formularios que se describen en los artículos &lt;a target="_blank" class="b"  href="http://carloszcom.blogspot.com/2004/06/mantenimiento-de-las-tablas-puente-i.html"&gt;Mantenimiento de las tablas puente I&lt;/a&gt;, y &lt;a target="_blank" class="b"  href="http://carloszcom.blogspot.com/2004/07/mantenimiento-de-las-tablas-puente-ii.html"&gt;Mantenimiento de las tablas puente II&lt;/a&gt; son el cerebro y el sistema nervios. Los comentarios van entre corchetes. Son 14 procedimientos, 14 funciones privadas, una función pública, 29 páginas con 14 imágenes que te ayudarán a comprender lo que estoy haciendo. Hago algunos comentarios personales para aclarar el diseño la base de datos. Hay también alguna programación DAO. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;  &lt;br /&gt;Option Compare Database&lt;br /&gt;Option Explicit&lt;br /&gt;&lt;br /&gt;[Para almacenar la cadena SQL que le paso a la propiedad RecordSource bastaría con una variable, yo utilizo cinco variables para facilitar la lectura.]&lt;br /&gt;                    &lt;br /&gt;Dim fin As String&lt;br /&gt;Dim elect As String&lt;br /&gt;Dim rom As String&lt;br /&gt;Dim here As String&lt;br /&gt;Dim rder As String&lt;br /&gt;    &lt;br /&gt;[El formulario tiene instalados 6 combos, el último que  ha sido utilizado se muestra de un color distinto  a los demás, declaro una variable por cada uno de los combos.]&lt;br /&gt;  &lt;br /&gt;Dim color108 As Boolean&lt;br /&gt;Dim color70 As Boolean&lt;br /&gt;Dim color102 As Boolean&lt;br /&gt;Dim color100 As Boolean&lt;br /&gt;Dim color104 As Boolean&lt;br /&gt;Dim color106 As Boolean&lt;br /&gt;                    &lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Activate()&lt;br /&gt;&lt;br /&gt;[&lt;a target="_blank" class="b"   href="http://carloszcom.blogspot.com/2004/07/la-funcin-perteneceagrupo.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;La función perteneceagrupo()&lt;/a&gt; será explicada en otro apartado con todo detenimiento, basta saber ahora que la utilizo para saber si el usuario actual pertenece a un grupo determinado, en este caso al grupo clientes]&lt;br /&gt;&lt;br /&gt;If PerteneceaGrupo(CurrentUser(), "clientes") Then&lt;br /&gt;&lt;br /&gt;[Ocultamos ciertos campos que no queremos mostrar a los miembros del grupo clientes.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;                                       &lt;br /&gt;Me.APELLIDOS.Visible = False&lt;br /&gt;Me.NOMBRE.Visible = False&lt;br /&gt;Me.FECHA_NACIMIENTO.Visible = False&lt;br /&gt;Me.FECHA_ALTA.Visible = False&lt;br /&gt;Me.PUESTO.Visible = False&lt;br /&gt;Me.DIRECCION.Visible = False&lt;br /&gt;Me.CODIGO.Visible = False&lt;br /&gt;Me.POBLACION.Visible = False&lt;br /&gt;Me.PROVINCIA.Visible = False&lt;br /&gt;Me.DNI.Visible = False&lt;br /&gt;Me.SS.Visible = False&lt;br /&gt;Me.TELEFONO.Visible = False&lt;br /&gt;Me.TELEFONO_1.Visible = False&lt;br /&gt;Me.TELEFONO_2.Visible = False&lt;br /&gt;Me.FAX.Visible = False&lt;br /&gt;Me.CORREO_ELECTRONICO.Visible = False&lt;br /&gt;Me.CURRICULUM.Visible = False&lt;br /&gt;Me.personal_COMENTARIOS.Visible = False&lt;br /&gt;Me.FALTAS.Visible = False&lt;br /&gt;                      &lt;br /&gt;End If&lt;br /&gt;                    &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Open(Cancel As Integer)&lt;br /&gt;&lt;br /&gt;DoCmd.Maximize&lt;br /&gt;&lt;br /&gt;[El RecordSource cambiará muchas veces asignación a las variables.]&lt;br /&gt;      &lt;br /&gt;elect = "SELECT [participa].[FECHA] As participa_FECHA," &amp; _&lt;br /&gt;" [participa].[IDPERSONAL] AS participa_IDPERSONAL, [participa].[FALTAS]," &amp; _&lt;br /&gt;" [participa].[IDRODAJE] AS participa_IDRODAJE, [participa].[DESCARTAR], [personal].[IDPERSONAL]" &amp; _&lt;br /&gt;" AS personal_IDPERSONAL, [personal].[FECHA_ALTA], [personal].[FECHA_NACIMIENTO], [personal].[PUESTO]," &amp; _&lt;br /&gt;" [personal].[APELLIDOS], [personal].[NOMBRE], [personal].[DIRECCION], [personal].[CODIGO]," &amp; _&lt;br /&gt;" [personal].[POBLACION], [personal].[PROVINCIA], [personal].[DNI], [personal].[SS], [personal].[TELEFONO]," &amp; _&lt;br /&gt;" [personal].[TELEFONO_1], [personal].[TELEFONO_2], [personal].[FAX], [personal].[CORREO_ELECTRONICO]," &amp; _&lt;br /&gt;" [personal].[COMENTARIOS] AS personal_COMENTARIOS, [personal].[CURRICULUM], [personal].[FOTOGRAFIA]," &amp; _&lt;br /&gt;" [rodaje].[IDRODAJE] AS rodaje_IDRODAJE, [rodaje].[IDPRODUCTORA], [rodaje].[PRODUCCION]," &amp; _&lt;br /&gt;" [rodaje].[FECHA], [rodaje].[HORA_CITA], [rodaje].[HORA_FIN], [rodaje].[LUGAR_CITA]," &amp; _&lt;br /&gt;" [rodaje].[LUGAR_RODAJE], [rodaje].[VESTUARIO], [rodaje].[CATERING], [rodaje].[DETALLE]," &amp; _&lt;br /&gt;" [rodaje].[COMENTARIOS] AS rodaje_COMENTARIOS, [productora].[USUARIO]"&lt;br /&gt;            &lt;br /&gt;rom = "FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE)" &amp; _&lt;br /&gt;" ON personal.IDPERSONAL = participa.IDPERSONAL) ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA"&lt;br /&gt;&lt;br /&gt;[Queremos que el formulario aparezca en blanco y le damos una fecha imposible de cumplir. Solución poco ortodoxa.]&lt;br /&gt;&lt;br /&gt;here = " WHERE [rodaje].[FECHA]=01/01/1900"&lt;br /&gt;            &lt;br /&gt;rder = " ORDER BY [rodaje].[FECHA] DESC , [rodaje].[PRODUCCION]"&lt;br /&gt;&lt;br /&gt;fin = ";"&lt;br /&gt;&lt;br /&gt;[Pasamos valor a la propiedad RecordSource uniendo las variables que forman la cadena SQL.]&lt;br /&gt;                               &lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;[A los controles personalizados de una barra de herramientas personalizada se accede a través de su índice, cosa que no ha sido nada fácil llegar a descubrirlo, algunos permanecen desactivados hasta que no se muestren datos para evitar incongruencias. Este fragmento de código requiere que esté activada la referencia DAO.]&lt;br /&gt;&lt;br /&gt;CommandBars("barra_participa3").Controls(2).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(1).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(2).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(3).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(4).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(5).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(6).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(7).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(8).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(5).Enabled = False&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_3.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario al abrir.]&lt;br /&gt;&lt;br /&gt;[Este combo muestra los valores, "Todos", "30 días atrás en adelante", "60 días atrás en adelante", "90 días atrás en adelante", "Posteriores al día de hoy". Según este criterio se flitran los registros.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado108_Change(). [Combo Opciones.]&lt;br /&gt;&lt;br /&gt;[Al seleccionar una opción cambiamos el color de fondo distinguiéndolo del resto de los combos.]&lt;br /&gt;[Al seleccionar se muestran otros combos.]&lt;br /&gt;&lt;br /&gt;color108 = True&lt;br /&gt;color70 = False&lt;br /&gt;color102 = False&lt;br /&gt;color100 = False&lt;br /&gt;color104 = False&lt;br /&gt;color106 = False&lt;br /&gt;        &lt;br /&gt;If color108 = True Then&lt;br /&gt;Me.Cuadro_combinado108.BackColor = 16777088&lt;br /&gt;Me.Cuadro_combinado70.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado102.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado100.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado104.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado106.BackColor = 16777215&lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;[La mayoría de los combos permanecen ocultos al abrir el formulario para evitar incongruencias.]&lt;br /&gt;&lt;br /&gt;Cuadro_combinado70.Visible = True&lt;br /&gt;Col1_Etiqueta.Visible = True&lt;br /&gt;  &lt;br /&gt;If PerteneceaGrupo(CurrentUser(), "clientes") Then&lt;br /&gt;&lt;br /&gt;[Utilizando esta función averiguamos si un usuario pertenece al grupo clientes en cuyo caso no le mostramos el combo que permite filtrar por una de las tablas "extremo", la tabla trabajadores. A los usuarios del grupo clientes no le mostramos datos personales por medio de los cuales puedan establecer contacto por su cuenta. Se trata de una empresa de selección de personal.]&lt;br /&gt;                &lt;br /&gt;Cuadro_combinado102.Visible = False&lt;br /&gt;Etiqueta103.Visible = True&lt;br /&gt;&lt;br /&gt;[Para los usuarios del grupo clientes permanecen desactivadas ciertas opciones de la barra de menús personalizada, se trata de opciones que permiten acceder a formularios que muestran datos que no queremos que vean. Ya hemos dicho que se accede a los controles por el índice. A pesar de que en ningún caso hemos descuidado la seguridad por usuarios utilizamos esta opción para tener mejor comunicación con el usuario.]&lt;br /&gt;                        &lt;br /&gt;CommandBars("barra_participa3").Controls(2).Enabled = False&lt;br /&gt;                        &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(1).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(2).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(3).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(4).Enabled = False&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(5).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(6).Enabled = False&lt;br /&gt;                            &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(7).Enabled = False&lt;br /&gt;                            &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(8).Enabled = False&lt;br /&gt;                                        &lt;br /&gt;CommandBars("barra_participa3").Controls(5).Enabled = False&lt;br /&gt;                        &lt;br /&gt;Else&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_4.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario]&lt;br /&gt;&lt;br /&gt;[Si el usuario pertenece a cualquier otro grupo que no sea clientes, se muestra el combo que contiene los apellidos de nuestros empleados.]&lt;br /&gt;                   &lt;br /&gt;Cuadro_combinado102.Visible = True&lt;br /&gt;Etiqueta103.Visible = True&lt;br /&gt;&lt;br /&gt;[Los controles de la barra de menús se activan, a pesar de que en ningún caso hemos descuidado la seguridad por usuarios utilizamos esta opción para tener mejor comunicación con el usuario.]&lt;br /&gt;                        &lt;br /&gt;CommandBars("barra_participa3").Controls(2).Enabled = True&lt;br /&gt;                            &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(1).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(2).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(3).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(4).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(5).Enabled = True&lt;br /&gt;    &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(6).Enabled = True&lt;br /&gt;                            &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(7).Enabled = True&lt;br /&gt;                            &lt;br /&gt;CommandBars("barra_participa3").Controls(3).Controls(8).Enabled = True&lt;br /&gt;                                        &lt;br /&gt;CommandBars("barra_participa3").Controls(5).Enabled = True&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Tanto si el usuario actual pertenece al grupo clientes como si no, se muestra el combo que contiene las opciones de filtrado de una de las tablas "extremo", la tabla "proyectos".]&lt;br /&gt;          &lt;br /&gt;Cuadro_combinado100.Visible = True&lt;br /&gt;Etiqueta101.Visible = True&lt;br /&gt;&lt;br /&gt;[Estos combos permanecen ocultos hasta que no se haga una selección en el combo anterior, con objeto de filtrar por varios conceptos.]&lt;br /&gt;    &lt;br /&gt;Cuadro_combinado106.Visible = False&lt;br /&gt;Etiqueta107.Visible = False&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado104.Visible = False&lt;br /&gt;Etiqueta105.Visible = False&lt;br /&gt;    &lt;br /&gt;             &lt;br /&gt;If PerteneceaGrupo(CurrentUser(), "clientes") Then&lt;br /&gt;&lt;br /&gt;[Si el usuario pertenece al grupo clientes, sólo se muestran sus proyectos, no se muestran los del resto de los clientes. Nueva asignación a las variables que intervienen en el RecordSource.]&lt;br /&gt;&lt;br /&gt;[El campo "USUARIO" de la tabla "productora" debe de coincidir con el nombre de usuario que se da en el menú Seguridad.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_5.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.] &lt;br /&gt;         &lt;br /&gt;If Cuadro_combinado70 = "Ascendente" Then&lt;br /&gt;        &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = " WHERE [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date() And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;End If&lt;br /&gt;                &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] ASC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;Else: Cuadro_combinado70 = "Descendente"&lt;br /&gt;                    &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = " WHERE [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date() And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;End If&lt;br /&gt;                   &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] DESC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;Else&lt;br /&gt;&lt;br /&gt;[Si el usuario actual pertenece a cualquier otro grupo se aplica sólo el filtro por fechas. No utilizamos la variable CurrentUser().]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_6.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver un formulario abierto por un usuario que no pertenece al grupo clientes.]&lt;br /&gt;&lt;br /&gt;If Cuadro_combinado70 = "Ascendente" Then&lt;br /&gt;        &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = ""&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90"&lt;br /&gt;End If&lt;br /&gt;                &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] ASC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;Else: Cuadro_combinado70 = "Descendente"&lt;br /&gt;                    &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = ""&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90"&lt;br /&gt;End If&lt;br /&gt;                   &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] DESC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Cada vez que  seleccionamos una opción en este combo cambiamos la propiedad RecordSource.]&lt;br /&gt;                &lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado70_Change(). [Combo Orden.]&lt;br /&gt;&lt;br /&gt;[Este combo mustra los valores "Ascendente" y "Descendente".]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_7.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver este control.]&lt;br /&gt;&lt;br /&gt;[Cambiamos el color de fondo.]&lt;br /&gt;&lt;br /&gt;color108 = False&lt;br /&gt;color70 = True&lt;br /&gt;color102 = False&lt;br /&gt;color100 = False&lt;br /&gt;color104 = False&lt;br /&gt;color106 = False&lt;br /&gt;        &lt;br /&gt;If color70 = True Then&lt;br /&gt;Me.Cuadro_combinado108.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado70.BackColor = 16777088&lt;br /&gt;Me.Cuadro_combinado102.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado100.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado104.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado106.BackColor = 16777215            &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Estos combos se mantienen ocultos hasta que no se haga una selección sobre el combo que muestra una de las tablas "extremo", la tabla proyectos.]&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado106.Visible = False&lt;br /&gt;Etiqueta107.Visible = False&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado104.Visible = False&lt;br /&gt;Etiqueta105.Visible = False&lt;br /&gt;&lt;br /&gt;[Si el usuario pertenece al grupo clientes, sólo se muestran sus proyectos, no se muestran los del resto de los clientes. Nueva asignación a las variables que intervienen en el RecordSource.]&lt;br /&gt;                &lt;br /&gt;If PerteneceaGrupo(CurrentUser(), "clientes") Then&lt;br /&gt;        &lt;br /&gt;If Cuadro_combinado70 = "Ascendente" Then&lt;br /&gt;                &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = " WHERE [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date() And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;                &lt;br /&gt;End If&lt;br /&gt;                &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] ASC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;ElseIf Cuadro_combinado70 = "Descendente" Then&lt;br /&gt;                    &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = " WHERE [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date() And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90 And [productora].[USUARIO] = CurrentUser()"&lt;br /&gt;End If&lt;br /&gt;                   &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] DESC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;               &lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;Else&lt;br /&gt;&lt;br /&gt;[Si el usuario actual pertenece a cualquier otro grupo se aplica sólo el filtro por fechas. No utilizamos la variable CurrentUser().]&lt;br /&gt; &lt;br /&gt;If Cuadro_combinado70 = "Ascendente" Then&lt;br /&gt;                &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = ""&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90"&lt;br /&gt;                &lt;br /&gt;End If&lt;br /&gt;                &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] ASC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;                &lt;br /&gt;ElseIf Cuadro_combinado70 = "Descendente" Then&lt;br /&gt;                    &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;here = ""&lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()"&lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-30"&lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-60"&lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;here = " WHERE [participa].[FECHA]&gt;Date()-90"&lt;br /&gt;End If&lt;br /&gt;                   &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] DESC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;               &lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Cada vez que  seleccionamos una opción en este combo cambiamos la propiedad RecordSource.]&lt;br /&gt;              &lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82"&gt;Private Sub Cuadro_combinado102_GotFocus(). [Combo Apellidos.]&lt;br /&gt;&lt;br /&gt;[Ya hemos visto que este combo sólo se muestra si el usuario no pertnece al grupo clientes. Nos permitirá filtrar el formulario por una de las tablas "extremo", la tabla trabajadores, y añadir a este filtro el que hemos hecho con el Combo 108 (Combo Opciones). De lo que se trata ahora es de conseguir que todas las opciones den como resultado algún registro. No queremos que se muestren los trabajadores que nunca han participado en un proyecto. Para ello modificamos la propiedad Rowsource.]&lt;br /&gt;&lt;br /&gt;[Esta variable almacena la cadena SQL que le pasaremos a la propiedad RowSource.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Para ser consecuente conmigo mismo la variable owsource debería de dividirla en dos. &lt;br /&gt;&lt;br /&gt;owsource102_1="SELECT DISTINCT [personal].[APELLIDOS] FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" [rodaje].[IDRODAJE]=[participa].[IDRODAJE]) ON" &amp; _&lt;br /&gt;" [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) ON" &amp; _&lt;br /&gt;" [productora].[IDPRODUCTORA]=[rodaje].[IDPRODUCTORA]"&lt;br /&gt;&lt;br /&gt;y owsource102_2, que cambiaría de valor para cada una de las opciones siguientes&lt;br /&gt;&lt;br /&gt;If Me.Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;owsource102_2 = " WHERE [participa].[FECHA]&gt;Date();"&lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "Todos." Then&lt;br /&gt;owsource102_2 = ";" &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;owsource102_2 = " WHERE [participa].[FECHA]&gt;Date()-30;"&lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;owsource102_2 = " WHERE [participa].[FECHA]&gt;Date()-60;"&lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;owsource102_2 = " WHERE [participa].[FECHA]&gt;Date()-90;"&lt;br /&gt;&lt;br /&gt;Me.Cuadro_combinado102.RowSource = owsource102_1 + owsource102_2&lt;br /&gt;&lt;br /&gt;de esta manera se ahorra uno muchas líneas de código.]&lt;br /&gt; &lt;br /&gt;Dim owsource102 As String&lt;br /&gt;     &lt;br /&gt;If Me.Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;            &lt;br /&gt;owsource102 = "SELECT DISTINCT [personal].[APELLIDOS] FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" [rodaje].[IDRODAJE]=[participa].[IDRODAJE]) ON" &amp; _&lt;br /&gt;" [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) ON" &amp; _&lt;br /&gt;" [productora].[IDPRODUCTORA]=[rodaje].[IDPRODUCTORA]" &amp; _&lt;br /&gt;" WHERE [participa].[FECHA]&gt;Date();"&lt;br /&gt;        &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "Todos." Then&lt;br /&gt;            &lt;br /&gt;owsource102 = "SELECT DISTINCT [personal].[APELLIDOS] FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" [rodaje].[IDRODAJE]=[participa].[IDRODAJE]) ON" &amp; _&lt;br /&gt;" [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) ON" &amp; _&lt;br /&gt;" [productora].[IDPRODUCTORA]=[rodaje].[IDPRODUCTORA];"&lt;br /&gt;        &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;owsource102 = "SELECT DISTINCT [personal].[APELLIDOS] FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" [rodaje].[IDRODAJE]=[participa].[IDRODAJE]) ON" &amp; _&lt;br /&gt;" [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) ON" &amp; _&lt;br /&gt;" [productora].[IDPRODUCTORA]=[rodaje].[IDPRODUCTORA]" &amp; _&lt;br /&gt;" WHERE [participa].[FECHA]&gt;Date()-30;"&lt;br /&gt;        &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;owsource102 = "SELECT DISTINCT [personal].[APELLIDOS] FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" [rodaje].[IDRODAJE]=[participa].[IDRODAJE]) ON" &amp; _&lt;br /&gt;" [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) ON" &amp; _&lt;br /&gt;" [productora].[IDPRODUCTORA]=[rodaje].[IDPRODUCTORA]" &amp; _&lt;br /&gt;" WHERE [participa].[FECHA]&gt;Date()-60;"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;owsource102 = "SELECT DISTINCT [personal].[APELLIDOS] FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" [rodaje].[IDRODAJE]=[participa].[IDRODAJE]) ON" &amp; _&lt;br /&gt;" [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) ON" &amp; _&lt;br /&gt;" [productora].[IDPRODUCTORA]=[rodaje].[IDPRODUCTORA]" &amp; _&lt;br /&gt;" WHERE [participa].[FECHA]&gt;Date()-90;"&lt;br /&gt;&lt;br /&gt;End If  &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_8.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]      &lt;br /&gt;&lt;br /&gt;[Obtenemos una nueva  lista de apellidos cada vez que enfocamos el control.]&lt;br /&gt;&lt;br /&gt;Me.Cuadro_combinado102.RowSource = owsource102&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado102_Change(). Combo Apellidos.&lt;br /&gt;&lt;br /&gt;[Al seleccionar un apellido vamos a modificar el RecordSource del formulario que nos va a mostrar los proyectos en que ha participado el trabajador seleccionado.]&lt;br /&gt;&lt;br /&gt;[Cambiamos el color de fondo del combo.]&lt;br /&gt;&lt;br /&gt;color108 = False&lt;br /&gt;color70 = False&lt;br /&gt;color102 = True&lt;br /&gt;color100 = False&lt;br /&gt;color104 = False&lt;br /&gt;color106 = False&lt;br /&gt;        &lt;br /&gt;If color102 = True Then&lt;br /&gt;Me.Cuadro_combinado108.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado70.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado102.BackColor = 16777088&lt;br /&gt;Me.Cuadro_combinado100.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado104.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado106.BackColor = 16777215&lt;br /&gt;End If&lt;br /&gt;                    &lt;br /&gt;[Podemos sustituir la función de este combo, que consiste en proporcionar ordenación ascendente o descendente para los registros por una opción incorporada que nos proporciona Acces, nos evitamos así muchas líneas de código.]&lt;br /&gt;&lt;br /&gt;Cuadro_combinado70.Visible = False&lt;br /&gt;Col1_Etiqueta.Visible = False&lt;br /&gt;&lt;br /&gt;[Estos combos se mantienen ocultos hasta que no se haga una selección sobre el combo que muestra una de las tablas "extremo", la tabla proyectos.]&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado106.Visible = False&lt;br /&gt;Etiqueta107.Visible = False&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado104.Visible = False&lt;br /&gt;Etiqueta105.Visible = False&lt;br /&gt;&lt;br /&gt;[Asignamos valor a algunas de las variables que intervienen en la formación del RecordSource.]&lt;br /&gt;        &lt;br /&gt;If Cuadro_combinado102 &lt;&gt; "" Then&lt;br /&gt;&lt;br /&gt;If Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;                &lt;br /&gt;here = " WHERE APELLIDOS=[Forms]![participa3]![Cuadro combinado102]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()"&lt;br /&gt;            &lt;br /&gt;ElseIf Cuadro_combinado108 = "Todos." Then&lt;br /&gt;                &lt;br /&gt;here = " WHERE APELLIDOS=[Forms]![participa3]![Cuadro combinado102]"&lt;br /&gt;            &lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;                &lt;br /&gt;here = " WHERE APELLIDOS=[Forms]![participa3]![Cuadro combinado102]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()-30"&lt;br /&gt;            &lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;here = " WHERE APELLIDOS=[Forms]![participa3]![Cuadro combinado102]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()-60"&lt;br /&gt;                &lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;here = " WHERE APELLIDOS=[Forms]![participa3]![Cuadro combinado102]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()-90"&lt;br /&gt;            &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Nueva ordenación de los registros, se muestran en primer, los de fecha más avanzada por ser la opción más necesaria.]&lt;br /&gt;                &lt;br /&gt;rder = " ORDER BY [participa].[FECHA] DESC, [rodaje].[PRODUCCION]"&lt;br /&gt;        &lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;[Cada vez que seleccionamos un apellido cambiamos el RecordSource, las variables elect, rom y fin permanecen inalterables desde que abrimos el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_9.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;        &lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado100_GotFocus(). [Combo Producción.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Este combo nos permitirá filtrar el formulario por una de las tablas "extremo", la tabla proyectos, y añadir a este filtro al que hemos hecho con el Combo 108 (Combo Opciones). De lo que se trata ahora es de conseguir que todas las opciones den como resultado algún registro. No queremos que se muestren los proyectos a los que todavía no se han asignado trabajadores. Para ello modificamos la propiedad Rowsource.]&lt;br /&gt;&lt;br /&gt;[Esta variable almacena la cadena SQL que le pasaremos a la propiedad RowSource.]&lt;br /&gt;&lt;br /&gt;[Más arriba ya he hecho un comentario para ahorrar líneas de código en Private Sub Cuadro_combinado102_GotFocus() (Combo Apellidos). que vale igual para este caso.] &lt;br /&gt;&lt;br /&gt;Dim owsource100 As String&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Si el usuario pertenece al grupo clientes sólo se muestran los proyectos en los que participa. No se muestran en el combo los proyectos de otros clientes. El campo "USUARIO" de la tabla "productora" coincide con el nombre de usuario que  se da en el menú Seguridad.]&lt;br /&gt;    &lt;br /&gt;If PerteneceaGrupo(CurrentUser(), "clientes") Then&lt;br /&gt;           &lt;br /&gt;If Me.Cuadro_combinado108 = "Posteriores al día de hoy." Then     &lt;br /&gt;&lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE participa.FECHA&gt;Date() And [productora].[USUARIO] = CurrentUser();"&lt;br /&gt;        &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "Todos." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE [productora].[USUARIO] = CurrentUser();"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE participa.FECHA&gt;Date()-30 And [productora].[USUARIO] = CurrentUser();"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE participa.FECHA&gt;Date()-60 And [productora].[USUARIO] = CurrentUser();"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE participa.FECHA&gt;Date()-90 And [productora].[USUARIO] = CurrentUser();"&lt;br /&gt;            &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Si el usuario pertenece a cualquier otro grupo se muestran los proyectos de todos los clientes. No utilizamos la variabla CurrentUser().]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_10.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;        &lt;br /&gt;Else&lt;br /&gt; &lt;br /&gt;If Me.Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE (((participa.FECHA)&gt;Date()));"&lt;br /&gt;        &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "Todos." Then&lt;br /&gt;                &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA;"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE (((participa.FECHA)&gt;Date()-30));"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE (((participa.FECHA)&gt;Date()-60));"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;        &lt;br /&gt;owsource100 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;" FROM productora INNER JOIN" &amp; _&lt;br /&gt;" (personal INNER JOIN" &amp; _&lt;br /&gt;" (rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE) ON" &amp; _&lt;br /&gt;" personal.IDPERSONAL = participa.IDPERSONAL) ON" &amp; _&lt;br /&gt;" productora.IDPRODUCTORA = rodaje.IDPRODUCTORA" &amp; _&lt;br /&gt;" WHERE (((participa.FECHA)&gt;Date()-90));"&lt;br /&gt;            &lt;br /&gt;End If&lt;br /&gt;        &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Obtenemos una nueva  lista de proyectos cada vez que enfocamos el control.]&lt;br /&gt;&lt;br /&gt;Me.Cuadro_combinado100.RowSource = owsource100&lt;br /&gt;                                            &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado100_Change(). [Combo Producción.]&lt;br /&gt;&lt;br /&gt;[Cambiamos el color de fondo del combo.]&lt;br /&gt;&lt;br /&gt;color108 = False&lt;br /&gt;color70 = False&lt;br /&gt;color102 = False&lt;br /&gt;color100 = True&lt;br /&gt;color104 = False&lt;br /&gt;color106 = False&lt;br /&gt;        &lt;br /&gt;If color100 = True Then&lt;br /&gt;Me.Cuadro_combinado108.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado70.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado102.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado100.BackColor = 16777088&lt;br /&gt;Me.Cuadro_combinado104.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado106.BackColor = 16777215&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Podemos sustituir la función de este combo, que consiste en proporcionar ordenación ascendente o descendente para los registros por una opción incorporada que nos proporciona Acces, nos evitamos así muchas líneas de código.]&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado70.Visible = False&lt;br /&gt;Col1_Etiqueta.Visible = False&lt;br /&gt;&lt;br /&gt;[Este combo permite filtrar por el campo "descartados" de la tabla "puente". No se muestrará hasta que  no hagamos una selección en el combo104, donde filtramos por el campo "fecha" de la tabla "puente".]&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado106.Visible = False&lt;br /&gt;Etiqueta107.Visible = False&lt;br /&gt;&lt;br /&gt;[Este combo nos permite incorporar otro filtro, la fecha. Es un campo de la tabla "puente".]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_11.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;                    &lt;br /&gt;Cuadro_combinado104.Visible = True&lt;br /&gt;Etiqueta105.Visible = True&lt;br /&gt;&lt;br /&gt;[Asignamos valor a algunas de las variables que intervienen en la formación del RecordSource.]&lt;br /&gt;                &lt;br /&gt;If Cuadro_combinado100 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;If Me.Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;                &lt;br /&gt;here = " WHERE ((PRODUCCION=[Forms]![participa3]![Cuadro combinado100]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()))"&lt;br /&gt;            &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "Todos." Then&lt;br /&gt;            &lt;br /&gt;here = " WHERE PRODUCCION=[Forms]![participa3]![Cuadro combinado100]"&lt;br /&gt;                &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;here = " WHERE ((PRODUCCION=[Forms]![participa3]![Cuadro combinado100]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()-30))"&lt;br /&gt;                &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;here = " WHERE ((PRODUCCION=[Forms]![participa3]![Cuadro combinado100]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()-60))"&lt;br /&gt;                &lt;br /&gt;ElseIf Me.Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;here = " WHERE ((PRODUCCION=[Forms]![participa3]![Cuadro combinado100]" &amp; _&lt;br /&gt;" AND [participa].[FECHA]&gt;Date()-90))"&lt;br /&gt;            &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Nueva ordenación de los registros, se muestran en primer, los de fecha más avanzada por ser la opción más necesaria.]&lt;br /&gt;                &lt;br /&gt;rder = " ORDER BY [personal].[APELLIDOS], [participa].[FECHA] DESC"&lt;br /&gt;        &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Cada vez que seleccionamos un proyecto cambiamos el RecordSource, las variables elect, rom y fin permanecen inalterables desde que abrimos el formulario.]&lt;br /&gt;                &lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado104_GotFocus(). Combo Fecha.&lt;br /&gt;&lt;br /&gt;[Este combo nos permitirá filtrar el formulario por uno de los campos de la tabla "puente", el campo fecha, y añadir a este filtro el que hemos hecho con el Combo 100 (Combo Producción). De lo que se trata ahora es de conseguir que todas las opciones den como resultado algún registro. No queremos que se muestren fechas de proyectos a los que todavía no se han asignado trabajadores. Para ello modificamos la propiedad Rowsource]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Es un buen momento para detenerme a explicar cuestiones relacionadas con el diseño de la base de datos. Como puede intuirse los campos con título azul pertenecen a la tabla "apellidos" que es una tabla extremo. Los campos con título rojo pertenecen a la tabla "producción" que  es la otra tabla extremo. Pero hay que hacer una salvedad, el campo "FECHA" parece titulado en rojo y ordenado con el resto de los campos de la tabla "producción" pero en realidad no pertenece a esta tabla sino que pertenece a la tabla puente, es decir, a la tabla "participa". Lo hago así porque facilita al usuario la lectura de la información. Otra cuestión a considerar es el campo "DETALLE", que a primera vista debería de pertenecer a la tabla "puente", es decir, a la tabla "participa". Pero yo lo incluyo en la tabla extremo "PRODUCCION" porque no sufre alteración, o sufre muy pocas alteraciones. En un caso como este creo que es lo más recomendable.] &lt;br /&gt;&lt;br /&gt;[Esta variable almacena la cadena SQL que le pasaremos a la propiedad RowSource.]&lt;br /&gt;&lt;br /&gt;Dim owsource104 As String&lt;br /&gt;     &lt;br /&gt;If Me.Cuadro_combinado100 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;If Cuadro_combinado108 = "Todos." Then&lt;br /&gt;                    &lt;br /&gt;owsource104 = "SELECT DISTINCT participa.FECHA FROM rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;" WHERE PRODUCCION='" &amp; Me.Cuadro_combinado100 &amp; "'" &amp; _&lt;br /&gt;" ORDER BY [participa].[FECHA] DESC;"&lt;br /&gt;            &lt;br /&gt;ElseIf Cuadro_combinado108 = "Posteriores al día de hoy." Then&lt;br /&gt;            &lt;br /&gt;owsource104 = "SELECT DISTINCT participa.FECHA FROM rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;" WHERE PRODUCCION='" &amp; Me.Cuadro_combinado100 &amp; "'" &amp; _&lt;br /&gt;" And participa.FECHA&gt;Date()" &amp; _&lt;br /&gt;" ORDER BY [participa].[FECHA] DESC;"&lt;br /&gt;            &lt;br /&gt;ElseIf Cuadro_combinado108 = "30 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;owsource104 = "SELECT DISTINCT participa.FECHA FROM rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;" WHERE PRODUCCION='" &amp; Me.Cuadro_combinado100 &amp; "'" &amp; _&lt;br /&gt;" And participa.FECHA&gt;Date()-30" &amp; _&lt;br /&gt;" ORDER BY [participa].[FECHA] DESC;"&lt;br /&gt;            &lt;br /&gt;ElseIf Cuadro_combinado108 = "60 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;owsource100 = "SELECT DISTINCT participa.FECHA FROM rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;" WHERE PRODUCCION='" &amp; Me.Cuadro_combinado100 &amp; "'" &amp; _&lt;br /&gt;" And participa.FECHA&gt;Date()-60" &amp; _&lt;br /&gt;" ORDER BY [participa].[FECHA] DESC;"&lt;br /&gt;            &lt;br /&gt;ElseIf Cuadro_combinado108 = "90 días atrás en adelante." Then&lt;br /&gt;            &lt;br /&gt;owsource104 = "SELECT DISTINCT participa.FECHA FROM rodaje INNER JOIN participa ON" &amp; _&lt;br /&gt;" rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;" WHERE PRODUCCION='" &amp; Me.Cuadro_combinado100 &amp; "'" &amp; _&lt;br /&gt;" And participa.FECHA&gt;Date()-90" &amp; _&lt;br /&gt;" ORDER BY [participa].[FECHA] DESC;"&lt;br /&gt;            &lt;br /&gt;End If&lt;br /&gt;                                            &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Obtenemos una nueva  lista de fechas cada vez que enfocamos el control.]&lt;br /&gt;&lt;br /&gt;Me.Cuadro_combinado104.RowSource = owsource104&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado104_Change(). [Combo Fecha.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_12.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;[Cambiamos el color de fondo del combo.]&lt;br /&gt;&lt;br /&gt;color108 = False&lt;br /&gt;color70 = False&lt;br /&gt;color102 = False&lt;br /&gt;color100 = False&lt;br /&gt;color104 = True&lt;br /&gt;color106 = False&lt;br /&gt;        &lt;br /&gt;If color104 = True Then&lt;br /&gt;Me.Cuadro_combinado108.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado70.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado102.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado100.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado104.BackColor = 16777088&lt;br /&gt;Me.Cuadro_combinado106.BackColor = 16777215&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Este combo permite filtrar por el campo "descartados" de la tabla "puente".]&lt;br /&gt;  &lt;br /&gt;Cuadro_combinado106.Visible = True&lt;br /&gt;Etiqueta107.Visible = True&lt;br /&gt;&lt;br /&gt;[Asignamos valor a algunas de las variables que intervienen en la formación del RecordSource.]&lt;br /&gt;                    &lt;br /&gt;here = " WHERE ((PRODUCCION=[Forms]![participa3]![Cuadro combinado100]" &amp; _&lt;br /&gt;" AND participa.FECHA=[Forms]![participa3]![Cuadro combinado104]))"&lt;br /&gt;&lt;br /&gt;[Nueva ordenación de los registros.]  &lt;br /&gt;&lt;br /&gt;rder = " ORDER BY [personal].[APELLIDOS]"&lt;br /&gt;&lt;br /&gt;[Cada vez que seleccionamos una fecha cambiamos el RecordSource, las variables elect, rom y fin permanecen inalterables desde que abrimos el formulario.]&lt;br /&gt;                                            &lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado106_Change(). [Combo Seleccione.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_13.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Este combo nos permitirá filtrar el formulario por uno de los campos de la tabla "puente", el campo "DESCARTADOS", y añadir a este filtro el que hemos hecho con el Combo 100 (Combo Producción)y el combo104 (Combo Fecha). Sería muy conveniente consultar el artículo &lt;a target="_blank" class="b"   href="http://carloszcom.blogspot.com/2004/07/relaciones-varios-varios-participacin.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Relaciones varios a varios. Participación y selección dos conceptos a tener en cuenta.&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;[Cambiamos el color de fondo del combo.]&lt;br /&gt;&lt;br /&gt;color108 = False&lt;br /&gt;color70 = False&lt;br /&gt;color102 = False&lt;br /&gt;color100 = False&lt;br /&gt;color104 = False&lt;br /&gt;color106 = True&lt;br /&gt;        &lt;br /&gt;If color106 = True Then&lt;br /&gt;Me.Cuadro_combinado108.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado70.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado102.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado100.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado104.BackColor = 16777215&lt;br /&gt;Me.Cuadro_combinado106.BackColor = 16777088&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Asignamos valor a algunas de las variables que intervienen en la formación del RecordSource.]&lt;br /&gt;&lt;br /&gt;If Cuadro_combinado106 = "Descartados" Then&lt;br /&gt;&lt;br /&gt;here = " WHERE ((PRODUCCION=[Forms]![participa3]![Cuadro combinado100]" &amp; _&lt;br /&gt;" AND participa.FECHA=[Forms]![participa3]![Cuadro combinado104] AND [participa].[DESCARTAR]=-1))"&lt;br /&gt;&lt;br /&gt;Else: Cuadro_combinado106 = "NO descartados"&lt;br /&gt;&lt;br /&gt;here = " WHERE ((PRODUCCION=[Forms]![participa3]![Cuadro combinado100]" &amp; _&lt;br /&gt;" AND participa.FECHA=[Forms]![participa3]![Cuadro combinado104] AND [participa].[DESCARTAR]=0))"&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Nueva ordenación de los registros.]&lt;br /&gt;&lt;br /&gt;rder = " ORDER BY [personal].[APELLIDOS]"&lt;br /&gt;&lt;br /&gt;[Cada vez que seleccionamos una opción cambiamos el RecordSource, las variables elect, rom y fin permanecen inalterables desde que abrimos el formulario.]&lt;br /&gt;                                            &lt;br /&gt;Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Close()&lt;br /&gt;&lt;br /&gt;[Al cerrar cerramos todos los formularios que  basan su  RecordSource en un campo de este formulario.]&lt;br /&gt;&lt;br /&gt;DoCmd.Close acForm, "rodaje3"&lt;br /&gt;&lt;br /&gt;DoCmd.Close acForm, "productora2"&lt;br /&gt;&lt;br /&gt;DoCmd.Close acForm, "llamada2"&lt;br /&gt;&lt;br /&gt;DoCmd.Close acForm, "personal1"&lt;br /&gt;    &lt;br /&gt;DoCmd.Close acForm, "parametros"&lt;br /&gt;    &lt;br /&gt;DoCmd.Close acForm, "cuenta_trabajadores"&lt;br /&gt;&lt;br /&gt;[Este es un formulario que podemos verlo en dos versiones, una que muestra todos los registros y otra que muestra registros relacionados con el campo que tenemos a la vista. La variable pública "atalogo" es la que  determina si se abre una versión u otra.]&lt;br /&gt;    &lt;br /&gt;If atalogo &lt;&gt; True Then&lt;br /&gt;DoCmd.Close acForm, "composit"&lt;br /&gt;End If&lt;br /&gt;    &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Current()&lt;br /&gt;&lt;br /&gt;[Mostramos la fotografía del trabajador asignando a la propiedad Picture del control la ruta que tenemos en el control Me.FOTOGRAFIA.]&lt;br /&gt;&lt;br /&gt;If Me.FOTOGRAFIA &lt;&gt; "" Then&lt;br /&gt;Imagen143.Picture = Me.FOTOGRAFIA&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;[Asignamos valor a variables públicas que capturan datos del formulario abierto para pasar este valor a campos de otros formularios.]&lt;br /&gt;&lt;br /&gt;If Me.NOMBRE &lt;&gt; "" Then&lt;br /&gt;    &lt;br /&gt;dpersonal_cuenta_trabajadores = Me.personal_IDPERSONAL&lt;br /&gt;drodaje_cuenta_trabajadores = Me.rodaje_IDRODAJE&lt;br /&gt;          &lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub NOMBRE_Change()&lt;br /&gt;&lt;br /&gt;[Asignamos valor a variables públicas que capturan datos del formulario abierto para pasar este valor a campos de otros formularios]&lt;br /&gt;&lt;br /&gt;nombre_participa3_llamada2 = Me.NOMBRE&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;[Todas las funciones que vienen a continuación y hasta el final, son las que se pasan a la propiedad Acción de los controles personalizados de la barra de menús personalizada.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" alt="Una imagen vale más que 1.000 palabras." onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mosvava_14.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true"&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="82" height="82" hspace="5"&gt;Private Function catalogo()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;[Variables públicas si/no que se utilizan para mostrar una versión u otra de distintos formularios.]&lt;br /&gt;            &lt;br /&gt;atalogo = True&lt;br /&gt;rabajadores = False&lt;br /&gt;&lt;br /&gt;stDocName = "composit"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;DoCmd.Close acForm, "rodaje3"&lt;br /&gt;DoCmd.Close acForm, "productora2"&lt;br /&gt;DoCmd.Close acForm, "llamada2"&lt;br /&gt;DoCmd.Close acForm, "parametros"&lt;br /&gt;DoCmd.Close acForm, "personal1"&lt;br /&gt;DoCmd.Close acForm, "cuenta_trabajadores"&lt;br /&gt;DoCmd.Close acForm, "cuenta_productoras"&lt;br /&gt;            &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="82" height="82" hspace="5"&gt;Private Function abonos_trabajadores()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt; &lt;br /&gt;stDocName = "cuenta_trabajadores1"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;                &lt;br /&gt;DoCmd.Close acForm, "rodaje3"&lt;br /&gt;DoCmd.Close acForm, "productora2"&lt;br /&gt;DoCmd.Close acForm, "llamada2"&lt;br /&gt;DoCmd.Close acForm, "parametros"&lt;br /&gt;DoCmd.Close acForm, "personal1"&lt;br /&gt;DoCmd.Close acForm, "composit"&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function cargos_productoras()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt; &lt;br /&gt;stDocName = "cuenta_productoras1"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;DoCmd.Close acForm, "rodaje3"&lt;br /&gt;DoCmd.Close acForm, "productora2"&lt;br /&gt;DoCmd.Close acForm, "llamada2"&lt;br /&gt;DoCmd.Close acForm, "parametros"&lt;br /&gt;DoCmd.Close acForm, "personal1"&lt;br /&gt;DoCmd.Close acForm, "composit"&lt;br /&gt;  &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function composit()&lt;br /&gt;        &lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;[Variables públicas si/no que se utilizan para mostrar una versión u otra de distintos formularios.]&lt;br /&gt;&lt;br /&gt;rabajadores = True&lt;br /&gt;atalogo = False&lt;br /&gt;    &lt;br /&gt;stDocName = "composit"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function llamadas()&lt;br /&gt;        &lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;stDocName = "llamada2"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;        &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function parametros()&lt;br /&gt;     &lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;[Variables públicas si/no que se utilizan para mostrar una versión u otra de distintos formularios.]&lt;br /&gt;            &lt;br /&gt;rabajadores = True&lt;br /&gt;atalogo = False&lt;br /&gt;    &lt;br /&gt;stDocName = "parametros"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;            &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function productoras()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;            &lt;br /&gt;stDocName = "productora2"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt; &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function rodajes()&lt;br /&gt;                                                        &lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;[Variables públicas si/no que se utilizan para mostrar una versión u otra de distintos formularios.]&lt;br /&gt;    &lt;br /&gt;ecordSource_participa3_rodaje3 = True&lt;br /&gt;ecordSource_productora2_rodaje3 = False&lt;br /&gt;ecordSource_personal1_rodaje3 = False&lt;br /&gt;ecordSource_llamada2_rodaje3 = False&lt;br /&gt;    &lt;br /&gt;stDocName = "rodaje3"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function trabajadores()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;[Variables públicas si/no que se utilizan para mostrar una versión u otra de distintos formularios.]&lt;br /&gt;            &lt;br /&gt;rabajadores = True&lt;br /&gt;atalogo = False&lt;br /&gt;    &lt;br /&gt;stDocName = "personal1"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;            &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function inicio()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;stDocName = "inicio"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;DoCmd.Close acForm, "rodaje3"&lt;br /&gt;DoCmd.Close acForm, "productora2"&lt;br /&gt;DoCmd.Close acForm, "llamada2"&lt;br /&gt;DoCmd.Close acForm, "parametros"&lt;br /&gt;DoCmd.Close acForm, "personal1"&lt;br /&gt;DoCmd.Close acForm, "cuenta_trabajadores"&lt;br /&gt;DoCmd.Close acForm, "cuenta_productoras"&lt;br /&gt;DoCmd.Close acForm, "participa3"&lt;br /&gt;        &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function a_e_opciones()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt;&lt;br /&gt;stDocName = "participa6"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;DoCmd.Close acForm, "rodaje3"&lt;br /&gt;DoCmd.Close acForm, "productora2"&lt;br /&gt;DoCmd.Close acForm, "llamada2"&lt;br /&gt;DoCmd.Close acForm, "parametros"&lt;br /&gt;DoCmd.Close acForm, "personal1"&lt;br /&gt;DoCmd.Close acForm, "cuenta_trabajadores"&lt;br /&gt;DoCmd.Close acForm, "cuenta_productoras"&lt;br /&gt;            &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function a_e_parametros()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt; &lt;br /&gt;stDocName = "participa9"&lt;br /&gt;DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;DoCmd.Close acForm, "rodaje3"&lt;br /&gt;DoCmd.Close acForm, "productora2"&lt;br /&gt;DoCmd.Close acForm, "llamada2"&lt;br /&gt;DoCmd.Close acForm, "parametros"&lt;br /&gt;DoCmd.Close acForm, "personal1"&lt;br /&gt;DoCmd.Close acForm, "cuenta_trabajadores"&lt;br /&gt;DoCmd.Close acForm, "cuenta_productoras"&lt;br /&gt;            &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function asistencia()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt; &lt;br /&gt;stDocName = "asistencia"&lt;br /&gt;DoCmd.OpenReport stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function personal()&lt;br /&gt;&lt;br /&gt;Dim stDocName As String&lt;br /&gt;Dim stLinkCriteria As String&lt;br /&gt; &lt;br /&gt;stDocName = "personal"&lt;br /&gt;DoCmd.OpenReport stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;End Function&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108688550501619449?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108688550501619449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108688550501619449'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/07/mostrar-el-resultado-de-una-relacin.html' title='Mostrar el resultado de una relación varios a varios.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108688519397025155</id><published>2004-07-03T10:15:00.000+01:00</published><updated>2005-04-06T12:51:51.626+01:00</updated><title type='text'>Relaciones varios a varios. Participación y selección dos conceptos a tener en cuenta.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (1).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/07/relaciones-varios-varios-participacin.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_participacion_seleccion_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;Conviene detenerse en este punto que no es de importancia menor. Siguiendo el ejemplo de nuestro centro de atención primaria, supongamos ahora, que  emprendemos un programa de salud x mediante el cual debemos convocar a todas las mujeres de edad comprendida entre los 30 y 35 años  para ser examinadas y en su caso tratadas de una determinada enfermedad. &lt;a target="_blank"  class="b"  href="http://carloszcom.blogspot.com/2004/06/mantenimiento-de-las-tablas-puente.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;En el artículo Mantenimiento de las tablas puente ya he explicado como se hace esta operación&lt;/a&gt;. Todas las mujeres agregadas al programa de salud x participan pero no todas son seleccionadas. Solamente aquellas que tras ser examinadas, su diagnóstico resulta positivo, son seleccionadas para el tratamiento. Vemos entonces que la tabla puente "consultas" necesita un campo mediante el cual podamos discriminar a las mujeres que van a ser tratadas mediante nuestro programa x de aquellas que no necesitan atención por este concepto, aunque en un principio se hayan tenido en cuenta por pertenecer a un grupo de riesgo. El método que yo empleo para resolver esto es incluir un campo "si/no" en la tabla puente, es decir, en la tabla "consultas" que llamo "descartados/as". Este campo se activa con el valor -1, es decir, se selecciona, en el caso de que la exploración de la paciente de como resultado que no necesita tratamiento.  &lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/detalle.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Los pequeños detalles son importantes."&gt;Esta situación se repite en muchas bases de datos. Por ejemplo, sería muy útil para una empresa que se dedica a la selección de personal para terceros discriminar los candidatos que  son emplazados para un proyecto de aquellos que efectivamente están dispuestos a realizar las pruebas de selección. Otro ejemplo, un estudiante de periodismo está trabajando en su proyecto de final de carrera que trata sobre el lobby de la construcción en España. Sería muy significativo discriminar las empresas cuyos presupuestos son rechazados en todos los ayuntamientos y comunidades autónomas de aquellas que gozan de favoritismo por parte de la administración. El problema adopta algunas variantes como en el caso de los participantes en una competición deportiva que son todos aquellos que se han inscrito en la prueba, aunque no figuren en línea de salida por enfermedad, defunción o, haber dado positivo en un control de dopaje.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108688519397025155?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108688519397025155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108688519397025155'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/07/relaciones-varios-varios-participacin.html' title='Relaciones varios a varios. Participación y selección dos conceptos a tener en cuenta.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108685964353173129</id><published>2004-06-26T10:15:00.000+01:00</published><updated>2005-04-07T14:14:17.663+01:00</updated><title type='text'>Mostrar fotografías.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (3).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/06/mostrar-fotografas.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_fotografias_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62"  alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://www.carloszcom.com/blogima/imagen.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Las bases de datos suelen mostrar imágenes."&gt;Con frecuencia necesitamos destinar un campo de una tabla para almacenar una fotografía que será mostrada junto con los demás campos del mismo registro. Tenemos la posibilidad de guardar la fotografía como objeto O.L.E. pero esta opción no es recomendable porque  aumenta el tamaño de la base de datos considerablemente. Lo que se hace en estos casos es guardar en un campo texto la ruta donde se encuentra la fotografía que queremos mostrar. En el formulario debemos insertar un control Imagen independiente y una caja de texto dependiente e invisible que contenga la ruta de la fotografía. A la propiedad Imagen del control Imagen podemos darle la ruta donde tenemos almacenado el logotipo de la empresa, de esta manera el control nunca aparecerá vacío.&lt;br /&gt;Si la tabla está diseñada de forma que los registros contienen muchas fotografías podemos utilizar un control Ficha con un control Imagen en cada una de las pestañas. El objeto de utilizar un control Ficha es conseguir que al cambiar de registro se cargue sólamente una fotografía y el resto se vayan cargando a medida que hacemos clic sobre la pestaña   disminuyendo el tiempo de espera hasta hacerlo casi inapreciable.&lt;br /&gt;Utilizar archivos .jpg utilizando este sistema puede provocar errores inesperados e incomprensibles aunque poco frecuentes. Si utilizamos archivos .bmp evitamos estos errores pero se puede producir una pérdida de calidad, debido al tamaño del control Imagen.&lt;br /&gt;A continuación pego el código que utilizo en un formulario que utilizo para este propósito. Los comentarios van entre corchetes.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/fotografias_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Current()&lt;br /&gt;&lt;br /&gt;[Cada vez que cambiamos de registro el foco vuelve sobre la primera pestaña cargando sólo una fotografía] &lt;br /&gt;                &lt;br /&gt;TabCtl0.Value = 0&lt;br /&gt;&lt;br /&gt;If Me.VESTU_1_CORTO &lt;&gt; "" Then&lt;br /&gt;Imagen148.Picture = Me.VESTU_1_CORTO&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82"&gt;Private Sub TabCtl0_Change()&lt;br /&gt;&lt;br /&gt;[Aunque a primera vista parezca que es mejor utilizar el evento clic no es así]&lt;br /&gt;[Cada ficha tiene su correspondiente control imagen]&lt;br /&gt;&lt;br /&gt;Select Case TabCtl0.Value&lt;br /&gt;&lt;br /&gt;Case 0&lt;br /&gt;&lt;br /&gt;    If Me.VESTU_1_CORTO &lt;&gt; "" Then&lt;br /&gt;    Imagen148.Picture = Me.VESTU_1_CORTO&lt;br /&gt;    End If&lt;br /&gt;   &lt;br /&gt;Case 1&lt;br /&gt;&lt;br /&gt;    If Me.VESTU_1_MEDIO &lt;&gt; "" Then&lt;br /&gt;    Imagen149.Picture = Me.VESTU_1_MEDIO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 2&lt;br /&gt;                                                                                        &lt;br /&gt;    If Me.VESTU_1_GENERAL &lt;&gt; "" Then&lt;br /&gt;    Imagen150.Picture = Me.VESTU_1_GENERAL&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 3&lt;br /&gt;                &lt;br /&gt;    If Me.VESTU_2_CORTO &lt;&gt; "" Then&lt;br /&gt;    Imagen151.Picture = Me.VESTU_2_CORTO&lt;br /&gt;    End If&lt;br /&gt;                                                &lt;br /&gt;Case 4&lt;br /&gt;&lt;br /&gt;    If Me.VESTU_2_MEDIO &lt;&gt; "" Then&lt;br /&gt;    Imagen152.Picture = Me.VESTU_2_MEDIO&lt;br /&gt;    End If&lt;br /&gt;                                                &lt;br /&gt;Case 5&lt;br /&gt;&lt;br /&gt;    If Me.VESTU_2_GENERAL &lt;&gt; "" Then&lt;br /&gt;    Imagen153.Picture = Me.VESTU_2_GENERAL&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 6&lt;br /&gt;                                                    &lt;br /&gt;    If Me.VESTU_3_CORTO &lt;&gt; "" Then&lt;br /&gt;    Imagen154.Picture = Me.VESTU_3_CORTO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 7&lt;br /&gt;                                                                                                                        &lt;br /&gt;    If Me.VESTU_3_MEDIO &lt;&gt; "" Then&lt;br /&gt;    Imagen155.Picture = Me.VESTU_3_MEDIO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 8&lt;br /&gt;               &lt;br /&gt;    If Me.VESTU_3_GENERAL &lt;&gt; "" Then&lt;br /&gt;    Imagen156.Picture = Me.VESTU_3_GENERAL&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 9&lt;br /&gt;                    &lt;br /&gt;    If Me.VESTU_4_CORTO &lt;&gt; "" Then&lt;br /&gt;    Imagen157.Picture = Me.VESTU_4_CORTO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 10&lt;br /&gt;                                                                                         &lt;br /&gt;    If Me.VESTU_4_MEDIO &lt;&gt; "" Then&lt;br /&gt;    Imagen146.Picture = Me.VESTU_4_MEDIO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 11&lt;br /&gt;                &lt;br /&gt;    If Me.VESTU_5_GENERAL &lt;&gt; "" Then&lt;br /&gt;    Imagen158.Picture = Me.VESTU_4_GENERAL&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 12&lt;br /&gt;                    &lt;br /&gt;    If Me.VESTU_5_CORTO &lt;&gt; "" Then&lt;br /&gt;    Imagen159.Picture = Me.VESTU_5_CORTO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 13&lt;br /&gt;                        &lt;br /&gt;    If Me.VESTU_5_MEDIO &lt;&gt; "" Then&lt;br /&gt;    Imagen160.Picture = Me.VESTU_5_MEDIO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 14&lt;br /&gt;                       &lt;br /&gt;    If Me.VESTU_5_GENERAL &lt;&gt; "" Then&lt;br /&gt;    Imagen161.Picture = Me.VESTU_5_GENERAL&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 15&lt;br /&gt;                &lt;br /&gt;    If Me.VESTU_6_CORTO &lt;&gt; "" Then&lt;br /&gt;    Imagen162.Picture = Me.VESTU_6_CORTO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 16&lt;br /&gt;                &lt;br /&gt;    If Me.VESTU_6_MEDIO &lt;&gt; "" Then&lt;br /&gt;    Imagen163.Picture = Me.VESTU_6_MEDIO&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Case 17&lt;br /&gt;                &lt;br /&gt;    If Me.VESTU_6_GENERAL &lt;&gt; "" Then&lt;br /&gt;    Imagen164.Picture = Me.VESTU_6_GENERAL&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;End Select&lt;br /&gt;&lt;br /&gt;End Sub&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108685964353173129?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108685964353173129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108685964353173129'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/06/mostrar-fotografas.html' title='Mostrar fotografías.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108628657398260154</id><published>2004-06-19T10:05:00.000+01:00</published><updated>2005-04-07T14:10:16.363+01:00</updated><title type='text'>Mantenimiento de las tablas puente I.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (26).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/06/mantenimiento-de-las-tablas-puente-i.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_mantenimiento_i_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Access proporciona un Asistente para búsquedas que  permite buscar y mostrar en una tabla uno o varios campos de otra tabla relacionada con ella o de una lista previamente creada. Lo que necesitamos es localizar los ids de los registros de las tablas extremos que queremos agregar a un nuevo registro de la tabla puente. El asistente proporcionado  por Access es muy útil pero con frecuencia insuficiente. La localización del id no siempre se hace a partir de los apellidos o del nombre del proyecto. Se pueden presentar infinidad de casos pero como idea general lo que vamos a tratar aquí es de aproximarnos a los ids a través de distinto criterios de filtrado. Estos criterios pueden ser tan complejos que merezca la pena utilizar más de un formulario, de momento podemos ver el aspecto que tendría uno de estos formularios. Aunque esto no tenga sentido en la vida real el formulario tiene dos formas distintas de resolver el mismo problema, mediante una barra de menús y programación DAO o, mediante clásicos botones y programación  mas convencional.] &lt;br /&gt;&lt;br /&gt;[A continuación pego el código de un formulario diseñado para este propósito. Son  19 procedimientos, 5 funciones privadas, 25 páginas con  22 imágenes que te ayudarán a comprender lo que estoy haciendo. Hago algunos comentarios personales entre corchetes para aclarar el diseño. Hay también alguna programación DAO. &lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_1.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;[Las dos primeras líneas proporcionan los filtros necesarios para localizar los ids que queremos agregar al nuevo registro de la tabla puente.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_2.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;[Para evitar acciones incongruentes, al abrir el formulario algunas opciones aparecen desactivadas.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_3.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Option Compare Database&lt;br /&gt;Option Explicit&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Activate()&lt;br /&gt;         &lt;br /&gt;         abrir_faltas_llamadas = False&lt;br /&gt;         abrir_faltas_agregarparametros = False&lt;br /&gt;         abrir_faltas_agregaropciones = True&lt;br /&gt;         &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;[Se muestran fotografías correspondientes al registro seleccionado. En el artículo &lt;a target="_blank" class="b" href="http://carloszcom.blogspot.com/2004/06/mostrar-fotografas.html"&gt;Mostrar fotografías&lt;/a&gt; explico con todo detalle el procedimiento a emplear.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_4.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Form_Current()&lt;br /&gt;    &lt;br /&gt;     If Me.Texto77 &lt;&gt; "" Then&lt;br /&gt;        Imagen85.Picture = Me.Texto77&lt;br /&gt;    End If&lt;br /&gt;        &lt;br /&gt;    If Me.Texto79 &lt;&gt; "" Then&lt;br /&gt;        Imagen86.Picture = Me.Texto79&lt;br /&gt;    End If&lt;br /&gt;        &lt;br /&gt;    If Me.Texto81 &lt;&gt; "" Then&lt;br /&gt;        Imagen87.Picture = Me.Texto81&lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;    If Me.Texto83 &lt;&gt; "" Then&lt;br /&gt;        Imagen88.Picture = Me.Texto83&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado4_GotFocus()&lt;br /&gt;&lt;br /&gt;[Al enfocar este control se limpian los filtros de los criterios utilizados anteriormente y se vuelven a ocultar controles que podría producir incongruencias.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_5.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Me.[Cuadro combinado36] = ""&lt;br /&gt;    Me.[Cuadro combinado54] = ""&lt;br /&gt;    Me.[Cuadro combinado14] = ""&lt;br /&gt;    Me.[Cuadro combinado18] = ""&lt;br /&gt;    &lt;br /&gt;     Comando61.Visible = False&lt;br /&gt;     Comando62.Visible = False&lt;br /&gt;     Comando67.Visible = False&lt;br /&gt;     Comando68.Visible = False&lt;br /&gt;                                                                        &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado36_GotFocus()&lt;br /&gt;&lt;br /&gt;[Al enfocar este control se limpian los filtros de los criterios utilizados anteriormente y se vuelven a ocultar controles que podría producir incongruencias.]&lt;br /&gt;[El RowSource de este control tiene como origen algunas filas de una tabla. En su momento parecía que esto podría ser práctico pero ahora tengo mis dudas.]&lt;br /&gt;&lt;br /&gt;    Dim owsource36 As String&lt;br /&gt;    &lt;br /&gt;    If Cuadro_combinado4 &lt;&gt; "" Then&lt;br /&gt;    &lt;br /&gt;        Me.[Cuadro combinado54] = ""&lt;br /&gt;        Me.[Cuadro combinado14] = ""&lt;br /&gt;        Me.[Cuadro combinado18] = ""&lt;br /&gt;           &lt;br /&gt;        owsource36 = "SELECT [opciones].[opciones] FROM opciones WHERE" &amp; _&lt;br /&gt;        " ((([opciones].[opciones])='" &amp; "Posteriores al día de hoy." &amp; "' Or" &amp; _&lt;br /&gt;        " ([opciones].[opciones])='" &amp; "Rodaje. 30 días atrás en adelante." &amp; "' Or" &amp; _&lt;br /&gt;        " ([opciones].[opciones])='" &amp; "Rodaje. 60 días atrás en adelante." &amp; "' Or" &amp; _&lt;br /&gt;        " ([opciones].[opciones])='" &amp; "Rodaje. 90 días atrás en adelante." &amp; "' Or" &amp; _&lt;br /&gt;        " ([opciones].[opciones])='" &amp; "Rodaje. Todos." &amp; "' Or" &amp; _&lt;br /&gt;        " ([opciones].[opciones])='" &amp; "Sin participación." &amp; "')) ORDER BY [opciones].[opciones];"&lt;br /&gt;        &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;        Me.Cuadro_combinado36.RowSource = owsource36&lt;br /&gt;        &lt;br /&gt;                                        Comando61.Visible = False&lt;br /&gt;                                        Comando62.Visible = False&lt;br /&gt;                                        Comando67.Visible = False&lt;br /&gt;                                        Comando68.Visible = False&lt;br /&gt;                                                                            &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;        &lt;br /&gt;        Verificación71 = 0&lt;br /&gt;        &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Antes de seguir es conveniente no perder de vista las relaciones entre las tablas. En especial hay que recordar siempre que el campo fecha no pertenece a una tabla extremo.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_6.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver las relaciones entre tablas.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado36_Change()&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Al elegir la opción "Sin participación." se producen algunos cambios en el formulario. Elegimos esta opción si es la primera vez que vamos a agregar un registro a la tabla puente. El campo fecha está compuesto de dos controles superpuestos que se muestran según nos interese, si queremos añadir una fecha nueva utilizamos el Cuadro combinado69, que en realidad es un cuadro de texto que aparece siempre vacío a la espera de lo que le indiquemos. Por defecto el control que se muestra en el campo fecha es el Cuadro combinado14 que siempre nos muestra alguna fecha. Vemos que desaparece la etiqueta "Añadir un día al proyecto." esto es debido a que  se trata del primer registro que vamos a añadir a un poryecto.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_7.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;[Si elegimos cualquier opción que no sea "Sin participación." es porque ya hay algún registro anterior, por eso se muestra el Cuadro combinado14 en el campo fecha y la casilla de verificación "Añadir un día al proyecto."]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_8.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;    &lt;br /&gt;    If Cuadro_combinado36 = "Posteriores al día de hoy." Then&lt;br /&gt;            Cuadro_combinado14.Visible = True&lt;br /&gt;            Cuadro_combinado69.Visible = False&lt;br /&gt;            Verificación71.Visible = True&lt;br /&gt;    ElseIf Cuadro_combinado36 = "Rodaje. 30 días atrás en adelante." Then&lt;br /&gt;            Cuadro_combinado14.Visible = True&lt;br /&gt;            Cuadro_combinado69.Visible = False&lt;br /&gt;            Verificación71.Visible = True&lt;br /&gt;    ElseIf Cuadro_combinado36 = "Rodaje. 60 días atrás en adelante." Then&lt;br /&gt;            Cuadro_combinado14.Visible = True&lt;br /&gt;            Cuadro_combinado69.Visible = False&lt;br /&gt;            Verificación71.Visible = True&lt;br /&gt;    ElseIf Cuadro_combinado36 = "Rodaje. 90 días atrás en adelante." Then&lt;br /&gt;            Cuadro_combinado14.Visible = True&lt;br /&gt;            Cuadro_combinado69.Visible = False&lt;br /&gt;            Verificación71.Visible = True&lt;br /&gt;    ElseIf Cuadro_combinado36 = "Rodaje. Todos." Then&lt;br /&gt;            Cuadro_combinado14.Visible = True&lt;br /&gt;            Cuadro_combinado69.Visible = False&lt;br /&gt;            Verificación71.Visible = True&lt;br /&gt;    ElseIf Cuadro_combinado36 = "Sin participación." Then&lt;br /&gt;            Cuadro_combinado14.Visible = False&lt;br /&gt;            Cuadro_combinado69.Visible = True&lt;br /&gt;            Verificación71.Visible = False&lt;br /&gt;    End If&lt;br /&gt;        &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;[Si activamos la casilla de verificación "Añadir un día al proyecto." el aspecto del formulario cambia mostrando el control Cuadro combinado69, que en realidad es un cuadro de texto, a la espera de nuestras indicaciones. Esto se explica con todo detalle junto con el código del control Cuadro combinado54.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_9.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado54_GotFocus()&lt;br /&gt;&lt;br /&gt;[Este control tiene RowSource dinámico dependiendo de la selección que permanezca activada en los controles Cuadro combinado36 y Cuadro combinado4. Como en todos los formularios de la aplicación los filtros se aplican según el orden de lectura, de izquierda a derecha.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_10.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;    &lt;br /&gt;    Dim owsource54 As String&lt;br /&gt;        &lt;br /&gt;    If Cuadro_combinado4 &lt;&gt; "" Then&lt;br /&gt;        If Cuadro_combinado36 &lt;&gt; "" Then&lt;br /&gt;&lt;br /&gt;        Me.[Cuadro combinado14] = ""&lt;br /&gt;        Me.[Cuadro combinado18] = ""&lt;br /&gt;&lt;br /&gt;    If [Forms]![participa6]![Cuadro combinado36] = "Rodaje. Todos." Then&lt;br /&gt;&lt;br /&gt;        owsource54 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;        " FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA)" &amp; _&lt;br /&gt;        " INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;        " WHERE productora.NOMBRE_PRODUCTORA='" &amp; [Forms]![participa6]![Cuadro combinado4] &amp; "'" &amp; _&lt;br /&gt;        " ORDER BY rodaje.PRODUCCION;"&lt;br /&gt;&lt;br /&gt;    ElseIf [Forms]![participa6]![Cuadro combinado36] = "Rodaje. 30 días atrás en adelante." Then&lt;br /&gt;        &lt;br /&gt;        owsource54 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;        " FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA)" &amp; _&lt;br /&gt;        " INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;        " WHERE productora.NOMBRE_PRODUCTORA='" &amp; [Forms]![participa6]![Cuadro combinado4] &amp; "'" &amp; _&lt;br /&gt;        " And participa.FECHA&gt;Date()-30 ORDER BY rodaje.PRODUCCION;"&lt;br /&gt;&lt;br /&gt;    ElseIf [Forms]![participa6]![Cuadro combinado36] = "Rodaje. 60 días atrás en adelante." Then&lt;br /&gt;&lt;br /&gt;        owsource54 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;        " FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA)" &amp; _&lt;br /&gt;        " INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;        " WHERE productora.NOMBRE_PRODUCTORA='" &amp; [Forms]![participa6]![Cuadro combinado4] &amp; "'" &amp; _&lt;br /&gt;        " And participa.FECHA&gt;Date()-60 ORDER BY rodaje.PRODUCCION;"&lt;br /&gt;&lt;br /&gt;    ElseIf [Forms]![participa6]![Cuadro combinado36] = "Rodaje. 90 días atrás en adelante." Then&lt;br /&gt;&lt;br /&gt;        owsource54 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;        " FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA)" &amp; _&lt;br /&gt;        " INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;        " WHERE productora.NOMBRE_PRODUCTORA='" &amp; [Forms]![participa6]![Cuadro combinado4] &amp; "'" &amp; _&lt;br /&gt;        " And participa.FECHA&gt;Date()-90 ORDER BY rodaje.PRODUCCION;"&lt;br /&gt;&lt;br /&gt;    ElseIf [Forms]![participa6]![Cuadro combinado36] = "Posteriores al día de hoy." Then&lt;br /&gt;&lt;br /&gt;        owsource54 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;        " FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA)" &amp; _&lt;br /&gt;        " INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;        " WHERE productora.NOMBRE_PRODUCTORA='" &amp; [Forms]![participa6]![Cuadro combinado4] &amp; "'" &amp; _&lt;br /&gt;        " And participa.FECHA&gt;Date() ORDER BY rodaje.PRODUCCION;"&lt;br /&gt;&lt;br /&gt;[Ya se ha explicado como cambia el formulario de aspecto al seleccionar "Sin participación." en Cuadro combinado36. Hay  muchas formas de hacer esta consulta, al parecer yo me he decidido por la más sencilla.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_11.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    ElseIf [Forms]![participa6]![Cuadro combinado36] = "Sin participación." Then&lt;br /&gt;            &lt;br /&gt;     owsource54 = "SELECT DISTINCT rodaje.PRODUCCION" &amp; _&lt;br /&gt;    " FROM (productora INNER JOIN rodaje ON productora.IDPRODUCTORA = rodaje.IDPRODUCTORA) LEFT JOIN participa ON [rodaje].[IDRODAJE]=[participa].[IDRODAJE]" &amp; _&lt;br /&gt;    " WHERE participa.IDRODAJE Is Null" &amp; _&lt;br /&gt;    " And productora.NOMBRE_PRODUCTORA='" &amp; [Forms]![participa6]![Cuadro combinado4] &amp; "'" &amp; _&lt;br /&gt;    " ORDER BY rodaje.PRODUCCION;"&lt;br /&gt;        &lt;br /&gt;    End If&lt;br /&gt;      &lt;br /&gt;        End If&lt;br /&gt;    End If&lt;br /&gt;        &lt;br /&gt;        Me.Cuadro_combinado54.RowSource = owsource54&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado54_Change()&lt;br /&gt;&lt;br /&gt;[Se modifica el RecordSource del formulario. Se mantienen ocultos algunos controles para evitar incongruencias.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_12.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    elect = "SELECT [participa].[IDRODAJE], [rodaje].[PRODUCCION], [participa].[FECHA]," &amp; _&lt;br /&gt;    " [personal].[APELLIDOS], [participa].[IDPERSONAL]," &amp; _&lt;br /&gt;    " [vestuario].[VESTU_1_CORTO], [vestuario].[VESTU_2_CORTO], [vestuario].[VESTU_3_CORTO], [vestuario].[VESTU_4_CORTO]"&lt;br /&gt;    &lt;br /&gt;    rom = " FROM (((personal INNER JOIN parametros" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[parametros].[IDPERSONAL]) INNER JOIN (rodaje INNER JOIN participa" &amp; _&lt;br /&gt;    " ON [rodaje].[IDRODAJE]=[participa].[IDRODAJE])" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) INNER JOIN vestuario" &amp; _&lt;br /&gt;    " ON [parametros].[IDPERSONAL]=[vestuario].[IDPERSONAL])" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    ""&lt;br /&gt;    &lt;br /&gt;    here = " WHERE [rodaje].[PRODUCCION]=[Forms]![participa6]![Cuadro combinado54]"&lt;br /&gt;    &lt;br /&gt;    rder = " ORDER BY [participa].[FECHA] DESC, [personal].[APELLIDOS]"&lt;br /&gt;    &lt;br /&gt;    fin = ";"&lt;br /&gt;&lt;br /&gt;        Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;                                                        Comando61.Visible = False&lt;br /&gt;                                                        Comando62.Visible = False&lt;br /&gt;                                                        Comando67.Visible = False&lt;br /&gt;                                                        Comando68.Visible = False&lt;br /&gt;                                                        &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;            &lt;br /&gt;[La estructura que viene a continuación es la responsable de cambiar el aspecto del formulario, ocultando o mostrando los controles que se utilizan para añadir una fecha o seleccionarla.]&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado36 = "Sin participación." Then&lt;br /&gt;        &lt;br /&gt;        Cuadro_combinado69.Visible = True&lt;br /&gt;        Cuadro_combinado14.Visible = False&lt;br /&gt;            &lt;br /&gt;            ElseIf Cuadro_combinado36 &lt;&gt; "Sin participación." Then&lt;br /&gt;            &lt;br /&gt;                If Verificación71 = 0 Then&lt;br /&gt;        &lt;br /&gt;                    Cuadro_combinado69.Visible = False&lt;br /&gt;                    Cuadro_combinado14.Visible = True&lt;br /&gt;                    &lt;br /&gt;                ElseIf Verificación71 = -1 Then&lt;br /&gt;                &lt;br /&gt;                    Cuadro_combinado69.Visible = True&lt;br /&gt;                    Cuadro_combinado14.Visible = False&lt;br /&gt;                    &lt;br /&gt;                End If&lt;br /&gt;    &lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado14_GotFocus()&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Este control tiene RowSource dinámico pero no actuan sobre él todos los filtros de la línea a la que pertenece, sólamente se tiene en cuenta la selección de Cuadro combinado54 y de Cuadro combinado4, es decir, los combos Productoras y Rodajes. No obstante se aplica un orden descendente, que  se considera suficiente para las gestiones que necesite el usuario. En otros formularios de esta aplicación he aplicado más de un filtro pero aquí no solo me ha parecido innecesario sino que además puede ayudar al usuario. Se mantienen  ocultos  algunos controles para evitar incongruencias.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_13.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;        Dim owsource14 As String&lt;br /&gt;    &lt;br /&gt;    If Cuadro_combinado4 &lt;&gt; "" Then&lt;br /&gt;        If Cuadro_combinado36 &lt;&gt; "" Then&lt;br /&gt;            If Cuadro_combinado54 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;    Me.[Cuadro combinado18] = ""&lt;br /&gt;&lt;br /&gt;        owsource14 = "SELECT DISTINCT participa.FECHA" &amp; _&lt;br /&gt;        " FROM rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;        " WHERE rodaje.PRODUCCION ='" &amp; [Forms]![participa6]![Cuadro combinado54] &amp; "'" &amp; _&lt;br /&gt;        " ORDER BY participa.FECHA DESC;"&lt;br /&gt;     &lt;br /&gt;            End If&lt;br /&gt;        End If&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;Me.Cuadro_combinado14.RowSource = owsource14&lt;br /&gt;&lt;br /&gt;Comando61.Visible = False&lt;br /&gt;Comando62.Visible = False&lt;br /&gt;Comando67.Visible = False&lt;br /&gt;Comando68.Visible = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;                &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado14_Change()&lt;br /&gt;&lt;br /&gt;[Este control proporciona RecordSource dinámico al formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_14.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    elect = "SELECT [participa].[IDRODAJE], [rodaje].[PRODUCCION], [participa].[FECHA]," &amp; _&lt;br /&gt;    " [personal].[APELLIDOS], [participa].[IDPERSONAL]," &amp; _&lt;br /&gt;    " [vestuario].[VESTU_1_CORTO], [vestuario].[VESTU_2_CORTO], [vestuario].[VESTU_3_CORTO], [vestuario].[VESTU_4_CORTO]"&lt;br /&gt;    &lt;br /&gt;    rom = " FROM (((personal INNER JOIN parametros" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[parametros].[IDPERSONAL]) INNER JOIN (rodaje INNER JOIN participa" &amp; _&lt;br /&gt;    " ON [rodaje].[IDRODAJE]=[participa].[IDRODAJE])" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) INNER JOIN vestuario" &amp; _&lt;br /&gt;    " ON [parametros].[IDPERSONAL]=[vestuario].[IDPERSONAL])" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    ""&lt;br /&gt;    &lt;br /&gt;    here = " WHERE [rodaje].[PRODUCCION]=[Forms]![participa6]![Cuadro combinado54]" &amp; _&lt;br /&gt;    " And [participa].[FECHA]=[Forms]![participa6]![Cuadro combinado14]"&lt;br /&gt;    &lt;br /&gt;    rder = " ORDER BY [personal].[APELLIDOS]"&lt;br /&gt;    &lt;br /&gt;    fin = ";"&lt;br /&gt;&lt;br /&gt;        Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado18_GotFocus()&lt;br /&gt;&lt;br /&gt;Dim owsource18 As String&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Llegamos por fín al control que nos proporciona el primer id que queremos agregar al registro de la tabla puente. El código de este procedimiento podría haberlo simplificado pero lo dejo así para conservar distintas maneras de enfocar el problema.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_15.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;If Cuadro_combinado4 &lt;&gt; "" Then&lt;br /&gt;If Cuadro_combinado36 &lt;&gt; "" Then&lt;br /&gt;If Cuadro_combinado54 &lt;&gt; "" Then&lt;br /&gt;If Cuadro_combinado14 &lt;&gt; "" Then&lt;br /&gt;&lt;br /&gt;    owsource18 = "SELECT DISTINCT [rodaje].[IDRODAJE]" &amp; _&lt;br /&gt;    " FROM rodaje INNER JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;    " WHERE PRODUCCION ='" &amp; [Forms]![participa6]![Cuadro combinado54] &amp; "'" &lt;br /&gt;    &lt;br /&gt;        ElseIf Cuadro_combinado14.Visible = False Then&lt;br /&gt;    &lt;br /&gt;    owsource18 = "SELECT DISTINCT [rodaje].[IDRODAJE]" &amp; _&lt;br /&gt;    " FROM rodaje LEFT JOIN participa ON rodaje.IDRODAJE = participa.IDRODAJE" &amp; _&lt;br /&gt;    " WHERE PRODUCCION ='" &amp; [Forms]![participa6]![Cuadro combinado54] &amp; "';"&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt; &lt;br /&gt;Me.Cuadro_combinado18.RowSource = owsource18&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado18_Change()&lt;br /&gt;&lt;br /&gt;[Algunos controles que permanecen ocultos se muestran si en la línea inferior los combos tienen opciones seleccionadas. Esto se entenderá mejor cuando veamos el código del resto de los controles.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_16.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;        If Cuadro_combinado18 &lt;&gt; "" Then&lt;br /&gt;            If Cuadro_combinado26 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;                                                        Comando61.Visible = True&lt;br /&gt;                                                        Comando62.Visible = True&lt;br /&gt;                                                        Comando67.Visible = True&lt;br /&gt;                                                        Comando68.Visible = True&lt;br /&gt;                                                        &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = True&lt;br /&gt;                &lt;br /&gt;            End If&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado24_GotFocus()&lt;br /&gt;&lt;br /&gt;[Se limpian las opciones seleccionadas en la misma línea y se mantienen ocultos algunos controles para evitar incongruencias. Las opciones de este control se refieren a la participación en todos los proyectos no en el que está seleccionado.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_17.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Me.Cuadro_combinado20 = ""&lt;br /&gt;    Me.Cuadro_combinado26 = ""&lt;br /&gt;    &lt;br /&gt;                                                        Comando61.Visible = False&lt;br /&gt;                                                        Comando62.Visible = False&lt;br /&gt;                                                        Comando67.Visible = False&lt;br /&gt;                                                        Comando68.Visible = False&lt;br /&gt;                                                        &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;    &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado20_GotFocus()&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Se puede decir que con este control se aplica el primer filtro que proporciona ayuda al usuario para tomar una decisión. En una situación compleja, fácil de imaginar, sería imposible memorizar las condiciones de selección. Esta capacidad de dicisión es posible debida a que el control tiene RowSource dinámico. Las sentencias SQL que vienen a continuación son muy sencillas pero no ha sido fácil para mí dar con ellas. Creo que puede tener especial interés la opción "Sin participación.". Algunos controles permanecen ocultos y se limpia el control posterior de la línea correspondiente.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_18.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    Me.Cuadro_combinado26 = ""&lt;br /&gt;&lt;br /&gt;If Cuadro_combinado24 &lt;&gt; "" Then&lt;br /&gt;    &lt;br /&gt;    If Cuadro_combinado24 = "Todos los trabajadores." Then&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal LEFT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = ""&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;  &lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 30 días atrás en adelante." Then&lt;br /&gt; &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-30));)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 60 días atrás en adelante." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-60));)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación desde 90 días atrás en adelante." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL" &amp; _&lt;br /&gt;       " WHERE (((participa.FECHA)&gt;Date()-90));)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;    &lt;br /&gt;    ElseIf Cuadro_combinado24 = "Sin participación." Then&lt;br /&gt;       &lt;br /&gt;       elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;       &lt;br /&gt;       rom = " FROM personal"&lt;br /&gt;       &lt;br /&gt;       here = " WHERE personal.APELLIDOS NOT IN (SELECT personal.APELLIDOS" &amp; _&lt;br /&gt;       " FROM personal INNER JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL;)"&lt;br /&gt;       &lt;br /&gt;       rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;       fin = ";"&lt;br /&gt;    &lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 30 días atrás en adelante." Then&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE (((participa.FECHA)&gt;Date()-30))"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 60 días atrás en adelante." Then&lt;br /&gt;    &lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE (((participa.FECHA)&gt;Date()-60))"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        fin = ";"&lt;br /&gt;&lt;br /&gt;    ElseIf Cuadro_combinado24 = "Con participación desde 90 días atrás en adelante." Then&lt;br /&gt;&lt;br /&gt;        elect = "SELECT DISTINCT personal.APELLIDOS"&lt;br /&gt;        &lt;br /&gt;        rom = " FROM personal RIGHT JOIN participa ON personal.IDPERSONAL = participa.IDPERSONAL"&lt;br /&gt;        &lt;br /&gt;        here = " WHERE (((participa.FECHA)&gt;Date()-90))"&lt;br /&gt;        &lt;br /&gt;        rder = " ORDER BY personal.APELLIDOS"&lt;br /&gt;    &lt;br /&gt;        fin = ";"&lt;br /&gt;        &lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;            Me.Cuadro_combinado20.RowSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;                                                                Comando61.Visible = False&lt;br /&gt;                                                                Comando62.Visible = False&lt;br /&gt;                                                                Comando67.Visible = False&lt;br /&gt;                                                                Comando68.Visible = False&lt;br /&gt;                                                                &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = False&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = False&lt;br /&gt;            &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado26_GotFocus()&lt;br /&gt;&lt;br /&gt;[Por fín vamos a obtener el segundo id. Este control tiene RowSource dinámico dependiendo de la selección que haya en Cuadro combinado20. En el caso que nos ocupa pudiera ocurrir que el control mostrara más de un id, por ejemplo si se tratara de hermanos, el usuario cuenta con las fotografías pero también con otros formularios para refinar la búsqueda.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_19.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado20 &lt;&gt; "" Then&lt;br /&gt;        If Cuadro_combinado24 &lt;&gt; "" Then&lt;br /&gt;    &lt;br /&gt;            elect = "SELECT personal.IDPERSONAL, personal.APELLIDOS"&lt;br /&gt;            &lt;br /&gt;            rom = " FROM personal"&lt;br /&gt;            &lt;br /&gt;            here = " WHERE (((personal.APELLIDOS) ='" &amp; [Forms]![participa6]![Cuadro combinado20] &amp; "'))"&lt;br /&gt;            &lt;br /&gt;            rder = " ORDER BY personal.IDPERSONAL"&lt;br /&gt;            &lt;br /&gt;            fin = ";"&lt;br /&gt;    &lt;br /&gt;        End If&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;        Me.Cuadro_combinado26.RowSource = elect + rom + here + rder + fin&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Cuadro_combinado26_Change()&lt;br /&gt;&lt;br /&gt;[Al seleccionar el segundo id, manteniendo seleccionado el primero, se muestran los controles que permiten agregar o eliminar registros.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_20.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;        If Cuadro_combinado18 &lt;&gt; "" Then&lt;br /&gt;            If Cuadro_combinado26 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;                                                                Comando61.Visible = True&lt;br /&gt;                                                                Comando62.Visible = True&lt;br /&gt;                                                                Comando67.Visible = True&lt;br /&gt;                                                                Comando68.Visible = True&lt;br /&gt;                                                                &lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(2).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(2).Controls(3).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(1).Enabled = True&lt;br /&gt;&lt;br /&gt;CommandBars("barra_agregar_eliminar_opciones").Controls(3).Controls(2).Enabled = True&lt;br /&gt;                &lt;br /&gt;            End If&lt;br /&gt;        End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Comando59_Click()&lt;br /&gt;&lt;br /&gt;[Al accionar este control obtenemos todos los registros de la tabla puente ordenados por fecha descendente.]&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    elect = "SELECT [participa].[IDRODAJE], [rodaje].[PRODUCCION], [participa].[FECHA]," &amp; _&lt;br /&gt;    " [personal].[APELLIDOS], [participa].[IDPERSONAL]," &amp; _&lt;br /&gt;    " [vestuario].[VESTU_1_CORTO], [vestuario].[VESTU_2_CORTO], [vestuario].[VESTU_3_CORTO], [vestuario].[VESTU_4_CORTO]"&lt;br /&gt;    &lt;br /&gt;    rom = " FROM (((personal INNER JOIN parametros" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[parametros].[IDPERSONAL]) INNER JOIN (rodaje INNER JOIN participa" &amp; _&lt;br /&gt;    " ON [rodaje].[IDRODAJE]=[participa].[IDRODAJE])" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) INNER JOIN vestuario" &amp; _&lt;br /&gt;    " ON [parametros].[IDPERSONAL]=[vestuario].[IDPERSONAL])" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    ""&lt;br /&gt;    &lt;br /&gt;    here = ""&lt;br /&gt;    &lt;br /&gt;    rder = "ORDER BY [participa].[FECHA] DESC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;    &lt;br /&gt;    fin = ";"&lt;br /&gt;&lt;br /&gt;    Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;    &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Comando61_Click()&lt;br /&gt;&lt;br /&gt;[Al accionar este botón se agrega un registro al RecordSource del formulario. En caso de duplicar un registro Access muestra un mensaje de error.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_21.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado18 &lt;&gt; "" Then&lt;br /&gt;        If Cuadro_combinado26 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;            If Cuadro_combinado14.Visible = True Then&lt;br /&gt;        &lt;br /&gt;            Recordset.AddNew&lt;br /&gt;            &lt;br /&gt;            Me.IDRODAJE = Me.Cuadro_combinado18&lt;br /&gt;            Me.IDPERSONAL = Me.Cuadro_combinado26&lt;br /&gt;            Me.FECHA = Me.Cuadro_combinado14&lt;br /&gt;            &lt;br /&gt;            ElseIf Cuadro_combinado69.Visible = True Then&lt;br /&gt;            &lt;br /&gt;            Recordset.AddNew&lt;br /&gt;            &lt;br /&gt;            Me.IDRODAJE = Me.Cuadro_combinado18&lt;br /&gt;            Me.IDPERSONAL = Me.Cuadro_combinado26&lt;br /&gt;            Me.FECHA = Me.Cuadro_combinado69&lt;br /&gt;            &lt;br /&gt;            End If&lt;br /&gt;            &lt;br /&gt;        End If&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Comando62_Click()&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;[Al accionar este botón se elimina el registro correspondiente a los ids seleccionados en los combos.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_22.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;Dim elete As String&lt;br /&gt;Dim rom As String&lt;br /&gt;Dim here As String&lt;br /&gt;Dim fin As String&lt;br /&gt;&lt;br /&gt;Dim borrar As String&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado18 &lt;&gt; "" Then&lt;br /&gt;        If Cuadro_combinado26 &lt;&gt; "" Then&lt;br /&gt;&lt;br /&gt;            elete = "DELETE *"&lt;br /&gt;            &lt;br /&gt;            rom = " FROM participa"&lt;br /&gt;            &lt;br /&gt;          &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;    here = " WHERE [participa].[IDRODAJE]=" &amp; [Forms]![participa6]![Cuadro combinado18] &amp; " And" &amp; _&lt;br /&gt;    " [participa].[IDPERSONAL]=" &amp; [Forms]![participa6]![Cuadro combinado26] &amp; " And" &amp; _&lt;br /&gt;    " [participa].[FECHA]=cdate('" &amp; [Forms]![participa6]![Cuadro combinado14] &amp; "')"&lt;br /&gt;    &lt;br /&gt;    'And" [participa].[FECHA]=cdate('" &amp; [Forms]![participa6]![Cuadro combinado14] &amp; "')"&lt;br /&gt;    &lt;br /&gt;    '" [participa.FECHA]= " &amp; Me.Cuadro_combinado14 &amp; ""&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    fin = ";"&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    borrar = elete + rom + here + fin&lt;br /&gt;    &lt;br /&gt;    DoCmd.SetWarnings False&lt;br /&gt;    CurrentDb.Execute (borrar)&lt;br /&gt;    DoCmd.SetWarnings True&lt;br /&gt;        &lt;br /&gt;        End If&lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/procedimiento.gif" align="center" width="82" height="82" hspace="5"&gt;Private Sub Comando67_Click()&lt;br /&gt;&lt;br /&gt;[Abre un formulario que muestra las faltas de asistencia del trabajador seleccionado en el combo IDPERSONAL. Es un dato que puede ayudar a decidir al usuario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_23.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;    &lt;br /&gt;    Dim stDocName As String&lt;br /&gt;    Dim stLinkCriteria As String&lt;br /&gt;    &lt;br /&gt;            stDocName = "faltas"&lt;br /&gt;            DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;[Las funciones que vienen a continuación se pasan a la propiedad Acción del control correspondiente.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="center" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/mantenimiento_i_24.html'); return true" onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'; return true" alt="Una imagen vale más que 1.000 palabras."&gt;[Ver el formulario.]&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function ver_todos()&lt;br /&gt;&lt;br /&gt;    Dim elect As String&lt;br /&gt;    Dim rom As String&lt;br /&gt;    Dim here As String&lt;br /&gt;    Dim rder As String&lt;br /&gt;    Dim fin As String&lt;br /&gt;&lt;br /&gt;    elect = "SELECT [participa].[IDRODAJE], [rodaje].[PRODUCCION], [rodaje].[FECHA]," &amp; _&lt;br /&gt;    " [personal].[APELLIDOS], [participa].[IDPERSONAL]," &amp; _&lt;br /&gt;    " [vestuario].[VESTU_1_CORTO], [vestuario].[VESTU_2_CORTO], [vestuario].[VESTU_3_CORTO], [vestuario].[VESTU_4_CORTO]"&lt;br /&gt;    &lt;br /&gt;    rom = " FROM (((personal INNER JOIN parametros" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[parametros].[IDPERSONAL]) INNER JOIN (rodaje INNER JOIN participa" &amp; _&lt;br /&gt;    " ON [rodaje].[IDRODAJE]=[participa].[IDRODAJE])" &amp; _&lt;br /&gt;    " ON [personal].[IDPERSONAL]=[participa].[IDPERSONAL]) INNER JOIN vestuario" &amp; _&lt;br /&gt;    " ON [parametros].[IDPERSONAL]=[vestuario].[IDPERSONAL])" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    "" &amp; _&lt;br /&gt;    ""&lt;br /&gt;    &lt;br /&gt;    here = ""&lt;br /&gt;    &lt;br /&gt;    rder = "ORDER BY [rodaje].[FECHA] DESC, [rodaje].[PRODUCCION], [personal].[APELLIDOS]"&lt;br /&gt;    &lt;br /&gt;    fin = ";"&lt;br /&gt;&lt;br /&gt;    Me.RecordSource = elect + rom + here + rder + fin&lt;br /&gt;    &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function agregar_registros()&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado18 &lt;&gt; "" Then&lt;br /&gt;        If Cuadro_combinado26 &lt;&gt; "" Then&lt;br /&gt;            &lt;br /&gt;            If Cuadro_combinado14.Visible = True Then&lt;br /&gt;        &lt;br /&gt;            Recordset.AddNew&lt;br /&gt;            &lt;br /&gt;            Me.IDRODAJE = Me.Cuadro_combinado18&lt;br /&gt;            Me.IDPERSONAL = Me.Cuadro_combinado26&lt;br /&gt;            Me.FECHA = Me.Cuadro_combinado14&lt;br /&gt;            &lt;br /&gt;            ElseIf Cuadro_combinado69.Visible = True Then&lt;br /&gt;            &lt;br /&gt;            Recordset.AddNew&lt;br /&gt;            &lt;br /&gt;            Me.IDRODAJE = Me.Cuadro_combinado18&lt;br /&gt;            Me.IDPERSONAL = Me.Cuadro_combinado26&lt;br /&gt;            Me.FECHA = Me.Cuadro_combinado69&lt;br /&gt;            &lt;br /&gt;            End If&lt;br /&gt;            &lt;br /&gt;        End If&lt;br /&gt;    End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function eliminar_registros()&lt;br /&gt;&lt;br /&gt;Dim elete As String&lt;br /&gt;Dim rom As String&lt;br /&gt;Dim here As String&lt;br /&gt;Dim fin As String&lt;br /&gt;&lt;br /&gt;Dim borrar As String&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    If Cuadro_combinado18 &lt;&gt; "" Then&lt;br /&gt;        If Cuadro_combinado26 &lt;&gt; "" Then&lt;br /&gt;&lt;br /&gt;            elete = "DELETE *"&lt;br /&gt;            &lt;br /&gt;            rom = " FROM participa"&lt;br /&gt;            &lt;br /&gt;          &lt;br /&gt;            &lt;br /&gt;            &lt;br /&gt;    here = " WHERE [participa].[IDRODAJE]=" &amp; [Forms]![participa6]![Cuadro combinado18] &amp; " And" &amp; _&lt;br /&gt;    " [participa].[IDPERSONAL]=" &amp; [Forms]![participa6]![Cuadro combinado26] &amp; " And" &amp; _&lt;br /&gt;    " [participa].[FECHA]=cdate('" &amp; [Forms]![participa6]![Cuadro combinado14] &amp; "')"&lt;br /&gt;    &lt;br /&gt;    &lt;br /&gt;    borrar = elete + rom + here + fin&lt;br /&gt;    &lt;br /&gt;    DoCmd.SetWarnings False&lt;br /&gt;    CurrentDb.Execute (borrar)&lt;br /&gt;    DoCmd.SetWarnings True&lt;br /&gt;        &lt;br /&gt;        End If&lt;br /&gt;    End If&lt;br /&gt;    &lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function FALTAS()&lt;br /&gt;    &lt;br /&gt;    Dim stDocName As String&lt;br /&gt;    Dim stLinkCriteria As String&lt;br /&gt;    &lt;br /&gt;            stDocName = "faltas"&lt;br /&gt;            DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;    &lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/funcion.gif" align="center" width="88" height="88" hspace="5"&gt;Private Function estadisticas()&lt;br /&gt;&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;Private Function i_rapida()&lt;br /&gt;&lt;br /&gt;    Dim stDocName As String&lt;br /&gt;    Dim stLinkCriteria As String&lt;br /&gt;    &lt;br /&gt;            stDocName = "participa3"&lt;br /&gt;            DoCmd.OpenForm stDocName, , , stLinkCriteria&lt;br /&gt;            &lt;br /&gt;            DoCmd.Close acForm, "participa6"&lt;br /&gt;       &lt;br /&gt;End Function&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108628657398260154?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108628657398260154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108628657398260154'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/06/mantenimiento-de-las-tablas-puente-i.html' title='Mantenimiento de las tablas puente I.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108660652943005688</id><published>2004-06-12T10:05:00.000+01:00</published><updated>2005-04-06T12:56:42.136+01:00</updated><title type='text'>Grupos de noticias.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (1).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/06/grupos-de-noticias.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_grupos_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Alguien ha descrito la Red como un inmenso panóptico. El sueño de dominación total que un tirano loco concibiera hecho realidad, aislar a todos los seres humanos sin ver otro rostro que la pantalla del ordenador mientras el sistema nos vigila. Pero no lo hemos perdido todo, nos queda la palabra.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/periodico.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Los grupos de noticias son una buena fuente de información."&gt;Cuando empecé a utilizar los grupos de noticias creía que las respuestas que obtenía eran por obra y gracia del sistema, creía que los participantes eran perfectamente prescindibles e intercambiables, estaba convencido de que eran  las modernas  tecnologías de la información, las que en definitiva resolvían mis problemas. Ahora me doy cuenta de lo equivocado que estaba. Han tenido que pasar algunos meses de intercambios para darme cuenta de que en estos grupos se dan, algunas veces,  relaciones verdaderamente personales y casi íntimas, salvando las distancias que impone una comunicación exenta de lenguaje corporal. Quiero decir que hay participantes que ponen algo de lo mejor de sí mismos y de su experiencia a la hora de enfrentarse y dar respuesta a un post. En algunas ocasiones he comprobado que más que responder a una pregunta, alguien ha adivinado el problema que alguien más intentaba plantear con un verdadero galimatías indescifrable. Últimamente he utilizado mucho los &lt;a target="_blank" class="b"  href="http://support.microsoft.com/newsgroups/default.aspx" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;grupos de noticias de Microsoft.&lt;/a&gt; Puede ser muy útil acceder a estos grupos de noticias &lt;a target="_blank" class="b"   href="http://groups.google.es/groups?hl=es&amp;lr=&amp;ie=UTF-8&amp;q=microsoft.public.es&amp;btnG=B%C3%BAsqueda" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;a través de Google.&lt;/a&gt; Aquí encontrarás potentes herramientas de búsqueda que te permitirán encontrar una solución sin necesidad de plantearla. Pero, no te aconsejo que abras un hilo desde aquí, para publicar es mejor que utilices directamente el grupo de noticias de Microsoft. &lt;a target="_blank" class="b"   href="http://groups.google.com/groups?hl=es&amp;lr=lang_es&amp;ie=UTF-8&amp;group=es.comp" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Google tiene también otros grupos de noticias relacionados con la informática&lt;/a&gt;, y, tiene también otros de &lt;a target="_blank"  class="b"  href="http://www.google.com/grphp?hl=es&amp;tab=wg&amp;q=" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;diversos temas&lt;/a&gt;. No he encotrado tan satisfactorios estos últimos. Aunque al final sea inevitable presenciar mas de una tontería no deja de ser una experiencia interesantísima participar en estos grupos. Expresar mi agradecimiento a todos los que me han ayudado me parece insuficiente, con todos ellos estaré siempre en deuda, que trataré de saldar en la medida de lo posible con mis modestas aportaciones.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/esclavo.gif" align="left" width="82" height="82" hspace="15" vspace="5" alt="Usuario esclavizado."&gt;Pero el uso de la Red plantea incertidumbres continuamente. Uno de los medios más eficaces para contagiar equipos informáticos es precisamente los grupos de noticias. El spam se nutre de las direcciones de los participantes de los grupos para llenar de correo no deseado nuestros buzones. Nunca estaremos completamente seguros de a quien estamos ayudando, con que fines se emplean nuestras aportaciones. Por ejemplo, la estructura de una base de datos para una clínica dental o, una banda terrorista es idéntica. Pero creo que lo peor de todo es la descontextualización que padece nuestro discurso al insertarlo en un hilo, estoy  convencido de que este hecho deja herido de muerte al lenguaje que tiende a hacerse impersonal. Al elaborar un discurso exclusivamente para la Red desaparece toda referencia personal y corremos el riesgo de expresarnos para ser entendidos por el sistema más que por individuos de nuestra misma comunidad lingüística. El empleo de significantes como este ;-) o este :-( se ha extendido entre los participantes, muchos han visto en ello una tendencia a utilizar formas visuales de expresión en oposición al lenguaje tradicional, pero también, este uso indiscriminado de signos huecos, se ha interpretado como ejemplo de la terrible alienación a que estamos sometidos para convertirnos en masa. En demasiados casos se responde a un post exclusivamente con una dirección de una página web. El arte de participar en los grupos consiste en intuir cual es el grado de instrucción que tiene el que plantea una duda y darle una respuesta acorde con sus posibilidades. Se trata pues de una actividad muy adecuada para exprimir todo el potencial lingüístico que posea cada cual.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108660652943005688?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108660652943005688'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108660652943005688'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/06/grupos-de-noticias.html' title='Grupos de noticias.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108628642860860920</id><published>2004-06-05T10:15:00.000+01:00</published><updated>2005-04-06T12:58:32.393+01:00</updated><title type='text'>Bibliografía I</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (1).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/06/bibliografa-i.html"&gt;&lt;img height="62" hspace="5" src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_bibliografia_i_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;p&gt;Bibliografía recomendada para abordar el estudio del diseño, la programación y la administración de bases de datos elementales con Acces. Recomiendo estos libros pero ni digo que sean los mejores ni digo que sean buenos. Lo que puedo decir de ellos es que me han ayudado a aprender. Se han cruzado en mi vida como lo hace un amor que al concluir nos deja sumidos en una profunda decepción. La informática es horrible. Siempre puedes encontrar un autor todavía más pedante, más paternalista, más cínico, más sádico. Todavía es posible que encuentres una editorial con menos escrúpulos. Causa un profundo malestar comprobar que la difusión de la cultura está en manos de desaprensivos que tienen como objetivo la intoxicación de la sociedad.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_1.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para tener una idea general de lo que es una base de datos y las herramientas de Access.&lt;/li&gt;&lt;br /&gt;Domine Acces 2000&lt;br /&gt;Autor: César Pérez&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.ra-ma.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Ra-Ma&lt;/a&gt;&lt;br /&gt;ISBN 84-7897-445-8&lt;/br&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_3.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para profundizar ampliamente en el diseño de bases de datos, se abordan estructuras complejas.&lt;/li&gt;&lt;br /&gt;Diseño de Bases de Datos. Problemas resueltos&lt;br /&gt;Autores: Adoración de Miguel, Paloma Martínez, Elena Castro, José Mª Cavero, &lt;a target="_blank" class="b" href="http://basesdatos.uc3m.es/Miembros/Dolores.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Dolores Cuadra&lt;/a&gt;, &lt;a target="_blank" class="b" href="http://basesdatos.uc3m.es/Miembros/Ana.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Ana Mª Iglesias&lt;/a&gt;,  Carlos Nieto.&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.ra-ma.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Ra-Ma&lt;/a&gt;&lt;br /&gt;ISBN 84-7897-436-9&lt;/br&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_5.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para conocer Visual Basic.&lt;/li&gt;&lt;br /&gt;Visual Basic. Curso de Programación.&lt;br /&gt;Autor: Francisco Javier Ceballos.&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.ra-ma.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Ra-Ma&lt;/a&gt;.&lt;br /&gt;ISBN 84-7897-357-5&lt;/br&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_7.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para profundizar un poco más en Visual Basic para Aplicaciones.&lt;/li&gt;&lt;br /&gt;VBA Access 2000.&lt;br /&gt;Autor: Juan Pedro Bello.&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.ediciones-eni.com" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Ediciones ENI&lt;/a&gt;.&lt;br /&gt;ISBN 2-7460-0956-0&lt;/br&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_9.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;Para profundizar ampliamente en programación SQL.&lt;/li&gt;&lt;br /&gt;Fundamentos de SQL.&lt;br /&gt;Autor: &lt;a target="_blank" class="b" href="http://www.knockoutclothing.com/Forrest-Houlette_author_p1.html" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Forrest Houlette&lt;/a&gt;.&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.mcgraw-hill.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;McGraw Hill&lt;/a&gt;.&lt;br /&gt;ISBN 970-10-3895-9&lt;/br&gt;&lt;br /&gt;&lt;li&gt;&lt;img src="http://www.carloszcom.com/blogima/libro_11.gif" align="right" width="62" height="62" alt="Libro. Para los efectos legales, en España, todo impreso no periódico que contiene 49 páginas o más, excluidas las cubiertas."&gt;&lt;/li&gt;&lt;br /&gt;Programación avanzada con Microsoft Acces. Versión 2002.&lt;br /&gt;Autor: &lt;a target="_blank" class="b" href="http://www.programmingmsaccess.com/TheBook/AboutTheAuthor.htm" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;Rick Dobson&lt;/a&gt;.&lt;br /&gt;Editorial: &lt;a target="_blank" class="b" href="http://www.mcgraw-hill.es" onMouseOver="window.status='Haz clic para seguir el hipervículo.'; return true"&gt;McGraw-Hill&lt;/a&gt;.&lt;br /&gt;ISBN 84-481-3247-5&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108628642860860920?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108628642860860920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108628642860860920'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/06/bibliografa-i.html' title='Bibliografía I'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-108582237389150233</id><published>2004-05-29T10:15:00.000+01:00</published><updated>2005-04-07T13:46:50.520+01:00</updated><title type='text'>Diseño de bases de datos.</title><content type='html'>&lt;table border="0"&gt;&lt;tr&gt;&lt;td align="center"&gt;Envía un comentario al autor sobre éste artículo.&lt;/td&gt;&lt;td align="center"&gt;Este artículo en formato pdf. Páginas (1).&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Me gustaría saber que opinas sobre éste artículo.'; return true" onclick="comentario_mensaje(); return true" onmouseout="window.status=''; return true" href="http://carloszcom.blogspot.com/2004/05/diseo-de-bases-de-datos.html"&gt;&lt;img height="62"  src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" align="center" alt="Tu opinión sobre este artículo." /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td align="center"&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_diseno_1.pdf" target="_blank"&gt;&lt;img height="62" src="http://www.carloszcom.com/blogima/pdf.gif" width="62" align="center" alt="Abre este artículo en formato pdf."/&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;img src="http://www.carloszcom.com/blogima/usuario.gif" align="right" width="82" height="82" hspace="5" vspace="5" alt="Un usuario acaba de encontrar una solución."&gt;Las bases de datos pueden resolver los problemas de gestión de la información que surgen en organizaciones y empresas. Para abordar un problema de información mediante una base de datos o, en cualquier caso, primero habrá que expresar dicho problema en lenguaje común y corriente, elaborando un discurso que limite y defina el alcance del problema. En esta primera aproximación no es estrictamente necesario considerar toda la demanda de información que requiere la organización. &lt;br /&gt;&lt;br /&gt;Por ejemplo.&lt;br /&gt;&lt;br /&gt;Una clínica de atención primaria necesita mantener la información correspondiente a los pacientes que la visitan de forma que los doctores de distintas especialidades puedan acceder con facilidad al historial y diagnósticos previos.&lt;br /&gt;Tablas. Una tabla es un objeto de la base de datos que representa una entidad de la vida real definida por sus propiedades irreductibles. En nuestro ejemplo distinguimos con facilidad las entidades "médicos", "pacientes" y "consultas" que, se corresponden con tablas del mismo nombre en la base de datos. Los campos de una tabla no son otra cosa que las propiedades irreductibles de una entidad del mundo real.&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/clic.gif" align="left" width="62" height="62" hspace="15" vspace="5" onClick="cinco_ventana('http://www.carloszcom.com/blogima_gr/diseno_1.html')" alt="Una imagen vale más que 1000 palabras." onMouseOver="window.status='Haz clic para ver una imagen en otra ventana.'"&gt;Relaciones. En nuestro caso la tabla "medicos" mantiene una relación "uno a varios" con la tabla "consultas". De la misma manera que la tabla "pacientes" mantiene también una relación "uno a varios" con la misma tabla "consultas". Las tablas "medicos" y "pacientes" son tablas "extremos" y, mantienen una relación "varios a varios" entre ellas. La tabla "consultas" es una tabla "puente" entre "medicos" y "pacientes" que, resuelve la relación "varios a varios".&lt;br /&gt;Un problema común suele ser atribuir campos a las tablas "extremos" que en realidad deberían figurar en la tabla "puente", siendo mucho menos frecuente el problema inverso, es decir, atribuir a una tabla "puente" un campo de una tabla "extremo".&lt;br /&gt;Siguiendo con nuestro ejemplo. La tabla "puente", es decir, la tabla "consultas", tendría los campos: "idmedico", "idpaciente", "fecha", "diagnostico", "analisis", "radiografia" y "sintomas".&lt;br /&gt;&lt;img src="http://www.carloszcom.com/blogima/cabeza.gif" align="left" width="82" height="82" hspace="15" vspace="5" alt="Pensamiento profundo, dedícale tiempo."&gt;Sería un error atribuir los campos "diagnostico", "analisis", "radiografia" y "sintomas" a la tabla "pacientes". El campo "fecha" no debe de ofrecer duda alguna, parece muy evidente que se trata de un campo perteneciente a la tabla "consultas". Sin duda los médicos del centro necesitarán un informe en el que se reflejen los sucesivos diagnósticos, análisis, radiografías y síntomas de los pacientes. Este informe tendría como origen una consulta basada en las tablas "medicos", "pacientes" y "consultas".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-108582237389150233?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108582237389150233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/108582237389150233'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/05/diseo-de-bases-de-datos.html' title='Diseño de bases de datos.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-7141294.post-109881238510288623</id><published>2004-05-22T10:20:00.000+01:00</published><updated>2005-04-12T10:11:43.786+01:00</updated><title type='text'>Menú con dibujicos.</title><content type='html'>&lt;center&gt;&lt;br /&gt;&lt;DIV style="width:300px;"&gt;&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   &lt;h6 class="sidebar-title"&gt;Ventanilla.&lt;/h6&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a href="http://carloszcom.blogspot.com/2004/05/men-con-dibujicos.html" onClick="cinco_ventana('http://www.morsopay.com/index.htm'); return true" onMouseOver="window.status='Haga sus pagos con seguridad.'; return true"  onMouseOut="window.status=''; return true"&gt;&lt;img src="http://www.carloszcom.com/blogima/dinero.gif" width="62" height="62"&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;h6 class="sidebar-title"&gt;Todos los artículos sobre Access en un archivo pdf. Páginas (90)&lt;/h6&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a onmouseover="window.status='Haz clic para abrir el archivo, después puedes guardarlo si lo deseas.'; return true" href="http://www.carloszcom.com/pdf/pdf_todos_1.pdf" target="_blank"&gt;&lt;img src="http://www.carloszcom.com/blogima/pdf.gif" width="62" height="62"&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6 class="sidebar-title"&gt;Espero tus comentarios.&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt;&lt;a href="http://carloszcom.blogspot.com/2004/05/men-con-dibujicos.html" onClick="comentario_general_mensaje(); return true" onMouseOver="window.status='Envia un comentario al autor de este blog.'; return true"  onMouseOut="window.status=''; return true"&gt;&lt;img src="http://www.carloszcom.com/blogima/escribeme.gif" width="62" height="62"&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6 class="sidebar-title"&gt;Quiero ser tu página de inicio.&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="center"&gt;&lt;br /&gt; &lt;a  href="#"onClick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.carloszcom.blogspot.com/');return false" onMouseOver="window.status='Haz conmigo lo que quieras.'; return true" onMouseOut="window.status=''; return true"&gt;&lt;br /&gt; &lt;img src="http://www.carloszcom.com/blogima/corazon.gif" width="62" height="62"&gt;&lt;br /&gt; &lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7141294-109881238510288623?l=carloszcom.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109881238510288623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7141294/posts/default/109881238510288623'/><link rel='alternate' type='text/html' href='http://carloszcom.blogspot.com/2004/05/men-con-dibujicos.html' title='Menú con dibujicos.'/><author><name>Carlos</name><uri>http://www.blogger.com/profile/04496196548991401958</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://www.carloszcom.com/lado/personal_4.jpg'/></author></entry></feed>
