Naviguer dans les variables de type Array
Étiquetté : Forms
-
Naviguer dans les variables de type Array
Posté par Delphine sur 8 juillet 2022 à 11h56Bonjour,
Il me manque un petit élément de langage pour récupérer une valeur précise dans un variable de type array sur PowerAutomate.
J’ai créé une variable Table avec deux “colonnes”, chaque élément de ma table possède donc deux “propriétés”.
Je souhaite récupérer seulement une des deux propriétés dans mon flux, j’utilise la fonction suivante :
variables('Table')[0]
Qui me permet de récupérer le premier élément de ma table, mais je voudrais récupérer uniquement la propriété stockée dans la première colonne.
J’ai essayé ça :
variables('Table')[0]?[0]
Mais j’ai le message d’erreur suivant
« Impossible d’évaluer l’expression de langage de gabarit « variables(‘Table’)[0]?[0] », car la propriété « 0 » ne peut pas être sélectionnée. Une sélection de propriété n’est pas prise en charge sur des valeurs de type « String ».
Je ne connais pas du tout le JS (si ç’en est bien 😆 ) donc si quelqu’un pouvait m’aider ce serait sympa.
Merci.
PostID=h9tWwTqhOvUkZFM
R3dKap a répondu Il y a 11 mois, 3 semaines 1 Membre · 10 Réponses -
10 Réponses
-
Delphine c’est pas du JS, c’est du “Power Automate” maison : le Workflow Definition Language… 😅
Alors ta tentative est la bonne mais de ce que je comprends du message d’erreur
variables('Table')[0]
te retournes une chaîne et pas une structure à plusieurs colonnes.Est-ce que tu peux nous montrer comment tu construis ta table ?
CommentID=2CxkSNM2W6ITLmI, PostID=h9tWwTqhOvUkZFM
-
Toujours aussi prompt pour nous aider 👍
Alors pour la construction de ma Table1, j’ai d’abord initialiser une variable array vide appelée Table1, je fais une boucle sur une liste SharePoint appelée LiCritere filtrée, et pour chaque élément, j’ajoute à ma variable Table, deux valeurs string issues de ma liste SP
[
{ “Libelle”:@{items(‘Pour_chaque_critere’)?[‘LibelleCritere’]};
“Zone”:@{items(‘Pour_chaque_critere’)?[‘ZoneCritere’]}}
]
Cette partie là fonctionne (je me suis envoyé le résultat par mail sous forme de chaîne de caractère, ça me donne un truc de ce genre :
[ {“Libelle” : Libellé1; “Zone” : Zone 1} ];[ {“Libelle” : Libellé 2; “Zone” : Zone 2} ]
(En tapant ce message j’ai l’impression d’avoir tout pris à l’envers, je vais donc plutôt expliquer ce que je veux faire)
J’aimerais construire une deuxième table, appelons la Table2 qui ressemblerait à ça :
Nom / Title1 / Title2
Libellé1 / valeur11 / valeur21
Libellé2 / valeur12 / valeur22
….
Ma première colonne correspond à ce que j’ai récupéré dans ma Table1.
Pour les autres colonnes, je dois récupérer les éléments d’une autre liste SP appelée liResultats, qui se présente comme ça
Title / Critere1 / Critere 2 / ….
Title1 / Valeur11 / Valeur 21
Title2 / Valeur 21 / Valeur 22
J’ai autant de colonne CritereX que de lignes dans ma Table1 (je peux pas juste mettre leur “Libelle” en intitulé de colonne car ils varient régulièrement et j’utilise ce montage (les libellés dans une liste et les résultats dans une autre avec mon appli PowerApps).
Je sais pas si c’est très clair.
CommentID=TS3GZdgLbO1I774, PostID=h9tWwTqhOvUkZFM
-
C’est parce-que c’est les vacances… 😋
Merci pour tout le détail… Avant de me plonger à fond dedans je vais tenter un tour de passe-passe passk’on sait jamais qu’on puisse éviter tout ça… >>> A quoi va te servir cette Table2 au final ? Tu veux générer un PDF ? Envoyer un tableau par mail ? Construire un fichier ?
Autre approche intéressante : oublions totalement la technique et explique-moi ce que tu veux faire (parle-moi uniquement besoin, métier et données). Décris-moi ton modèle de données (tes listes SharePoint avec leurs colonnes). Ensuite dis-moi ce que t’as déjà fait : une app ici pour faire ça, un flux là appelé par l’app pour faire ceci, etc.
En fait ce qui m’intrigue dans ton histoire, c’est pourquoi générer autant de tables dans ton flux ? Pourquoi ne pas travailler directement avec des boucles imbriquées sur les différents listes SharePoint ?
Bon ça fait bcp de questions… Je te laisse bosser… 😅
CommentID=2dWKM6y8pDA4cf2, PostID=h9tWwTqhOvUkZFM
-
Il est bien possible que je me complique la vie pour pas grand chose 😂 L’idée c’est bien d’envoyer quotidiennement un recap’ des résultats du jour par mail, puis de générer un rapport mensuel en PDF.
Donc oublions la technique, voilà ce le besoin global
Tous les jours, des opérateurs utilisent une application pour noter des contrôles fait sur des productions.
A chaque poste de travail, les critères de contrôles ne sont pas les mêmes (et ces critères de contrôle sont susceptibles de varier en cours d’année selon ce qui aura été observé sur le terrain).
Pour faire ça, j’ai créé deux Listes SharePoint
Une première liste “liPointsControles” qui se présente ainsi
-
Title (qui est sous la forme PointControle-NumCritere)
-
PointControle (liste de choix avec les postes de travail)
-
NumCritere (un texte qui devait servir à “matcher” les données de type Critere1, Critere2, Critere3,… CritereX)
-
LibelleCritere (un texte qui donne le critère à contrôler)
Une deuxième liste “liResultatsControles” qui récupère les données d’une application et qui contient les éléments suivants
-
Title (qui est sous la forme Date-NumProd-CodeProduit)
-
Date (date d’enregistrement du contrôle)
-
NumProd (texte qui reprend un code de production interne)
-
CodeProduit (texte qui reprend un code produit interne)
-
NbProduits (nombre de produits fabriqués)
-
Critere1 (nombre de défauts pour ce critère de contrôle)
-
Critere2 (nombre de défauts pour ce critère de contrôle)
-
… CritereX (nombre de défauts pour ce critère de contrôle)
-
SommeDefauts (colonne calculée qui fait la somme des nombres dans les colonnes Criteres)
-
TauxDefauts (colonne calculée a partir de SommeDefaut et NbProduits)
Une application, avec juste un formulaire tout simple basé sur liResultatsControles ou chaque enregistrement va générer une ligne avec les informations qui vont bien. J’ai utilisé la liste liPointsControles pour mes libellés d’étiquettes pour remplacer Critere1, Critere2, …
(Le but étant de pas reprendre l’application quand on modifie un critère de contrôle)
Jusqu’ici tout fonctionne très bien.
Nous souhaitons mettre en place des rapports automatisés.
Rapport journalier
J’ai mis en place un flux quotidien, qui récupère les contrôles faits dans la journée sur la liste liResultatsControles (avec un filtre oData sur la date)
Ces contrôles sont injectés dans un tableau HTML, pour cela, j’ai procédé de cette façon
-
J’ai initialisé une variable integer appelée Dlig à 0
-
J’ai initialisé une variable string appelée TableHTML avec le code suivant
<table style="border:1px solid #eeeeee;border-collapse: collapse;" border="1" cellspading="0" cellspacing="0"> n<thead style="background:#1C6EA4; border-bottom: 2px solid #444444; font-size: 15px; font-weight:bold; color:#FFFFFF;">n<tr>n<th width="250">Numéro de prod</th>n<th width="250">Code produit</th>n<th width="250">Nombre de produits</th>n<th width="250">Nombre de défauts</th>n<th width="300">Taux défaut</th>n</tr>n</thead>n<tbody>
Ce qui me créé une “carcasse” de tableau HTML.
Ensuite j’ai créé une boucle sur mes contrôles récupérés, cette boucle :
-
Incrémente Dlig de 1
-
Ajoute à la variable TableHTML les infos suivantes
<tr style="background-color:@{if(equals(mod(variables('Dlig'),2),0),'white','#e1e1e1')};">n <td>@{items('Appliquer_à_chacun')?['NumProd']}</td>n <td>@{items('Appliquer_à_chacun')?['CodeProduit']}</td>n <td>@{items('Appliquer_à_chacun')?['NbProduits']}</td>n <td>@{int(items('Appliquer_à_chacun')?['SommeDefaut'])}</td>n <td>@{int(items('Appliquer_à_chacun')?['TauxDefaut'])}</td>n</tr>
Ce qui intègre proprement mes données dans un tableau HTML mis en forme (le int() des deux dernières lignes me permet de garder qu’un nombre entier).
J’envoie ensuite un mail en intégrant ma variable TableHTML
Tout ça fonctionne bien, mais je voudrais ajouter à mon mail, le détail des défauts qui sont détectés (pour les productions où il y a des défauts).
Et là, on retrouve le tableau que j’essaie de construire qui matcherait les résultats de liResultatsControles mais en remplaçant mes colonnes Critere1, Critere2, … par ce que j’ai en liPointsControles
L’idée étant de refaire un autre Tableau HTML sur le même principe, mais en filtrant mes contrôles non seulement sur la date, mais aussi sur la présence de défauts.
Comme ça, je rajoute ce tableau qui contient un peu plus de détails, sous le premier.
Rapport mensuel
J’ai pas encore beaucoup réfléchi dessus, mais il contiendra certainement les mêmes éléments, avec sûrement quelques informations supplémentaires type “Poste de Travail” voire des graphiques.
Je pense que je les ferai via Excel puis un enregistrement PDF pour avoir un truc propre.
Mais si t’as des idées, je prends.
CommentID=9yMv5cMHxREzYUR, PostID=h9tWwTqhOvUkZFM
-
-
Nickel Delphine… Très clair, merci ! 👍
Le modèle de données
Alors tu vois, clairement dans ton cas j’identifie tout de suite qu’en fait il te faudrait une liste des critères. Car c’est une information que tu retrouves dans 2 autres listes. A partir du moment où une information (qui identifie quelque chose de tangible) se retrouve dans plus d’une liste, c’est qu’il faut lui prévoir une liste dédiée.
Idem pour les points de contrôles… 😉En fait, rien qu’en lisant les 2 phrases de ton besoin métier au début de ton dernier post, je me suis tout de suite dit : donc il faut une liste des points de contrôles, une liste des critères, une liste qui spécifient quels critères sont vérifiés sur chaque point de contrôle et une dernière liste qui permette de stocker les relevés fait chaque jour.
Le fait de partir sur une structuration des données de cette manière (avec des liens entre les listes) clarifie les choses et te simplifie tout par la suite…Mais c’est pas grave… Tu as déjà bien avancé donc on va rester là-dessus… Essaie de t’appliquer cette règle pour la prochaine fois. 😉
Rapport journalier
Avant de chercher à optimiser, faut chercher à faire simple. La solution simple consisterait à récupérer dans liResultatsControles toutes les lignes du jour où SommeDefauts > 0. Ensuite, on bouclerait sur ces lignes pour générer le code HTML de chaque ligne du 2è tableau en allant chercher à chaque fois dans la liste liPointsControles le libellé des critères concernés.
Ce qui n’est pas très optimisé c’est qu’on va faire des tas de requêtes à liPointsControles pour aller rechercher à chaque fois le bon libellé du critère. L’idéal consisterait à charger une seule les lignes de liPointsControles dont on a besoin pour ensuite travailler uniquement avec des variables… Mais ça peut vite prendre la tête… Donc faisons simple pour l’instant.
Vu ton niveau je pense que faire une boucle sur liResultatsControles puis rechercher le bon libellé de chaque critère dans liPointsControles tu devrais y arriver non ?
Qu’en penses-tu ? Appelle à l’aide sinon… 😊
CommentID=MMqPFsE25PjDUmV, PostID=h9tWwTqhOvUkZFM
-
R3dKap merci pour ton retour.
Alors, on est juste au début pour ce type d’enregistrement sur application, et je préfère reprendre à zéro mon modèle de données pour partir sur des bases saines plutôt que me retrouver bloquée dans plusieurs mois parce que je veux ajouter encore quelque chose ou que j’ai besoin d’un autre type de rapport (par CodeProduit par exemple)
Je pense que je construis mes listes comme des tableaux Excel, alors qu’il faudrait que je raisonne plus en mode “table” avec effectivement des liens entre chaque.
Si je comprends bien, il me faut 4 listes
-
liPointsdeControles : qui reprend la liste de mes postes de travail ou sont réalisés les contrôles (magasin, atelier1, atelier2, atelier3, expédition)
-
liCriteres : qui liste tous les points qui seront contrôlés (couleur, épaisseur, masse, taille, ….)
-
liCriteresControle : qui liste les criteres (couleur, épaisseur, …) à contrôler à chaque poste (magasin, atelier1, …) -> J’ai un peu de mal à la visualiser celle-ci
-
liResultats : connectée à l’application qui récupère les résultats -> tu verrais ça sous quelle forme ? 1 ligne = 1 point de contrôle avec le PointControle (magasin, …), le Critere (couleur, …), le Résultat (oui/non) et mes autres éléments (CodeProduit, Date, NumProd, …) mais du coup je perds mon info SommeDefaut et Taux Defaut sur une ligne (qui doit dans le futur déclencher une alerte en cas de dépassement en fait).
CommentID=lrOXqxRBIrZ4tA6, PostID=h9tWwTqhOvUkZFM
-
-
Salut Delphine, désolé pour le délai…
Bon super… Alors voici concrètement comment je monterais le modèle de données…
liPostes (puisque tu parles de “postes” je l’appellerai ainsi 🙂)
-
Title (colonne native que tu peux renommer par ex. en “Nom du poste“
liCriteres
-
Title (colonne native que tu peux renommer par ex. en “Nom du critère“)
liCriteresPostes
-
Title (colonne native qui ne te servira pas ici -> tu peux la rendre facultative comme ça t’es pas obligé de la remplir)
-
colPoste : colonne de recherche qui pointe sur la liste liPostes et sa colonne Title
-
colCritere : colonne de recherche qui point sur la liste liCriteres et sa colonne Title
liControles (liste tous les contrôles qui ont lieu : une ligne = un contrôle à une date donnée, sur un poste donné, pour un produit et un numéro de prod ; on y retrouve aussi la somme des défauts et le taux de défauts -> ces éléments sont calculés au fur et à mesure des relevés (voir ci-dessous))
-
Title (colonne native à renommer en “N° contrôle” par ex.) : l’idée c’est d’y concaténer les colonnes qui sont identifiantes pour un contrôle (par ex. :
<colPoste>_<colDateControle>_<colProduit>_<colNumProd>
) -
colPoste : colonne de recherche vers la liste liPostes (comme dans la table liCriteresPostes)
-
colDateControle : colonne de date/heure indiquant la date et l’heure du contrôle
-
colProduit : colonne de texte pour le code du produit
-
colNumProd : colonne de texte pour le numéro de production
-
colTotalDefauts : colonne numérique pour le total des défauts
-
colTauxDefaults : colonne numérique pour le taux des défauts
liReleves (je l’appelle plutôt “Relevés” car c’est ce qui se passe sur le terrain : l’opérateur fait des relevés/mesures au niveau des points de contrôles pour des critères spécifiques ; mais à toi de la nommer autrement si tu veux)
-
colControle : colonne de recherche qui pointe vers la liste liControles et sa colonne Title
-
colCritere : colonne de recherche vers la liste liCriteres et sa colonne Title
-
colValeur : colonne qui porte la valeur du contrôle pour le critère sur le poste -> là c’est à toi de voir quel type de colonne tu veux (oui/non ou alors de type choix ou alors de type texte pour y mettre des valeurs de différent formats)
Voilou… J’ai supposé que tu créais les colonnes directement dans les listes. Maintenant si tu passes par des colonnes de sites et des types de contenus (voir mon article ici, mais je crois que tu l’as peut-être déjà vu : https://r3dkap.fr/post/comment-creer-vos-listes-sharepoint-pour-vos-applications-power-apps-60cde3aee7328da090060c28) à ce moment-là appelle les colonnes plutôt scNomColonne (sc voulant dire Site Column). Passer par des colonnes de sites te permet de réutiliser une colonne dans plusieurs listes…
Si t’as besoin d’un coup de main ou si t’as encore des questions, n’hésite pas… Et je t’encourage à représenter ton modèle de données dans un petit Power Point comme ceci :
Ca te permettra d’y revenir régulièrement quand tu te poseras des questions genre : “Tiens, comment j’ai organisé mes données finalement ?“… 😉
CommentID=mdDq8kDjVo49p4Q, PostID=h9tWwTqhOvUkZFM
-
R3dKap merci beaucoup, je vais regarder ça. Effectivement je créé mes colonnes directement dans les listes, j’utilise les colonnes de site pour d’autres données mais pas dans ce cas là (et j’avais regardé ton article).
J’utilise également déjà ton ppt pour représenter mes modèles de données, c’est plus pratique pour mes collègues aussi pour comprendre ce que j’ai fait.
SubCommentID=pJSIRuukmkCzOnW, CommentID=mdDq8kDjVo49p4Q, PostID=h9tWwTqhOvUkZFM
-
R3dKap c’est parfait, j’ai construit le modèle selon tes recommandations, je suis en train de remettre mon application à jour, je visualise bien comment je vais pouvoir automatiser ms rapports et je pourrais même aller plus loin dans mon analyse de données.
Encore un grand merci !
SubCommentID=28lsQKxqnDbJ3T5, CommentID=mdDq8kDjVo49p4Q, PostID=h9tWwTqhOvUkZFM
-
-
Avec plaisir… 😉
CommentID=XaGalc1qihmc3rx, PostID=h9tWwTqhOvUkZFM
Connectez-vous pour répondre.