Generar una tabla de programación

Un usuario Pregunto ✅

KJinete

En una de mis fuentes de datos tengo una tabla de nómina. Para cada empleado tiene una fila para cada fecha que trabajó. Me gustaría construir algo para futuros trabajos reservados. Creo que tengo todos los componentes para construirlo, pero no estoy seguro de cómo armarlo. Creo que tiene algo que ver con las fórmulas de la tabla que aún no he logrado entender en mi cerebro, como RESUMEN y CALCULACIÓN, etc. Tal vez uno de ustedes pueda mostrarme el camino.

Este es el plan: no me importa qué días reales de la semana trabajará la gente. Solo los quiero marcados en todas las semanas en el rango de su trabajo programado. Entonces, donde la nómina muestra una fila para cada día de cada empleado y omite las fechas en las que no trabajaron, quiero una fila por semana por empleado (ver más abajo).

Por cierto, conozco varias formas de obtener un recuento de los empleados que trabajan por semana sin crear esta tabla adicional. Esta tabla es para otros fines.

La base para esto serán dos tablas:

1) mi DateTable estándar, que incluye, por supuesto, un continuo [Date] columna, así como una [Week] columna (que es la fecha del último día de la semana para cada [Date]), y

2) una tabla BookedWork, que incluye [EmployeeID], [StartDate] y [EndDate].

Tabla de fechas:

Fecha Semana
29/5/2016 4/6/2016
30/5/2016 4/6/2016
31/5/2016 4/6/2016
01/06/2016 04/06/2016
02/06/2016 04/06/2016
03/06/2016 04/06/2016
04/06/2016 04/06/2016
05/06/2016 11/06/2016
6/6/2016 11/6/2016
7/6/2016 11/6/2016
08/06/2016 11/06/2016
09/06/2016 11/06/2016
10/06/2016 11/06/2016
11/06/2016 11/06/2016
12/06/2016 18/06/2016
13/06/2016 18/06/2016
14/06/2016 18/06/2016

…etc.

Trabajo reservado:

ID de empleado Fecha de inicio Fecha de finalización
Emp0015 1/5/2016 4/6/2016
Emp0016 1/5/2016 4/6/2016
Emp0027 3/6/2016 9/7/2016
Emp0028 11/6/2016 1/8/2016
Emp0029 18/06/2016 10/08/2016

…etc.

Y esta es la salida deseada:

Horario de trabajo:

Id. de empleado de la semana
04/06/2016 Emp0015
04/06/2016 Emp0016
04/06/2016 Emp0027
6/11/2016 Emp0027
6/11/2016 Emp0028
18/06/2016 Emp0027
18/06/2016 Emp0028
18/06/2016 Emp0029

¿Algunas ideas?

Owen Auger

Hola,

Parece que desea crear esto como una tabla calculada DAX. Aquí hay una forma de hacerlo:

(Nota: supongo que no hay relación entre BookWork y DateTable; podría cambiar las cosas ligeramente si hay una relación).

WorkSchedule = 
SUMMARIZE (
    GENERATE (
        BookedWork,
        CALCULATETABLE (
            VALUES ( DateTable[Week] ),
            DATESBETWEEN ( DateTable[Date], BookedWork[StartDate], BookedWork[EndDate] )
        )
    ),
    DateTable[Week],
    BookedWork[EmployeeID]
)

Z4m

@OwenAuger Por favor, ayúdenme, intenté lograr lo mismo que la solución a continuación, pero recibo un error después de enviar el código DAX.
Recibo el error: «Una columna especificada en la llamada a la función ‘FECHAS ENTRE’ no es del tipo FECHA. Esto no es compatible»

Similar al ejemplo, tengo dos tablas, una llamada «Matchprofiles» y otra llamada «CALENDARIO»

Los perfiles de coincidencia contienen hrm_name (nombre del empleado) y fecha de inicio/fecha de finalización

Perfiles de coincidencia:

hrm_name Fecha de inicio Fecha de finalización Valor

emlp007 1-1-2016 10-1-2016 4

emlp008 1-1-2016 3-1-2016 5

CALENDARIO:
Fecha Número de semana Día de la semana

01-01-16 1 5
En lugar de usar la semana como el ejemplo, me gustaría mostrar la semana (número)

Horario de trabajo:

Valor de ID de empleado de la semana
1 emlp007 4
2 emlp007 4
1 emlp008 5

¿Podrías ayudarme? Todas las columnas que contienen una fecha son, de hecho, del tipo fecha. No hay ninguna relación hasta ahora entre estas tablas tal como se mencionó.
Además, necesito agregar el «valor» para cada semana (esto representa la cantidad de días en esa semana)

Mi código:
Horario de trabajo =
RESUMEN (
GENERAR (
Perfiles de coincidencia;
CALCULATETABLE ( MatchProfiles;
VALORES (‘CALENDARIO'[Date]);
FECHAS ENTRE (‘CALENDARIO'[WeekNumber]; Perfiles de coincidencia[hrm_StartDate];Coincidencia de perfiles[hrm_EndDate])
)
);
Perfiles de coincidencia[hrm_name]

También agregué un volcado de pantalla del error que obtuve al agregar el código DAX a la nueva definición de tabla
)PBIError.png

Owen Auger

En respuesta a Z4m

Hola @Z4m,

El motivo de ese error en particular es que ha pasado ‘CALENDARIO'[Weeknumber] como el primer argumento de FECHAS ENTRE, no ‘CALENDARIO'[Date].

Parece que se necesitan algunas correcciones, incluida esa:

  1. CALCULATETABLE no necesita Matchprofiles como primer argumento
  2. El primer argumento de CALCULATETABLE debe ser VALORES( ‘CALENDARIO'[Weeknumber] )
  3. El primer argumento de DATESBETWEEN debe ser la columna de fecha en sí, es decir, ‘CALENDARIO'[Date]
  4. Los argumentos finales de SUMMARIZE deben ser todas las columnas que desea resumir, por lo que debe agregar ‘CALENDARIO'[Weeknumber] y MatchProfiles[Value]

No estaba del todo seguro de cómo interpretar Matchprofiles[Value] pero asumí que solo desea que esto se incluya en la tabla de resumen.

El código corregido debería verse así (sin preocuparse por los nombres de las columnas en WorkSchedule):

WorkSchedule =
SUMMARIZE (
    GENERATE (
        MatchProfiles;
        CALCULATETABLE (
            VALUES ( 'CALENDAR'[Weeknumber] );
            DATESBETWEEN (
                'CALENDAR'[Date];
                MatchProfiles[hrm_StartDate];
                MatchProfiles[hrm_EndDate]
            )
        )
    );
    'CALENDAR'[Weeknumber];
    MatchProfiles[hrm_name];
    MatchProfiles[Value]
)

Z4m

En respuesta a Owen Auger

Gracias de nuevo @OwenAuger por toda la ayuda. Intentaré actualizar mi solicitud como resuelta….

Z4m

En respuesta a Owen Auger

Estimado @OwenAuger,

Gracias por su respuesta, inmediatamente agregué el código y verifiqué si hay una columna mal escrita.
Desafortunadamente, ahora tengo un mensaje de error diferente que dice; «Se encontró una representación numérica no válida de un valor de fecha»
Después de buscar en diferentes foros, encontré algunas publicaciones con personas que tenían los mismos problemas.
En algunos casos, la solución fue descartar cualquier formato de fecha no válido en las filas.
Ahora revisé ambas tablas en busca de problemas e incluso filtré la tabla para asegurarme de que no haya problemas, pero sigo recibiendo el mensaje.
Intenté enviarte directamente un mensaje sobre este error porque soy un poco nuevo y no quiero llenar este hilo con lo que ‘parece’ ser un problema de principiantes…
¿Es posible enviarle mi archivo pbx para que pueda ver qué estoy haciendo mal?

Owen Auger

Hola,

Parece que desea crear esto como una tabla calculada DAX. Aquí hay una forma de hacerlo:

(Nota: supongo que no hay relación entre BookWork y DateTable; podría cambiar las cosas ligeramente si hay una relación).

WorkSchedule = 
SUMMARIZE (
    GENERATE (
        BookedWork,
        CALCULATETABLE (
            VALUES ( DateTable[Week] ),
            DATESBETWEEN ( DateTable[Date], BookedWork[StartDate], BookedWork[EndDate] )
        )
    ),
    DateTable[Week],
    BookedWork[EmployeeID]
)

KJinete

En respuesta a Owen Auger

Eso parece funcionar perfectamente. Ahora, siéntese y trate de entender exactamente qué hace cada paso en ese código. Tengo problemas con esas funciones porque siento que hay algunos pasos intermedios invisibles que no puedo visualizar correctamente.

Owen Auger

En respuesta a KJinete

Está bien 🙂
Con este tipo de fórmulas, las crearía de adentro hacia afuera, ya sea en DAX Studio o simplemente en Power BI Desktop, con un conjunto de datos reducido para ver qué sucede.

En este caso, la secuencia que pasé fue:

1. Agregue las fechas entre StartDate y EndDate a la tabla BookedWork (repitiendo cada fila de BookedWork para cada fecha)

= GENERATE (
        BookedWork,
        DATESBETWEEN ( DateTable[Date], BookedWork[StartDate], BookedWork[EndDate] )
)

2. Cambia esas fechas a semanas en su lugar

 =   GENERATE (
        BookedWork,
        CALCULATETABLE (
            VALUES ( DateTable[Week] ),
            DATESBETWEEN ( DateTable[Date], BookedWork[StartDate], BookedWork[EndDate] )
        )
    )

3. Cree una tabla de resumen con solo semanas y empleados:

= SUMMARIZE (
    GENERATE (
        BookedWork,
        CALCULATETABLE (
            VALUES ( DateTable[Week] ),
            DATESBETWEEN ( DateTable[Date], BookedWork[StartDate], BookedWork[EndDate] )
        )
    ),
    DateTable[Week],
    BookedWork[EmployeeID]
)

KJinete

En respuesta a Owen Auger

Creo que es ese primer paso que estaba teniendo problemas para imaginar. Así que déjame intentar reformular tu explicación para ver si entiendo.

Si pudiera ver el resultado de esa primera versión de GENERATE() declaración, se vería como mi tabla BookedWork existente, excepto que cada fila con una fecha de inicio y finalización se repetiría varias veces, una vez para cada fecha entre la fecha de inicio y finalización? ¿Y supongo que se agregaría una nueva columna de Fecha que tiene esas fechas? En otras palabras, después del paso 1, ya tiene la misma estructura básica que el resultado final deseado, excepto que todavía tiene todas las demás columnas de BookedWork y las filas están por fecha en lugar de por semana. ¿Correcto?

Entonces, el paso 2 reduce esas filas de fechas a semanas, y el paso 3 reduce las columnas a solo semana e ID de empleado. ¿Estoy en el camino correcto?

sean

En respuesta a KJinete

@KHorseman como @OwenAuger dijo que puedes ver cada paso con => https://daxstudio.codeplex.com/

Aquí están los pasos copiados de Dax Studio y ordenados en Excel

Generar tabla de horarios.png

KJinete

En respuesta a sean

Al igual que GENERATE(), Dax Studio es otra cosa que aún no he aprendido a usar. 😛 Pero gracias por el desglose @Sean. Eso ayuda.

Simplemente me gusta hablar conceptualmente para poder obtener un mejor modelo mental de lo que sucede cuando quiero usar la misma función para un caso de uso completamente diferente. He generalizado lo que, por ejemplo, FILTER(ALL(…) significa lo suficientemente bien como para que siempre pueda imaginar lo que está haciendo en la fórmula de cualquier persona, pero todavía hay algunas de estas funciones de devolución de tablas que tampoco puedo imaginar. .

sean

En respuesta a KJinete

@KHorseman Sí, definitivamente me gusta hacer lo mismo: tómate mi tiempo para desglosar y ver todos los pasos también.

Estaba buscando información sobre GENERATE( ) y encontré esto…

http://www.powerpivotpro.com/2012/09/gantt-reworked-with-addcolumns-filter-generate-and-summarize/

Todavía no he tenido tiempo de explorarlo, pero pensé que tal vez quieras verlo también.

También hay una imagen personalizada de Gantt (en mi lista)

https://app.powerbi.com/visuals/show/Gantt1448688115699

De todos modos, como siempre, una gran solución de @OwenAuger

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *