Calcular fechas. Todos los domingos de un año
A ver si me puedes echar una mano como en alguna otra ocasión.
Tengo una base de datos en la que uno de los formularios es para programar una actividad para cada domingo del año. Entonces cuando tengo que programar un nuevo año es un proceso manual y engorroso, por lo que había pensado automatizarlo. Tengo una idea de como hacerlo pero no se como.
Lo que me gustaría hacer es que en ese formulario pueda escoger un año (con un cuadro combinado) y mediante un botón de comando al clicar me rellene una columna del subformulario (campo fecha) con todas las fechas que correspondan a los domingos de ese año.
He pensado que podría hacerlo con una consulta en la que al preguntarme una fecha de inicio calculara esa fecha + 7 pero no se como hacerlo o si se puede hacer.
Bueno, no se si esta es la mejor forma o quizá se te ocurra otra más sencilla.
1 respuesta
Veamos, sin ver cómo tienes tu BD, es difícil que te pueda dar un código que te funcione exactamente como quieres, pero, te he preparado un ejemplo, a ver si lo puedes adaptar. Si tienes problemas, me lo comentas, y lo miramos.
Te explico el proceso:
1º miramos que haya un valor en el cuadro combinado
2º declaramos las variables
3º definimos la fecha inicial (1 de enero del año elegido) y la final (31 de diciembre del mismo año)
4º iniciamos un bucle, que nos mira si la fecha es o no domingo. En caso afirmativo, nos escribe esa fecha en la tabla. Para eso se usa la función WeekDay(fecha)
5º pasamos al siguiente día.
El ejemplo: <a>http://www.filebig.net/files/Ax4AKi4fC9</a>
Muchas gracias Sveinbjorn por tu rápida respuesta. Me he descargado el ejemplo que me has enviado y he probado lo que hace. Has interpretado perfectamente lo que te pedía. Ahora tengo que ver como lo adapto a mi BD. Yo no lo tengo como formularios continuos, tengo un formulario con subformulario. Supongo que si en el código sustituyo el nombre de cada uno de los elementos me funcionará. Permíteme que me lo mire durante esta semana y te digo como me va. Gracias de nuevo.
El código te tendría que funcionar igual, independientemente del tipo de distribución del formulario, pues lo que hace es escribir los domingos en la tabla. Obviamente, con los nombres que tu tengas de tablas y controles.
Si tienes algún problema, aquí me tienes para intentar resolverlo.
Hola de nuevo Sveinbjorn.
He adaptado el código que me pasaste a mi BD y he hecho algunos progresos, pero no consigo que funcione 100%.
Si te parece te explico como están montadas las tablas y los formularios y luego te digo el problema que me da.
Una tabla (T-Planificacion) contiene los siguientes campos: Cod_Plan (autonumérico); Mes (Texto); Año (Numérico).
Otra tabla (T-PLanificacion-Detalle) con los campos: Cod_Plan (Numérico); Fecha (Fecha/Hora); Nombre (Texto); Tarea (Numérico).
Entonces El formulario principal F-Planificacion está basado en la tabla T-Planificacion y el subformulario F-Planificacion-Detalle es de la tabla T-Planificacion-Detalle.
Cuando creé la BD (hace unos cuantos años), la idea era la siguiente:
Al generar un Nuevo Registro, le introducía el Año y el Mes (en el formulario T-Planificacion) y a continuación en el Subformulario con vista de tabla (F-Planificacion-Detalle) introducía todas las fechas (solo las de ese mes, o sea que cada nuevo registro correspondía a un mes). Esa introducción de datos la hacía de una vez sin introducir nombres ni tareas y
luego durante el año voy rellenando esos campos. Como ves bastante engorroso.
Entonces lo que he conseguido hasta ahora con tu código es que me rellene en el subformulario todas las fechas del año que elijo en el Cuadro Combinado, pero no me registra el Mes ni el Año porque están en otra tabla (T-Planificacion).
Otro problema es que añade todos los registros nuevos al primer registro que tenía creado (El primer registro contenía los 4 domingos de enero de 2007 y a continuación ha guardado todos los domingos de 2015, el año que escogí para probar).
O sea que no Genera un Nuevo Registro asociado a un mes del año elegido al que estén vinculadas las fechas y el resto de datos del subformulario.
Se que es un poco liado pero fue lo que se me ocurrió para ver de forma rápida la programación mes a mes. Ahora lo habría hecho diferente.
Entonces lo que he pensado para aprovechar el código (porque
creo que será más fácil que adaptarlo al funcionamiento actual) es unificar las
dos tablas (T-Planificacion y T-Planificacion-Detalle). Pero lo que si necesito
es que una vez haya introducido todos los datos, que pueda filtrarlos, porque
al estar todos los registros juntos, para ir al 2013 ó 2014 va a ser engorroso.
Entonces había pensado en dos cuadros combinados, uno para seleccionar el año al que quiero ir y otro para el mes (aunque este segundo puede ser prescindible si al escoger el año me muestra siempre Enero).
Bueno, no se si me he liado mucho. Espero haberlo explicado bien. Cualquier duda o sugerencia la comentamos.
Gracias de nuevo y un saludo.
Te he preparado el código para tu BD inicial (espero que aún no la hayas cambiado a una sola tabla)...
Ahora te registra para cada registro del formulario, los domingos correspondientes.
http://filebig.net/files/emBRNF7iFF
Si ya hubieras unificado las tablas, coméntamelo y te explico como hacer los filtros.
Hola.
He probado el nuevo código y funciona perfecto. Me ha costado un poco porque el campo Mes de T-Planificacion lo introducía con un cuadro combinado que a su vez tenía los datos en una tabla T-Mes y el problema estaba en que en lugar de guardar el mes por nombre (por ejem. Enero) lo guardaba por Cod.Mes (1, 2, 3, etc…) entonces aunque me guardaba el nuevo registro con el Año y el Mes, no generaba las fechas en la tabla T-Planificacion-Detalle. Pero ya está solucionado.
Aunque he detectado que permite hacer algo que no está bien.
Si abrimos un Nuevo Registro e introducimos Año y Mes y pulsamos el fabuloso botón
se generan las fechas en el subformulario. Hasta aquí correcto, pero si ahora Sin abrir un Nuevo Registro le cambio el Mes o el Año, me vuelve a calcular y guardar en ese registro las nuevas fechas. ¿Se puede hacer algo para que después del cálculo salga del registro? O bien si en el subformulario ya hay algún registro, que no permita añadir más de forma automática (aunque sí de forma manual). No se seguro que tu encuentras la mejor solución.
No quisiera abusar de ti pero también me interesaría mucho lo que te comenté anteriormente de un cuadro combinado donde pueda seleccionar un año de los que están en T-Planificacion y me busque el primer mes de ese año (tengo uno hecho de antes pero me ha dejado de funcionar porque he cambiado un campo Cod-Plan que ahora es autonumérico, antes era numérico y lo introducía cada vez de forma manual. Entonces al eliminar ese campo y sustituirlo por el otro ya no me funciona el filtro).
Bueno, muchas gracias de nuevo por tu excelente trabajo. Un saludo.
Buenas,
he pensado en algo que solucionaría los dos problema de una vez.
Si hacemos el Cuadro Combinado para elegir el año al que queremos ir, se puede utilizar para que cuando abramos el formulario muestre la fecha más próxima a la actual (Hoy()), porque en realidad lo que hago siempre cuando lo abro, es buscar el año actual para consultar o añadir datos.
Entonces, respecto al problema que te comentaba de que permite añadir fechas en el mismo registro, se podría hacer que cada vez que añadamos un nuevo grupo de fechas vuelva a ese estado (Hoy()) y fuerce a volver a solicitar Nuevo Registro.
Te comento también que tengo ya creados los siguientes Comandos:
Nuevo Registro, Ir al Siguiente Registro, Ir al Anterior Registro, Cuadro Combinado Meses, Cuadro Combinado para Años, Guardar Registro y Actualizar.
Siento ser un poco pesado pero anoche me acosté pensando en la BD y cuando me he levantado lo primero que me ha venido a la cabeza es también la BD.
Saludos.
Lo que comentas de la T-Meses, se me había ocurrido, pues era más fácil que meter los meses a mano, y más sencillo para programar.
Para que no nos pasen esas cosas, ¿te importa pasarme una copia de tu BD (aunque sea sin datos)? Así, viendo su estructura completa, ya voy más a tiro fijo.
Si no tienes inconveniente, súbela a filebig.net o web similar y ponme aquí el enlace de descarga.
Hola!
En el vínculo adjunto encontraras la BD.
https://dl.dropbox.com/u/20042295/Discursos-Mushus.mdb
Veras que al abrir los formularios “Planificacion de discursos” y “Hermanos discursantes” aparece un mensaje donde pide: introduzca el valor del parámetro:
T-Planificacion.codigo-Plan y T-PLanificacion-Detalle.Codigo-Plan.
Esto se debe a que como te comenté he borrado el campo “Codigo-Plan” de las tablas
T-Planificacion y T-Planificacion-Detalle. Este campo era antes un campo de texto con el que vinculaba el subformulario al formulario y además era una Clave Principal. Lo he sustituido por Cod-Plan que es autonumérico y así me olvido. Cuando he limpiado de datos la BD para enviártela, he aprovechado para borrar definitivamente el campo, y es cuando me han comenzado a salir los mensajes. He intentado ver porque, pero mi lamentable nivel (jeje) no me ha permitido encontrar la causa. ¿Puedes por favor mirarlo? (He visto que en algunas consultas también da el error, pero no te preocupes por eso, si hace falta las borro y las hago de nuevo).
También veras que en el Formulario “Planificacion de discursos” (F-Planificacion) no funciona el Cuadro Combinado “Buscar Año”. Es por lo mismo, por haber borrado el campo “Codigo-Plan”, pero supongo que con el nuevo código que hagas, este Cuadro Combinado desaparece.
Ya que te envío la BD aprovecho para comentarte algo que también llevo tiempo intentando y no consigo. En el Formulario “Hermanos Discursantes” verás un Cuadro Combinado con la etiqueta BUSCAR. Cuando voy introduciendo el nombre, va mostrando el valor que va coincidiendo pero siempre en orden. Pero he visto alguna BD con campos parecidos que al escribir una palabra muestra todos los registros que contienen esa palabra.
Me explico con un ejemplo:
Ahora hay un nombre (J.Gabriel Garcia)(el mio) pero si hubiera otro que fuera J.Gabriel Fernandez tendría que escribir todo el nombre hasta la primera letra del apellido que es la que los diferencia.
Con el otro tipo de búsqueda (creo que es con el parámetro: Como "*" & […] & "*" pero yo no he conseguido hacerlo) puedes buscar cualquier palabra que contenga ese nombre.
Por ejemplo, si hay alguien que se llama Antonio Olivera Rico y yo se que no
hay nadie más que tenga el apellido Olivera, tan solo tendría que escribir “Oliv” en lugar de “Antonio Oliv”.
Bueno eso es todo que no es poco. Hace años que uso esa BD y me ha ido muy bien, pero la verdad es que es muy mejorable. Hace tiempo que llevo pensando en todos estos cambios pero la falta de tiempo y sobre todo la falta de conocimientos ha hecho que lo vaya dejando. Menos mal que hay gente como tu que está dispuesta a compartir su tiempo y conocimientos para ayudar a otros como yo con escasos recursos.
Una última observación: la BD que te he enviado es una copia donde he borrado la mayoría de los datos. Cuando me envíes la BD modificada tendré que pasar a mi BD todos esos cambios. Por eso, si hay algún cambio importante en la estructura de la BD, coméntamelo para que no me vuelva loco. Mil gracias de nuevo.
Saludos.
Te subo tu bd con alguna modificación hecha, y un pdf en el que te explico un poco y te respondo la las cuestiones que estaban pendientes. A ver si te sirven las soluciones que te propongo y no se me quedó nada en el tintero...
Hola,
Quería agradecerte la valiosa ayuda que me has prestado. Funciona todo perfectamente y me va a ser muy útil.
Mi valoración es Excelente no solo por la funcionalidad del código sino por la rapidez, profesionalidad y sobre todo, la paciencia que has tenido conmigo.
Muchas gracias de nuevo y hasta otra.
- Compartir respuesta