POWER QUERY: Soustraire une semaine à la colonne semaine suivant conditions

Bonjour tout le monde,

J'ai besoin de vous sur le codage d'une étape dans ma requête.

J'ai une colonne nommée "TFA" de type Date/Heure et une colonne "Semaine" (S01, S02...) de type n'importe lequel.

Je souhaite que lorsque ma date est un lundi et est >= 0h et < 5h soustraire un numéro de semaine à la colonne "Semaine".

Pour cela j'ai utilisé la fonction "Table.TransformColumns", dans laquelle j'ai défini les paramètres, conditions et utilisé ensuite un IF.

J'obtiens le message d'erreur suivant :

Expression.Error : Désolé... Nous n'avons pas pu appliquer l'accès au champ au type Text.
Détails :
Value=S11
Key=TFA

Je vous partage le fichier avec la requête ainsi que le fichier source.
Merci pour votre temps, au plaisir d'échanger

Bonjour à tous !

Je vous propose de remplacer (et surtout tester....) le code de votre étape "SoustractSemaine" par :

= Table.ReplaceValue(SéparerAnnéeSemaine,each [Semaine],each
                let 
                    sem = [Semaine],
                    h = Time.Hour([TFA]),
                    w = Date.DayOfWeek([TFA])
                in if ((w = 1) and (h >= 0) and (h < 5)) then "S" & Text.From(Number.From(Text.Remove(sem,"S"))-1) else sem,
                Replacer.ReplaceText,
                {"Semaine"}
                ),

Merci pour le retour

J'ai essayé mais je n'obtiens pas de résultat, et je ne comprends pas le message d'erreur (première fois que je le vois)...

image

Par ailleurs j'ai du mal à comprendre les deux dernières lignes

Replacer.ReplaceText,
{"Semaine"}
),

Bonjour à tous de nouveau !

Si c'est la dernière étape, il y a lieu de supprimer la virgule après la parenthèse.

Concernant la compréhension de la syntaxe de la fonction Table.ReplaceValue, les deux dernières lignes correspondent à la fonction de remplacement et au nom du champ visé par le remplacement.

Un peu de lecture ici !

Merci bien JFL !

J'ai seulement ajusté la valeur w de lundi à 0 pour que ça fonctionne. Je pensais que le 0 était dimanche d'après mes recherches.

Bonne journée

Bonjour à tous !

Bien....

La fonction Date.DayOfWeek admet un deuxième argument pour affiner le résultat ----> firstDayOfWeek (une valeur Day indiquant le jour qui doit être considéré comme le premier jour de la semaine. Les valeurs autorisées sont Day.Sunday, Day.Monday, Day.Tuesday, Day.Wednesday, Day.Thursday, Day.Friday ou Day.Saturday. Si elle n’est pas spécifiée, une valeur par défaut est utilisée qui dépend de la cultur).

Je vous remercie de ce retour.

Je reviens de nouveau,

Je viens de me rendre compte que mon échantillon de valeur masque un problème.
Lorsque j'ai créé ma colonne "Semaine" initialement j'ai intégré un 0 après le "S" pour toutes les semaines entre 1 et 9.

J'ai donc essayé d'ajuster votre code pour passer du "S9" à "S09" mais sans résultat.

= Table.ReplaceValue(SéparerAnnéeSemaine,each [Semaine],each
                let 
                    sem = [Semaine],
                    NumSem = Number.FromText(Text.Middle([Semaine], 1)),
                    h = Time.Hour([TFA]),
                    w = Date.DayOfWeek([TFA], Day.Monday)
                in if ((w = 0) and (h >= 0) and (h < 5) and (NumSem > 0) and (NumSem < 10)) then "S0" & Text.From(Number.From(Text.Remove(sem,"S"))-1) 
                else if ((w = 0) and (h >= 0) and (h < 5) and (NumSem >= 10)) then "S" & Text.From(Number.From(Text.Remove(sem,"S"))-1) 
                   else sem,
                Replacer.ReplaceText,
                {"Semaine"}
                )

Hello,

Pas besoin de faire une condition si le numéro de semaine est inférieur à 10. Utilise la fonction Text.PadStart. Ca donnerait un truc du genre

= Table.ReplaceValue(SéparerAnnéeSemaine,each [Semaine],each
                let 
                    sem = [Semaine],
                    NumSem = Number.FromText(Text.Middle([Semaine], 1)),
                    h = Time.Hour([TFA]),
                    w = Date.DayOfWeek([TFA], Day.Monday)
                in if ((w = 0) and (h >= 0) and (h < 5) and (NumSem > 0) and (NumSem < 10)) then "S" & Text.PadStart(Text.From(Number.From(Text.Remove(sem,"S"))-1),2,"0")

                   else sem,
                Replacer.ReplaceText,
                {"Semaine"}
                )

@+

Salut,

J'ai essayé la méthode mais ça n'applique aucune transformation. Et je ne comprends pas pourquoi retirer la condition > 10, ne risque-t-on pas d'avoir par exemple S010 sinon ?

Ma méthode te donne la même chose que ce tu as fait.

Cette fonction permet de : si ton numéro de semaine c'est 9 et bien il va mettre 09 pour arriver à une chaîne de deux chiffres.

Si c'est 12, il ne mettra pas de 0 devant car la chaîne de caractère contient déjà deux chiffres.

Je t'invite à regarder la documentation sur cette fonction

@+

Bonjour à tous !

La caractère confus (multiples étapes inutiles) de votre requête ne facile pas les choses.

Il serait judicieux de joindre un jeu de données complet afin que des tests puissent être effectués.

Voir la fonction Number.ToText qui permet de formater des valeurs numériques.

@BAROUTE78

Ok je te remercie j'ai compris.

@JFL

Vous voulez dire que l'on peut grouper certaines étapes (je le comprends) ou bien que l'on peut supprimer certaines étapes (je ne vois pas lesquelles).

J'expérimente encore (pas assez compétent aussi), du coup je privilégie plus d'étapes pour visualiser au fur et à mesure les transformations et notamment ajuster dans le temps.

Cas de figure pour semaine S09 :

1420230227-apfs09.zip (820.56 Ko)

C'est bon résolu.

Merci à vous deux et désolé pour le temps perdu

Bonne fin de journée

Bonjour à tous !

Bien !

Je vous remercie de ce retour.

Rechercher des sujets similaires à "power query soustraire semaine colonne suivant conditions"