IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POWER Discussion :

PWQY : Ajout de colonnes multiples Table.AddColumn + ListAccumulate


Sujet :

POWER

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 026
    Billets dans le blog
    45
    Par défaut PWQY : Ajout de colonnes multiples Table.AddColumn + ListAccumulate
    Bonjour,

    Mon objectif est d'ajouter plusieurs colonnes dans une seule fonction. J'ai donc tenté de passer en paramètre une liste de couples {{ColonneSource, ColonneNew}, {ColonneSource, ColonneNew}, ....} ainsi que la table via List.Accumulate.

    En me basant sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table.AddColumn(#"Changed Type", "OrderDateCle", each Date.From(Text.From([OrderDateKey], "fr-FR")), type date)
    Je pensais pouvoir m'en tirer avec ce code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    = List.Accumulate({{"OrderDateKey","OrderDateCle"}, {"DateKey","DateCle"}}, #"Changed Type", (anyOutFirst, anyCurr) =>  Table.AddColumn(anyOutFirst, anyCurr(1), 
     each Date.From(Text.From(Table.Column(anyOutFirst,anyCurr(0))), "fr-FR"), type date))
    mais il provoque une erreur
    Expression.Error: We cannot convert a value of type List to type Function.Details:
    Value=
    [List]
    Type=[Type]
    Les dates sont en numérique formatées
    20170709
    Merci par avance pour toute aide

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 026
    Billets dans le blog
    45
    Par défaut
    j'ai indexé avec des parenthèses () et non avec des accolades

    Donc le code est bon jusqu'à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    = List.Accumulate({{"OrderDateKey","OrderDateCle"},{"DueDateKey","DueDateCle"}}, #"Changed Type", (anyOutFirst, anyCurr) => 
    Table.AddColumn(anyOutFirst, anyCurr{1}, each Date.From(Text.From([OrderDateKey], "fr-FR")), type date)
    )
    Sachant que DueDateCle est chargée des valeurs de OrderDateKey dans cet exemple mais le format est bon


    Par contre si je veux paramétrer le champ source en utilisant Table.Column(anyOutFirst{0}, ça beug encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    = List.Accumulate({{"OrderDateKey","OrderDateCle"},{"DueDateKey","DueDateCle"}}, #"Changed Type", (anyOutFirst, anyCurr) => 
    Table.AddColumn(anyOutFirst, anyCurr{1}, each Date.From(Text.From(Table.Column(anyOutFirst{0}), "fr-FR")), type date)
    )

  3. #3
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 276
    Par défaut
    Bonjour

    Dans votre formule ci dessous, [OrderDateKey] ne désigne pas une colonne de la table mais un champ de l'enregistrement en cours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    = List.Accumulate({{"OrderDateKey","OrderDateCle"},{"DueDateKey","DueDateCle"}}, #"Changed Type", (anyOutFirst, anyCurr) => 
    Table.AddColumn(anyOutFirst, anyCurr{1}, each Date.From(Text.From([OrderDateKey], "fr-FR")), type date)
    )

    il faut donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    = List.Accumulate({{"OrderDateKey","OrderDateCle"},{"DueDateKey","DueDateCle"}}, #"Changed Type", (anyOutFirst, anyCurr) => 
    Table.AddColumn(anyOutFirst, anyCurr{1}, each Date.From(Text.From(Record.Field(_,anyCurr{0}), "fr-FR")), type date)
    )
    Stéphane

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 026
    Billets dans le blog
    45
    Par défaut
    Encore une fois merci Stéphane pour la solution, propre et efficiente 100%


    Jute pour bien comprendre , le Record.Field(_,anyCurr{0}) dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    each Date.From(Text.From(Record.Field(_,anyCurr{0}), "fr-FR"))
    Dans le contexte de la table passée en paramètre ici anyOutFirst = #"Changed Type" , Record.Field(_,anyCurr{0}) boucle sur les enregistrements de la colonne anyCurr{0} grâce à each. L'enregistrement courant est récupéré par _

    C'est à peu près ça l'idée ?

  5. #5
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 276
    Par défaut
    Pas tout à fait.
    Ce n'est pas le Record.Field(_,anyCurr{0}) qui boucle sur les enregistrements désignés par le raccourci _ c'est le Table.AddColumn

    On doit utiliser Record.Field(_,anyCurr{0}) pour désigner le champ par son nom "MaColonne" et non par sa référence [MaColonne]

    Stéphane

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 026
    Billets dans le blog
    45
    Par défaut
    Dans mon idée, dans le contexte de la source(Table)


    • Table.AddColumn créait la colonne
    • Each Record.field (_, Nom2colonne) boucle sur la colonne donnée en paramètres permis par l'association each & _


    Sur ce post il y a cet exemple sur Record.Field

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    let
      Item = [Name = "Widget", Wholesale Price = 5, Retail Price = 10],
      PriceToUse = "Wholesale Price"
    in
    Record.Field(Item, PriceToUse) // returns 5

  7. #7
    Membre Expert
    Homme Profil pro
    ingénieur
    Inscrit en
    Mars 2015
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ingénieur
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2015
    Messages : 1 276
    Par défaut
    Non !
    Each Record.field (_, Nom2colonne) est équivalent à (_) => Record.field (_, Nom2colonne) avec Nom2colonne = du texte.
    voir le principe du _ ici https://learn.microsoft.com/fr-fr/po...d-declarations

    dans un Table.AddColumn, _ représente l'enregistrement en cours, il suffit d'ajouter une colonne avec la fonction each _ ou (_) => _ pour le constater

    Stéphane

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    1 026
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 1 026
    Billets dans le blog
    45
    Par défaut
    Un grand merci pour tes explication qui croisées avec la définition de

    Table.AddColumn(
    table as table,
    newColumnName as text,
    columnGenerator as function,
    optional columnType as nullable type,
    ) as table
    Argument Attribute Description
    table The table to add a column to.
    newColumnName The new column’s name.
    columnGenerator A function performed in a row context that generates the value for your value. Simplified functions always start with the keyword ‘each’.
    columnType optional A data type to ascribe to the new column. This could be a primitive type like ‘type text, ‘type number’ etc. Alternatively, you can provide Type Claims like Text.Type, Number.Type, etc.
    me permettent une meilleure compréhension
    Encore merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Ajout provenant de multiples tables vers 1 seule par un formulaire.
    Par KevinA4 dans le forum Access
    Réponses: 10
    Dernier message: 09/02/2017, 00h01
  2. [InnoDB] Ajout de colonne dans table volumineuse
    Par Traroth2 dans le forum Requêtes
    Réponses: 6
    Dernier message: 02/06/2010, 10h14
  3. Réponses: 4
    Dernier message: 17/05/2006, 09h21
  4. prob ajout de colonne ds une table en tant NOT NULL
    Par elhosni dans le forum Access
    Réponses: 3
    Dernier message: 19/11/2005, 22h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo