Calendario de turnos rotativos en access

Tras volverme tarumba con un código que traté de hacer yo y que no funcionaba ni para atrás, ahora estoy tratando de hacerlo con el ejemplo de Chea: https://geeks.ms/access/gestin-de-turnos-de-trabajo-con-access/ El problema es que en mi caso cada trabajador entra en la cadencia 7 días más tarde ¿Cómo lo tengo que reflejar en el código o en la consulta? Me rompí la cabeza pero nada … no soy capaz. La secuencia sería de este tipo: MMMMMMMTTTTTTTNNNNNNNLLLLLLL

Trabajador1 de 01/01/01 a 07/01/01: MMMMMMM

Trabajador2 de 01/01/01 a 07/01/01: TTTTTTT

…. ….

Según el código me sale así:

Trabajador1: MMMMMM (correcto)

Trabajador2: LMMMMMM (atrasa un día, tendría que adelantar 7)

El código es este:

Public Function fColumna(item As Long, Columnas As Long) As Long
fColumna = 1 + ((item + Columnas - 1) Mod (Columnas))
End Function
Public Function fTurnoFecha(FechaCalculo As Date, sCadencia As String, PrimerDiaTurno As Date, Optional lDesplazamiento As Long) As String
Dim v As Variant 'OJO: ESTOS DATOS SE METEN DESDE LA CONSULTA
Dim lColumnas As Long
Dim lCompensacion As Long

v = Split(sCadencia, ",")
lColumnas = 1 + UBound(v)

lCompensacion = fColumna(Int(PrimerDiaTurno + lDesplazamiento), lColumnas) - 1
fTurnoFecha = v(fColumna(Int(FechaCalculo) - lCompensacion, lColumnas) - 1)

End Function

Y en la Consulta en turno tengo:

Turno: fturnofecha([fechavirtual];"M,M,M,M,M,M,M,T,T,T,T,T,T,T,N,N,N,N,N,N,N,L,L,L,L,L,L,L";CFecha("03-09-2018");[grupo]-1)

Imaginé que sería poner … [turno]+7 pero eso lo único que hace es adelantar 7 días los turnos de todos los trabajadores

2 respuestas

Respuesta
2

Si con lo que se trató en este otro foro te sirve, yo creo que sí:

http://nksvaccessolutions.com/Foro/viewtopic.php?f=7&t=410 

Lo estaba mirando ahora mismo, pero así por encima creo que me pierdo … ya te diré. A mí con un trabajador funciona correctamente, el tema es con la cadencia en el trabajador 2 que sería 7 días más tarde, el trabajador 3 otros 7 más, etc.

Básicamente lo que has de modificar es lo que te marco en negrita en la función:

Turno: turnofecha([fechavirtual];"M,M,M,M,M,M,M,T,T,T,T,T,T,T,N,N,N,N,N,N,N,L,L,L,L,L,L,L";CFecha("03-09-2018");[grupo]-1)

Ahí tendrás que poner el desplazamiento de cada trabajador (0 para el del primer turno, 6 para el del segundo, y así sucesivamente)

Obviamente si no tienes un campo grupo como en el ejemplo de Chea, tendrás que buscar otra forma de indicar ese desplazamiento...

Gracias Sveinbjorn,

Me contesto yo también ya que era una tontería lo que me faltaba y seguro que a alguno más le pasó igual:

Turno: fturnofecha([fechavirtual];"M,M,M,M,M,M,M,T,T,T,T,T,T,T,N,N,N,N,N,N,N,L,L,L,L,L,L,L";CFecha("03-09-2018");[GRUPO])

La clave está en el campo grupo: En ese campo tienes que indicarle el número de días de desplazamiento de cada grupo de trabajadores (era lo que no me aclaraba yo). Por lo tanto a los trabajadores que empiecen según la cadencia se les pone 0, si tienes un trabajador que empieza a los 7 días (tardes) le pones -7, si otro empieza a los 14 días (noches) pones  -14 y así sucesivamente. 

El funcionamiento de ese parámetro (y del campo grupo) no funciona exactamente así, pero si a tu te sirve así como lo has puesto, ¡Perfecto!

Pues a mí así me funciona perfectamente.

Por cierto un apunte para los que leáis esto poder hacer un filtrado en el campo fechaVirtual la fecha hay que convertirla a una variable de tipo fecha con CVFECHA, sino no funciona el filtro, por lo menos a mí no me funcionaba. Lo hice de la siguiente forma (por algo estaba así en el ejemplo, yo no sabía ni que era CVFECHA): 

Entre CVFecha([Teclea fecha mínima]) Y CVFecha([Teclea fecha máxima])

Respuesta
1

Andrés: No lo he probado porque endría que reproducirlo todo, pero yo pondría >>

Turno: FTurnoFecha([FechaVirtual];"M,M,M,M,M,M,M,T,T,T,T,T,T,T,N,N,N,N,N,N,N,L,L,L,L,L,L,L";CFecha("03-09-18");([Grupo]-1)*21)

Mis saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas