Bucle con fechas en calendario

Estoy realizando un calendario donde, si un feriado cae miércoles o jueves debe pasar al lunes próximo, ejemplo cae 1 debe pasar a al lunes 6 y si cae martes debe pasar al lunes anterior ejemplo: martes 2 debe pasar a lunes 1. Estoy utilizando este bucle, que me adelante la fecha a 20 años, con el día esta todo bien. No consigo que los años corrar y que los demás también. Eh probado con if y no hay caso les dejo el código que utilizo.

Private Sub Movible_Click()
Dim i As Byte
Dim ahora1 As Date
Dim fech As Date
Dim texto As String
Dim salida As String
Dim Descrip: Descrip = Me.Descripcion
fech = Me.Fecha
ahora1 = DateAdd("d", 0, [fech]) ' dejo dia actual
ahora1 = DateAdd("yyyy", 0, [fech]) ' dejo año actual
Fecha = ahora1
texto = Me.Conmemoracion 'Es para acortar nombre y borrar todos
salida = Left(texto, 3)
Me.clave = salida
If Weekday(Fecha, vbMonday) = 3 Then ' si el dia es igual a mierocles debe pasar al lunes posterior
For i = 1 To Me.si 'armo el bucle segun la catidad del campo si
DoCmd.SetWarnings False
fech = ahora1
ahora1 = DateAdd("d", -2, [fech]) ' aqui le resto los 2 dias
ahora1 = DateAdd("yyyy", 1, [fech]) ' aqui suma un año
DoCmd.GoToRecord , , acNewRec
Descripcion = Descrip
Fecha = ahora1
Descripcion = Descrip
texto = Me.Conmemoracion
salida = Left(texto, 3)
Me.clave = salida
DoCmd.GoToRecord , , acFirst
Me.Requery
Me.Lista43.Requery
Next i
End If
End Sub

3 respuestas

Respuesta
1

¿Podrías poner una imagen de lo que, más o menos, quieres.? Es que por más que leo no consigo entenderlo.

Estimado Aquí le dejo la base,, para que pueda verla. Es el formulario ffestivos. El cual carga los días al calendario principal. Como vera el de fecha fijas anda bien, dado que el bucle suma los 20 años.

https://drive.google.com/file/d/1XzKAiBGzdanKSRKP0F4sl-Z5h3T8n2Uw/view?usp=sharing 

Había empezado a prepararte un ejemplo, ya que, honestamente, el código de tu base me parece bastante lioso y que sobra mucho. Por ejemplo( luego te digo por lo que no he seguido), si tengo el formulario donde elijo el día, mes, año que quiera. Puedes ver que no se necesita ninguna tabla ya que la de citas todavía no se ha usado y la de festivos es la de festivos en España.

Elijo un día

Elijo un mes

El combinado Elija el año me muestra 20 años como podría mostrarme 200. En el mismo momento que selecciono uno

Y con esos datos ya podrías confeccionar( no está terminado) el calendario de ese mes y poder fijar citas por horas, y el código no puede ser más simple, como te decía, sin necesidad de tablas

Private Sub ElegirAño_AfterUpdate()
DiaElegido = CDate([ElegirDia] & "/" & [ElegirMes] & "/" & [ElegirAño])
DiaSemana = Format([DiaElegido], "dddd")
PrimerDia = DateSerial(Year([DiaElegido]), Month([DiaElegido]), 1)
UltimoDia = DateSerial(Year([DiaElegido]), Month([DiaElegido]) + 1, 0)
PrimerLetra = Format([PrimerDia], "dddd")
UltimoLetra = Format([UltimoDia], "dddd")
If DCount("*", "festivos", "DiaFestivo=day([diaelegido]) and mesfestivo=month([diaelegido])") >= 1 Then
EsFestivo = "SI"
Else
EsFestivo = "NO"
End If
End Sub
Private Sub ElegirAño_GotFocus()
Dim i As Integer
For i = 2022 To 2042
ElegirAño.AddItem i
Next
End Sub
Private Sub ElegirDia_GotFocus()
Dim i As Byte
For i = 1 To 31
ElegirDia.AddItem i
Next
End Sub
Private Sub ElegirMes_GotFocus()
Dim i As Byte
For i = 1 To 12
ElegirMes.AddItem i
Next
End Sub

Es decir, los combinados no tienen origen de la fila, con lo cual no necesitas ninguna tabla, se lo das cuando pones el cursor sobre él, y una vez que has elegido el año, se rellenan los cuadros de texto.

No continué, ya que he observado la insistencia ( o necesidad imperiosa) de alguien en que adaptes su idea.

Respuesta
1

Desconociendo de donde sale la fecha inicial, según se calcule, habrá años en que la fecha se corresponda con días no laborables (sábado, domingo) y se perdería el feriado ese año.

Que calculo es el correcto, conservar el día feriado (a cambio de uno laborable) o ignorarlo

Olavarria Citi

Estimado Aquí le dejo la base,, para que pueda verla. Es el formulario ffestivos. El cual carga los días al calendario principal. Como vera el de fecha fijas anda bien, dado que el bucle suma los 20 años.

https://drive.google.com/file/d/1XzKAiBGzdanKSRKP0F4sl-Z5h3T8n2Uw/view?usp=sharing 

Ojeare la base, pero la pregunta es si el día festivo es del trabajador, esto es: si cuadra con un festivo (sábado, domingo) se pasa también al lunes o si ese día se pierde (en beneficio del patrón y a perjuicio del trabajador)

Tengo ambos cálculos pendientes únicamente de esa cuestión, ya que no es lo mismo calcular el próximo en base a la fecha actual (o referente) para años futuros y el mismo calculo que se basa en tomar como referente la fecha calculada año a año (que suele ser la que aplica el trabajador a la hora de calcular los festivos)

El cálculo básico lo interpreto así (si mi análisis correcto, se trata de evitar puentes entre semana, derivando los festivos al lunes más próximo)

X_Fecha = DateAdd("yyyy", N_Años, X_Fecha)
X_Fecha = X_Fecha - 1 * Abs(Weekday(X_Fecha, vbMonday) = 2)
X_Fecha = X_Fecha + 5 * Abs(Weekday(X_Fecha, vbMonday) = 3)
X_Fecha = X_Fecha + 4 * Abs(Weekday(X_Fecha, vbMonday) = 4)

Siendo X_Fecha la fecha referente para el cálculo. y Festivo = Feriado

Sobre los calendarios y los festivos.

Hay una fórmula que utilizan (en el Vaticano, para los católicos) para organizar el santoral de cada año, se basa en una fecha concreta que ha de coincidir en un día concreto (por ejemplo 'el 'domingo de ramos') que no puede ser más que un domingo y por ello la 'regla' dice que domingo del mes se utilizara.

En base a esa fecha salen el resto de los festivos que pueden reubicarse y como la liturgia tiene sus ciclos (la ascensión x días tras la muerte y resurrección) hay una formulación para ello y muchos festivos 'bailan por el calendario'.
Otros festivos (no asociados a eventos religiosos) también deben de conservar 'su día' independiente de donde caiga (por poner un caso: en los estados unidos el día de la independencia, el cuatro de julio).
Hay festivos concretos que puede ser necesario reubicar si caen en un festivo natural (sábado/domingo) porque de no hacerlo no se podría celebrar adecuadamente o se perdería como tal festivo ese año (por ejemplo, los festivos gremiales, asociados a un santo).

Muchas gracias, tu ejemplo lo eh utilizado, pero me da el mismo resultado que el utilizado de otra manera.

El problema esta en que el año, no corre a la par de la fecha.

Algo no esta bien en el bucle que has utilizado, en mi calculo de fechas he aplicado dos metodos:

En este se calcula tomando como semilla para el año que viene la fecha del año en curso obteniendo estos resultados:

Public Function CalculaF(X_Fecha As Date, N_Años As Long) As Date
Dim Bucle As Long
For Bucle = 1 To N_Años
X_Fecha = DateAdd("yyyy", 1, X_Fecha)
X_Fecha = X_Fecha + 1 * (Weekday(X_Fecha) = vbTuesday) - 5 * (Weekday(X_Fecha) = vbWednesday) - 4 * (Weekday(X_Fecha) = vbThursday)
Next Bucle
CalculaF = X_Fecha
End Function
Antes del cálculo                         fecha recalculada
17/09/2023    domingo                     17/09/2023    domingo
17/09/2024    martes                      16/09/2024    lunes
16/09/2025    martes                      15/09/2025    lunes
15/09/2026    martes                      14/09/2026    lunes
14/09/2027    martes                      13/09/2027    lunes
13/09/2028    miércoles                   18/09/2028    lunes
18/09/2029    martes                      17/09/2029    lunes
17/09/2030    martes                      16/09/2030    lunes
16/09/2031    martes                      15/09/2031    lunes
15/09/2032    miércoles                   20/09/2032    lunes
20/09/2033    martes                      19/09/2033    lunes
19/09/2034    martes                      18/09/2034    lunes
18/09/2035    martes                      17/09/2035    lunes
17/09/2036    miércoles                   22/09/2036    lunes
22/09/2037    martes                      21/09/2037    lunes
21/09/2038    martes                      20/09/2038    lunes
20/09/2039    martes                      19/09/2039    lunes
19/09/2040    miércoles                   24/09/2040    lunes
24/09/2041    martes                      23/09/2041    lunes
23/09/2042    martes                      22/09/2042    lunes
22/09/2043  martes 21/09/2043  lunes

En este otro se mantiene la fecha inicial y se le añaden años obteniendo fechas sin martes, miércoles o jueves:

Public Function CalculaFf(ZFecha As Date, U_Años As Long) As Date
ZFecha = DateAdd("yyyy", U_Años, ZFecha)
CalculaFf = ZFecha + 1 * (Weekday(ZFecha) = vbTuesday) - 5 * (Weekday(ZFecha) = vbWednesday) - 4 * (Weekday(ZFecha) = vbThursday)
End Function
17/09/2023    domingo                     17/09/2023    domingo
17/09/2024    martes                      16/09/2024    lunes
17/09/2025    miércoles                   22/09/2025    lunes
17/09/2026    jueves                      21/09/2026    lunes
17/09/2027    viernes                     17/09/2027    viernes
17/09/2028    domingo                     17/09/2028    domingo
17/09/2029    lunes                       17/09/2029    lunes
17/09/2030    martes                      16/09/2030    lunes
17/09/2031    miércoles                   22/09/2031    lunes
17/09/2032    viernes                     17/09/2032    viernes
17/09/2033    sábado                      17/09/2033    sábado
17/09/2034    domingo                     17/09/2034    domingo
17/09/2035    lunes                       17/09/2035    lunes
17/09/2036    miércoles                   22/09/2036    lunes
17/09/2037    jueves                      21/09/2037    lunes
17/09/2038    viernes                     17/09/2038    viernes
17/09/2039    sábado                      17/09/2039    sábado
17/09/2040    lunes                       17/09/2040    lunes
17/09/2041    martes                      16/09/2041    lunes
17/09/2042  miércoles 22/09/2042  lunes

Los saltos de día de la semana coinciden con los años bisiestos y en el 'se pierden' los festivos que coinciden en sábado y domingo.

¡Gracias! Enrique, es tal cual lo que tu dices hay algo en el bucle que esta mal y no logro saber que es.

Los 2 ejemplos me han seervido.

Agradezco tu colabioracion, como a los demás que han respondido a mi consulta.

La variable que utilizas para incrementar los años (o el dato que incrementes) la compartes en otro sitio y se interfieren, crea una exclusiva para esa función e inténtalo de nuevo (aunque ya lo tengas solucionado, que el error te sirva para aprender algo nuevo)

¡Gracias! Por el consejo así lo hago, a pesar de poder solucionarlo por otro lado, igual seguiré tratando que funcione ya teniendo una punto lo haré. Muchas gracias

Respuesta
1

Escríbame a [email protected] y le regalo este calendario para 21 países, está hecho en VB6.0. La respuesta a su pregunta está en el código, como observa este calendario en pantalla está para Colombia, en donde los festivos se pasan al siguiente lunes, pero entre los países tengo Chile en donde se da un manejo diferente, creo que es el caso de su pregunta.

Estimado muchas gracias le he enviado el email, con la solicitud de envio de la base.

Igual aquí le dejo la base,, para que pueda verla. Es el formulario ffestivos. El cual carga los días al calendario principal. Como vera el de fecha fijas anda bien, dado que el bucle suma los 20 años.

https://drive.google.com/file/d/1XzKAiBGzdanKSRKP0F4sl-Z5h3T8n2Uw/view?usp=sharing 

Cómo está trabajando su base de datos no es la forma de manipular los festivos, veo que es de Argentina, en este caso puede enviarme a mi correo los festivos de Argentina indicando fijos y cuáles se trasladan.

Elaboré hace muchos años el código de las funciones para este caso sin necesidad de crear tablas de festivos, es decir, en lo posible un calendario prácticamente perpetuo.

Estimado Eduardo, los feriados movibles los implemente el gobierno año a año de acuerdo a las necesidades turísticas. A veces lo hace por 2 años, otras vez por 1.

Por esa razón se creo el campo para poner la cantidad de bucles.

Ud va a ver otro botón que dice fijos esos si quedan como están pero son pocos. Ejemplo: 1 de mayo, 9 de julio, 25 de diciembre, 1 de enero.

Si mira mi programa calendario, hay una opción para adicionar otros días no laborables, por ejemplo, vacaciones, igualmente permite definir si el día sábado se considera laborable.

Observe que he adicionado a los días no laborables el 26 y 27 de septiembre, en consecuencia, el calendario cambia el color para estos días.

Ahora si hago doble clic sobre el día 27 para programar una actividad, el sistema me informa que esa fecha se ha considerado NO laborable.

Este código lo tengo para VB 6.0 pero se puede recuperar, tendría que reinstalar Visual Studio de esa versión. La idea es igual para Access, es decir, los algoritmos son válidos. Envíeme su correo y le hago llegar el instalador de la Agenda para que se haga una mejor idea.

Estimado Eduardo muchas gracias le eh enviado el correo. Tengo instalado en una pc viejita el VB6.

Olavarria no he recibido su correo para enviarle el programa y no le estoy imponiendo mi idea como dicen, comenzando porque si UTILIZAN tabla de festivos y de esto se trata mi algoritmo de NO utilizar tabla de festivos, solo una tabla para registrar las vacaciones y otros días que se acuerden no laborables, en caso de que se consideren, pero no es obligatoria. Y mejor que no le siguieron explicando están lejos de la solución.

Estimado Eduardo, se lo he enviado ayer con el Titulo " Bucle con fechas en calendario".

Ya se lo reenvío nuevamente,, Desde mi ciudad.

Saludos

Lo he enviado a su correo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas