Power Query - Analyse plage méridienne pointage

Bonjour @ tous
Une problématique que je souhaite traiter avec Power Query que j’utilise déjà pour d’autres rapports.

La problématique est la suivante, j’ai un rapport (mensuel) en pièce jointe qui me donne les pointages des collaborateurs par jour, selon la journée type (colonne E) le nombre de pointage peut être différent.

Ce que je veut faire :

  • ne garder que les collaborateurs qui ont 4 pointages par jour;
  • pour ces derniers, ne garder que les pointages méridiens (donc deux pointages);
  • calculer le temps entre ces deux pointages.

Le but étant de voir le temps de pause méridienne des collaborateurs par jour.

Merci de votre aide.
Fabien

rapport - copie forum.csv (2,9 Mo)

Bonjour,
Hello Fabien (après une escapade au Tara-Inn)…
Avec ce code, (Source à modifier), je regroupe selon le collaborateur/Date/Type, puis filtre sur 4 pointages.
J’ajoute une colonne « Record », afin d’extraire l’heure de début de pause, de fin, et calcule la durée.
Lors de la restitution sur un onglet, il vaut mieux mettre le format de la colonne « Durée » en [h]:mm
Voici le code :

let
    Source = Csv.Document(File.Contents("D:\d\fabien\pointage\rapport.csv"),[Delimiter=";", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    PromoHead = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    ModType = Table.TransformColumnTypes(PromoHead,{{"Date de pointage", type date}, {"Heure Pointage Forcée", type time}}),
    GroupBy = Table.Group(ModType, {"Matricule", "Date de pointage", "Journée type"}, {{"Nombre", each Table.RowCount(_), Int64.Type}, {"Tbl", each _, type table [Matricule=nullable text, Nom=nullable text, #"Prénom "=nullable text, Date de pointage=nullable date, Journée type=nullable text, Heure Pointage Forcée=nullable time, Sens=nullable text]}}),
    Filtre4Pointages = Table.SelectRows(GroupBy, each ([Nombre] = 4)),
    AjoutRecord = Table.AddColumn(Filtre4Pointages, "Rec", each [Debut =[Tbl][#"Heure Pointage Forcée"]{1}, Fin = [Tbl][#"Heure Pointage Forcée"]{2}, Durée = Fin-Debut]),
    ExpandRecord = Table.ExpandRecordColumn(AjoutRecord, "Rec", {"Debut", "Fin", "Durée"}, {"Debut", "Fin", "Durée"}),
    TypeTime = Table.TransformColumnTypes(ExpandRecord,{{"Debut", type time}, {"Fin", type time}, {"Durée", type duration}})
in
    TypeTime

Si tu n’y arrives pas, tu dis.
Bonne fin de journée, et bon « petit » W-E

Re-,
A noter un petit souci avec le collaborateur A14503, à la date du 26/03/2025

Hey :wink:
Salut Hubert, (bien reçu ton mail :-))
Faut que je revienne faire un tour au Tara-Inn :+1:

Merci pour la proposition, je vais essayer de suite…
Je vais regarder aussi le A14503
@ bientôt
Fabien

Re-,
A priori, l’extraction a effectué un mauvais tri.
Prend ce code, pour compenser :

let
    Source = Csv.Document(File.Contents("D:\d\fabien\pointage\rapport.csv"),[Delimiter=";", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    PromoHead = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    ModType = Table.TransformColumnTypes(PromoHead,{{"Date de pointage", type date}, {"Heure Pointage Forcée", type time}}),
    GroupBy = Table.Group(ModType, {"Matricule", "Date de pointage", "Journée type"}, {{"Nombre", each Table.RowCount(_), Int64.Type}, {"Tbl", each Table.Sort(_,{{"Heure Pointage Forcée", Order.Ascending}}), type table}}),
    Filtre4Pointages = Table.SelectRows(GroupBy, each ([Nombre] = 4)),
    AjoutRecord = Table.AddColumn(Filtre4Pointages, "Rec", each [Debut =[Tbl][#"Heure Pointage Forcée"]{1}, Fin = [Tbl][#"Heure Pointage Forcée"]{2}, Durée = Fin-Debut]),
    ExpandRecord = Table.ExpandRecordColumn(AjoutRecord, "Rec", {"Debut", "Fin", "Durée"}, {"Debut", "Fin", "Durée"}),
    TypeTime = Table.TransformColumnTypes(ExpandRecord,{{"Debut", type time}, {"Fin", type time}, {"Durée", type duration}})
in
    TypeTime

Faut que je regarde y’a des incohérences… Mais ça ne vient pas du résultat.
Exemple le A61889 le 04/03/2025 le résultat donne 04:45:00
Sur mon rapport de base le dit A61889 et le 04/03/2025 a bien pointé 4 fois mais à :

  • 07:36
  • 07:41
  • 12:26
  • 16:30

Ce n’est pas normal et l’intéressé doit avoir posé une nature d’heure, ça c’est ma sauce.

Il faudrait donc que je ne garde par collaborateurs que les deux pointages compris entre 11:00 et 14:00 pour être bien

Et on va filtrer dès le début en gardant uniquement les profils : LHV1 et LHV2
Les autres sont des profils postés ou atypiques (comme dit l’autre Plaza)

Re-,
Je pense que ce filtrage, tu dois savoir le faire… :innocent:
Pour les conditions 11:00 <= Miam <= 14:00, je vais modifier le code dans l’étape « Rec »

Re-,
Je vois le A07286, avec un départ à 10H49, et un retour à 12H42 le 07/03, donc la borne « 11:00:00 », à modifier en « 10:30:00 », par exemple?

Re-,
J’ai mis les bornes entre 10:00:00 et 15:00:00.
17 anomalies remontent avec ce code (colonne « Durée » (vides))

let
    Source = Csv.Document(File.Contents("D:\d\fabien\pointage\rapport.csv"),[Delimiter=";", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    PromoHead = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    FiltreType = Table.SelectRows(PromoHead, each ([Journée type] = "LHV1" or [Journée type] = "LHV2")),
    ModType = Table.TransformColumnTypes(FiltreType,{{"Date de pointage", type date}, {"Heure Pointage Forcée", type time}}),
    GroupBy = Table.Group(ModType, {"Matricule", "Date de pointage", "Journée type"}, {{"Nombre", each Table.RowCount(_), Int64.Type}, {"Tbl", each Table.Sort(_,{{"Heure Pointage Forcée", Order.Ascending}}), type table}}),
    Filtre4Pointages = Table.SelectRows(GroupBy, each ([Nombre] = 4)),
    AjoutRecord = Table.AddColumn(Filtre4Pointages, "Rec", each [Deb =[Tbl][#"Heure Pointage Forcée"]{1}, Debut = if Deb>=#time(10,0,0) then Deb else null,  HFin = [Tbl][#"Heure Pointage Forcée"]{2}, Fin = if HFin <= #time(15,0,0) then HFin else null, Durée = Fin-Debut]),
    ExpandRecord = Table.ExpandRecordColumn(AjoutRecord, "Rec", {"Debut", "Fin", "Durée"}, {"Debut", "Fin", "Durée"}),
    TypeTime = Table.TransformColumnTypes(ExpandRecord,{{"Debut", type time}, {"Fin", type time}, {"Durée", type duration}})
in
    TypeTime

Hello Hub…
Parfait comme toujours :+1: