Ajouter un tri à un template utilisant PQ. problème avec une ligne en M: Expression.SyntaxError: Invalid identifier

Bonjour à tous, j’espère que vous allez bien.

Grâce à Cousinhub (Un gars super du forum :slight_smile:) j’ai réussi à obtenir un template qui m’est très utile au boulot. J’essaye à présent de le modifier pour mieux maîtriser le fichier dans le but de l’améliorer en fonction de mes besoins qui peuvent évoluer au fil du temps.
Ça me permet aussi de débuter sur PQ que je ne connaissais pas du tout.

J’essaye donc de rajouter un tri sur une colonne (G, 3PL Line Status) afin d’avoir les cellules non-vides qui apparaissent en premier pour chaque client tout en gardant le tri par date en second pour chaque client.

J’ai essayé plusieurs lignes différentes à plusieurs endroits (avant, après et dans le groupby). Dans ma dernière tentative qui est dans le groupby, j’obtiens ce message d’erreur : Expression.SyntaxError: Invalid identifier.

Est ce que quelqu’un serait en capacité de m’aider à résoudre, mais aussi à comprendre l’erreur et comment la solutionner ?

Je vous joins les différents fichiers:

  • Exemple1: ce sont les données que j’importe dans le template
  • Fichier Base: C’est le template sans les essais de tri supplémentaire et qui fonctionne
  • Essai tri: c’est le fichier avec l’erreur

Fichier base.xlsm (37,2 Ko)
Exemple1.xlsx (29,3 Ko)
Essai tri.xlsm (37,4 Ko)

Merci d’avance pour votre aide !

Hello,
Très beau w-e olympique :100:
Tu y étais…
Juste que dans le code M, c’est une double apostrophe ( " )

"tbl"

et non
« tbl »
(il y a plusieurs fois cette erreur de syntaxe dans cette ligne de code)
PS, tu as une ligne vide dans ton tableau source
si ce cas de figure peut se produire, tu peux faire un filtre supprimant les « null » dans la première colonne dès l’import

HAAA! Tout s’explique.

Pour la ligne vide c’est une erreur de ma part, je l’ai supprimée.

Je viens de modifier et j’ai effectivement plus d’erreurs qui s’affiche. Merci :slight_smile:

Par contre le résultat final n’était pas celui attendu. Après regardé, c’est parce que je n’ai pas mis dans le bon ordre les tris. Si quelqu’un est intéressé voici la ligne finale qui fonctionne pour ce que je souhaitais faire :

= Table.Group(TypeDate2, « Customer », {{« tbl », each Table.Sort(_, {{« 3PL Line Status », Order.Descending},{« Schedule Ship Date », Order.Ascending} }) & #table({« Customer »,« Open Value (Local) »,« RSVD Value »}, {{"Sous-Total " & [Customer]{0}, List.Sum([#« Open Value (Local) »]), List.Sum([RSVD Value])}})}})

Par contre j’ai le texte sous-total qui s’en est allé et du coup la mise en forme conditionnelle associé qui l’a suivi. Il semblerait que j’ai encore supprimé le {0} après [Customer]. Je viens de le remettre et ça fonctionne !

Après avoir créé plein d’erreurs sur d’autres endroits du template j’ai enfin réussi à ajouter le tri haha !

Je joins le fichier final au cas où c’est utile à quelqu’un.
Essai tri.xlsm (37,1 Ko)

Merci encore cousinhub!

Edit: je viens d’essayer sur un fichier réel et il semblerait que ça marche partiellement, je regarde plus en détail ce qu’il se passe et je reviens vous embêter avec des question haha. Malheureusement, je ne peux pas partager le Fichier vu qu’il contient des données confidentielles, mais voilà un screenshot pour vous donner une idée du problème.

Alors je pense avoir trouvé quel est le souci:
Vue ma ligne indique de faire un tri par la colonne 3PL Line Status puis par Schedule Ship date (dernière colonne du screenshort) il laisse des espaces vides pour que les lignes soient groupées par date.
Donc il semblerait que même si la formule fonctionne ce ne soit pas celle à utiliser.

Mon objectif était d’avoir en priorité pour chaque client les lignes avec des choses écrites en 3PL classées par date puis juste en dessous les lignes sans rien écrit dans 3PL aussi classées par date.

Une idée de ce que je pourrais faire ?

Re-,
En « trichant » un peu?

let
    Source = Excel.Workbook(File.Contents(Excel.CurrentWorkbook(){[Name="NomFich"]}[Content][Column1]{0})),
    Filtre = Table.SelectRows(Source, each ([Name] = "Table1"))[[Data]],
    // Récupère le nom des colonnes du fichier original
    ListCols = T_Choix[Noms Colonnes],
    // Développe la Table avec uniquement les colonnes de la ListPreserv, et supprime la première ligne (comprenant les noms de colonnes)
    Expand = Table.ExpandTableColumn(Filtre, "Data", ListCols, ListCols),
    RemplVide = Table.ReplaceValue(Expand,"",null,Replacer.ReplaceValue,{"Line Hold", "Customer Hold", "Backorder Delivery Date", "Backorder Comments"}),
    SupprColsVides = Table.SelectColumns(RemplVide,List.Select(Table.ColumnNames(RemplVide),each List.NonNullCount(Table.Column(RemplVide,_)) <> 0)),
    TypeDate = Table.TransformColumnTypes(SupprColsVides,{{"Request Date", type date}, {"Schedule Ship Date", type date}, {"RSVD Date", type date}}),
    // Effectue un regroupement selon les valeurs de la première colonne, et ajoute une ligne de sous-totaux des colonnes 28 (AB) et 32(AF)
    TypeDate2 = if List.Contains(Table.ColumnNames(TypeDate), "Backorder Delivery Date") then Table.TransformColumnTypes(TypeDate,{{"Backorder Delivery Date", type date}}) else TypeDate,
    AjtTri3PL = Table.AddColumn(TypeDate2, "Tri_3PL", each if [3PL Line Status]<>null then 1 else 0),
    // Rajout d'une colonne pour le tri de 3PL
    GroupBy = Table.Group(AjtTri3PL, "Customer", {{"tbl", each Table.Sort(_, {{"Tri_3PL", Order.Descending},{"Schedule Ship Date", Order.Ascending},{"3PL Line Status", Order.Ascending}})  & #table({"Customer","Open Value (Local)","RSVD Value"}, {{"Sous-Total "&[Customer]{0},List.Sum([#"Open Value (Local)"]),List.Sum([RSVD Value])}})}}),
    Tri = Table.Sort(GroupBy,{{"Customer", Order.Ascending}}),
    // Ajoute une ligne "Total", en prenant en référence la Table "Expand", afin de ne pas inclure les sous-totaux dans le calcul
    Total = Table.Combine(Tri[tbl]) & Table.Group(TypeDate,{},{{"Customer", each "Total général", type nullable text}, {"Open Value (Local)", each List.Sum([#"Open Value (Local)"]), type nullable number}, {"RSVD Value", each List.Sum([RSVD Value]), type nullable number}}),
    SupprColTri = Table.RemoveColumns(Total,{"Tri_3PL"})
in
    SupprColTri

Je rajoute une colonne qui donne 1 si la colonne 3PL est remplie, 0 sinon.
Puis, premier tri sur cette colonne, 2 ème sur la date (et 3ème, pour faire joli, sur la colonne 3PL, mais est-ce nécessaire?)

1 « J'aime »

Pas forcément nécessaire, cette solution à l’air un peu compliqué. J’ai essayé de regarder, mais pas encore terminé. Mon autre solution était juste de faire une mise en forme conditionnelle pour repérer les lignes concernées.

Par contre, je ne comprends pas comment marche table.sort

Quand j’utilise custom sort et que je demande de trier par 3PL Line status puis par Schedule ship date, ça me donne bien ce que je souhaite:

Edit: j’ai compris ce que tu faisais dans la solution proposée. J’ai essayé, ça a l’air de fonctionner sur le principe. (La colonne Tri_Pl est bien créée, il essaye effectivement de regarder si elle est vide ou pas pour lui attribuer une valeur, ensuite le tri et enfin suppression de la colonne.).

Par contre, je suis perdu parce que toute la colonne Tri_PL est notée 1. J’ai regardé ce qu’il se passait en 3PL Line Status, mais il y a effectivement des cellules vides. En fait, elles sont même carrément vides, il n’y a pas écrit null, c’est de là que vient le problème, je pense. Donc soit je dois réussir a remplacer ces cases vides par null soit je change cette ligne :

AjtTri3PL = = Table.AddColumn(TypeDate2, « Tri_3PL », each if [3PL Line Status]<>null then 1 else 0)
En raplacant null par quel que chose qui revenverrait au fait que les cellules sont 100% vides.

Je te mest un screen pour être un peu plus clair:

Comme tu peux voir, il y a une différence entre 3PL Line Status ou, quand il n’y a rien, rien n’est écrit VS la colonne rsvd line status ou quand la cellule est vide, c’est écrit null.

Je ne comprends pas la différence entre null et vide n’y d’où ça peut venir. Une idée ?

Re-,
J’ai sans doute mal compris le besoin…
Tu veux trier :

  • 3PL : les cellules remplies en haut, puis les vides
  • Date : par ordre, du plus ancien au plus récent

Si c’est cela, ma dernière proposition le fait.
Si ce n’est pas ça (je vois dans ton screen que les dates ne sont pas triées par ordre chronologique, mais triées selon la valeur de 3PL d’abord…
Bref, pas clair du tout pour moi
PS, je ne sais pas si c’est possible, mais enlève le « résolu », tant qu’on continue (ça évite les messages du forum à droite)

Re-,
Ok, je « pense » avoir compris.
PQ fait la différence entre une valeur « null » et une valeur vide
Cette valeur vide peut avoir plusieurs raisons (notamment le résultat d’une formule qui donnerait

""

en résultat.
Essaie en modifiant la formule de la colonne ajoutée par :

= Table.AddColumn(TypeDate2, "Tri_3PL", each if [3PL Line Status]<>null and [3PL Line Status]<>"" then 1 else 0)

pour voir

Je viens de faire un Edit sur mon message précédent pendant que tu écrivais.

Les deux me conviennent pour être honnêtes. Le plus important étant d’avoir les cellules non-vides en haut.
Si c’est classé, c’est encore mieux, mais le gain est minime donc ta solution convient très bien.

Ce n’était pas clair parce que je pensais table.sort fonctionnait de la même manière que custom sort. En gros, que ça allait faire un tri par ordre alphabétique de la colonne 3PL Line Status avec les cellules vides en dessous, puis par Date de schedule Ship date.
Le screenshot, c’était juste pour illustrer ça, on peut l’oublier !

Re-,
On se croirait dans une discussion instantanée… :slight_smile:
Tu as vu ma dernière?

Oui! Haha

Je viens de voir et de modifier dans mon PQ, tout fonctionne !

Je comprends mieux, merci pour l’explication. En fait, je croyais que PQ mettait automatiquement toute cellule vide en null, c’est pour ça que j’étais confus.
Ça m’a aussi permis de mieux comprendre certaines lignes où tu avais écrit " ".

Merci beaucoup pour la solution mais surtout les explications :slight_smile: !

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.