Power query raccourcir code m

Bonsoir à tous,

J'aimerai si possible raccourcir le code M assez basique que j'ai réalisé, comment faire pour obtenir le même résultat sans passer par l'ajout de colonne conditionnelle et modifier directement dans les colonnes AFFECTATION 1 et AFFECTATION 2 les affectations à modifier ?

Je joins un fichier exemple,

Merci d'avance pour votre aide,

Cordialement,

15test-code-m.xlsx (19.00 Ko)

Bonsoir,

Remplaces ton ajout de colonne :

= Table.AddColumn(#"T_MODIF développé", "AFFECTION SOUHAITEE 1", each if[AFFECTATION 1 A MODIFIEE]=null then[AFFECTATION 1] else [AFFECTATION 1 A MODIFIEE])

par :

= Table.ReplaceValue(#"T_MODIF développé",null,each [AFFECTATION 1],Replacer.ReplaceValue,{"AFFECTATION 1 A MODIFIEE"})

A+

Bonsoir OOoiste,

Merci pour votre retour, c'est presque ça, je voudrais modifier la colonne

"AFFECTATION 1"

plutôt que la colonne

"AFFECTATION 1 A MODIFIEE"

est ce possible, de plus si on peut éviter la fusion et passer par une fonction (si ça ne ralentit pas pour autant le code) mais je ne sais pas si c'est possible également,

Merci d'avance,

Cordialement,

Hello,

Etant donné qu'il s'agit d'un remplacement de ligne, un petit filtre et le tour est joué

Une proposition

@+

15test-code-m.xlsx (19.55 Ko)

Bonjour à tous et à Baroute78,

Merci pour votre retour, c’est parfait, seulement désolé quand j’ai appliqué votre code sur mon réel projet, et je me suis rendu compte que j’avais oublié une donnée importante :

  • Je ne devrais que modifier l’affectation 1 alors que la table base comporte plus de colonnes

Encore désolé de ne pas avoir prévu dès le début un fichier représentatif,

Pour mieux comprendre ma nouvelle problématique, je joins le fichier correspondant,

Merci d’avance,

Cordialement,

13test-code-m.xlsx (19.54 Ko)

Bonsoir à tous,

Après des recherches sur le site, le lien ci dessous a permit de résoudre mon problème :

https://forum.excel-pratique.com/excel/powerquery-rechercher-remplacer-plusieurs-fois-sur-une-meme-l...

Je joins donc mon fichier avec la correction adéquate,

Merci à JFL pour sa contribution au lien partagé sur ce post.
11test-code-m.xlsx (19.82 Ko)

Bonsoir à tous !

Contribuer sans participer directement...la vie est belle n'est-ce pas ?

Vous pouvez même simplifier la requête :

let
    Source = Excel.CurrentWorkbook(){[Name="T_BASE"]}[Content],
    Type = Table.TransformColumnTypes(Source,{{"BASE", Int64.Type}, {"AFFECTATION 1", type text}, {"AFFECTATION 2", type text}}),
    ValRempl = Table.ReplaceValue(Type,
                each [AFFECTATION 1],
                each try T_MODIF{[BASE=[BASE]]}[AFFECTATION 1 A MODIFIEE] otherwise [AFFECTATION 1],
                Replacer.ReplaceText,{"AFFECTATION 1"})
in
    ValRempl

Hello JFL,

J'ai un peu de mal à comprendre la syntaxe suivante :

T_MODIF{[BASE=[BASE]]}[AFFECTATION 1 A MODIFIEE]
T_MODIF[AFFECTATION 1 A MODIFIEE] : permet de renvoyer la liste des éléments de la colonne [AFFECTATION 1 A MODIFIEE] de la requête T_MODIF
Par contre le {[BASE=[BASE]]} j'ai un peu plus de mal. Aurais tu un peu d'explications ?

Je te remercie d'avance

EDIT : Hum, smart, en fait on va dans la requête T_MODIF, on récupère l'enregistrement correspondant au record pour la ligne = au champ base de notre requête actuelle.

T_MODIF{0} renvoie le record correspondant à la première ligne de T_MODIF.

T_MODIF[BASE=101000] renvoie le record correspondant à la ligne de T_MODIF où dans le champ BASE, on a 101000 sinon renvoie une erreur

Donc T_MODIF[BASE=[BASE]] renvoie le record correspondant à la ligne de T_MODIF où dans le champ BASE, on a la valeur du champ BASE de notre requête actuelle sinon renvoie une erreur. D'où le fait que ce soit couplé avec le try otherwise

Compris

Du coup ce que je ne m'explique pas c'est que ça fonctionne comme ça :

let
    Source = Excel.CurrentWorkbook(){[Name="T_BASE"]}[Content],
    #"Valeur remplacée" = Table.ReplaceValue(Source,
                                                    each [AFFECTATION 1],
                                                    each T_MODIF{[BASE = [BASE]]}[AFFECTATION 1 A MODIFIEE],Replacer.ReplaceText,{"AFFECTATION 1"})
in
    #"Valeur remplacée"

Quand il y a une erreur il me met par défaut le AFFECTATION 1 sans avoir à effectuer le try otherwise

Le classeur ci-joint

13test-code-m-3.xlsx (19.49 Ko)

Bonjour à tous !

Compris

Une saine curiosité récompensée ! Tant mieux.

Concernant votre "Quand il y a une erreur il me met par défaut le AFFECTATION 1 sans avoir à effectuer le try otherwise", c'est effectivement un comportement bien singulier. Peut-être l'erreur inhibe-t-elle la fonction Table.ReplaceValue ?

Bonjour à vous,

Merci pour vos contributions et je n'aurais jamais pensé qu'on pouvait réduire à une seule étape ma demande !!!

J'ai tenté de comprendre mais j'avoue que c'est un peu au delà de mes connaissances actuelles !

Sur le fichier joint j'ai tenté de reproduire dans des requêtes pour voir les résultats renvoyés :

T_MODIF{0} renvoie le record correspondant à la première ligne de T_MODIF : ok

T_MODIF[BASE=101000] renvoie le record correspondant à la ligne de T_MODIF où dans le champ BASE, on a 101000 sinon renvoie une erreur : message d'erreur

Donc T_MODIF[BASE=[BASE]] renvoie le record correspondant à la ligne de T_MODIF où dans le champ BASE, on a la valeur du champ BASE de notre requête actuelle sinon renvoie une erreur. D'où le fait que ce soit couplé avec le try otherwise : message d'erreur

Je comprends très bien le résultat vu qu'il s'agit de ma demande , mais je n'aurais jamais su intervenir sur le code M comme vous l'avez si bien fait pour en arriver au résultat proposé

En décortiquant la fonction Table.ReplaceValue, je la résume ainsi :

 Table.ReplaceValue(étape précédente,"Valeur à rechercher","Remplacer par",Replacer.ReplaceText,{"Colonne à remplacer"})

La proposition de JFL combiné avec celle de Baroute 78 donne celle ci :

Table.ReplaceValue(Source,each [AFFECTATION 1],each T_MODIF{[BASE = [BASE]]}[AFFECTATION 1 A MODIFIEE],Replacer.ReplaceText,{"AFFECTATION 1"})
Valeur à rechercher :
each [AFFECTATION 1]

sélection de la colonne AFFECTATION 1, mais pourquoi lui met on des crochets ? c'est ainsi qu'on sélectionne la colonne ?

Remplacer par : 
each T_MODIF{[BASE = [BASE]]}[AFFECTATION 1 A MODIFIEE]

Pourriez vous m'expliquer également cette partie?,

Merci d'avance,

Cordialement,

11test-code-m-3.xlsx (27.02 Ko)

Bonjour à tous de nouveau !

 Table.ReplaceValue(étape précédente,"Valeur à rechercher","Remplacer par",Replacer.ReplaceText,{"Colonne à remplacer"})

La proposition de JFL combiné avec celle de Baroute 78 donne celle ci :

Table.ReplaceValue(Source,each [AFFECTATION 1],each T_MODIF{[BASE = [BASE]]}[AFFECTATION 1 A MODIFIEE],Replacer.ReplaceText,{"AFFECTATION 1"})
Valeur à rechercher :
each [AFFECTATION 1]

sélection de la colonne AFFECTATION 1, mais pourquoi lui met on des crochets ? c'est ainsi qu'on sélectionne la colonne ?

Remplacer par : 
each T_MODIF{[BASE = [BASE]]}[AFFECTATION 1 A MODIFIEE]

Pourriez vous m'expliquer également cette partie?,

Le "each [AFFECTATION 1]" fait effectivement référence au champ "AFFECTATION 1" et plus précisément à chaque élément de celui-ci.

Seconde partie de votre questionnement : Lecture, dans la table "T_MODIF", de l'enregistrement concernant le champ [BASE] recherché. L'élément retourné est un "record". Pour en extraire, la partie souhaitée, on utilise le nom du champ concerné, ici [AFFECTATION 1 A MODIFIEE].

Note : Cette syntaxe, très concise (ie sans le try....otherwise), est à utiliser avec prudence.

Bonjour JFL,

Merci pour votre retour,

Pourquoi à utiliser avec prudence?,

En fait la gestion de l'erreur possible c'est lorsqu'il ne trouve pas de correspondance avec BASE de la table T_MODIF et T_BASE?,

Dans mon projet perso ce ne sera pas possible, il y aura toujours une correspondance.

Cordialement,

Bonjour à tous de nouveau !

Pourquoi à utiliser avec prudence?,

En fait la gestion de l'erreur possible c'est lorsqu'il ne trouve pas de correspondance avec BASE de la table T_MODIF et T_BASE?,

Dans mon projet perso ce ne sera pas possible, il y aura toujours une correspondance.

Cordialement,

La prudence me semble de mise car l'erreur (code BASE non trouvé) "semble" entraîner un comportement très particulier de la fonction. Quelque chose m'échappe à ce stade.

Dans mon projet perso ce ne sera pas possible, il y aura toujours une correspondance.

Votre table T_MODIF reprend l'intégralité des codes BASE de la table T_BASE ? Ce n'est pas ce que vos classeurs exemples laissent entendre.

Bonjour JFL,

Votre table T_MODIF reprend l'intégralité des codes BASE de la table T_BASE ? Ce n'est pas ce que vos classeurs exemples laissent entendre.

Non effectivement , mais en quoi cela poserai un éventuel problème ?

Cordialement,

Hello JFL,

Concernant votre "Quand il y a une erreur il me met par défaut le AFFECTATION 1 sans avoir à effectuer le try otherwise", c'est effectivement un comportement bien singulier. Peut-être l'erreur inhibe-t-elle la fonction Table.ReplaceValue ?

C’est exactement ce que je me suis dis. J’ai fait les tests en utilisant la même syntaxe T_MODIF{[BASE=[BASE]]}[AFFECTATION 1 A MODIFIEE] en dehors de la fonction Table.ReplaceValue et la il me ressort bien les erreurs quand pas de correspondance. Donc on peut bien en déduire que la fonction Table.ReplaceValue gère toute seule la gestion de l’erreur => du coup à utiliser avec une extrême prudence, peut jouer des tours

Bonjour à tous,

Je vais donc utiliser la version utilisant le 'Try....Otherwise"

@Baroute78, pourriez vous joindre un fichier correspondant ou vous voyer les erreurs?

Merci à vous deux pour votre participation à ce post,

Cordialement,

Hello,

Bonjour JFL,

Votre table T_MODIF reprend l'intégralité des codes BASE de la table T_BASE ? Ce n'est pas ce que vos classeurs exemples laissent entendre.

Non effectivement , mais en quoi cela poserai un éventuel problème ?

Cordialement,

du coup ça pose problème dans la gestion de l’erreur. Si la syntaxe dans le Table.ReplaceValue n’est pas parfaitement parfaite il va simplement mettre le contenu du champ… donc on peut penser que notre fonction fonctionne alors que non

Bonjour à tous de nouveau !

Votre table T_MODIF reprend l'intégralité des codes BASE de la table T_BASE ? Ce n'est pas ce que vos classeurs exemples laissent entendre.

Non effectivement , mais en quoi cela poserai un éventuel problème ?

Cette possible non-concordance nous oblige à la vigilance quant à l'erreur.

Bonjour à tous de nouveau !

....... Donc on peut bien en déduire que la fonction Table.ReplaceValue gère toute seule la gestion de l’erreur => du coup à utiliser avec une extrême prudence, peut jouer des tours

En investiguant de la sorte vous avez fait une......"Tulipienne" . J'adore.

Rechercher des sujets similaires à "power query raccourcir code"