

R3dKap
Expert Power AppsForum Replies Created
R3dKap
Member30 mai 2025 at 23h09 en réponse à: Compléter un Word et lancer une séquence d’approbation.🤣 J’adore le Québecois ! Et ça me désole que ce soit une des langues que je n’arrive absolument pas à imiter : je peux te faire le Belge, l’Allemand, l’Arabe, l’Africain, le Chinois, le Japonais, le Russe, l’Américain, ……. mais le Québecois j’y arrive pas… 😅
Bref…
Alors, je dirais : un document Word avec un bouton et des étapes de validation ça s’appelle….. une application ! 🤣
Alors tu peux faire passer un document Word entre les mains de différents valideurs, mais :
- à ma connaissance, tu ne pourras pas envoyer le document en validation à partir d’un bouton dans Word : il faudra plutôt déclencher le processus de validation en sélectionnant le fichier Word dans SharePoint et en choisissant le flux dans le menu Automatiser > Flux > FluxDeValidation
- tu ne pourras pas empêcher les différents intervenants sur le documents de modifier ou d’effacer ce que les p’tits copains précédents auront saisis
- tu ne pourras pas empêcher que des personnes valident alors qu’il manque des informations obligatoires
Mais en fait, tout dépend du processus :
- Qui crée le fichier ?
- Qui le rempli au début ?
- Qui doit envoyer le document en premier et déclencher le processus de validation ?
- Est-ce que les valideurs doivent saisir des informations dans le document ou juste le lire et valider ?
- Est-ce que les valideurs sont les n+1 et n+2 de l’employé ou sont-ils définis quelque part manuellement pour chaque employé ? Peut-il y en avoir plusieurs à chaque niveau ?
- Que se passe-t-il si un valideur est absent ?
- A quelle fréquence y a-t-il ces documents ? Une fois par an et par personne ? 2 fois par an et par personne ?
Tu pourrais le faire avec une simple liste SharePoint avec des colonnes qui représentent les données du document Word. Et il y aurait un flux Power Automate pour le processus de validation.
Maintenant, perso, je ferais ça avec une petite application où il y aurait 2 type de profils (employé, valideur) :
- Ecran Accueil
- Liste les rencontres d’appréciation
- Uniquement MES rencontres lorsque je suis employé
- Toutes les rencontres de MES employés si je suis le N+1 ou le N+2
- La rencontre a un statut Brouillon jusqu’à ce que son créateur décide de la soumettre pour validation -> elle passe alors au statut Soumise
- Il y a un bouton NOUVEAU pour créer une nouvelle rencontre (désactivé si j’ai déjà une rencontre en cours de validation -> règles à définir)
- Lorsque je clique sur une rencontre j’arrive sur l’écran Rencontre
- Liste les rencontres d’appréciation
- Ecran Rencontre
- Formulaire pour Créer/Modifier/Consulter/Valider une rencontre
- Le bouton VALIDER n’est disponible que pour les profils Valideur
- Des champs peuvent être verrouillés ou modifiables selon le profil ou selon le statut de la rencontre (règles à définir)
Et c’est tout… A priori avec 2 écrans tu peux t’en sortir…
😉
Le résultat du GroupBy() est une collection. Donc :
LookUp(colResult; Test = "Portugal").ListeNoms
te renvoie les noms de ce paysComme tu le vois, c’est “dynamique”…
C’est pas ça que tu voulais ?
Tu pourrais afficher le résultat de ce regroupement en imbriquant 2 galeries :
- une première galerie qui liste les pays
- une autre galerie à l’intérieur de la première, pour lister les noms de chaque pays
Salut @Gauthier,
J’ai réussi à utiliser la fonction Graph API que tu utilises pour ajouter un utilisateur à un canal privé Teams. Le format de l’url était la suivante chez moi :
Avec le body suivant :
<div>
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": [],
"user@odata.bind": "https://graph.microsoft.com/v1.0/users/5ce3b743-867c-4133-8d7a-a4d518e422fc"
}<div>Donc, à priori tout ce que tu as fait est correct. Les vérifications que je ferais sont les suivantes :</div>
<div>- Vérifier que l’ID du canal est le bon (et à priori pas besoin de l’encoder ; comme tu le vois, tu peux le mettre brut de fonderie avec les deux-points dedans)
- Vérifier l’ID de l’utilisateur
- Vérifier que tu as bien les droits nécessaires :
- Est-ce que le canal est bien un canal privé (car on ne peut ajouter un utilisateur qu’à un canal privé ; pour les canaux non privés, les membres sont ceux de l’équipe) ?
- L’utilisateur doit être membre de l’équipe avant de pouvoir être ajouté au canal. Est-ce bien le cas ?
- L’utilisateur doit évidemment être présent sur le tenant où se trouve l’équipe Teams. Est-ce bien le cas ?
J’ai fait le test via le Graph Explorer, pas via Power Automate. Mais si ça marche dans l’Explorer, ça doit marcher dans un flux… 😉
</div>
</div>Salut @Sacha,
Voilà j’ai reproduis ta source de données chez moi et j’ai testé les 3 combo box. Voici comment les paramétrer :
- cbxType
- Items =
SortByColumns(Distinct(Sacha; Titre); "Value")
- OnChange =
Reset(cbxConducteur);; Reset(cbxSection)
- Items =
- cbxConducteur
- Items =
SortByColumns(Distinct(Filter(Sacha; Titre = cbxType.Selected.Value); Conducteur); "Value")
- OnChange =
Reset(cbxSection)
- DisplayMode =
If(!IsBlank(cbxType.Selected); DisplayMode.Edit; DisplayMode.Disabled)
- Items =
- cbxSection
- Items =
SortByColumns(Distinct(Filter(Sacha; Titre = cbxType.Selected.Value && Conducteur = cbxConducteur.Selected.Value); Section); "Value")
- DisplayMode =
If(!IsBlank(cbxConducteur.Selected); DisplayMode.Edit; DisplayMode.Disabled)
- Items =
Voilou… 😉
- cbxType
@Sacha,
Ah… Alors c’est tout à fait faisable… Je t’explique ça demain… 😉
Il faudrait juste que tu me décrives précisément comment les 3 types de données (type de câble, conducteur, section) sont organisés : si j’ai bien compris ils sont tous dans la même liste c’est ça ? Chacun dans 1 colonne de la même liste ? Du coup, potentiellement avec des doublons ? Quel est le type de chaque colonne (texte ? lookup ? option ?) ?
Salut @Gauthier,
Pour un débutant tu t’attaques déjà à du semi-lourd… 😅
Tu peux nous montrer le détail de l’action Graph ?
Salut @Laurent,
Au cas où tu cherches encore, la solution doit ressembler à quelque chose comme ceci :
C oncat(LookUp(TaListe; Département = "ValeurDépartement").Personnes; DisplayName; ", ")
C’est ce que tu as fait au final ?
PS : j’ai dû mettre un espace entre le “C” et le “o” du “C oncat” sinon il ne voulait pas m’enregistrer le post… 🫤
Salut Sacha,
Il est possible que ton erreur soit un problème de référence circulaire : en effet, tu ne vas pas pouvoir faire en sorte que chaque liste déroulante s’adapte en fonction l’une de l’autre car cela impliquerait que les valeurs de A dépendent des valeurs de B et que les valeurs de B dépendent des valeurs de A.
Du moins tu ne pourras pas le faire en faisant référence à tes autres listes déroulantes dans les Items de chacune d’elle.
Voici une solution de contournement potentielle (il y aurait sûrement d’autres techniques) :
Screens:
Screen1:
Properties:
LoadingSpinnerColor: =RGBA(56, 96, 178, 1)
Children:
- Button1:
Control: Classic/Button@2.2.0
Properties:
BorderColor: =ColorFade(Self.Fill, -15%)
Color: =RGBA(255, 255, 255, 1)
DisabledBorderColor: =RGBA(166, 166, 166, 1)
Fill: =RGBA(56, 96, 178, 1)
Font: =Font.'Open Sans'
HoverBorderColor: =ColorFade(Self.BorderColor, 20%)
HoverColor: =RGBA(255, 255, 255, 1)
HoverFill: =ColorFade(RGBA(56, 96, 178, 1), -20%)
OnSelect: |
=ClearCollect(
colData,
{
Id: "T1S1",
Type: "T1",
Section: "S1"
},
{
Id: "T1S2",
Type: "T1",
Section: "S2"
},
{
Id: "T1S3",
Type: "T1",
Section: "S3"
},
{
Id: "T2S2",
Type: "T2",
Section: "S2"
},
{
Id: "T2S4",
Type: "T2",
Section: "S4"
}
);
ClearCollect(
colFiltered,
colData
);
PressedBorderColor: =Self.Fill
PressedColor: =Self.Fill
PressedFill: =Self.Color
X: =40
Y: =40
- cbxType:
Control: Classic/ComboBox@2.4.0
Properties:
BorderColor: =RGBA(0, 18, 107, 1)
ChevronBackground: =RGBA(56, 96, 178, 1)
ChevronFill: =RGBA(255, 255, 255, 1)
ChevronHoverBackground: =ColorFade(RGBA(56, 96, 178, 1), -20%)
ChevronHoverFill: =RGBA(255, 255, 255, 1)
DisplayFields: =["Value"]
Font: =Font.'Open Sans'
HoverFill: =RGBA(186, 202, 226, 1)
Items: =Distinct(colFiltered, Type)
OnChange: =ClearCollect(colFiltered, Filter(colData, (IsBlank(cbxType.Selected) || Type = cbxType.Selected.Value) && (IsBlank(cbxSection.Selected) || Section = cbxSection.Selected.Value)))
PressedColor: =RGBA(255, 255, 255, 1)
PressedFill: =RGBA(0, 18, 107, 1)
SearchFields: =["Value"]
SelectMultiple: =false
SelectionColor: =RGBA(255, 255, 255, 1)
SelectionFill: =RGBA(56, 96, 178, 1)
Width: =273
X: =261
Y: =40
- cbxSection:
Control: Classic/ComboBox@2.4.0
Properties:
BorderColor: =RGBA(0, 18, 107, 1)
ChevronBackground: =RGBA(56, 96, 178, 1)
ChevronFill: =RGBA(255, 255, 255, 1)
ChevronHoverBackground: =ColorFade(RGBA(56, 96, 178, 1), -20%)
ChevronHoverFill: =RGBA(255, 255, 255, 1)
DisplayFields: =["Value"]
Font: =Font.'Open Sans'
HoverFill: =RGBA(186, 202, 226, 1)
Items: =Distinct(colFiltered, Section)
OnChange: =ClearCollect(colFiltered, Filter(colData, (IsBlank(cbxType.Selected) || Type = cbxType.Selected.Value) && (IsBlank(cbxSection.Selected) || Section = cbxSection.Selected.Value)))
PressedColor: =RGBA(255, 255, 255, 1)
PressedFill: =RGBA(0, 18, 107, 1)
SearchFields: =["Value"]
SelectMultiple: =false
SelectionColor: =RGBA(255, 255, 255, 1)
SelectionFill: =RGBA(56, 96, 178, 1)
Width: =273
X: =636
Y: =40Inconvénient : lorsque tu as choisi une valeur dans une première liste déroulante, et que tu as choisi une valeur dans la 2è, dans cette dernière tu ne verras plus toutes les valeurs disponibles mais seulement la valeur en cours. Pour voir à nouveau toutes les valeurs disponibles, tu dois supprimer la valeur en cours. Il est donc impératif de laisser leur propriété IsSearchable à true.
Salut @Mickael,
Je sais pas si t’as trouvé ce que tu cherchais, mais voici une technique très simple pour y parvenir :
ClearCollect(
colData;
{
Noms: "Pierre";
Test: "Portugal"
};
{
Noms: "Marie";
Test: "France"
};
{
Noms: "Louis";
Test: "Portugal"
};
{
Noms: "Françis";
Test: "Italie"
};
{
Noms: "Patrice";
Test: "France"
};
{
Noms: "Francine";
Test: "Italie"
}
);;
ClearCollect(
colResult;
GroupBy(
colData;
Test;
ListeNoms
)
);;
Index(colResult; 1).ListeNoms;;// Pierre et Louis
Index(colResult; 2).ListeNoms;;// Marie et Patrice
Index(colResult; 3).ListeNoms;;// Françis et Francine😉
R3dKap
Member24 mai 2025 at 21h54 en réponse à: Enregistrer un fichier dans une bibliothèque SharePoint depuis PowerApps ?Salut Vincent,
Voici une vidéo qui explique comment enregistrer un fichier dans une bib. SharePoint par la méthode “classique” via un flux Power Automate : https://www.youtube.com/watch?v=cjcDH7_v6cE
En voici une autre qui explique comment le faire sans flux Power Automate (un peu plus technique) : https://www.youtube.com/watch?v=n3mhe88BI34&pp=0gcJCdgAo7VqN5tD
😉
Oh oui, les formulaires vont te faire gagner du temps, mais il faut savoir s’en servir.
Je te recommande vivement cette vidéo de @DavidZed sur le sujet : https://dz13n.wordpress.com/2025/02/11/les-formulaires/
😉
R3dKap
Member23 mai 2025 at 10h39 en réponse à: Comment afficher plus d’Affichages dans l’en-tête d’une liste SP ?Salut @GREGOIRE,
C’est évident qu’ils ont fait ça “by design” (c’est voulu), même s’il reste de la place sur la ligne… Tu vas pas pouvoir faire grand chose pour ça malheureusement…
Suggestion : editer le menu de gauche sur le site pour créer une entrée pour la liste et des sous-entrées pour chacune des vues… 😉
Quels sont les rôles de sécurité affectés aux utilisateurs sur l’environnement où se trouvent les flux ?
R3dKap
Member21 mai 2025 at 21h55 en réponse à: Implémenter une notion de "comptage jours consécutifs" dans une galerie.Salut @Sylvain,
L’algorithme va dépendre de la manière dont tu veux détecter ces 6 journées consécutives :
- Est-ce que c’est 6 journées sur une semaine qui s’étale du dimanche au samedi ?
- Est-ce que ces 6 journées peuvent s’étaler à cheval sur 2 semaines ?
- Est-ce que l’algo doit retourner vrai ou faux pour ces 6 journées consécutives entre 2 dates données ?
Mais comme ça au premier abord, à supposer que l’on regarde dans toutes les occurrences de ta collection, je dirais qu’il va falloir :
- initialiser un compteur de jours consécutifs à zéro
- boucler avec un ForAll() sur les items de la collection :
- je regarde si je trouve un item à la date D+1 par rapport à la date de l’item en cours
- si je le trouve :
- si le compteur est égal à 6 alors je sais que j’ai 6 jours consécutifs
- si je ne le trouve pas c’est que je suis sur un trou -> je réinitialise le compteur de jours consécutifs à zéro
Note : pour travailler avec des variables dans une boucle ForAll() (vu qu’on ne peut ni utiliser Set() ni UpdateContext()), il faut utiliser une variable locale de type enregistrement à une colonne (par ex. :
{Value: 0}
) et utiliser la fonction Patch() pour la faire évoluer :Patch(locCompteur; {Value: locCompteur.Value + 1})
.Sinon, est-ce tu peux nous préciser comment est structurée et conmment fonctionne ta collection colTamponPlanningEquipier ?
Tu n’as pas besoin de partager un flux qui est déclenché par Power Apps pour qu’un utilisateur de l’application puisse l’utiliser : le flux est exécutable par toute personne à qui l’application est partagée car c’est l’application qui lance le flux et lui transmet l’identité de l’utilisateur connecté. Dans tous mes projets, je n’ai jamais eu besoin de partager un flux… 😉
Par contre, un utilisateur de l’application ne peut pas voir un flux dans Power Automate qu’il n’a pas lui-même créé s’il n’est pas partagé avec lui.
C’est à ça que servent les options Copropriétaires et Utilisateurs avec autorisations d’exécution uniquement :
- Copropriétaires = en ajoutant ici un utilisateur tu lui donnes tous les droits sur le flux : consultation de l’historique des exécutions, modification du flux, suppression du flux
- Utilisateurs avec autorisations d’exécution uniquement = en ajoutant ici un utilisateur le flux devient visible à cet utilisateur mais ses droits sont limités :
- il peut exécuter le flux manuellement
- il ne peut pas voir le contenu du flux
- il ne peut voir que ses propres exécutions et pas celles des autres, et il ne peut pas voir le détail des exécutons : il ne voit que s’il y a eu succès ou échec
Dans ton cas, le message d’erreur indique que ton flux n’a pas les droits d’accès à un composant de ta solution. Quels sont les connecteurs utilisés par ton flux ? Fait-il des trucs un peu particuliers qui pourraient expliquer qu’il y a un souci d’autorisations, comme par exemple faire appel à un connecteur custom ou ce genre de chose ?