Tomemos una tabla de empleados, con indicación de a qué grupo pertenecen
Id | Empleado | Grupo |
---|---|---|
1 | Pedro | 1 |
2 | Andrés | 1 |
3 | Jaime | 1 |
4 | Juan | 2 |
5 | Felipe | 2 |
6 | Bartolomé | 2 |
7 | Tomás | 3 |
8 | Mateo | 3 |
9 | Santiago | 3 |
10 | Judas | 4 |
11 | Simón | 4 |
13 | Matías | 4 |
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.
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
Empleado | FechaVirtual | Grupo | Turno |
---|---|---|---|
Andrés | 01/10/10 | 1 | Noche |
Andrés | 02/10/10 | 1 | Libre |
Andrés | 03/10/10 | 1 | Mañana |
Andrés | 04/10/10 | 1 | Tarde |
Andrés | 05/10/10 | 1 | Noche |
Andrés | 06/10/10 | 1 | Libre |
Andrés | 07/10/10 | 1 | Mañana |
Andrés | 08/10/10 | 1 | Tarde |
Andrés | 09/10/10 | 1 | Noche |
Andrés | 10/10/10 | 1 | Libre |
… | … | … | … |
Andrés | 27/10/10 | 1 | Mañana |
Andrés | 28/10/10 | 1 | Tarde |
Andrés | 29/10/10 | 1 | Noche |
Andrés | 30/10/10 | 1 | Libre |
Andrés | 31/10/10 | 1 | Mañana |
Bartolomé | 01/10/10 | 2 | Tarde |
Bartolomé | 02/10/10 | 2 | Noche |
Bartolomé | 03/10/10 | 2 | Libre |
Bartolomé | 04/10/10 | 2 | Mañana |
Bartolomé | 05/10/10 | 2 | Tarde |
Bartolomé | 06/10/10 | 2 | Noche |
Bartolomé | 07/10/10 | 2 | Libre |
… | … | … | .. |
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.
Empleado | Grupo | 01/10/10 | 02/10/10 | … | 25/10/10 | 26/10/10 | 27/10/10 | 28/10/10 | 29/10/10 | 30/10/10 | 31/10/10 |
---|---|---|---|---|---|---|---|---|---|---|---|
Andrés | 1 | Noche | Libre | … | Noche | Libre | Mañana | Tarde | Noche | Libre | Mañana |
Jaime | 1 | Noche | Libre | … | Noche | Libre | Mañana | Tarde | Noche | Libre | Mañana |
Pedro | 1 | Noche | Libre | … | Noche | Libre | Mañana | Tarde | Noche | Libre | Mañana |
Bartolomé | 2 | Tarde | Noche | … | Tarde | Noche | Libre | Mañana | Tarde | Noche | Libre |
Felipe | 2 | Tarde | Noche | … | Tarde | Noche | Libre | Mañana | Tarde | Noche | Libre |
Juan | 2 | Tarde | Noche | … | Tarde | Noche | Libre | Mañana | Tarde | Noche | Libre |
Mateo | 3 | Mañana | Tarde | … | Mañana | Tarde | Noche | Libre | Mañana | Tarde | Noche |
Santiago | 3 | Mañana | Tarde | … | Mañana | Tarde | Noche | Libre | Mañana | Tarde | Noche |
Tomás | 3 | Mañana | Tarde | … | Mañana | Tarde | Noche | Libre | Mañana | Tarde | Noche |
Judas | 4 | Libre | Mañana | … | Libre | Mañana | Tarde | Noche | Libre | Mañana | Tarde |
Matías | 4 | Libre | Mañana | … | Libre | Mañana | Tarde | Noche | Libre | Mañana | Tarde |
Simón | 4 | Libre | Mañana | … | Libre | Mañana | Tarde | Noche | Libre | Mañana | Tarde |
Evidentemente es fácil de hacer con una consulta de referencias cruzadas.
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.
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