R3dKap
Expert Power AppsRéponses céées sur le Forum
-
Exact @Alain. Merci, je corrige…
CommentID=4nEGUXffqXOyt2F, PostID=W2XFTBCMqFAsSfc
-
@Alain du coup j’ai fait vite fait un p’tit post sur ce sujet 😉 :
CommentID=VkDtjJSu5YJnHXf, PostID=W2XFTBCMqFAsSfc
-
R3dKap
Membre22 mars 2022 à 9h54 en réponse à: Faire une boucle qui génère des enregistrements dans une table à partir d'un formulaireOk, c’est bon, j’ai compris ton modèle de données…
Dis-nous comment on peut t’aider… 😊
CommentID=NVJjrv9Joa4y64X, PostID=RTKvQn2SLy4RdUK
-
R3dKap
Membre22 mars 2022 à 9h50 en réponse à: Faire une boucle qui génère des enregistrements dans une table à partir d'un formulaireAh, laisse tomber… Je viens de voir que t’avais préfixé toutes tes colonnes avec un trigramme indiquant la liste… Donc, c’est bon…
CommentID=u5W349Ku5VfK46w, PostID=RTKvQn2SLy4RdUK
-
R3dKap
Membre22 mars 2022 à 9h49 en réponse à: Faire une boucle qui génère des enregistrements dans une table à partir d'un formulaireAlors, c’est vraiment pas mal du tout… Je vois que t’as généré le modèle de données avec Power Query à partir de SharePoint… Top ! 👍 Moi-même j’ai une copine qui m’a montré ça récemment. Faudrait voir à l’occase comment automatiquement retirer certains champs inintéressants. Bref…
Il me manque juste un p’tit truc : si tu peux me rajouter au-dessus de chaque tableau des slides 5, 6, 7 le nom de la table correspondante ça serait top.
J’attends ta nouvelle version…
CommentID=N42osij5ONqfJvW, PostID=RTKvQn2SLy4RdUK
-
R3dKap
Membre22 mars 2022 à 9h36 en réponse à: Faire une boucle qui génère des enregistrements dans une table à partir d'un formulaireAh oui effectivement… c’est de la Walking Dead App là… 😅
Allez, je regarde ça à tête reposée et je reviens vers toi…
CommentID=ajI7Z9DAIdJoCrm, PostID=RTKvQn2SLy4RdUK
-
Salut @Ju_li3n,
En fait, que ce soit pour les apps ou les flows, lorsque le propriétaire disparaît, l’objet en question devient effectivement orphelin.
L’outil idéal pour les gérer c’est le CoE Starter Kit car il te permet de les identifier facilement et d’attribuer de nouveaux propriétaires par le biais d’un outil qui est fourni.
Sinon, la bonne pratique, bin c’est tout simplement d’aller dans l’Administration Power Apps, d’aller sur l’environnement concerné, de cliquer sur Apps ou Flux et de filtrer les apps ou les flux sur ceux qui n’ont pas de propriétaire. Et pour chacun d’eux, à cet endroit, tu peux leur attribuer un nouveau propriétaire.
Evidemment, tu peux aussi décider de mettre en place un flux qui va s’exécuter quotidiennement et dont le rôle sera de détecter les apps ou flux orphelins et faire ensuite le traitement que tu préfères derrière (envoyer un mail d’alerte par ex.).
Pour finir, l’idéal est de mettre en place une gouvernance pour éviter les orphelins : par exemple, prévoir une étape dans le processus de sortie du salarié ou de la suppression de son compte pour qu’il s’assurer de bien transmettre ses apps/flux à une autre personne.
Voilou…
CommentID=9vVmV4Y54qHzQem, PostID=M4rJ0pOP1uq9GiS
-
C’est parce-que ton ‘Body’ a un ‘B’ majuscule… 😉
Respecte bien le formalise indiqué dans la structure indiquée au-dessus de la barre de formule :
Si tu les vois pas tous, tu peux aussi le voir dans Power Automate en ajoutant l’action correspondante (Créer un événement (V4)), en renseignant les paramètres qui t’intéressent avec des valeurs bidons et en regardant le code :
Et du coup tu vois comment s’écrit la propriété :
CommentID=BKfdBaAiyqI3Fcp, PostID=LPTAqkWMo099PuY
-
Je vois rien de particulier dans ton flow… Est-ce que par hasard t’aurais pas un autre flow de test que t’aurais fait y’a quelques temps et qui est resté branché sur la même liste, qui se déclencherait aussi en même temps que celui-ci et qui te rajouterait d’autres fichiers dans tes dossiers ?
SharePoint n’invente pas des fichiers. Ils viennent forcément de quelque part.
Ah, y’a un truc que tu peux faire aussi : c’est de regarder l’exécution du flux pour essayer de trouver celui qui génère le fichier qui n’a rien à voir dans le dossier…
CommentID=RgUpGX0nWFbVAE4, PostID=P3kqhLcGFmuRQzy
-
@philippe ouhlaaa… il est bizarre ton truc… 😋
-
Quel est le déclencheur du flux ?
-
Quand tu dis que des fichiers sont ajoutés dans ta liste, c’est-à-dire ? En pièces jointes ?
-
Les fichiers sont copiés dans une bibliothèque de documents ?
-
Un dossier est créé pour chaque item de la liste ?
Je vois pas très bien pourquoi des vieux fichiers “fantômes” reviendraient dans tes dossiers… On touche au surnaturel… 👻😁
CommentID=kfHeC220bnzjGTQ, PostID=P3kqhLcGFmuRQzy
-
-
R3dKap
Membre18 mars 2022 à 12h24 en réponse à: LookUp function basée sur une combobox (multiple choice)Avec plaisir… 😉
Alors j’ai indenté ton code pour y voir plus clair :
If(n FormNewHQ.Mode = FormMode.New,n Concat(n Distinct(n Split(n Concatenate(n Concat(n Filter(n AddColumns(n AccessManagement,n "Selectedcountries",n If(n IsEmpty(DataCardValue49_1.SelectedItems.Value),n "true",n If(n "yes" in Concat(n ForAll(n DataCardValue49_1.SelectedItems.Value,n If(Value in Country.Value, "yes", "no")n ),n Valuen ),n "true",n "false"n )n )n ),n Selectedcountries = "true"n ),n AdminEmailAccess,n ";"n ),n ";",n Concat(n Filter(n AddColumns(n AccessManagement,n "Selectedcountries",n If(n IsEmpty(DataCardValue49_1.SelectedItems.Value),n "true",n If(n "yes" in Concat(n ForAll(n DataCardValue49_1.SelectedItems.Value,n If(Value in Country.Value, "yes", "no")n ),n Valuen ),n "true",n "false"n )n )n ),n Selectedcountries = "true"n ),n HREmailAccess,n ";"n ),n ";",n Concat(n Filter(n AddColumns(n AccessManagement,n "Selectedcountries",n If(n IsEmpty(DataCardValue49_1.SelectedItems.Value),n "true",n If(n "yes" in Concat(n ForAll(n DataCardValue49_1.SelectedItems.Value,n If(Value in Country.Value, "yes", "no")n ),n Valuen ),n "true",n "false"n )n )n ),n Selectedcountries = "true"n ),n CentralApproverEmailAccess,n ";"n )n ),n ";"n ),n Resultn ),n Result,n ";"n ),n Parent.Defaultn)
Bon, le post n’étant pas très large ça n’aide pas non plus mais c’est déjà ça…
Je vois que tu as 3 blocs parfaitement identiques :
Filter(n AddColumns(n AccessManagement,n "Selectedcountries",n If(n IsEmpty(DataCardValue49_1.SelectedItems.Value),n "true",n If(n "yes" in Concat(n ForAll(n DataCardValue49_1.SelectedItems.Value,n If(Value in Country.Value, "yes", "no")n ),n Valuen ),n "true",n "false"n )n )n ),n Selectedcountries = "true"n)
Pour simplifier la maintenance de ton code, ce que je ferais c’est que je mettrais une galerie vide (supposons qu’elle s’appelle Gallery1), masquée, sur l’écran et j’y mettrais cette formule dans sa propriétés Items.
Du coup, ta grosse formule devient :
If(n FormNewHQ.Mode = FormMode.New,n Concat(n Distinct(n Split(n Concatenate(n Concat(n Gallery1.AllItems,n AdminEmailAccess,n ";"n ),n ";",n Concat(n Gallery1.AllItems,n HREmailAccess,n ";"n ),n ";",n Concat(n Gallery1.AllItems,n CentralApproverEmailAccess,n ";"n )n ),n ";"n ),n Resultn ),n Result,n ";"n ),n Parent.Defaultn)
Ce qui est quand même plus lisible… 😉
CommentID=ueu6hQtk5XhurdV, PostID=7sLjiaO0S60z9LY
-
Salut @Sylvain,
Pour faire des “fonctions” (ce que tu appelles des macros 😉) dans Power Apps, c’est-à-dire du code que l’on peut appeler à plusieurs reprises mais où le code n’existe qu’une seule fois dans toute l’application, il y a plusieurs techniques :
-
tu mets un bouton quelque part, tu mets ton bout de code sur sa propriété OnSelect, et pour le déclencher tu fais un
Select(NomDuBouton)
-
tu mets un toggle quelque part, tu mets ton bout de code sur sa propriété OnChange et tu mets
gloExecuteCode
dans sa propriété Default puis lorsque tu veux déclencher le code tu faisSet(gloExecuteCode; Not(gloExecuteCode))
L’inconvénient de ces 2 techniques c’est que tu ne peux pas transmettre de paramètres à ton bout de code. C’est pourquoi il y a une technique plus élégante comme l’indique @Pierre Bourdial (sauf que ce sont pas les Behavior properties mais les Output properties avec l’option Propriétés du composant amélioré activée).
Je m’explique…
Dans ton application, active d’abord l’option en question :
Cela aura pour effet de te rajouter les fonctionnalités suivantes dans les composants (si tu étais déjà sur l’onglet Composants lorsque tu as activé l’option, il faut que tu reviennes sur l’onglet Ecrans puis retour sur Composants pour que ce soit visible) :
Les 2 nouvelles fonctionnalités sont les suivantes :
-
les propriétés de tes composants peuvent désormais avoir des paramètres
-
ton composant peut désormais avoir des propriétés de comportement
Lorsque tu combines des paramètres à une propriété de sortie d’un composant tu peux alors créer une “pseudo-fonction”.
Par exemple, je peux créer un composant qui s’appelle Calcul (dans lequel il n’y a aucun contrôle -> il est vide) où je crée une propriété de sortie de type Nombre qui s’appelle Addition avec 2 paramètres N1 et N2 de type Nombre également :Ensuite, tu définis la valeur de cette propriété à
N1 + N2
:Tu viens de créer une fonction d’addition de 2 nombres quelconques.
Pour l’utiliser tu poses un exemplaire de ton composant sur ton écran (ici Calcul_1), et par exemple dans un libellé tu peux faire ceci :
Sympa non ? Ca ouvre pas mal de possibilités… D’ailleurs, sur le Github de Matthew Devaney tu trouveras des tonnes de fonctions faites par différentes personnes de la communauté… 😉
NOTE – ATTENTION, les 2 techniques (avec le bouton et le toggle) décrites ci-dessus ne sont pas recommandées car la tentation est de placer ces contrôles sur un écran inutilisé visuellement par l’application. Or, Power Apps n’aime pas que sur un écran 1 on fasse référence à un contrôle qui se trouve sur un écran 2. Tout simplement parce-qu’il ne garantit pas que l’écran 1 est instancié (existe) AVANT l’écran 2.
Ainsi, si sur le OnVisible de ton écran 1 tu fais unSelect(btnExecuteCode)
qui est sur un écran 2 mais que par malheur lorsque tu lances ton application Power Apps n’a pas encore eu le temps d’instancier l’écran 2 alors que ton écran 1 est déjà visible, et bien ton code ne s’exécute pas…
Cela est encore plus vrai si jamais l’option suivante est activée sur ton application :Elle augmente les performances de l’application en ne créant les contrôles (et donc les écrans) de ton application que lorsqu’ils sont affichés.
CommentID=4ETqVWksJikudH2, PostID=m9I5cvcPjoEoVGk
-
-
Que se passe-t-il en fait ? Le flux se lance mais il y a une erreur ? Lorsque tu le déclenches depuis le Studio Power Apps est-ce qu’il y a une croix rouge affichée et si oui quel est le message associé ?
Concernant le nom du fichier (“ExportCSV”) je vois pas très bien pourquoi il t’affiche ce message, qui plus est, dans le paramètre d’entrée… C’est un genre de warning ?
Sinon, je vois rien de spécial dans ton code.
Un peu bizarre ton truc. Y’a anguille sous roche à mon avis… 😉
CommentID=kI4b4wJhUgOuOsN, PostID=9TXuyYqzaPfX7IS
-
Alors pour être plus précis, lorsque tu enregistres une donnée dans SharePoint à partir d’un formulaire Power Apps, le champ obligatoire est d’abord vérifié dans Power Apps au niveau du datacard PUIS au niveau de la colonne SharePoint.
Donc si ton datacard est facultatif mais que je ton champ est obligatoire dans SharePoint alors tu ne peux pas enregistrer un item avec ton champ à vide.
Si tu veux que ton champ soit facultatif il faut qu’il soit facultatif à la fois côté Power Apps ET côté SharePoint.
En règle général, je fais comme ceci :
-
toutes mes colonnes SharePoint sont facultatives
-
c’est au niveau des datacards dans Power Apps que je décide quelles champs sont obligatoires ou pas
Note : n’oublie pas que lorsque tu modifies les caractéristiques de ta liste ou de tes colonnes côté SharePoint il faut que tu rafraîchisses ta source de données côté Power Apps pour qu’elle se mette à jour.
CommentID=8bt4z4E4rcYoHf1, PostID=P3kqhLcGFmuRQzy
-
-
R3dKap
Membre16 mars 2022 à 13h50 en réponse à: LookUp function basée sur une combobox (multiple choice)Alors, pour mon test j’ai construis les collections suivantes :
colEmployés
ClearCollect(n colEmployés;n {n Id: 1;n Nom: "Employé 1";n Pays: Table(n {Id: 1; Value: "Allemagne"};n {Id: 2; Value: "Autriche"};n {Id: 3; Value: "Suisse"}n )n };n {n Id: 2;n Nom: "Employé 2";n Pays: Table(n {Id: 1; Value: "Allemagne"};n {Id: 2; Value: "Autriche"}n )n }n)
colPays
ClearCollect(n colPays;n {n Id: 1;n Nom: "Allemagne";n Personnes: Table(n {Id: 1; Value: "A"};n {Id: 2; Value: "B"}n )n };n {n Id: 2;n Nom: "Autriche";n Personnes: Table(n {Id: 1; Value: "A"}n )n };n {n Id: 3;n Nom: "Suisse";n Personnes: Table(n {Id: 3; Value: "C"};n {Id: 4; Value: "D"}n )n }n)
colPersonnes
ClearCollect(n colPersonnes;n {Id: 1; Value: "A"};n {Id: 2; Value: "B"};n {Id: 3; Value: "C"};n {Id: 4; Value: "D"}n)
Sur mon écran j’ai mis une combo box cbxEmployés où
Items = colEmployés
. Donc, dans cbxEmployés.Selected j’ai l’employé sélectionné.L’objectif c’est que si je choisis Employé 1 il me donne ABCD et si je choisis Employé 2 il me donne AB (comme dans ton exemple).
Voici comment j’ai procédé pour monter la formule…
Mon objectif est de filtrer colPays pour ne garder que les pays de l’employé sélectionné et en extraire ensuite les personnes (sans les doublons).
Du coup, d’abord je rajoute une colonne dans colPays pour avoir une concaténation des identifiants des personnes de chaque pays :
AddColumns(n colPays As Pays;n "ConcatPersonnesId";n Concat(Pays.Personnes; Text(Id); ";")n)
Le résultat est le suivant :
Ensuite, je filtre la liste des pays pour ne conserver que les pays de l’employé sélectionné (à droite du in il faut obligatoirement une table à une seule colonne ; c’est pour ça que je fais le ShowColumns() pour ne garder que la colonne Id des pays de l’employé) :
Filter(n <formule précédente>;n Id in ShowColumns(cbxEmployés.Selected.Pays; "Id")n)
Pour l’employé 2 par ex. ça me donne donc ceci :
Après, je concatène tous les ids des personnes identifiées dans la colonne ConcatPersonnesId :
Concat(n <formule précédente>;n ConcatPersonnesId;n ";"n)
Ca me donne donc :
1;2;1
Il faut maintenant que j’élimine les doublons. Pour cela je reconvertis ce résultat en tableau à l’aide du Split() :
Split(<formule précédente>; ";")
Ca me donne :
Puis j’élimine les doublons :
Distinct(<formule précédente>; Result)
Et j’obtiens enfin :
Ces ids correspondants à ceux des personnes qui ont dont les droits d’accès.
La formule complète est donc la suivante :
Distinct(n Split(n Concat(n Filter(n AddColumns(n colPays As Pays;n "ConcatPersonnesId";n Concat(n Pays.Personnes;n Text(Id);n ";"n )n );n Id in ShowColumns(n cbxEmployés.Selected.Pays;n "Id"n )n );n ConcatPersonnesId;n ";"n );n ";"n );n Resultn)
Si tu mets ça dans une galerie, tu peux afficher le nom des personnes avec un libellé où tu mets
LookUp(colPersonnes; Id = Value(ThisItem.Result))
. Il faut convertir le ThisItem.Result en numérique pour que la comparaison avec le Id de colPersonnes fonctionne correctement.Voilou… J’espère que t’arriveras à l’adapter à ton cas de figure… Sinon n’hésite pas à revenir ici… 😉
Je te mets ci-joint la p’tite application que j’ai faite pour simuler ton cas d’usage… A ouvrir directement depuis le studio Power Apps.
CommentID=zaVTYRe1Y4tJ2cz, PostID=7sLjiaO0S60z9LY