

R3dKap
Expert Power AppsForum Replies Created
Tu n’as besoin que d’un seul formulaire car nativement un formulaire peut prendre 3 états :
- création
- modification
- affichage
Pour définir l’état du formulaire, il y a 2 possibilités :
- Définir une variable avec l’état et positionner cette variable sur la propriété DefaultMode du formulaire
- Utiliser les fonction NewForm(), EditForm() et ViewForm()
Dans le premier cas, par exemple sur ton écran Câble ZPAU :
- lorsque tu cliques sur le bouton Crayon d’une ligne, tu y mets le code :
Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"; locFormMode: FormMode.Edit})
- lorsque tu cliques sur le bouton Flèche tu y mets le code :
Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"; locFormMode: FormMode.View})
- et lorsque tu cliques sur l’icône “+” :
Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"; locFormMode: FormMode.New})
Et ensuite, sur l’écran DétailsTouret, tu mets la variable locFormMode sur la propriété DefaultMode du formulaire. Je préfère cette solution car je peux utiliser cette variable à différent endroit de mon écran pour différents besoins (autoriser des boutons, masquer des éléments, etc.).
Dans le 2è cas, tu modifies l’état du formulaire AVANT de naviguer :
- sur le bouton Crayon tu mets :
EditForm(FormTouretZPAU);; Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})
- sur le bouton Flèche tu mets :
ViewForm(FormTouretZPAU);; Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})
- sur le bouton “+” tu mets :
NewForm(FormTouretZPAU);; Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})
En fait, ces fonctions positionnent le statut du formulaire quelle que soit la valeur de la propriété DefaultMode (il n’en tient pas compte).
R3dKap
Member25 avril 2025 at 11h24 en réponse à: Récupérer les données depuis un fichier Excel déposé sur Sharepoint (+condition)Salut Tram Anh,
C’est probablement dû à ton test sur la date car soit les formats ne correspondent pas, soit (puisqu’il n’y a pas d’heures associée aux dates) le décalage horaire entre la date dans le fichier Excel et celui du utcNow() fait que elles ne sont pas sur le même jour. Il faut commencer par regarder ce que te renvoies précisément (sous quel format) l’action Lister les lignes présentes dans un tableau au niveau de la colonne Reception date.
Mais franchement, j’hallucine de voir la quantité de gens qui essaie de manipuler des données dans des fichiers Excel avec Power Automate ou Power Apps. C’est faisable mais c’est vraiment galère. Je sais que ça tient du fait que les entreprises migrent petit à petit des fichiers Excel vers la Power Platform mais je crois fermement que c’est justement l’occasion d’inviter les utilisateurs de ces fichiers Excel à basculer définitivement sur SharePoint.
Une liste dans SharePoint c’est comme un tableau dans Excel. Sauf que c’est vachement plus simple à manipuler derrière avec du Power Automate ou du Power Apps.
Dans ton cas de figure, on pourrait très bien imaginer une liste SharePoint qui reproduirait exactement ce qu’il y a dans ton fichier de suivi des isolés, et ensuite un petit flux très simple qui filtre les lignes de cette liste où la date de réception correspondrait à la date du jour pour la recopier dans une autre liste appelée Contrats. Beaucoup plus simple que de bosser sur des fichiers Excel. Les fichiers Exel c’est bien EN DEHORS de la Power Platform en fait, si je devais résumer… 😆
Mais ce n’est que mon humble avis…
Salut @Sacha,
Ce que tu veux faire n’est pas possible, en tout cas pas de cette manière : un formulaire ne peut pas prendre comme source de données une variable où la source de données changerait inopinément.
Tu dois mettre 5 formulaires sur ton écran de détail (ou faire 5 écrans de détail, au choix) : un pour chaque liste. Puis, tu affiches le formulaire (ou tu choisis l’écran) en fonction du type de câble.
J’en profite pour te signaler que la bonne pratique pour transmettre des données d’un écran à l’autre consiste à utiliser le 3è paramètre de la fonction Navigate(). Ce 3è paramètre est un enregistrement dont les colonnes vont être des variables locales créées uniquement sur l’écran cible.
Donc, par exemple, sur l’écran CâbleZPAU :
- OnSelect de la flèche :
Navigate(DetailsTouret; ScreenTransition.Fade; {locSelectedTouret: ThisItem; locTypeCâble: "ZPAU"})
Sur l’écran DetailsTouret :
- DataSource du formulaire :
Stock_ZPAU
- Item du formulaire :
locSelectedTouret
- Visible du formulaire :
locTypeCâble = "ZPAU"
Etc…
- OnSelect de la flèche :
Salut @Sacha,
Etant donné que ton formulaire doit fonctionner à la fois en mode PC et en mode mobile, voici comment je configurerai le conteneur vertical et le formulaire pour que ça fonctionne correctement :
Container1.LayoutJustifyContent = LayoutJustifyContent.Start
(les contrôles partent du haut et descendent vers le bas)Container1.LayoutAlignItems = LayoutAlignItems.Center
(on centre les contrôles horizontalement)Container1.Width = Parent.Width
Container1.Height = Parent.Height
Container1.LayoutGap = 20
(pour mettre un peu d’espace entre le formulaire et le bouton du bas)Container1.PaddingBottom = 20
(pour que le bouton du bas ne soit pas collé au bord de l’écran)Form1.AlignInContainer = AlignInContainer.SetByContainer
Form1.Width = Parent.Width - Parent.PaddingLeft - Parent.PaddingRight
(la soustraction des paddings c’est au cas où tu décides un jour de mettre un padding gauche ou droite sur le conteneur parent du formulaire)Form1.FillPortions = 1
(pour être sûr que le formulaire repousse le bouton le plus possible vers le bas)
Ensuite, tout va se jouer sur les Width des datacards du formulaire en fonction de ce que tu voudras obtenir au final (car par défaut ils ont une valeur fixe qui est recalculée lorsque tu changes le nombre de colonnes de ton formulaire –> attention d’ailleurs, car lors de cette manip’ toutes les formules dans les propriétés Width de tes datacards sont écrasées par la nouvelle valeur fixe ; donc faut bien choisir ton nombre de colonnes au départ et ne plus le modifier ensuite).
Tout d’abord, il faut que tu saches qu’il existe 4 taille d’écrans dans Power Apps (source) :
Du coup, ce que tu peux faire par exemple, c’est de répartir le nombre de champs que tu veux dans une ligne du formulaire sur les 4 dimensions d’écran en mettant la formule suivante dans le Width de chaque datacard :
Parent.Width / (Int(3 * App.ActiveScreen.Size/ScreenSize.ExtraLarge))
Si tu veux 6 champs par ligne, tu remplaces le 3 par un 6.
Note : pour te faciliter la vie, si tu es ok pour que tous tes datacards aient la même largeur, tu peux mettre la formule sur le premier datacard puis “brancher” le Width de tous les autres datacards sur celui du premier… 😉
PS : tu devrais utiliser les contrôles modernes car ils vont être de plus en plus présents dans les applications Power Apps désormais… 😉
R3dKap
Member22 avril 2025 at 20h53 en réponse à: Problème d’update de données volumineuses (200k+ lignes) dans DataverseOh pinaiz, le coup du trigger au milieu du flux jamais j’y aurais pensé… Ca laisse entrevoir des trucs intéressants… 😋
Salut @Yvan,
Dans ce genre de cas de figure ce que je fais :
- un mini-flux avec juste une action Otbtenir l’élément où je spécifie manuellement l’ID d’une ligne de la liste où la case est cochée
- je lance le flux
- je regarde le résultat de l’action pour voir quelle valeur il y a dans le champ de la case
Et du coup, je fais mon test en connaissance de cause avec la bonne valeur… 😉
R3dKap
Member22 avril 2025 at 14h30 en réponse à: Problème d’update de données volumineuses (200k+ lignes) dans DataverseJe pense à un truc : et planifier le lancement du dataflow via un flux ?
Ah ok… Bin la seule chose que tu peux éviter de “retaper” à chaque fois c’est l’url du serveur SharePoint : https://xxxx.sharepoint.com. Tu peux juste mettre : /sites/TonSite/TaBib/TonFichier.pdf.
Ok. Vu que c’est une canevas, tu peux faire quasiment tout ce que tu veux. Par contre, n’hésite pas à expliquer ici comment tu vas structurer ton application. Comme ça je pourrais t’aider à la concevoir proprement.
Si tu peux juste décrire pour l’instant les écrans que tu as prévu, avec les différentes actions possibles sur chaque écran ça serait déjà un bon début.
Je pourrais aussi t’expliquer comment gérer tes données intelligemment grâce aux propriétés améliorées des composants. Et te donner des bonnes pratiques générales…
Si tu as déjà commencé, tu peux aussi mettre ici des captures d’écrans pour que je puisse te donner des conseils sur le design…
Vu ton modèle de données qui n’est pas des plus basique, il faut que tu conçoives bien l’application pour qu’elle soit bien adoptée.
D’ailleurs, est-ce une application PC ou mobile ?
R3dKap
Member18 avril 2025 at 19h40 en réponse à: Problème de dimension d'un composant dans une section de pageVoici le bon code pour le bouton :
{
"$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
"elmType": "a",
"attributes": {
"href": "[$Lien_x0020_vers_x0020_fiche]",
"target": "_blank"
},
"style": {
"text-decoration": "none"
},
"children": [
{
"elmType": "button",
"style": {
"background-color": "#0078d4",
"color": "white",
"border": "none",
"padding": "6px 12px",
"border-radius": "4px",
"cursor": "pointer"
},
"txtContent": "Ouvrir"
}
]
}Pour ce qui est de ta liste qui ne prend pas toute la largeur, je vois pas trop… Pourquoi avoir fait une page pas accéder directement à la liste ? C’est juste pour la jolie entête ?
En fait, si tu as bien créé une colonne Lien hypertexte tu as en réalité 2 champs que tu peux renseigner :
Le premier pour l’url. Et le second te permet d’avoir un joli libellé affiché à la place de l’url. Donc, tu peux très bien avoir un lien qui s’affiche Fiche mais qui pointe vers ta longue url locale… 😉
Salut @Bruno,
Pourquoi ne pas créer directement une liste SharePoint où dans la colonne Titre tu pourrais mettre la question, et rajouter une colonne Fiche de type hyperlink où tu mettrais les liens vers vos fiches de processus ?
Les utilisateurs pourraient alors utiliser le moteur de recherche natif de SharePoint pour trouver la bonne question et donc les bonnes fiches… 😉
Salut @Vincenzo,
Voici ce que m’a répondu ChatGPT 😅 :
Oui, c’est tout à fait possible d’écrire dans une table Dataverse depuis une API Java externe — et c’est même une architecture courante dans des projets hybrides (apps web back-end Java + Power Platform côté métier).
Voici comment tu peux le faire. 👇
<hr>
<h2>✅ Méthodes pour écrire dans Dataverse depuis Java</h2>
<h3>🔑 1. Utiliser l’API Web de Dataverse (Web API REST)</h3>Dataverse expose une API RESTful OData v4 qui te permet de créer, lire, mettre à jour, supprimer des enregistrements.
👉 Tu peux l’appeler directement depuis Java via
HttpClient
,RestTemplate
,HttpURLConnection
, etc.<h4>Exemple : Requête HTTP POST pour créer une ligne</h4>
URL :
https://<environment>.crm.dynamics.com/api/data/v9.2/<nom_table_logique_plural>
Méthode :
POST
Headers :
Authorization: Bearer <token>
Content-Type: application/json
OData-Version: 4.0
Body JSON :
<code class="language-json">{ "nomduchamp_logique1": "valeur1", "nomduchamp_logique2": "valeur2" }
<hr>
<h2>🔐 2. Authentification : Azure AD (OAuth 2.0)</h2>Tu dois d’abord obtenir un jeton d’accès (access token) via Azure Active Directory.
<h3>Étapes :</h3>
Enregistre ton application Java dans Azure AD (via Azure Portal)
Donne-lui les droits d’accès à Dataverse (API Dynamics 365)
Utilise le client credentials flow (client ID + secret) ou authorization code flow (si un user est impliqué)
<h4>Exemple d’URL de token :</h4>
POST https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/token
<h4>Body (x-www-form-urlencoded) :</h4>
client_id=xxxx client_secret=xxxx grant_type=client_credentials scope=https://<environment>.crm.dynamics.com/.default
👉 En réponse, tu obtiens un
access_token
à injecter dans les headers d’appel REST.<hr>
<h2>🧠 Exemple Java avec HttpClient (simplifié)</h2><code class="language-java">HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://<env>.crm.dynamics.com/api/data/v9.2/<nom_table_logique_plural>")) .header("Authorization", "Bearer " + accessToken) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString("{ \"champ1\": \"valeur\" }")) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.statusCode()); System.out.println(response.body());
<hr>
<h2>🧩 Autres options (moins directes)</h2>
<table>
<thead>
<tr>
<th>Méthode</th>
<th>Détail</th>
</tr>
</thead>
<tbody>
<tr>
<td>🔁 Azure Function intermédiaire</td>
<td>Java appelle une Azure Function qui écrit dans Dataverse via Power Platform</td>
</tr>
<tr>
<td>📩 Appeler un flux Power Automate via HTTP</td>
<td>Tu exposes un flux avec un connecteur HTTP entrant, et ton Java appelle ce flux (plus simple que l’auth Azure pour certains cas)</td>
</tr>
<tr>
<td>🔗 Intégration via Service Bus / Event Grid</td>
<td>Pour des scénarios asynchrones plus avancés</td>
</tr>
</tbody>
</table>
<hr>
<h2>🚀 Besoin d’un coup de main ?</h2>Je peux t’aider à :
Générer une requête POST Java prête à l’emploi
T’orienter sur l’enregistrement de l’app Azure AD
T’indiquer les noms de tables/champs logiques dans Dataverse
Ou même te générer un mini module Java réutilisable
Tu veux une démo sur un exemple précis ? Quelle table tu veux écrire dans Dataverse ?
Ok. Mais du coup je vois pas l’intérêt d’avoir une table supplémentaire Ouverture dans laquelle il y aurait qu’un seul champ Type (Fenêtre et/ou Porte).
Ton objectif c’est de regrouper les champs communs dans Ouverture et de n’avoir dans Fenêtre et Porte que les champs spécifiques aux fenêtres et aux portes ?
IMPORTANT : est-ce que tu fais une application model-driven ou une canevas ? Passke dans la canevas, tu peux très bien afficher les champs comme bon te semble en fonction de tes données. Dans la model-driven c’est plus compliqué.
Dans ce dernier cas (model-driven), il faudrait probablement que tu utilises un lookup polymorphique : https://learn.microsoft.com/fr-fr/power-apps/maker/canvas-apps/working-with-references
J’ai encore jamais utilisé perso, mais ça pourrait répondre à ton pb…
Tu peux nous détailler les éléments des ouvertures en précisant quels champs pour fenêtre et lesquels pour porte ?