domingo, 6 de noviembre de 2011

Elaborar un calendario con turnos

Tomemos una tabla de empleados, con indicación de a qué grupo pertenecen
EmpleadosTurnos
IdEmpleadoGrupo
1Pedro1
2Andrés1
3Jaime1
4Juan2
5Felipe2
6Bartolomé2
7Tomás3
8Mateo3
9Santiago3
10Judas4
11Simón4
13Matías4
Aunque el último ID sea 13, se trata de 12 empleados, pues despidieron a uno por conducta desleal. Están organizados en 4 grupos cada uno de los cuales se inicia al día siguiente del grupo anterior. Vamos a crear el calendario correspondiente a octubre del 2010 utilizando una consulta.
Sabemos que si disponemos de una tabla Numeros poblada de numeros consecutivos empezando por el 1, podemos obtener una secuencia de fechas a base de sumar una FechaInicial menos uno al campo Numero. Este truco y el de no relacionar tablas para que el resultado sea un producto cartesiano lo vamos a utilizar en la siguiente consulta.


image

El texto SQL es el siguiente:

SELECT EmpleadosTurnos.Empleado, [Numero]+CDate("01-10-10")-1 AS FechaVirtual, EmpleadosTurnos.Grupo, fturnofecha([fechavirtual],"Mañana,Tarde,Noche, Libre",CDate("04-01-07"),[Grupo]-1) AS Turno
FROM Numeros, EmpleadosTurnos
WHERE ((([Numero]+CDate("01-10-10")-1)<=CVDate("31-10-10")))
ORDER BY EmpleadosTurnos.Empleado, [Numero]+CDate("01-10-10")-1;

Y el resultado, resumiendo, porque serían 372 filas, mostraría algo parecido a lo siguiente completado hasta mostrar todos los empleados con todas las fechas de octubre del 2010 y el turno de cada fecha

qTurnosVirtuales
EmpleadoFechaVirtualGrupoTurno
Andrés01/10/101Noche
Andrés02/10/101Libre
Andrés03/10/101Mañana
Andrés04/10/101Tarde
Andrés05/10/101Noche
Andrés06/10/101Libre
Andrés07/10/101Mañana
Andrés08/10/101Tarde
Andrés09/10/101Noche
Andrés10/10/101Libre
Andrés27/10/101Mañana
Andrés28/10/101Tarde
Andrés29/10/101Noche
Andrés30/10/101Libre
Andrés31/10/101Mañana
Bartolomé01/10/102Tarde
Bartolomé02/10/102Noche
Bartolomé03/10/102Libre
Bartolomé04/10/102Mañana
Bartolomé05/10/102Tarde
Bartolomé06/10/102Noche
Bartolomé07/10/102Libre
..

La consulta la podemos personalizar para pasarle las fechas inicial y final del periodo como parámetros y también podemos tomarla como puento de partida para una consulta de datos anexado o de actualización que para cada día del año y cada empleado deje anotado el turno de trabajo. Aunque no es necesario volcar los datos en una tabla, pues podemos utilizar la consulta con cualquier periodo de fechas, si resulta muy conveniente, pues además de los distintos turnos pueden darse otras situaciones, como bajas, vacaciones, cambios de turno que hacen necesario trabajar con datos guardados.
A menudo se pretende realizar una planilla que refleje los trabajadores que entran en cada turno cada día, utilizando los días como encabezado de columna.


qTurnosVirtuales_Tabla de referencias cruzadas
EmpleadoGrupo01/10/1002/10/1025/10/1026/10/1027/10/1028/10/1029/10/1030/10/1031/10/10
Andrés1NocheLibreNocheLibreMañanaTardeNocheLibreMañana
Jaime1NocheLibreNocheLibreMañanaTardeNocheLibreMañana
Pedro1NocheLibreNocheLibreMañanaTardeNocheLibreMañana
Bartolomé2TardeNocheTardeNocheLibreMañanaTardeNocheLibre
Felipe2TardeNocheTardeNocheLibreMañanaTardeNocheLibre
Juan2TardeNocheTardeNocheLibreMañanaTardeNocheLibre
Mateo3MañanaTardeMañanaTardeNocheLibreMañanaTardeNoche
Santiago3MañanaTardeMañanaTardeNocheLibreMañanaTardeNoche
Tomás3MañanaTardeMañanaTardeNocheLibreMañanaTardeNoche
Judas4LibreMañanaLibreMañanaTardeNocheLibreMañanaTarde
Matías4LibreMañanaLibreMañanaTardeNocheLibreMañanaTarde
Simón4LibreMañanaLibreMañanaTardeNocheLibreMañanaTarde

Evidentemente es fácil de hacer con una consulta de referencias cruzadas.

image

El texto SQL sería:
TRANSFORM First(qTurnosVirtuales.Turno) AS PrimeroDeTurno
SELECT qTurnosVirtuales.Empleado, qTurnosVirtuales.Grupo
FROM qTurnosVirtuales
GROUP BY qTurnosVirtuales.Empleado, qTurnosVirtuales.Grupo
ORDER BY qTurnosVirtuales.Grupo
PIVOT qTurnosVirtuales.FechaVirtual;

Si nuestra consulta de referencias cruzadas la convertimos en un informe y usamos formato condicional, el resultado es la mar de vistoso (o la mar de hortera, según gustos). En el ejemplo le hemos quitado columnas para que nos quepa bien en la página.
image

En fin, se trata de una serie de ideas que pueden servir a alguien que debe plantearse la gestión de turnos de trabajo, pero no pretende ser ni “la solución” ni la forma canónica de plantearlo.

No hay comentarios:

Publicar un comentario