Accueil – Le CFO masqué › Forums › Power Query › erreur fonction condition langage M
Mots-clés : langage M
- Ce sujet contient 8 réponses, 3 participants et a été mis à jour pour la dernière fois par deltacta, le il y a 2 années et 1 mois.
-
AuteurArticles
-
21 août 2022 à 14 h 40 min #106492deltactaParticipant
Bonjour
J’ai un problème a le code M je ne suis pas doué pour les Expression de langage M ,mais
de base le code est sensé faire et remplacé ma formule dans la colonne E Cellule E2 a E40
SI.CONDITIONS(GAUCHE($D2;3)=”sol”;”SOL”;GAUCHE($D2;3)=”PAP”;”PAP”;$D2>0;”GARE”);””)
dans un exemple de donné comme suite.
Emplacement résultat
9 GARE
sol15 SOL
PAP PAPLe code M suivant est censé faire comme la formule mais j’ai une erreur:
let
Source = () => let
Source = Excel.CurrentWorkbook(){[Name=”gareorigine”]}[Content],
Test = Table.AddColumn(Source,
“gareN”,
each let
deb= Text.Start([Valeur],3),
rep= try if deb=”SOL” or deb=”PAP” then deb else if Text.Length(deb)>0 then “GARE” else null otherwise null
in
rep)
in
Test
in
Source- Ce sujet a été modifié le il y a 2 années et 1 mois par deltacta. Raison: Oops le fichier!
- Ce sujet a été modifié le il y a 2 années et 1 mois par deltacta. Raison: fichier
Attachments:
You must be logged in to view attached files.21 août 2022 à 15 h 07 min #106497Stéphane LorinParticipantBonjour
Je n’ai pas Excel sous la main, je n’ai donc pas ouvert la pièce jointe
Quelques remarques cependant à la lecture du codeJe ne vois pas l’intérêt d’une fonction
Ensuite Power Query est sensible à la casse donc SOL est différent de sol
Avez vous typé votre colonne en texte ? Si “any” le 9 sera aligné à droite et vous aurez une erreur avec Text.Lenght
Pourquoi pas un enchaînement de trois if then else ?
Stéphane
22 août 2022 à 4 h 55 min #106499Stéphane LorinParticipantBonjour
Voici une proposition de code M
let
Source = Excel.CurrentWorkbook(){[Name=”gareorigine”]}[Content],
Type_text = Table.TransformColumnTypes(Source,{{“Emplacement”, type text}}),
Condition = Table.AddColumn(Type_text, “gareN”, each
if Text.StartsWith([Emplacement],”sol”) then “SOL” else
if Text.StartsWith([Emplacement],”PAP”) then “PAP” else
if Text.Length([Emplacement]) > 0 then “GARE” else null)
in
ConditionStéphane
22 août 2022 à 6 h 12 min #106500deltactaParticipantBonjour
Merci Pour votre Réponse , pour répondre a votre première question ”Oui a la base toute est sous Format Texte Sol10;10;et PAP. Toute est en TXT.
JE Joins une copy d’écran
-Mon code se limite juste a des transformations puis a un chargement dans une feuille nommé gareorigine et au bout de ce tableau j’ai une formule Excel, qui fais le reste.Cordialement
Attachments:
You must be logged in to view attached files.22 août 2022 à 10 h 04 min #106507DanielParticipantBonjour Deltacta, Stephane, Le Forum,
Si j’ai bien compris les valeurs numériques doivent êtes transformées en “GARE” et les autres valeurs on doit prendre les trois premiers caractères et les transformés en Majuscules, si c’est bien cela le code suivant fera le job.
Début du code de la requête
let
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
#”Type modifié” = Table.TransformColumnTypes(Source,{{“Data”, type any}, {“Result visé”, type text}}),
#”Personnalisée ajoutée” = Table.AddColumn(#”Type modifié”, “Result Power Query”, each if Value.Type([Data])=Number.Type then “GARE” else Text.Upper(Text.Start([Data],3)))
in
#”Personnalisée ajoutée”
Fin du code de la requêteCordialement
Daniel22 août 2022 à 10 h 12 min #106508DanielParticipantBonjour Deltacta, Stephane, Le Forum,
Autre façon de faire, si l’on accepte que les données de la colonne d’origine soient directement modifiées, l’utilisation de la fonction Table.TransformColumns fait aussi le job avec les mêmes fonctions de transformations et de test.
= Table.TransformColumns( #”Personnalisée ajoutée”, {{“Data”, each if Value.Type(_)=Number.Type then “GARE” else Text.Upper(Text.Start(_,3))}})
Cordialement
Daniel24 août 2022 à 8 h 45 min #106635deltactaParticipantBonjour Daniel et vous tous
Oui ma formule en E dit si PAP alors PAP ,ci chiffre alors Gare si sol10 alors gauche extrait les 3 première lettre.
La colonne D est variable.
Pour l’instant j’ai cette formule en E qui fais le Taf, mais j’aurais aimer trouver la même chose dans PowQY.Attachments:
You must be logged in to view attached files.26 août 2022 à 13 h 59 min #106727DanielParticipantBonjour Deltacta, Le Forum,
Alors puisque j’ai bien compris, ma proposition fait ce que tu souhaites reproduire depuis Excel mais en Power Query.
Value.Type([Data]) retourne le type de données contenue dans la colonne D, exemple : SOL10 est de type Text, 10 est de type numérique
Number.Type correspond à une valeur numérique
donc si la colonne D contient 10 : Value.Type([Data])=Number.Type retourne TRUE, d’ou le IF Value.Type([Data])=Number.Type then “GARE” else (cas des valeurs texte)Text.Upper(Text.Start(_,3))
Text.Start prend les trois premiers caractères de la chaîne de texte contenu dans la colonne D et Text.Upper les passent en majuscules.
Espérant avoir pu t’aider à résoudre ton problème.
Cordialement
Daniel27 août 2022 à 3 h 37 min #106730deltactaParticipantbonjour a tous.
Merci pour votre intérêt, j’ai une piste déniché dans un autre forum avec l’aide d’un utilisateur aussi doué que vous.
voici ce qui m’a été proposé ,qui fonctionne aussi a 99% .
if Text.Start(Text.Lower([Emplacement]), 3) = “sol” then “SOL”
else if Text.Start(Text.Lower([Emplacement]), 3) = “pap” then “PAP”
else if Number.From([Emplacement]) > 0 then “GARE”
else [Emplacement] .Mais il arrive que dans ma colonne D j’ai un type de donné ex:(8et9)ou(8&9)
je cherche encore une solution.
avec if texte contain “” et Character FromNumber.
cordialement. -
AuteurArticles
- Vous devez être connecté pour répondre à ce sujet.