

DavidZed
MemberForum Replies Created
DavidZed
Member14 avril 2025 at 10h30 en réponse à: Rendre visible les lignes d’une liste qui concernent l’utilisateurBonjour,
Tu peux utiliser une Power Apps et ajouter une colonne de type personne ou un champ texte avec l’ID ou l’email de l’utilisateur pour filtrer et afficher les lignes où il apparaît, par contre en terme de confidentialité, ce n’est absoluement pas sécurisé. Sharepoint ne permet pas de faire du RLS (Row level security).
Ce qui signifie que l’utilisateur, dès l’ors qu’il a accès à la liste en lecture, pourra consulter les primes de ses collègues s’il va directement sur la liste sharepoint, sans passer par l’application ou en créant un flux power automate.
Pour imager, cela revient à mettre toutes les données dans une grande armoire dans une pièce à l’abri des regards, dont tous les employés concernés auraient la clé. Cette armoire contiendrait un dossier par employé et on indiquerait à ces derniers qu’ils ne peuvent ouvrir que le dossier à leur nom.
Pour faire du Row level security, il faut à minima une source de donnée Dataverse for Teams (licence standard) ou Dataverse (Premium) qui permettent d’assigner la propriété d’un enregistrement à un utilisateur dans un premier temps et dans un second temps de n’autoriser les utilisateurs à consulter que les enregistrements dont ils sont propriétaires.
DavidZed
Member13 avril 2025 at 0h23 en réponse à: Aide pour automatiser la sauvegarde des pièces jointes d’un projet dans OneDrive“Obtenir la pièce jointe” ne peut pas se trouver en dernier dans la boucle, c’est cette action qui va fournir le contenu du fichier de l’action “Créer un fichier”, elle doit donc être avant
Et bien vérifier que l’action créer un fichier récupère le contenu de “Obtenir la pièce jointe” et non du déclencheur (il est vide)
Hello,
Pour faire les choses dans l’ordre, et vu que tu débutes, je me permet quelques rappels pour m’assurer que tu as bien commencé par certains prérequis :
- être dans un environnement de développement (ou environnement développeur)
- avoir créé une solution “non gérée” pour ton projet Ce qui te permettra de bien gérer l’ALM de ton projet
<h2>Pour ce qui est de ton sujet, les relations :</h2>
Il y a trois types de relations possibles dans dataverse, nous allons prendre une relation entre professeurs, Classes et élèves pour illustrer :
- 1:N (Un à plusieurs)
- Une classe a plusieurs élèves
- N:1 (Plusieurs à Un)
- Chaque classe a un seul professeur principal (Mais un prof peut être le prof principal de plusieurs classes)
- N:N : Plusieurs à plusieurs
- Un professeurs a plusieurs classes, une classe a plusieurs professeurs
<h2>Quelques généralités : </h2>
Les relations 1:N et N:1 sont rigoureusement identiques, seule la cardinalité change. Dans notre exemple on peut voir que les tables élèves et professeurs ont deux relations (Dans Dataverse tu as le même exemple avec les tables contacts et comptes) :
- La relation qui indique qu’un professeur est le prof principal de plusieurs élèves / Un èleve ne peut avoir qu’un prof principal.
- La relation qui indique qu’un élève peut avoir cours avec plusieurs professeurs / que les professeurs peuvent faire cours à plusieurs élèves.
Une table peut également avoir une relation avec elle même.
On peut remplacer une relation N:N par une table intérmédiaire et deux relations 1:N, pour reprendre l’exemple de tout à l’heure (N professeurs : N classes), on peut remplacer cette relation en créant une table “Cours” qui contiendrait:
- une relation 1:N vers les professeurs
- une relation 1/N vers les classes
- éventuellement des informations supplémentaires ratachées au cours : la matière, les horaires, la salle etc… (ce qui serait impossible avec une relation N:N)
- Cette approche est à privilégier dans les applications Canevas car la gestion des relations N:N y est fastidieuse
<h2>Pour créer une relation</h2>
On peut passer par section relations d’une table, ce qui permet de créer n’importe quel type de relation et cardinalité :
Mais pour les relations N:1, il y a plus simple (Et surtout plus intuitif !) : il suffit d’ajouter une colonne de type recherche / lookup dans la table N
L’inverse est également vrai, si on crée une relation 1:N ou N:1 directement dans la section “Relations” d’une table, une colonne lookup / recherche sera créé dans la table N
Un nouvel outil permet de créer des tables et les liasons entre elles à l’aide d’un éditeur d’ERD, qui offre une interface visuelle également plus intuitive, mais attention, il est utilisé surtout pour créer de nouvelles tables et l’ajout de tables existentes n’est pas encore pris en charge (ça arrivera prochainement)
Quelques ressources pour aller plus loin :
DavidZed
Member11 avril 2025 at 20h05 en réponse à: Aide pour automatiser la sauvegarde des pièces jointes d’un projet dans OneDriveHello, dans ta boucle, il manque une action “Obtenir la pièce jointe” (Office 365 Outlook)
Sans cela tu ne pourras pas récupérer le contenu des pièces joints
DavidZed
Member7 avril 2025 at 12h40 en réponse à: Zone de liste déroulante dans un formulaire de modificationHello,
Partant du principe que la colonne REF est bien une colonne de type recherche qui pointe vers la liste ARTICLES.
Dans mon exemple j’utilise une liste ‘Expense tracker’ (A remplacer par ta liste principale) qui a une colonne Ticket(a remplacer par REF) qui pointe vers la liste Tickets (a remplacer par ARTICLE).
Pour alimenter une colonne recherche, SP a besoin d’un enregistrement comrenant deux champs
Id : qui indique l’ID de la liste destination (dans ton cas ARTICLE)
Value: La valeur de la colonne choisie dans la configuration de la colonne recherche (le plus souvent Titre ou Title)
La fonction Choices(Liste.NomdeColonne) établit une liste des choix possibles pour une colonne, dans une colonne recherche, elle va lister les éléments de la liste destination dans une table compatible avec le format attendu par le champ REF : Id & Value
Si on remplace la fonction choices par la source de données directement, le format sera complètement différent :
Pour convertir le format dans ton formulaire il y aura deux choses à faire:
- Modifier la propriété “Update” du datacard et remplacer
DataCardValueXX.Selected par
{Id:DataCardValueXX.Selected.ID; Value: DataCardValueXX.Selected.Title} - Modifier la propriété “DefaultSelectedItems” de la liste déroulante (DatacardValueXX) et remplacer
<div>
<div>[Parent.Default] par :
Lookup(ARTICLES;ID =ThisItem.REF.Id)</div>
<div> </div>
<div>Tu pourras ensuite modifier le champ affiché dans ta liste déroulante pour n’importe quelle colonne de ta liste ARTICLES</div>
</div>
- Modifier la propriété “Update” du datacard et remplacer
Dans ce cas c’est le comutateur/bascule qui est en cause, effectivement si la boucle Do Until est dans un “container” (Portée, condition, bascule), l’action container a besoin que toutes les actions qu’elle contient soient terminées (ignorées, succès ou error).
Pour remédier, il faut duppliquer le commutateur/bascule dans une branche parrallèle et mettre l’approbation et la mise à jour de la variable dans le premier et la relance dans le second
DavidZed
Member4 avril 2025 at 7h21 en réponse à: Compter le nbr d'enregistrements identiques, et intégrer ce nbr dans une tableSi c’est pour de l’affichage uniquement, tu peux utiliser une galerie avec en source la liste des mois (1 à 12) :
Sequence(12)
Dans cette galerie, tu pourrais disposer 3 TextLabel :
- NomDuMois : Text(Date(2025; ThisItem.Value; 1); “dddd”)
- NbrDemande : CountIf(MaCollection; Month(Date_Demande) = ThisItem.Value)
- NbrRendu : CountIf(MaCollection; Month(Date_Delai) = ThisItem.Value)
Attention, à utiliser avec une collection filtrée sur l’année uniquement et un jeu de données pas trop volumineux
Hello,
Je ne suis pas sûr de bien comprendre, peux-tu préciser à l’aide d’un diagrame ou d’un schéma comment sont ordonnées tes tables et ce que tu souhaites supprimer automatiquement ?
Hello,
Effectivement, ce n’est pas possible avec un contrôle html car celui-ci ne gère que le inline styling et non le cascading style sheets (CSS) et il n’est pas non plus possible d’afficher une source externe dans ce contrôle.
Les alternatives :
- Utiliser un composant PCF
- Utiliser l’objet “Carte” (premium)
- Utiliser un objet image avec un service qui génère des cartes au format pixel à la volée exemple : How to add a Google Map to a PowerApp – Collab365
collab365.com
How to add a Google Map to a PowerApp - Collab365
I love maps and adding a map to an app even a static one, adds that special touch. This post is an introduction to adding a Static Google map to a Power App. I will keep things simple as I … Continue reading
Hello,
La solution de @Nicolas fonctionne, la branche avec la boucle “do until” d’envoi des relances n’est pas censée se raccrocher sur la branche de gauche une fois terminée. C’est en quelquesorte une branche en cul-de-sac.
Par contre j’aurai tendance à ajouter un “Terminer le flux” sur la branche de gauche, car une fois la réponse donnée, la boucle “do until” devra attendre la fin du délai pour que le flux se termine, cela peut se traduire avec des flux qui apparaissent à l’état “en cours d’éxecution” dans l’historique jusqu’à 24 h après que l’approbation ait été terminée.
Quant à la solution que je proposais, il s’agissait d’un simple flux plannifié, qui va lister les éléments dont l’approbation est au statut “En cours” et pour chaque aprobateur concerné, lui envoyer un tableau récap des éléments qui attendent une approbation de sa part.
Mais cela suppose de stocker le statut d’approbation et l’approbateur dans une colonne de la source de données.
Ok, ça complexifie pas mal le problème…
dans ce cas de figure, il faudra créer une boucle sur chaque ligne excel :
- En première action dans la boucle tu ajoutes un “obtenir les éléments” (SharePoint) avec en requête de filtre :
No eq ‘<Valeur dynamique de NO de la ligne Excel>’ - Ensuite il faudra ajouter une condition sur l’expression : Lenght(outputs(‘obtenir_les_éléments’)?[‘body/value’]) >0
- Dans la branche false, tu peux mettre ton action de création de ligne
- Dans la branche true, il faudra mettre l’action “mettre à jour un élément” avec pour l’ID, l’expression : first(outputs(outputs(‘obtenir_les_éléments’))?[‘body/value’])?[‘ID’]
Le first est indispensable pour éviter de générer une nouvelle boucle.
Et pour les autres valeurs, récupérer les valeur de la boucle actuelle
- En première action dans la boucle tu ajoutes un “obtenir les éléments” (SharePoint) avec en requête de filtre :
Hello,
Je pense que l’ID renseigné n’est pas le bon :
Si tu mets à jour une ligne depuis un fichier excel, il faut que l’excel contienne et fournisse l’ID de la ligne SharePoint à mettre à jour
C’est d’ailleurs une étape à ajouter dans la branche création d’un élément : ajouter l’ID de l’item SharePoint nouvellement créé dans le fichier Excel, ce qui permettra de savoir quelle ligne mettre à jour et par le même occasion, indiquera que la ligne a déjà été créée.Pour la date il faudra peut être la fournir au format excel: Nb de jours écoulés depuis le 01/01/1900
Hello,
Quand tu appelles une image, par défaut c’est un thumbnail (apperçu) qui est chargé par défaut. Tu peux appeller l’image en pleine résolution en ajoutant un .Full à la suite de ton appel :
ThisItem.NomColonneImage.Full
Gallery1.Selected.NomColonneImage.Full
etc…
DavidZed
Member29 mars 2025 at 9h38 en réponse à: Probleme Affichage des fichiers dans une bibliotheque de documents.Hello, c’est un problème de délégation avec le filter dans ton clearcollect : Year() n’est pas une fonction délégable à SharePoint, c’est généralement signalé par un signe danger jaune et la partie non délégable est soulignée en jaune dans la formule :
Voici donc ce qu’il se passe quand tu fais une telle requête :
- Power apps demande à SharePoint de lui retourner tes résultats filtrés
- SharePoint ne comprenant pas le Year() se contente de renvoyer tous les résultats et dis à Power Apps : “Débrouille toi pour filtrer tout seul”
- Power apps ne récupère que les 500 à 2000 premiers éléments* et applique sont filtre tout seul comme un grand.
(*) en fonction de ce que tu as mis ici :
Ce qui fait que tu ne vois que 3 items sur 5 dans ton dossier, c’est parceque les 3 premiers éléments on eu la chance de figurer parmis les 500 ou 2000 premiers éléments de ta bibliothèque, les deux autres étaient après et n’ont tout simplement pas été traités.
La démarche est bonne : utiliser une collection puis filtrer la collection sur le chemin de dossier qui elle même n’est pas délégable. La seule chose qui manque c’est que le clearcollect qui alimente cette collection soit lui même délégable et effectivement que la collection soit chargée par moins de 500 ou 2000 éléments.
Tu peux donc remplacer le clear collect par cette formule :
//ClearCollect(ColDOCUMENT_PLANNING;Filter(DOCUMENT_PLANNING;Year(Créé)>(Year(Today())-1))); // a remplacer par :
ClearCollect(ColDOCUMENT_PLANNING;Filter(DOCUMENT_PLANNING;Créé > Date(Year(Today())-1;1;0);Créé < Date(Year(Today());1;1)))
-
This reply was modified 3 weeks ago by
DavidZed.
Hello,
C’est un comportement spécifique sur mobile (On retrouve cette fonctionnalité sur toutes les apps android / Ios qui proposent d’uploader une image), qui n’est malheureusement pas dsiponible sur navigateur.
La seule alternative pour prendre des photos avec une webacm sur un pc est d’utiliser le contrôle caméra ou d’utiliser l’application “camera” de windows pour prendre un cliché et l’uploader dans un second temps en tant que fichier.