Power Query Formule power query qui renvoie une erreur

Menibelus

XLDnaute Nouveau
Bonjour,

J'ai besoin d'aide pour une formule dans power query.
Voici ma formule :
PowerQuery:
if
    (Date.Day([Fin Intervention]) <= Date.Day([Début Intervention]) and
    Time.From([Début Intervention]) < 1/24 * 19)
then
    Time.From([Fin Intervention]) - 1/24 * 19
else if
    Time.From([Début Intervention]) < 1/24 * 7
then
    1/24 * 7 - Time.From([Début Intervention])
else
    if Date.Day([Fin Intervention]) > Date.Day([Début Intervention])
    then [Fin Intervention] - (Date.From([Début Intervention]) + 1/24 * 19)
    else null
L'éditeur ne me renvoie aucune erreur, par contre quand je regarde dans ma colonne, j'ai ce message : Expression:Error : la valeur Date doit contenir le composant Date. Détails : 15/09/2023 21:54
Sachant que mes colonnes [Début Intervention] et [Fin Intervention] sont au format Date/Time

Merci
 
Solution
Bonjour Menibelus, merinos, le forum,

Ci-dessous un essai :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    TypesModifiés = Table.TransformColumnTypes(Source,{{"Début Intervention", type datetime}, {"Fin Intervention", type datetime}}),
    AjoutColonneDépassement = Table.AddColumn(TypesModifiés, "Dépassement", each 
        let 
            interventionPeriod = [From=[Début Intervention], To=[Fin Intervention]],
            fnIntersect = (P1 as record, P2 as record) as duration => List.Max({#duration(0,0,0,0), List.Min({P1[To], P2[To]})-List.Max({P1[From], P2[From]})}), 
            daysList = {Number.From(Date.From([Début Intervention])) .. Number.From(Date.From([Fin Intervention]))}, 
            periodsList = List.Combine(List.Transform(daysList, each...

merinos

XLDnaute Accro
Bonjour Menibelus,

1/24 * 7 - Time.From([Début Intervention])
[Fin Intervention] - (Date.From([Début Intervention]) + 1/24 * 19)

C'est une date ça? une heure?

Tu dois savoir ce que te rends ta formule. Le plus facile est souvent de convertir d'abord en nombres... puis effectuer les opérations ... et éventuellement convertir de nouveau en heures

Sans fichier simplifié, difficile de chercher plus loin.



Merinos
 

mromain

XLDnaute Barbatruc
Bonjour Menibelus, merinos, le forum,

L'erreur renvoyée par PowerQuery est la suivante :
Code:
Expression.Error : Désolé... Nous n'avons pas pu appliquer l'opérateur < aux types Number et Time.
Détails :
    Operator=<
    Left=0,791666667
    Right=18:32:00

Il s'agit donc d'erreur de conversion de types.

En découpant ta formule, on peut voir plusieurs erreurs :

  • tu fait cette comparaison : Time.From([Début Intervention]) < 1/24 * 19 > à remplacer par Time.From([Début Intervention]) < Time.From(1/24 * 19)
  • tu fait ce calcul : Time.From([Fin Intervention]) - 1/24 * 19 > à remplacer par Time.From([Fin Intervention]) - Time.From(1/24 * 19)
  • tu fait cette comparaison : Time.From([Début Intervention]) < 1/24 * 7 > à remplacer par Time.From([Début Intervention]) < Time.From(1/24 * 7)
  • tu fait ce calcul : 1/24 * 7 - Time.From([Début Intervention]) > à remplacer par Time.From(1/24 * 7) - Time.From([Début Intervention])
  • tu fait ce calcul : [Fin Intervention] - (Date.From([Début Intervention]) + 1/24 * 19) > à remplacer par DateTime.From([Fin Intervention]) - (DateTime.From([Début Intervention]) + Duration.From(1/24 * 19))

Il est à noter que certains calculs peuvent potentiellement renvoyer des durées négatives...
Si besoin, explique clairement ce que tu souhaite pour pouvoir te proposer une syntaxe.

A+
 

Menibelus

XLDnaute Nouveau
Bonjour,

Je souhaite calculer automatiquement le temps des interventions qui se finissent après 19h et qui commence avant 7h.
Exemple : l'intervenons commence à 17h30 et finit à 20h30, il y a donc 1h30 de dépassement malgré une intervention de 3h

Merci
 

mromain

XLDnaute Barbatruc
Bonjour Menibelus, merinos, le forum,

Ci-dessous un essai :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    TypesModifiés = Table.TransformColumnTypes(Source,{{"Début Intervention", type datetime}, {"Fin Intervention", type datetime}}),
    AjoutColonneDépassement = Table.AddColumn(TypesModifiés, "Dépassement", each 
        let 
            interventionPeriod = [From=[Début Intervention], To=[Fin Intervention]],
            fnIntersect = (P1 as record, P2 as record) as duration => List.Max({#duration(0,0,0,0), List.Min({P1[To], P2[To]})-List.Max({P1[From], P2[From]})}), 
            daysList = {Number.From(Date.From([Début Intervention])) .. Number.From(Date.From([Fin Intervention]))}, 
            periodsList = List.Combine(List.Transform(daysList, each {[From=DateTime.From(_)+#duration(0,0,0,0), To=DateTime.From(_)+#duration(0,7,0,0)], [From=DateTime.From(_)+#duration(0,19,0,0), To=DateTime.From(_)+#duration(0,24,0,0)]})),
            intersectList = List.Transform(periodsList, each fnIntersect(interventionPeriod, _))
        in 
            List.Sum(intersectList), type duration)
in
    AjoutColonneDépassement

A+
 

Menibelus

XLDnaute Nouveau
Bonjour Menibelus, merinos, le forum,

Ci-dessous un essai :
PowerQuery:
let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    TypesModifiés = Table.TransformColumnTypes(Source,{{"Début Intervention", type datetime}, {"Fin Intervention", type datetime}}),
    AjoutColonneDépassement = Table.AddColumn(TypesModifiés, "Dépassement", each
        let
            interventionPeriod = [From=[Début Intervention], To=[Fin Intervention]],
            fnIntersect = (P1 as record, P2 as record) as duration => List.Max({#duration(0,0,0,0), List.Min({P1[To], P2[To]})-List.Max({P1[From], P2[From]})}),
            daysList = {Number.From(Date.From([Début Intervention])) .. Number.From(Date.From([Fin Intervention]))},
            periodsList = List.Combine(List.Transform(daysList, each {[From=DateTime.From(_)+#duration(0,0,0,0), To=DateTime.From(_)+#duration(0,7,0,0)], [From=DateTime.From(_)+#duration(0,19,0,0), To=DateTime.From(_)+#duration(0,24,0,0)]})),
            intersectList = List.Transform(periodsList, each fnIntersect(interventionPeriod, _))
        in
            List.Sum(intersectList), type duration)
in
    AjoutColonneDépassement

A+
Yes, merci beaucoup, cela fonctionne
 

Discussions similaires

Statistiques des forums

Discussions
312 209
Messages
2 086 274
Membres
103 168
dernier inscrit
isidore33