R3dKap
Expert Power AppsRéponses céées sur le Forum
-
R3dKap
Membre13 juillet 2022 à 17h46 en réponse à: Résolu-Envoie de liste sharepoint filtrer par mailHugotr35 quel serait le but de la demande d’approbation dans le mail ? Que l’utilisateur valide la liste de matériel qui lui est envoyée ?
Et que veux-tu dire par enregistrer le mail dans une liste SharePoint ?
CommentID=2RwbIzTqGYaspQw, PostID=BNjM58AmgWAPza2
-
Pas mieux de mon côté… 😉
CommentID=CfY4VFujA1PtH4T, PostID=oNTuDsZzdxRzkXh
-
DavidZed je te confirme ce comportement tout récent… 😒
Je vais remonter l’info à l’équipe Power Apps chez MS voir ce qu’ils me répondent…
CommentID=M6hLtb4IQNrkPWo, PostID=J8U6xodt8XvDk8A
-
Avec plaisir… 😉
CommentID=XaGalc1qihmc3rx, 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
-
-
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
-
Jonathan FRANÇOIS je te suggère ceci :
...n<h1>1. Liste récapitulative des observations</h1>n<br>" & If(IsEmpty(Gallery4.AllItems); "Sans observations"; "<ol>" & Concat(Gallery4.AllItems; $"<li>{Obs}</li>") & "</ol>"n) & "<br>n...
CommentID=y9uzThvtpm0S4io, PostID=NYYo632IvcTJ4vP
-
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
-
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
-
ChezWam tu ne peux pas, à partir de Power Apps, faire un lien vers un fichier qui est stocké sur un serveur de fichiers externe au cloud Microsoft. La solution la plus simple serait de mettre tes PDF dans une bibliothèque SharePoint comme le montre DavidZed …
CommentID=aZGVQbZrkzx4lDL, PostID=hUmIG8SYVPZ7GjW
-
Jonathan FRANÇOIS essaie ceci :
Concat(Gallery4.AllItems; $"<li>{Obs}</li>")
Et pense à enlever le
<li>
et le</li>
qui sont juste au-dessus et en-dessous de ton Concat()…CommentID=fZY4eIWCUcp3CB2, PostID=NYYo632IvcTJ4vP
-
R3dKap
Membre7 juillet 2022 à 20h37 en réponse à: problèmes avec la fontion "Patch" appliquée à un champs groupes & personnesOk, alors commençons par ce champ Progress…
Pourquoi définir une collection Prog dans ton App.OnStart pour alimenter ton DataCardValue31 ?
Tu utilises des datacards donc tu as un formulaire qui, je suppose, doit être branché sur ta liste SharePoint. Si c’est bien le cas, ton DataCardValue31 devait contenir au début un code qui ressemblait à ceci :
Choices(TaListe.TonChampProgress)
Pourquoi l’avoir enlevé ?
Ce code a l’avantage de générer automatiquement une table dont la structure correspond à ton champ côté SharePoint. Et du coup dans un Patch() il te suffirait alors de mettre ceci :
{Progress: DataCardValue31.Selected}
. Mais puisque tu as changé la structure des données qui alimentent ton DataCardValue31, tout se complique… C’est pas impossible à faire mais c’est un poil plus touchy…CommentID=UaEHSXYmQxoJisH, PostID=qav2GO1hmjc2PWF
-
R3dKap
Membre8 juillet 2022 à 12h31 en réponse à: problèmes avec la fontion "Patch" appliquée à un champs groupes & personnesRedonne-moi le lien du tuto d’April pour que je regarde pourquoi elle fait ça ?
Parce-qu’en plus j’ai pas poussé plus loin hier, mais en fait si ton utilisation du formulaire est basique, tu n’as pas à faire de Patch(). Un simple appel à la fonction SubmitForm() suffit à créer ou mettre à jour tes données selon le mode du formulaire. Est-ce que tu me suis ou tu as besoin de plus d’infos ?
Sinon décris-moi un peu plus ton app et ce que t’essaies de faire…
Faut absolument que je démarre mon projet de mini-vidéos sur pleins de petits sujets comme expliquer en détail comment fonctionne chaque contrôle de Power Apps… 😅
SubCommentID=cdzizRjXYIXOCq8, CommentID=UaEHSXYmQxoJisH, PostID=qav2GO1hmjc2PWF
-
-
R3dKap
Membre5 juillet 2022 à 14h05 en réponse à: problèmes avec la fontion "Patch" appliquée à un champs groupes & personnesSalut styve,
A mon avis, l’erreur que tu as sur ta capture initiale se situe au niveau du sous-champ Claims qui n’est pas au bon format.
Pour rappel (et comme on le voit bien sur ta capture), une colonne de type User dans SharePoint a la structure suivante :
t{nt DisplayName: "";nt Claims: "i:0#.f|membership|email@domain.com;nt Department: "";nt Email: "";nt JobTitle: "";nt Picture: Blank()nt}
Comme tu le vois, le Claims doit être formatté ainsi :
i:0#.f|membership|<adresse mail>
Donc ton la partie concernée de ton Patch() doit ressembler à ceci :
'User assigned': {n Claims: "i:0#.f|membership|" & DataCardValue3.Selected.Email;n Department: "";n DisplayName: DataCardValue3.Selected.DisplayName;n Email: DataCardValue3.Selected.Email;n JobTitle: "";n Picture: Blank()n}
Je préfère mettre Blank() pour Picture vu que c’est censé être de la données d’image brute, mais comme y’en pas Blank() c’est bien. Mais je pense que “” marche aussi…
Tu noteras aussi la disparition du ‘@odata’ : tu peux les enlever partout dans ton code ; ils ne servent plus à rien aujourd’hui. C’était pertinent y’a encore quelques années quand le système n’était pas capable de reconnaître automatiquement le format des données. Aujourd’hui c’est le cas… 😉
Maintenant, comme le dis DavidZed si ta colonne SharePoint est bien de type User, pas besoin de détailler la structure dans ton Patch(). Tu devrais pouvoir l’écrire simplement comme ceci :
'User assigned': DataCardValue3.Selected
A priori tu as aussi un souci avec ton champ Progress. Pour le solutionner il faudrait que tu nous dises ce que tu as dans le Items de ton DataCardValue31 et SURTOUT quelle est le type de la colonne SharePoint associée ?
Je te recommande de mettre en commentaire dans ton Patch() les champs qui posent problème, histoire d’avoir déjà un Patch() sans erreur. Puis ensuite, décommente les champs au fur et à mesure et corrige les erreurs au fur et à mesure. Sinon t’as plusieurs erreurs simultanées et quand t’en corriges une tu ne sais pas si elle est vraiment corrigée parce-qu’il y en a potentiellement une autre… 😉
NOTE : les DisplayFields et SearchFields n’ont absolument aucun impact sur l’enregistrement dans ta source de données ; ces propriétés influent uniquement sur le comportement à l’écran (champs à afficher et champs à utiliser pour la recherche).
CommentID=PaEG70CxhVeRizp, PostID=qav2GO1hmjc2PWF
-
R3dKap
Membre29 juin 2022 à 20h52 en réponse à: Activer la fonction/bouton "Export to PDF" dans une application Model DrivenSalut Youcef,
Alors finalement de notre côté, nous lançons un flux Power Automate qui se charge de construire de l’HTML qui est ensuite converti en PDF. C’est ce que je faisais avant.
Donc, on utilise pas de doc Word (je suis pas fan d’ailleurs)…
Est-ce que tu pourrais pas faire pareil : un flux qui génère de l’HTML puis le converti en PDF ? Resterait à voir comment déclencher le flux : un événement sur une table dataverse ? une mini-app canvas incrustée sur une de tes pages model-driven, avec juste un bouton pour déclencher le flux ?
SubCommentID=j3SP6HSlv5tyutD, CommentID=OLSyoSOmaKAGMdJ, PostID=PPEcpDVStySOmlk