<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Bilel Benaouda — Power Platform &amp; Copilot Studio</title>
    <link>https://bilelbenaouda.com/</link>
    <description>Articles techniques sur la Power Platform et Copilot Studio : architecture, ALM, Dataverse, Power Automate, Power Apps et agents.</description>
    <language>fr</language>
    <atom:link href="https://bilelbenaouda.com/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Certifications Power Platform : lesquelles passer en 2026 (et dans quel ordre) ?</title>
      <link>https://bilelbenaouda.com/blog/certifications-power-platform-lesquelles-passer-en-2026-et-dans-quel-ordre/</link>
      <guid isPermaLink="true">https://bilelbenaouda.com/blog/certifications-power-platform-lesquelles-passer-en-2026-et-dans-quel-ordre/</guid>
      <pubDate>Tue, 03 Mar 2026 13:27:33 GMT</pubDate>
      <description>Quand on commence à travailler sérieusement sur Power Platform, une question revient vite : quelle certification Microsoft passer ?</description>
      <category>News</category>
      <content:encoded><![CDATA[<p>Quand on commence à travailler sérieusement sur Power Platform, une question revient vite : <strong>quelle certification Microsoft passer ?</strong></p>
<p>PL-900, PL-200, PL-300, PL-400, PL-500, PL-600…</p>
<p>Le problème, c’est que la liste est longue, certains examens évoluent, et beaucoup de gens passent “la mauvaise certif” par défaut.</p>
<p>L’objectif de cet article est simple : vous aider à comprendre <strong>à quoi servent les certifications Power Platform</strong>, quelles sont celles qui existent réellement aujourd’hui, et surtout <strong>laquelle choisir selon votre profil</strong>.</p>
<h2 id="1-à-quoi-sert-une-certification-power-platform-">1. À quoi sert une certification Power Platform ?<a class="anchor" aria-label="Lien vers cette section" href="#1-à-quoi-sert-une-certification-power-platform-">#</a></h2>
<p>Une certification Microsoft n’est pas juste un badge LinkedIn. Bien utilisée, elle sert à 3 choses.</p>
<h3 id="1-structurer-votre-apprentissage">1) Structurer votre apprentissage<a class="anchor" aria-label="Lien vers cette section" href="#1-structurer-votre-apprentissage">#</a></h3>
<p>Power Platform est vaste : Power Apps, Power Automate, Dataverse, Power BI, gouvernance, sécurité, ALM…</p>
<p>Quand on apprend en autodidacte, on maîtrise souvent seulement ce qu’on utilise au quotidien.</p>
<p>Une certification oblige à couvrir les sujets “invisibles” mais indispensables en entreprise (licensing, sécurité, solutions, déploiement…).</p>
<h3 id="2-prouver-votre-niveau-de-manière-crédible">2) Prouver votre niveau de manière crédible<a class="anchor" aria-label="Lien vers cette section" href="#2-prouver-votre-niveau-de-manière-crédible">#</a></h3>
<p>Pour un recruteur, un client ou une DSI, une certification permet de valider rapidement que vous connaissez :</p>
<ul>
<li>les concepts fondamentaux,</li>
<li>les bonnes pratiques Microsoft,</li>
<li>et le vocabulaire “officiel”.</li>
</ul>
<p>Ce n’est pas parfait, mais c’est un signal clair.</p>
<h3 id="3-accélérer-votre-progression-professionnelle">3) Accélérer votre progression professionnelle<a class="anchor" aria-label="Lien vers cette section" href="#3-accélérer-votre-progression-professionnelle">#</a></h3>
<p>En freelance ou en cabinet, les certifications peuvent servir à :</p>
<ul>
<li>rassurer un prospect,</li>
<li>justifier un TJM plus élevé,</li>
<li>être positionné sur des missions plus stratégiques,</li>
<li>renforcer votre légitimité sur LinkedIn.</li>
</ul>
<h2 id="2-ce-quune-certification-ne-remplace-pas">2. Ce qu’une certification ne remplace pas<a class="anchor" aria-label="Lien vers cette section" href="#2-ce-quune-certification-ne-remplace-pas">#</a></h2>
<p>Il faut être lucide : une certification ne prouve pas que vous êtes “bon en projet”.</p>
<p>Ce qu’elle ne remplace pas :</p>
<ul>
<li>l’expérience réelle en production,</li>
<li>la gestion de la performance et des erreurs,</li>
<li>l’ALM en conditions réelles,</li>
<li>la gouvernance (DLP, environnements, rôles, CoE…),</li>
<li>la capacité à cadrer un besoin métier.</li>
</ul>
<p>👉 La certification est un accélérateur, pas une preuve absolue.</p>
<h2 id="3-comment-microsoft-structure-les-certifications-power-platform">3. Comment Microsoft structure les certifications Power Platform<a class="anchor" aria-label="Lien vers cette section" href="#3-comment-microsoft-structure-les-certifications-power-platform">#</a></h2>
<p>Microsoft organise ses certifications par niveaux.</p>
<h3 id="niveau-fundamentals">Niveau Fundamentals<a class="anchor" aria-label="Lien vers cette section" href="#niveau-fundamentals">#</a></h3>
<p>C’est le niveau “vision globale”.</p>
<p>Idéal pour démarrer, comprendre l’écosystème, et parler le bon langage.</p>
<h3 id="niveau-associate--specialty">Niveau Associate / Specialty<a class="anchor" aria-label="Lien vers cette section" href="#niveau-associate--specialty">#</a></h3>
<p>C’est le niveau “professionnel opérationnel” :</p>
<ul>
<li>maker avancé,</li>
<li>consultant fonctionnel,</li>
<li>analyste BI,</li>
<li>développeur,</li>
<li>expert RPA.</li>
</ul>
<p>C’est le niveau le plus rentable pour une carrière.</p>
<h3 id="niveau-expert">Niveau Expert<a class="anchor" aria-label="Lien vers cette section" href="#niveau-expert">#</a></h3>
<p>C’est le niveau architecture et décisions complexes, réservé aux profils expérimentés.</p>
<h2 id="4-panorama-clair-des-certifications-power-platform-disponibles">4. Panorama clair des certifications Power Platform disponibles<a class="anchor" aria-label="Lien vers cette section" href="#4-panorama-clair-des-certifications-power-platform-disponibles">#</a></h2>
<p>Voici les certifications Power Platform principales (les plus connues et les plus utiles).</p>
<h3 id="pl-900--power-platform-fundamentals">PL-900 — Power Platform Fundamentals<a class="anchor" aria-label="Lien vers cette section" href="#pl-900--power-platform-fundamentals">#</a></h3>
<p>La certification d’entrée.</p>
<p>Elle valide que vous comprenez :</p>
<ul>
<li>Power Apps, Power Automate, Power BI, Power Pages,</li>
<li>Dataverse,</li>
<li>les concepts de connecteurs,</li>
<li>la logique low-code.</li>
</ul>
<p>➡️ Parfait pour démarrer, ou pour un profil non technique (chef de projet, manager, AMOA).</p>
<h3 id="pl-200--power-platform-functional-consultant">PL-200 — Power Platform Functional Consultant<a class="anchor" aria-label="Lien vers cette section" href="#pl-200--power-platform-functional-consultant">#</a></h3>
<p>La certification “terrain entreprise”.</p>
<p>Elle couvre :</p>
<ul>
<li>Dataverse (tables, relations, business rules),</li>
<li>sécurité (rôles, BU, partage, FLS),</li>
<li>solutions et ALM,</li>
<li>automatisation Power Automate,</li>
<li>intégrations Microsoft 365.</li>
</ul>
<p>➡️ C’est souvent la plus pertinente pour les consultants et freelances.</p>
<h3 id="pl-300--power-bi-data-analyst">PL-300 — Power BI Data Analyst<a class="anchor" aria-label="Lien vers cette section" href="#pl-300--power-bi-data-analyst">#</a></h3>
<p>La certification Power BI.</p>
<p>Elle valide surtout :</p>
<ul>
<li>Power Query,</li>
<li>modélisation,</li>
<li>DAX,</li>
<li>optimisation,</li>
<li>déploiement, RLS, gouvernance Power BI.</li>
</ul>
<p>➡️ À prendre si Power BI est une vraie compétence principale.</p>
<h3 id="pl-400--power-platform-developer">PL-400 — Power Platform Developer<a class="anchor" aria-label="Lien vers cette section" href="#pl-400--power-platform-developer">#</a></h3>
<p>La certification pro-code.</p>
<p>Elle couvre :</p>
<ul>
<li>Dataverse SDK,</li>
<li>plugins,</li>
<li>PCF,</li>
<li>Web API,</li>
<li>intégrations avancées,</li>
<li>ALM technique.</li>
</ul>
<p>➡️ Très valorisée, mais exige une vraie expérience dev.</p>
<h3 id="pl-500--power-automate-rpa-developer">PL-500 — Power Automate RPA Developer<a class="anchor" aria-label="Lien vers cette section" href="#pl-500--power-automate-rpa-developer">#</a></h3>
<p>La certification orientée automatisation desktop.</p>
<p>Elle valide :</p>
<ul>
<li>Power Automate Desktop,</li>
<li>UI automation,</li>
<li>orchestration cloud + desktop,</li>
<li>monitoring et déploiement RPA.</li>
</ul>
<p>➡️ Très utile si votre spécialité est la RPA.</p>
<h3 id="pl-600--power-platform-solution-architect">PL-600 — Power Platform Solution Architect<a class="anchor" aria-label="Lien vers cette section" href="#pl-600--power-platform-solution-architect">#</a></h3>
<p>La certification la plus “prestigieuse”.</p>
<p>Elle valide :</p>
<ul>
<li>architecture globale,</li>
<li>choix Canvas vs Model-driven vs Pages,</li>
<li>sécurité et gouvernance,</li>
<li>stratégie ALM,</li>
<li>intégrations entreprise,</li>
<li>gestion des contraintes et des risques.</li>
</ul>
<p>➡️ À viser uniquement si vous avez déjà une vraie expérience multi-projets.</p>
<h2 id="5-quelle-certification-choisir-selon-votre-profil-">5. Quelle certification choisir selon votre profil ?<a class="anchor" aria-label="Lien vers cette section" href="#5-quelle-certification-choisir-selon-votre-profil-">#</a></h2>
<p>Voici une grille simple, sans ambiguïté.</p>
<h3 id="vous-débutez-ou-vous-voulez-une-vue-globale">Vous débutez ou vous voulez une vue globale<a class="anchor" aria-label="Lien vers cette section" href="#vous-débutez-ou-vous-voulez-une-vue-globale">#</a></h3>
<p>➡️ PL-900</p>
<h3 id="vous-construisez-des-apps-et-flows-en-entreprise-maker-avancé">Vous construisez des apps et flows en entreprise (maker avancé)<a class="anchor" aria-label="Lien vers cette section" href="#vous-construisez-des-apps-et-flows-en-entreprise-maker-avancé">#</a></h3>
<p>➡️ PL-900 puis PL-200</p>
<h3 id="vous-êtes-consultant-fonctionnel--chef-de-projet-power-platform">Vous êtes consultant fonctionnel / chef de projet Power Platform<a class="anchor" aria-label="Lien vers cette section" href="#vous-êtes-consultant-fonctionnel--chef-de-projet-power-platform">#</a></h3>
<p>➡️ PL-200</p>
<h3 id="vous-faites-surtout-power-bi">Vous faites surtout Power BI<a class="anchor" aria-label="Lien vers cette section" href="#vous-faites-surtout-power-bi">#</a></h3>
<p>➡️ PL-300</p>
<h3 id="vous-faites-du-pro-code-plugins-pcf-intégrations-api">Vous faites du pro-code (plugins, PCF, intégrations, API)<a class="anchor" aria-label="Lien vers cette section" href="#vous-faites-du-pro-code-plugins-pcf-intégrations-api">#</a></h3>
<p>➡️ PL-400</p>
<h3 id="vous-êtes-orienté-rpa--power-automate-desktop">Vous êtes orienté RPA / Power Automate Desktop<a class="anchor" aria-label="Lien vers cette section" href="#vous-êtes-orienté-rpa--power-automate-desktop">#</a></h3>
<p>➡️ PL-500</p>
<h3 id="vous-êtes-senior-et-vous-concevez-des-solutions-complètes">Vous êtes senior et vous concevez des solutions complètes<a class="anchor" aria-label="Lien vers cette section" href="#vous-êtes-senior-et-vous-concevez-des-solutions-complètes">#</a></h3>
<p>➡️ PL-600</p>
<h2 id="6-parcours-recommandés-dans-quel-ordre-les-passer">6. Parcours recommandés (dans quel ordre les passer)<a class="anchor" aria-label="Lien vers cette section" href="#6-parcours-recommandés-dans-quel-ordre-les-passer">#</a></h2>
<h3 id="parcours-power-platform-généraliste-le-plus-logique">Parcours “Power Platform généraliste” (le plus logique)<a class="anchor" aria-label="Lien vers cette section" href="#parcours-power-platform-généraliste-le-plus-logique">#</a></h3>
<p>PL-900 → PL-200 → (ensuite PL-400 ou PL-600 selon évolution)</p>
<h3 id="parcours-consultant--freelance">Parcours “consultant / freelance”<a class="anchor" aria-label="Lien vers cette section" href="#parcours-consultant--freelance">#</a></h3>
<p>PL-900 → PL-200 → PL-600</p>
<h3 id="parcours-développeur">Parcours “développeur”<a class="anchor" aria-label="Lien vers cette section" href="#parcours-développeur">#</a></h3>
<p>PL-900 → PL-400 → PL-600</p>
<h3 id="parcours-data--bi">Parcours “data / BI”<a class="anchor" aria-label="Lien vers cette section" href="#parcours-data--bi">#</a></h3>
<p>PL-900 → PL-300</p>
<h3 id="parcours-rpa">Parcours “RPA”<a class="anchor" aria-label="Lien vers cette section" href="#parcours-rpa">#</a></h3>
<p>PL-900 → PL-500</p>
<h2 id="8-conclusion--quelle-certification-choisir-en-1-phrase-">8. Conclusion : quelle certification choisir en 1 phrase ?<a class="anchor" aria-label="Lien vers cette section" href="#8-conclusion--quelle-certification-choisir-en-1-phrase-">#</a></h2>
<ul>
<li>Vous commencez : <strong>PL-900</strong></li>
<li>Vous voulez être crédible en entreprise : <strong>PL-200</strong></li>
<li>Vous êtes BI : <strong>PL-300</strong></li>
<li>Vous êtes développeur : <strong>PL-400</strong></li>
<li>Vous faites de la RPA : <strong>PL-500</strong></li>
<li>Vous êtes senior : <strong>PL-600</strong></li>
</ul>
<p>Si vous voulez une trajectoire “carrière + visibilité LinkedIn”, la combinaison la plus rentable aujourd’hui reste :</p>
<p><strong>PL-900 + PL-200</strong>, puis PL-600 si vous pouvez.</p>]]></content:encoded>
    </item>
    <item>
      <title>Dataverse vs SharePoint vs Excel : guide de décision technique pour architectes Power Platform</title>
      <link>https://bilelbenaouda.com/blog/dataverse-vs-sharepoint-vs-excel-guide-de-decision-technique-pour-architectes-power-platform/</link>
      <guid isPermaLink="true">https://bilelbenaouda.com/blog/dataverse-vs-sharepoint-vs-excel-guide-de-decision-technique-pour-architectes-power-platform/</guid>
      <pubDate>Tue, 03 Mar 2026 13:27:26 GMT</pubDate>
      <description>Choisir la bonne source de données pour une application Power Platform est une décision architecturale critique qui impacte les performances, les coûts et la maintenabilité sur plusieurs années. Pourtant, beaucoup de projets démarrent sur Excel ou SharePoint &quot;par défaut&quot;, sans…</description>
      <category>Power Apps</category>
      <content:encoded><![CDATA[<p>Choisir la bonne source de données pour une application Power Platform est une décision <strong>architecturale critique</strong> qui impacte les performances, les coûts et la maintenabilité sur plusieurs années. Pourtant, beaucoup de projets démarrent sur Excel ou SharePoint "par défaut", sans analyse préalable des besoins réels.</p>
<p>Ce guide vous aide à prendre une <strong>décision éclairée</strong> basée sur des critères techniques et financiers concrets.</p>
<h2 id="1-comprendre-les-véritables-limites-de-chaque-plateforme">1. Comprendre les véritables limites de chaque plateforme<a class="anchor" aria-label="Lien vers cette section" href="#1-comprendre-les-véritables-limites-de-chaque-plateforme">#</a></h2>
<h3 id="excel--prototypage-rapide-limites-structurelles">Excel : prototypage rapide, limites structurelles<a class="anchor" aria-label="Lien vers cette section" href="#excel--prototypage-rapide-limites-structurelles">#</a></h3>
<p><strong>Forces techniques</strong> :</p>
<ul>
<li>Déploiement instantané (OneDrive/SharePoint)</li>
<li>Formules natives pour calculs métiers</li>
<li>Modification structure sans migration</li>
<li>Pas de coût de licence supplémentaire</li>
</ul>
<p><strong>Limites techniques réelles</strong> :</p>
<ul>
<li><strong>Délégation Power Apps</strong> : 5 000 lignes maximum (non extensible)</li>
<li><strong>Concurrence</strong> : verrouillage fichier entier lors de l’édition</li>
<li><strong>Pas de transactions ACID</strong> : risque de corruption sur écritures simultanées</li>
<li><strong>Pas de typage strict</strong> : validation côté client uniquement</li>
<li><strong>Pas d’audit trail</strong> : aucune traçabilité native des modifications</li>
</ul>
<p><strong>Seuils de rupture</strong> :</p>
<ul>
<li>Au-delà de <strong>1 000 enregistrements</strong> → performances dégradées dans Power Apps</li>
<li>Plus de <strong>3 utilisateurs simultanés</strong> → problèmes de concurrence</li>
<li>Besoin de <strong>relations entre tables</strong> → non gérable</li>
</ul>
<p><strong>Cas d’usage valides</strong> :</p>
<ul>
<li>Prototypes/POC à durée de vie inférieure à 3 mois</li>
<li>Données de référence statiques (moins de 500 lignes)</li>
<li>Fichiers personnels ou équipe inférieure à 5 personnes</li>
</ul>
<h3 id="sharepoint--la-plateforme-collaborative-sous-estimée">SharePoint : la plateforme collaborative sous-estimée<a class="anchor" aria-label="Lien vers cette section" href="#sharepoint--la-plateforme-collaborative-sous-estimée">#</a></h3>
<p><strong>Forces techniques</strong> :</p>
<ul>
<li><strong>Scalabilité réelle</strong> : millions d’items par liste (avec architecture adaptée)</li>
<li><strong>Sécurité granulaire</strong> : item-level permissions, folder-level security</li>
<li><strong>Relations natives</strong> : colonnes Lookup, Managed Metadata</li>
<li><strong>Versioning natif</strong> : historique complet des modifications</li>
<li><strong>Intégration documentaire</strong> : pièces jointes sans limite de taille</li>
</ul>
<p><strong>Limites techniques réelles</strong> :</p>
<ul>
<li><strong>Seuil de vue de liste</strong> : 5 000 items par requête (contournable avec index)</li>
<li><strong>Délégation Power Apps</strong> : limitée à certains opérateurs (égalité, StartsWith, pas Contains)</li>
<li><strong>Performance des Lookup</strong> : dégradation sur relations supérieures à 2 niveaux</li>
<li><strong>Pas de transactions</strong> : pas de rollback natif sur opérations multiples</li>
<li><strong>Complexité des calculs</strong> : colonnes calculées limitées (pas de lookups dans formules)</li>
</ul>
<p><strong>Optimisations critiques souvent ignorées</strong> :</p>
<p><strong>Anti-pattern</strong> : Requête non indexée</p>
<p>Filter(SharePointList; Contains(Title; "recherche"))</p>
<p><strong>Pattern optimisé</strong> : Index + StartsWith</p>
<ol>
<li>Créer index sur colonne Title dans SharePoint</li>
<li>Utiliser opérateur délégable</li>
</ol>
<p>Filter(SharePointList; StartsWith(Title; "recherche"))</p>
<p><strong>Architecture performante SharePoint</strong> :</p>
<ol>
<li><strong>Créer des index</strong> sur toutes les colonnes utilisées dans Filter/LookUp</li>
<li><strong>Limiter les vues</strong> à moins de 5 000 items via folders ou filtres de vue</li>
<li><strong>Utiliser des colonnes calculées côté serveur</strong> pour les agrégations simples</li>
<li><strong>Archiver les données anciennes</strong> dans une liste séparée (partitionnement manuel)</li>
</ol>
<p><strong>Seuils de rupture réels</strong> :</p>
<ul>
<li>Au-delà de <strong>50 000 items actifs</strong> → nécessite architecture avancée (index, vues, archivage)</li>
<li>Plus de <strong>10 relations inter-listes</strong> → devient difficile à maintenir</li>
<li>Besoin de <strong>workflows complexes avec états</strong> → limites de Power Automate cloud flows</li>
</ul>
<p><strong>Cas d’usage valides</strong> :</p>
<ul>
<li>Applications métiers jusqu’à <strong>100 000 enregistrements</strong> avec architecture optimisée</li>
<li>Forte composante <strong>documentaire</strong> (gestion de fichiers)</li>
<li>Budget limité (inclus dans M365)</li>
<li>Équipe sans compétences Dataverse</li>
</ul>
<h3 id="dataverse--la-base-de-données-enterprise-grade">Dataverse : la base de données enterprise-grade<a class="anchor" aria-label="Lien vers cette section" href="#dataverse--la-base-de-données-enterprise-grade">#</a></h3>
<p><strong>Forces techniques</strong> :</p>
<ul>
<li><strong>Base relationnelle complète</strong> : relations 1:N, N:N avec intégrité référentielle</li>
<li><strong>Scalabilité illimitée</strong> : millions d’enregistrements sans dégradation</li>
<li><strong>Délégation totale</strong> : tous opérateurs supportés dans Power Apps</li>
<li><strong>Transactions ACID</strong> : rollback automatique, isolation des écritures</li>
<li><strong>Typage fort</strong> : validation serveur, contraintes d’intégrité</li>
<li><strong>Sécurité avancée</strong> : row-level security, field-level security, hierarchical security</li>
<li><strong>Audit complet</strong> : traçabilité native de toutes les opérations</li>
<li><strong>Solutions managées</strong> : déploiement ALM avec gestion de versions</li>
<li><strong>Business rules</strong> : logique métier côté serveur (indépendante de l’UI)</li>
<li><strong>Plugins et workflows</strong> : extensibilité via C# pour logique complexe</li>
</ul>
<p><strong>Limites et coûts réels</strong> :</p>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Composant</th>
<th>Limite/Coût</th>
<th>Impact</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Licence Power Apps</strong></td>
<td>Premium requise (40-48€/user/mois ou 10€/app/mois)</td>
<td>Coût récurrent élevé</td>
</tr>
<tr>
<td><strong>Capacité base de données</strong></td>
<td>10GB inclus, puis 40€/GB/mois supplémentaire</td>
<td>Peut exploser sur gros volumes</td>
</tr>
<tr>
<td><strong>API calls</strong></td>
<td>40 000/user/jour (Per User) ou 6 000/user/jour (Per App)</td>
<td>Limite atteinte sur apps intensives</td>
</tr>
<tr>
<td><strong>Capacité fichier/image</strong></td>
<td>20GB inclus, puis 2€/GB/mois</td>
<td>Stockage de documents coûteux</td>
</tr>
<tr>
<td><strong>Environnements</strong></td>
<td>3 inclus (Prod + 2 sandbox), puis payant</td>
<td>Complexifie le DevOps</td>
</tr>
</tbody>
</table></div>
<p><strong>Coût réel sur 3 ans – exemple concret</strong> :</p>
<p><strong>Scénario</strong> : 50 utilisateurs, application métier critique</p>
<p><strong>Option 1 – SharePoint optimisé</strong> :</p>
<ul>
<li>Licences M365 : incluses (0€ supplémentaire)</li>
<li>Développement initial : 40h × 800€ = 32 000€</li>
<li>Maintenance annuelle : 5 000€</li>
<li><strong>TOTAL 3 ans : 47 000€</strong></li>
</ul>
<p><strong>Option 2 – Dataverse Per App</strong> :</p>
<ul>
<li>Licences : 50 users × 10€/mois × 36 mois = 18 000€</li>
<li>DB capacity : 50GB × 40€ × 36 mois = 72 000€</li>
<li>Développement initial : 60h × 800€ = 48 000€</li>
<li>Maintenance annuelle : 8 000€</li>
<li><strong>TOTAL 3 ans : 162 000€</strong></li>
</ul>
<p><strong>Différence : +245% de coût</strong></p>
<p><strong>Seuils de justification économique</strong> :</p>
<ul>
<li><strong>Volume</strong> : supérieur à 100 000 enregistrements actifs avec croissance forte</li>
<li><strong>Complexité relationnelle</strong> : supérieur à 15 tables avec relations multiples</li>
<li><strong>Criticité</strong> : données métiers stratégiques (CRM, ERP, finance)</li>
<li><strong>Intégration Dynamics 365</strong> : si déjà présent dans l’entreprise</li>
<li><strong>Conformité stricte</strong> : audit trail réglementaire obligatoire</li>
</ul>
<p><strong>Cas d’usage obligatoires</strong> :</p>
<ul>
<li>CRM / ERP / Gestion commerciale</li>
<li>Applications transactionnelles (commandes, inventaire, facturation)</li>
<li>Workflows métiers complexes avec états et approbations</li>
<li>Intégration native avec Dynamics 365</li>
<li>Multi-environnements avec ALM structuré (Dev/Test/Prod)</li>
</ul>
<h2 id="2-matrice-de-décision-technique">2. Matrice de décision technique<a class="anchor" aria-label="Lien vers cette section" href="#2-matrice-de-décision-technique">#</a></h2>
<h3 id="critères-de-volumétrie">Critères de volumétrie<a class="anchor" aria-label="Lien vers cette section" href="#critères-de-volumétrie">#</a></h3>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Nombre d’enregistrements</th>
<th>Recommandation</th>
<th>Justification</th>
</tr>
</thead>
<tbody>
<tr>
<td>Moins de 1 000</td>
<td>Excel ou SharePoint</td>
<td>Coût/bénéfice favorable</td>
</tr>
<tr>
<td>1 000 – 10 000</td>
<td>SharePoint</td>
<td>Performance acceptable sans optimisation</td>
</tr>
<tr>
<td>10 000 – 100 000</td>
<td>SharePoint optimisé</td>
<td>Nécessite architecture (index, vues, archivage)</td>
</tr>
<tr>
<td>100 000 – 500 000</td>
<td>Dataverse ou SharePoint expert</td>
<td>Analyse coût/complexité requise</td>
</tr>
<tr>
<td>Supérieur à 500 000</td>
<td>Dataverse obligatoire</td>
<td>SharePoint atteint ses limites structurelles</td>
</tr>
</tbody>
</table></div>
<h3 id="critères-de-complexité-relationnelle">Critères de complexité relationnelle<a class="anchor" aria-label="Lien vers cette section" href="#critères-de-complexité-relationnelle">#</a></h3>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Nombre de tables/listes</th>
<th>Relations</th>
<th>Recommandation</th>
</tr>
</thead>
<tbody>
<tr>
<td>1-3 tables</td>
<td>Aucune ou simple (1 Lookup)</td>
<td>Excel ou SharePoint</td>
</tr>
<tr>
<td>3-8 tables</td>
<td>Relations 1:N simples</td>
<td>SharePoint</td>
</tr>
<tr>
<td>8-15 tables</td>
<td>Relations 1:N multiples</td>
<td>SharePoint (limite haute) ou Dataverse</td>
</tr>
<tr>
<td>Supérieur à 15 tables</td>
<td>Relations 1:N, N:N, hiérarchiques</td>
<td>Dataverse obligatoire</td>
</tr>
</tbody>
</table></div>
<h3 id="critères-de-concurrence-utilisateurs">Critères de concurrence utilisateurs<a class="anchor" aria-label="Lien vers cette section" href="#critères-de-concurrence-utilisateurs">#</a></h3>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Utilisateurs simultanés</th>
<th>Écritures/jour</th>
<th>Recommandation</th>
</tr>
</thead>
<tbody>
<tr>
<td>Moins de 5</td>
<td>Moins de 100</td>
<td>Excel acceptable</td>
</tr>
<tr>
<td>5-50</td>
<td>100-1 000</td>
<td>SharePoint</td>
</tr>
<tr>
<td>50-200</td>
<td>1 000-10 000</td>
<td>SharePoint ou Dataverse</td>
</tr>
<tr>
<td>Supérieur à 200</td>
<td>Supérieur à 10 000</td>
<td>Dataverse obligatoire</td>
</tr>
</tbody>
</table></div>
<h2 id="3-patterns-hybrides--le-meilleur-des-deux-mondes">3. Patterns hybrides : le meilleur des deux mondes<a class="anchor" aria-label="Lien vers cette section" href="#3-patterns-hybrides--le-meilleur-des-deux-mondes">#</a></h2>
<h3 id="pattern-1--sharepoint--dataverse-sélectif">Pattern 1 : SharePoint + Dataverse sélectif<a class="anchor" aria-label="Lien vers cette section" href="#pattern-1--sharepoint--dataverse-sélectif">#</a></h3>
<p><strong>Principe</strong> : Données documentaires sur SharePoint, données transactionnelles sur Dataverse</p>
<p><strong>Architecture exemple</strong> :</p>
<ul>
<li>Documents et pièces jointes → SharePoint (natif)</li>
<li>Commandes clients → Dataverse (transactionnel)</li>
<li>Produits catalogue → Dataverse (référentiel)</li>
<li>Relation : Commande.DocumentID → SharePoint via lien</li>
</ul>
<p><strong>Avantages</strong> :</p>
<ul>
<li>Stockage fichiers gratuit (SharePoint)</li>
<li>Performance transactionnelle (Dataverse)</li>
<li>Coût optimisé (moins de GB Dataverse)</li>
</ul>
<h3 id="pattern-2--sharepoint-avec-cache-dataverse">Pattern 2 : SharePoint avec cache Dataverse<a class="anchor" aria-label="Lien vers cette section" href="#pattern-2--sharepoint-avec-cache-dataverse">#</a></h3>
<p><strong>Principe</strong> : Données volumineuses sur SharePoint, cache performant sur Dataverse</p>
<p><strong>Workflow</strong> :</p>
<ol>
<li>Données principales dans SharePoint (historique complet)</li>
<li>Synchronisation quotidienne vers Dataverse (90 derniers jours)</li>
<li>Power Apps interroge Dataverse uniquement</li>
<li>Archivage automatique SharePoint → Azure Blob Storage</li>
</ol>
<p><strong>Avantages</strong> :</p>
<ul>
<li>Performance Power Apps optimale</li>
<li>Rétention longue durée économique</li>
<li>Capacité Dataverse maîtrisée</li>
</ul>
<h3 id="pattern-3--excel-pour-référentiels-statiques">Pattern 3 : Excel pour référentiels statiques<a class="anchor" aria-label="Lien vers cette section" href="#pattern-3--excel-pour-référentiels-statiques">#</a></h3>
<p><strong>Principe</strong> : Données transactionnelles Dataverse, référentiels simples Excel</p>
<p><strong>Exemple</strong> :</p>
<ul>
<li>Commandes, clients → Dataverse</li>
<li>Liste pays, devises, unités de mesure → Excel</li>
<li>Chargement Excel au démarrage dans collection locale</li>
</ul>
<p><strong>Avantages</strong> :</p>
<ul>
<li>Modification référentiels sans déploiement</li>
<li>Pas de pollution Dataverse avec données statiques</li>
<li>Coût optimisé</li>
</ul>
<h2 id="4-checklist-de-décision">4. Checklist de décision<a class="anchor" aria-label="Lien vers cette section" href="#4-checklist-de-décision">#</a></h2>
<h3 id="analyse-préliminaire-répondre-ouinon">Analyse préliminaire (répondre OUI/NON)<a class="anchor" aria-label="Lien vers cette section" href="#analyse-préliminaire-répondre-ouinon">#</a></h3>
<p><strong>Volume et croissance</strong> :</p>
<ul>
<li>Plus de 50 000 enregistrements prévus sur 2 ans ?</li>
<li>Croissance supérieure à 20% par an ?</li>
<li>Archivage impossible ou non souhaité ?</li>
</ul>
<p><strong>Complexité technique</strong> :</p>
<ul>
<li>Plus de 10 tables/entités ?</li>
<li>Relations N:N nécessaires ?</li>
<li>Logique métier serveur requise (calculs complexes, validations) ?</li>
<li>Transactions multi-tables avec rollback ?</li>
</ul>
<p><strong>Criticité métier</strong> :</p>
<ul>
<li>Données financières ou réglementées ?</li>
<li>SLA de disponibilité supérieur à 99% requis ?</li>
<li>Perte de données = impact business critique ?</li>
<li>Audit trail réglementaire obligatoire ?</li>
</ul>
<p><strong>Concurrence et performance</strong> :</p>
<ul>
<li>Plus de 50 utilisateurs simultanés ?</li>
<li>Besoin de temps de réponse inférieur à 2 secondes ?</li>
<li>Écritures simultanées sur mêmes enregistrements ?</li>
</ul>
<p><strong>Budget et licences</strong> :</p>
<ul>
<li>Budget récurrent supérieur à 10 000€/an disponible ?</li>
<li>Dynamics 365 déjà déployé dans l’entreprise ?</li>
<li>Compétences Dataverse en interne ou budget formation ?</li>
</ul>
<p><strong>Gouvernance et ALM</strong> :</p>
<ul>
<li>Environnements multiples requis (Dev/Test/Prod) ?</li>
<li>Déploiements automatisés via CI/CD nécessaires ?</li>
<li>Gestion de versions et rollback obligatoires ?</li>
</ul>
<h3 id="scoring-de-décision">Scoring de décision<a class="anchor" aria-label="Lien vers cette section" href="#scoring-de-décision">#</a></h3>
<p><strong>0-3 OUI</strong> → SharePoint suffit (avec optimisations)</p>
<p><strong>4-8 OUI</strong> → Analyse coût/bénéfice approfondie requise</p>
<p><strong>9+ OUI</strong> → Dataverse recommandé</p>
<h2 id="5-erreurs-fréquentes-et-mythes">5. Erreurs fréquentes et mythes<a class="anchor" aria-label="Lien vers cette section" href="#5-erreurs-fréquentes-et-mythes">#</a></h2>
<h3 id="mythe-1--dataverse-est-toujours-plus-performant">Mythe 1 : "Dataverse est toujours plus performant"<a class="anchor" aria-label="Lien vers cette section" href="#mythe-1--dataverse-est-toujours-plus-performant">#</a></h3>
<p><strong>Faux</strong>. Sur de petits volumes (moins de 10 000 items), SharePoint avec index bien configurés peut être <strong>aussi rapide</strong> que Dataverse, voire plus sur certaines opérations de recherche full-text.</p>
<h3 id="mythe-2--sharepoint-ne-scale-pas">Mythe 2 : "SharePoint ne scale pas"<a class="anchor" aria-label="Lien vers cette section" href="#mythe-2--sharepoint-ne-scale-pas">#</a></h3>
<p><strong>Faux</strong>. SharePoint peut gérer des <strong>dizaines de millions d’items</strong> avec une architecture correcte (exemple : Microsoft utilise SharePoint pour Viva Topics avec des milliards d’items). Le problème est la <strong>délégation Power Apps</strong>, pas SharePoint lui-même.</p>
<h3 id="mythe-3--excel-est-toujours-à-éviter">Mythe 3 : "Excel est toujours à éviter"<a class="anchor" aria-label="Lien vers cette section" href="#mythe-3--excel-est-toujours-à-éviter">#</a></h3>
<p><strong>Faux</strong>. Pour des <strong>référentiels statiques</strong> (moins de 500 lignes) modifiés manuellement, Excel peut être plus simple et efficace qu’une table Dataverse. Exemple : liste de codes postaux, pays, catégories métiers.</p>
<h3 id="mythe-4--dataverse--pas-de-limites">Mythe 4 : "Dataverse = pas de limites"<a class="anchor" aria-label="Lien vers cette section" href="#mythe-4--dataverse--pas-de-limites">#</a></h3>
<p><strong>Faux</strong>. Dataverse a des limites :</p>
<ul>
<li><strong>API calls</strong> : 40 000/user/jour (ou 6 000 en Per App)</li>
<li><strong>Taille message</strong> : 128 MB max par requête</li>
<li><strong>Timeout requêtes</strong> : 2 minutes max</li>
<li><strong>Nombre de tables</strong> : 1 024 max par environnement</li>
</ul>
<h3 id="erreur-1--ne-pas-évaluer-le-coût-total-sur-3-5-ans">Erreur 1 : Ne pas évaluer le coût total sur 3-5 ans<a class="anchor" aria-label="Lien vers cette section" href="#erreur-1--ne-pas-évaluer-le-coût-total-sur-3-5-ans">#</a></h3>
<p>Beaucoup de projets démarrent sur Dataverse sans calculer :</p>
<ul>
<li>Licences utilisateurs (récurrentes)</li>
<li>Capacité DB (croissance exponentielle)</li>
<li>Environnements multiples (sandbox, dev, test)</li>
<li>Formation et montée en compétences</li>
</ul>
<p><strong>Résultat</strong> : Facture qui explose après 2 ans.</p>
<h3 id="erreur-2--sous-estimer-loptimisation-sharepoint">Erreur 2 : Sous-estimer l’optimisation SharePoint<a class="anchor" aria-label="Lien vers cette section" href="#erreur-2--sous-estimer-loptimisation-sharepoint">#</a></h3>
<p>Beaucoup abandonnent SharePoint après des problèmes de performance, sans avoir :</p>
<ul>
<li>Créé des index sur les colonnes filtrées</li>
<li>Utilisé des folders pour partitionner</li>
<li>Optimisé les requêtes Power Apps (StartsWith vs Contains)</li>
<li>Archivé les données anciennes</li>
</ul>
<p><strong>Résultat</strong> : Migration Dataverse coûteuse alors que SharePoint aurait suffi.</p>
<h3 id="erreur-3--choisir-en-fonction-de-la-compétence-de-léquipe">Erreur 3 : Choisir en fonction de la compétence de l’équipe<a class="anchor" aria-label="Lien vers cette section" href="#erreur-3--choisir-en-fonction-de-la-compétence-de-léquipe">#</a></h3>
<p>"On connaît SharePoint, donc on reste sur SharePoint" même si le besoin justifie Dataverse.</p>
<p><strong>Résultat</strong> : Dette technique, workarounds complexes, maintenance cauchemardesque.</p>
<h2 id="6-cas-réel-et-retour-dexpérience">6. Cas réel et retour d’expérience<a class="anchor" aria-label="Lien vers cette section" href="#6-cas-réel-et-retour-dexpérience">#</a></h2>
<h3 id="migration-sharepoint--dataverse-évitée-économie-80k">Migration SharePoint → Dataverse évitée (économie 80k€)<a class="anchor" aria-label="Lien vers cette section" href="#migration-sharepoint--dataverse-évitée-économie-80k">#</a></h3>
<p><strong>Contexte</strong> :</p>
<ul>
<li>Application RH : gestion des congés</li>
<li>200 utilisateurs, 25 000 demandes/an</li>
<li>Performance SharePoint jugée "insuffisante"</li>
<li>Migration Dataverse planifiée (120k€ sur 3 ans)</li>
</ul>
<p><strong>Action</strong> :</p>
<ul>
<li>Audit de l’architecture SharePoint actuelle</li>
<li>Création de 4 index sur colonnes clés</li>
<li>Ajout de folders par année pour partitionnement</li>
<li>Optimisation des formules Power Apps (délégation)</li>
<li>Archivage automatique supérieur à 3 ans</li>
</ul>
<p><strong>Résultat</strong> :</p>
<ul>
<li>Temps de chargement : 8s → 1,2s</li>
<li>Aucun problème de performance après optimisation</li>
<li>Coût : 8 000€ (refonte) vs 120k€ (migration)</li>
<li><strong>ROI : 112k€ économisés</strong></li>
</ul>
<p><strong>Leçon</strong> : Ne pas migrer par défaut. Optimiser d’abord.</p>
<h2 id="7-arbre-de-décision-simplifié">7. Arbre de décision simplifié<a class="anchor" aria-label="Lien vers cette section" href="#7-arbre-de-décision-simplifié">#</a></h2>
<p><strong>Question 1</strong> : Dynamics 365 déjà déployé ?</p>
<ul>
<li><strong>OUI</strong> → Dataverse (synergie native)</li>
<li><strong>NON</strong> → Question 2</li>
</ul>
<p><strong>Question 2</strong> : Budget supérieur à 10k€/an disponible ?</p>
<ul>
<li><strong>NON</strong> → SharePoint ou Excel</li>
<li><strong>OUI</strong> → Question 3</li>
</ul>
<p><strong>Question 3</strong> : Volume supérieur à 100 000 enregistrements OU croissance supérieure à 50%/an ?</p>
<ul>
<li><strong>OUI</strong> → Dataverse</li>
<li><strong>NON</strong> → Question 4</li>
</ul>
<p><strong>Question 4</strong> : Plus de 10 tables avec relations complexes (N:N, hiérarchiques) ?</p>
<ul>
<li><strong>OUI</strong> → Dataverse</li>
<li><strong>NON</strong> → Question 5</li>
</ul>
<p><strong>Question 5</strong> : Criticité métier forte (finance, réglementaire, CRM) ?</p>
<ul>
<li><strong>OUI</strong> → Dataverse</li>
<li><strong>NON</strong> → Question 6</li>
</ul>
<p><strong>Question 6</strong> : Besoin ALM structuré (CI/CD, solutions managées) ?</p>
<ul>
<li><strong>OUI</strong> → Dataverse</li>
<li><strong>NON</strong> → SharePoint</li>
</ul>
<p><strong>Exception</strong> : Si moins de 1000 enregistrements ET prototype → Excel acceptable</p>
<h2 id="conclusion--la-décision-doit-être-data-driven">Conclusion : la décision doit être data-driven<a class="anchor" aria-label="Lien vers cette section" href="#conclusion--la-décision-doit-être-data-driven">#</a></h2>
<p>Le choix entre Excel, SharePoint et Dataverse n’est pas idéologique mais <strong>technique et économique</strong> :</p>
<ol>
<li><strong>Analysez vos besoins réels</strong> : volume, complexité, criticité, budget</li>
<li><strong>Calculez le TCO sur 3-5 ans</strong> : licences + capacité + développement + maintenance</li>
<li><strong>Évaluez les compétences</strong> : formation nécessaire vs expertise disponible</li>
<li><strong>Testez avec des volumes réalistes</strong> : POC avec 80% du volume final, pas 10 lignes</li>
<li><strong>Considérez l’hybride</strong> : souvent la solution optimale coût/performance</li>
</ol>
<p><strong>Règles d’or</strong> :</p>
<p>✅ <strong>Excel</strong> : POC, prototypes, référentiels statiques moins de 500 lignes</p>
<p>✅ <strong>SharePoint</strong> : Apps métiers jusqu’à 100k enregistrements avec architecture optimisée</p>
<p>✅ <strong>Dataverse</strong> : Apps stratégiques supérieur à 100k enregistrements, relationnel complexe, intégrations multiples</p>
<p>✅ <strong>Hybride</strong> : Le meilleur des deux mondes dans 60% des cas</p>
<p><strong>La pire erreur</strong> : choisir par défaut sans analyse. <strong>La meilleure décision</strong> : celle basée sur des critères mesurables et un TCO calculé.</p>
<p><strong>Ressources complémentaires</strong> :</p>
<ul>
<li><a href="https://learn.microsoft.com/fr-fr/power-apps/maker/canvas-apps/delegation-list" rel="noopener noreferrer">Limites de délégation SharePoint (Microsoft)</a></li>
<li><a href="https://powerapps.microsoft.com/fr-fr/pricing/" rel="noopener noreferrer">Pricing Dataverse Calculator</a></li>
<li><a href="https://learn.microsoft.com/fr-fr/office365/servicedescriptions/sharepoint-online-service-description/sharepoint-online-limits" rel="noopener noreferrer">SharePoint limits and boundaries</a></li>
</ul>]]></content:encoded>
    </item>
    <item>
      <title>Maîtriser la fonction LookUp</title>
      <link>https://bilelbenaouda.com/blog/maitriser-la-fonction-lookup-dans-power-apps-guide-complet/</link>
      <guid isPermaLink="true">https://bilelbenaouda.com/blog/maitriser-la-fonction-lookup-dans-power-apps-guide-complet/</guid>
      <pubDate>Sun, 01 Mar 2026 13:33:45 GMT</pubDate>
      <description>La fonction LookUp est l’une des plus utilisées dans Power Apps, mais aussi l’une des plus mal comprise. Elle permet de rechercher et retourner un enregistrement ou une valeur précise dans une table selon une condition. Apparemment simple, elle cache des subtilités de…</description>
      <category>Power Apps</category>
      <content:encoded><![CDATA[<p>La fonction <strong>LookUp</strong> est l’une des plus utilisées dans Power Apps, mais aussi l’une des plus mal comprise. Elle permet de <strong>rechercher et retourner un enregistrement ou une valeur précise dans une table</strong> selon une condition. Apparemment simple, elle cache des subtilités de performance, de délégation et de comportement qui peuvent faire la différence entre une app fluide et une app qui rame.</p>
<p>Dans ce guide technique, je vais tenter d’explorer :</p>
<ul>
<li>Les fondamentaux et la syntaxe complète</li>
<li>Le modèle d’exécution et la délégation</li>
<li>Les patterns avancés et anti-patterns</li>
<li>L’optimisation des performances</li>
<li>Les cas d’usage réels en production</li>
</ul>
<h2 id="1-anatomie-de-lookup--au-delà-de-la-syntaxe">1. Anatomie de LookUp : au-delà de la syntaxe<a class="anchor" aria-label="Lien vers cette section" href="#1-anatomie-de-lookup--au-delà-de-la-syntaxe">#</a></h2>
<h3 id="syntaxe-complète">Syntaxe complète<a class="anchor" aria-label="Lien vers cette section" href="#syntaxe-complète">#</a></h3>
<p><code>LookUp(Source; Condition; Result)</code></p>
<ul>
<li><strong>Source</strong> : Table, collection, ou source de données connectée</li>
<li><strong>Condition</strong> : Expression booléenne évaluée pour chaque enregistrement</li>
<li><strong>Result</strong> <em>(optionnel)</em> : Expression retournant la valeur souhaitée (pas seulement un nom de colonne)</li>
</ul>
<h3 id="ce-que-retourne-lookup">Ce que retourne LookUp<a class="anchor" aria-label="Lien vers cette section" href="#ce-que-retourne-lookup">#</a></h3>
<ul>
<li>Si Result est <strong>omis</strong> → retourne l’<strong>enregistrement complet</strong> (record)</li>
<li>Si Result est <strong>spécifié</strong> → retourne la <strong>valeur évaluée</strong> (peut être une formule)</li>
<li>Si <strong>aucune correspondance</strong> → retourne <code>Blank()</code></li>
<li>LookUp retourne <strong>toujours le premier enregistrement</strong> correspondant selon l’ordre de la source</li>
</ul>
<p>⚠️ <strong>Point critique</strong> : L’ordre n’est PAS aléatoire, mais il est <strong>non déterministe</strong> si la source n’est pas explicitement triée. Sur SharePoint, c’est souvent l’ordre d’ID. Sur Dataverse, ça dépend de l’index utilisé.</p>
<h2 id="2-délégation--comprendre-les-limites-réelles">2. Délégation : comprendre les limites réelles<a class="anchor" aria-label="Lien vers cette section" href="#2-délégation--comprendre-les-limites-réelles">#</a></h2>
<h3 id="quest-ce-qui-est-délégable-">Qu’est-ce qui est délégable ?<a class="anchor" aria-label="Lien vers cette section" href="#quest-ce-qui-est-délégable-">#</a></h3>
<p>La délégation de LookUp dépend de <strong>trois facteurs</strong> :</p>
<ol>
<li><strong>La source de données</strong></li>
<li><strong>Les opérateurs utilisés dans la condition</strong></li>
<li><strong>Les fonctions utilisées dans Result</strong></li>
</ol>
<h3 id="tableau-de-délégation-par-source">Tableau de délégation par source<a class="anchor" aria-label="Lien vers cette section" href="#tableau-de-délégation-par-source">#</a></h3>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Source</th>
<th>LookUp délégable ?</th>
<th>Opérateurs supportés</th>
<th>Limite sans délégation</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Dataverse</strong></td>
<td>✅ Oui</td>
<td><code>=</code>, <code>&#x3C;></code>, <code>&#x3C;</code>, <code>></code>, <code>&#x3C;=</code>, <code>>=</code>, <code>And</code>, <code>Or</code>, <code>Not</code>, <code>In</code>, <code>StartsWith</code></td>
<td>500-2000 lignes</td>
</tr>
<tr>
<td><strong>SharePoint</strong></td>
<td>⚠️ Partiel</td>
<td><code>=</code>, <code>&#x3C;></code>, <code>IsBlank</code> uniquement</td>
<td>500-2000 lignes</td>
</tr>
<tr>
<td><strong>SQL Server</strong></td>
<td>✅ Oui</td>
<td>Tous opérateurs standards</td>
<td>500-2000 lignes</td>
</tr>
<tr>
<td><strong>Collections</strong></td>
<td>❌ Non</td>
<td>Tous (mais en local)</td>
<td>Toutes les lignes (mémoire)</td>
</tr>
<tr>
<td><strong>Excel</strong></td>
<td>❌ Non</td>
<td>Tous</td>
<td>500-2000 lignes</td>
</tr>
</tbody>
</table></div>
<h3 id="exemple-de-délégation-cassée-sur-sharepoint">Exemple de délégation cassée sur SharePoint<a class="anchor" aria-label="Lien vers cette section" href="#exemple-de-délégation-cassée-sur-sharepoint">#</a></h3>
<p>`// ❌ NON DÉLÉGABLE sur SharePoint (Contains non supporté)
LookUp(Documents; Contains(Title; "rapport"); ‘Created By’)</p>
<p>// ✅ DÉLÉGABLE sur SharePoint
LookUp(Documents; StartsWith(Title; "rapport"); ‘Created By’)`</p>
<h3 id="comment-vérifier-la-délégation-">Comment vérifier la délégation ?<a class="anchor" aria-label="Lien vers cette section" href="#comment-vérifier-la-délégation-">#</a></h3>
<p>Dans Power Apps Studio, les formules non délégables affichent un **triangle ** avec l’avertissement "delegation warning".</p>
<h2 id="3-modèle-dexécution-et-performance">3. Modèle d’exécution et performance<a class="anchor" aria-label="Lien vers cette section" href="#3-modèle-dexécution-et-performance">#</a></h2>
<h3 id="où-et-quand-lookup-sexécute">Où et quand LookUp s’exécute<a class="anchor" aria-label="Lien vers cette section" href="#où-et-quand-lookup-sexécute">#</a></h3>
<p>Le <strong>contexte d’exécution</strong> de LookUp est crucial pour les performances :</p>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Propriété</th>
<th>Évaluation</th>
<th>Impact performance</th>
<th>Usage recommandé</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>OnSelect</strong></td>
<td>Une fois au clic</td>
<td>✅ Faible</td>
<td>Idéal pour actions ponctuelles</td>
</tr>
<tr>
<td><strong>OnVisible</strong></td>
<td>Au chargement de l’écran</td>
<td>✅ Faible</td>
<td>Excellent pour initialisation</td>
</tr>
<tr>
<td><strong>Default</strong></td>
<td>Au chargement du contrôle</td>
<td>⚠️ Moyen</td>
<td>Acceptable si source &#x3C; 1000 lignes</td>
</tr>
<tr>
<td><strong>Text / Items</strong></td>
<td>À chaque rafraîchissement</td>
<td>❌ Élevé</td>
<td><strong>À ÉVITER absolument</strong></td>
</tr>
<tr>
<td><strong>DisplayMode / Visible</strong></td>
<td>À chaque interaction</td>
<td>❌ Très élevé</td>
<td><strong>Anti-pattern majeur</strong></td>
</tr>
</tbody>
</table></div>
<h3 id="erreur-classique-déjà-observée">Erreur classique déjà observée<a class="anchor" aria-label="Lien vers cette section" href="#erreur-classique-déjà-observée">#</a></h3>
<p><code>Label1.Text = LookUp(Employees; Email = TextInput1.Text; FullName)</code></p>
<p><strong>Pourquoi est-ce une erreur?</strong> Chaque caractère tapé réévalue la formule. Sur une table de 5000 employés non délégable, cela provoque un freeze de l’app.</p>
<h3 id="pattern-correct">Pattern correct<a class="anchor" aria-label="Lien vers cette section" href="#pattern-correct">#</a></h3>
<p>`
TextInput1.OnChange:
Set(varEmployeeName;
LookUp(Employees; Email = TextInput1.Text; FullName)
)</p>
<p>Label1.Text:
varEmployeeName`</p>
<h2 id="4-techniques-avancées">4. Techniques avancées<a class="anchor" aria-label="Lien vers cette section" href="#4-techniques-avancées">#</a></h2>
<h3 id="a-lookup-avec-formule-dans-result">a) LookUp avec formule dans Result<a class="anchor" aria-label="Lien vers cette section" href="#a-lookup-avec-formule-dans-result">#</a></h3>
<p>Result peut être <strong>une expression</strong>, pas seulement un nom de colonne :</p>
<p>`// Calcul direct dans Result
LookUp(Orders;
OrderID = 12345;
Quantity * UnitPrice * (1 – Discount)
)</p>
<p>// Concaténation
LookUp(Employees;
ID = varEmployeeID;
FirstName &#x26; " " &#x26; LastName &#x26; " (" &#x26; Department &#x26; ")"
)`</p>
<h3 id="b-gérer-blank-proprement">b) Gérer Blank() proprement<a class="anchor" aria-label="Lien vers cette section" href="#b-gérer-blank-proprement">#</a></h3>
<h3 id="méthode-classique-avec-isblank">Méthode classique avec IsBlank<a class="anchor" aria-label="Lien vers cette section" href="#méthode-classique-avec-isblank">#</a></h3>
<p><code>If( IsBlank(LookUp(Orders; Status = "Open"; OrderID)); "Aucune commande"; "Commande trouvée" )</code></p>
<h3 id="méthode-moderne-avec-coalesce-">Méthode moderne avec coalesce (<code>//</code>)<a class="anchor" aria-label="Lien vers cette section" href="#méthode-moderne-avec-coalesce-">#</a></h3>
<p><code>LookUp(Orders; Status = "Open"; OrderID) // "N/A"</code></p>
<p>⚠️ <strong>Piège</strong> : Le coalesce ne fonctionne que si les types correspondent. Si OrderID est un nombre et "N/A" une chaîne, erreur de type.</p>
<h3 id="c-lookup-dans-patch--attention-à-ce-piège-silencieux">c) LookUp dans Patch – attention à ce piège silencieux<a class="anchor" aria-label="Lien vers cette section" href="#c-lookup-dans-patch--attention-à-ce-piège-silencieux">#</a></h3>
<p><code>Patch(Orders; LookUp(Orders; OrderID = 9999); {Status: "Closed"} )</code></p>
<p><strong>Problème</strong> : Si OrderID 9999 n’existe pas, LookUp retourne Blank(). Patch avec un premier argument Blank() <strong>crée un nouvel enregistrement</strong> au lieu de mettre à jour.</p>
<h3 id="solution-robuste">Solution robuste<a class="anchor" aria-label="Lien vers cette section" href="#solution-robuste">#</a></h3>
<p><code>With( {record: LookUp(Orders; OrderID = 9999)}; If( !IsBlank(record); Patch(Orders; record; {Status: "Closed"}); Notify("Commande introuvable"; NotificationType.Error) ) )</code></p>
<h3 id="d-lookup-vs-firstfilter--quand-choisir-">d) LookUp vs First(Filter()) – quand choisir ?<a class="anchor" aria-label="Lien vers cette section" href="#d-lookup-vs-firstfilter--quand-choisir-">#</a></h3>
<p><code>LookUp(Products; SKU = "A123") First(Filter(Products; SKU = "A123"))</code></p>
<p><strong>Différences subtiles</strong> :</p>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Critère</th>
<th>LookUp</th>
<th>First(Filter())</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Lisibilité</strong></td>
<td>✅ Plus clair</td>
<td>Moins direct</td>
</tr>
<tr>
<td><strong>Délégation</strong></td>
<td>Même capacité</td>
<td>Même capacité</td>
</tr>
<tr>
<td><strong>Chaînage</strong></td>
<td>Impossible</td>
<td>Possible avec Sort()</td>
</tr>
<tr>
<td><strong>Performance</strong></td>
<td>Identique</td>
<td>Identique</td>
</tr>
</tbody>
</table></div>
<p><strong>Quand utiliser First(Filter())</strong> :</p>
<p><code>// Besoin de trier avant de prendre le premier First( Sort( Filter(Orders; CustomerID = 1001); OrderDate; Descending ) )</code></p>
<p>LookUp seul ne permet pas de contrôler l’ordre. Si l’ordre importe, utilisez First(Sort(Filter())).</p>
<h2 id="5-relations-dataverse-et-navigation">5. Relations Dataverse et navigation<a class="anchor" aria-label="Lien vers cette section" href="#5-relations-dataverse-et-navigation">#</a></h2>
<h3 id="lookup-dans-les-relations-many-to-one">LookUp dans les relations many-to-one<a class="anchor" aria-label="Lien vers cette section" href="#lookup-dans-les-relations-many-to-one">#</a></h3>
<p>`// Navigation depuis un enregistrement vers sa relation
Gallery1.Selected.Account.’Account Name’</p>
<p>// Équivalent avec LookUp (moins performant)
LookUp(Accounts;
‘Account ID’ = Gallery1.Selected.’Account ID’;
‘Account Name’
)`</p>
<p><strong>Recommandation</strong> : Sur Dataverse, privilégiez la <strong>navigation par relation</strong> native. C’est plus performant et plus lisible.</p>
<h3 id="lookup-dans-les-choix-choice-columns">LookUp dans les choix (Choice columns)<a class="anchor" aria-label="Lien vers cette section" href="#lookup-dans-les-choix-choice-columns">#</a></h3>
<p>`// ❌ ERREUR FRÉQUENTE
LookUp(Contacts; Status = "Active")</p>
<p>// ✅ CORRECT – Les choix sont des enums
LookUp(Contacts; Status = Status.Active)`</p>
<h2 id="6-lookup-imbriqués--à-utiliser-avec-parcimonie">6. LookUp imbriqués – à utiliser avec parcimonie<a class="anchor" aria-label="Lien vers cette section" href="#6-lookup-imbriqués--à-utiliser-avec-parcimonie">#</a></h2>
<p><code>// Récupérer le nom du manager du manager LookUp(Employees; ID = LookUp(Employees; ID = varCurrentEmployeeID; ManagerID ); FullName )</code></p>
<p><strong>Problèmes</strong> :</p>
<ul>
<li><strong>Performance</strong> : Deux requêtes potentiellement non délégables</li>
<li><strong>Lisibilité</strong> : Code difficile à maintenir</li>
<li><strong>Debugging</strong> : Impossible de savoir quelle étape échoue</li>
</ul>
<p><strong>Alternative recommandée</strong> :</p>
<p><code>// Découper en variables Set(varManagerID; LookUp(Employees; ID = varCurrentEmployeeID; ManagerID) ); Set(varManagerOfManagerName; LookUp(Employees; ID = varManagerID; FullName) );</code></p>
<h2 id="7-patterns-de-cache-et-optimisation">7. Patterns de cache et optimisation<a class="anchor" aria-label="Lien vers cette section" href="#7-patterns-de-cache-et-optimisation">#</a></h2>
<h3 id="pattern--cache-avec-expiration">Pattern : Cache avec expiration<a class="anchor" aria-label="Lien vers cette section" href="#pattern--cache-avec-expiration">#</a></h3>
<p>`// OnVisible de l’écran
If(
DateDiff(varLastRefresh; Now(); Minutes) > 5 || IsBlank(varEmployeeData);
Set(varEmployeeData;
LookUp(Employees; Email = User().Email)
);
Set(varLastRefresh; Now())
)</p>
<p>// Utilisation dans l’app
Label1.Text = varEmployeeData.FullName
Label2.Text = varEmployeeData.Department`</p>
<p><strong>Avantages</strong> :</p>
<ul>
<li>Une seule requête au lieu de N</li>
<li>Contrôle de la fraîcheur des données</li>
<li>Performance maximale</li>
</ul>
<h3 id="pattern--lazy-loading-conditionnel">Pattern : Lazy loading conditionnel<a class="anchor" aria-label="Lien vers cette section" href="#pattern--lazy-loading-conditionnel">#</a></h3>
<p><code>// Ne charge que si nécessaire If( IsBlank(varProductDetails); Set(varProductDetails; LookUp(Products; SKU = varSelectedSKU) ) )</code></p>
<h2 id="8-debugging-et-troubleshooting">8. Debugging et troubleshooting<a class="anchor" aria-label="Lien vers cette section" href="#8-debugging-et-troubleshooting">#</a></h2>
<h3 id="techniques-de-débogage">Techniques de débogage<a class="anchor" aria-label="Lien vers cette section" href="#techniques-de-débogage">#</a></h3>
<p>`// Afficher le résultat complet dans un Label
Label_Debug.Text = JSON(
LookUp(Orders; OrderID = 12345);
JSONFormat.IncludeBinaryData
)</p>
<p>// Vérifier si le résultat est Blank
Label_Debug.Text = If(
IsBlank(LookUp(Orders; OrderID = 12345));
"BLANK RESULT";
"FOUND"
)</p>
<p>// Compter les résultats potentiels
CountRows(Filter(Orders; Status = "Open"))`</p>
<h3 id="erreurs-courantes-et-solutions">Erreurs courantes et solutions<a class="anchor" aria-label="Lien vers cette section" href="#erreurs-courantes-et-solutions">#</a></h3>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Erreur</th>
<th>Cause</th>
<th>Solution</th>
</tr>
</thead>
<tbody>
<tr>
<td>"Invalid argument type"</td>
<td>Type mismatch dans condition</td>
<td>Vérifier les types (Text vs Number)</td>
</tr>
<tr>
<td>"Network error"</td>
<td>Délégation échouée</td>
<td>Vérifier les limites de données</td>
</tr>
<tr>
<td>Résultat toujours Blank</td>
<td>Condition jamais vraie</td>
<td>Tester avec CountRows(Filter())</td>
</tr>
<tr>
<td>Performance dégradée</td>
<td>LookUp dans propriété "live"</td>
<td>Déplacer vers OnVisible/OnSelect</td>
</tr>
</tbody>
</table></div>
<h2 id="10-checklist-des-bonnes-pratiques">10. Checklist des bonnes pratiques<a class="anchor" aria-label="Lien vers cette section" href="#10-checklist-des-bonnes-pratiques">#</a></h2>
<p>✅ <strong>Toujours vérifier la délégation</strong> sur les sources > 2000 lignes</p>
<p>✅ <strong>Utiliser LookUp uniquement pour un résultat unique attendu</strong></p>
<p>✅ <strong>Mettre en cache</strong> les résultats réutilisés (Set/With)</p>
<p>✅ <strong>Éviter LookUp dans Text/Visible/DisplayMode</strong> sans cache</p>
<p>✅ <strong>Gérer explicitement Blank()</strong> avec IsBlank ou //</p>
<p>✅ <strong>Sécuriser les Patch</strong> avec vérification IsBlank</p>
<p>✅ <strong>Préférer les relations natives</strong> sur Dataverse</p>
<p>✅ <strong>Découper les LookUp imbriqués</strong> en variables</p>
<p>✅ <strong>Tester avec des volumes réalistes</strong> (pas seulement 10 lignes)</p>
<p>✅ <strong>Documenter les hypothèses</strong> sur l’ordre des résultats</p>
<h2 id="conclusion">Conclusion<a class="anchor" aria-label="Lien vers cette section" href="#conclusion">#</a></h2>
<p>La fonction <strong>LookUp</strong> est un outil fondamental de Power Apps, mais son utilisation efficace nécessite une compréhension approfondie de :</p>
<ol>
<li><strong>La délégation</strong> et ses limites par source de données</li>
<li><strong>Le contexte d’exécution</strong> et son impact sur les performances</li>
<li><strong>La gestion des cas limites</strong> (Blank, types, erreurs)</li>
<li><strong>Les patterns d’optimisation</strong> (cache, lazy loading)</li>
</ol>
<p><strong>Règle d’or</strong> : LookUp est votre allié pour cibler rapidement une donnée précise, mais uniquement si vous anticipez ses comportements et optimisez son contexte d’exécution. Une formule LookUp mal placée peut transformer une app fluide en cauchemar utilisateur.</p>]]></content:encoded>
    </item>
    <item>
      <title>Canvas ou Model-Driven : comment choisir le bon type d’app pour votre besoin métier ?</title>
      <link>https://bilelbenaouda.com/blog/canvas-ou-model-driven-comment-choisir-le-bon-type-dapp-pour-votre-besoin-metier/</link>
      <guid isPermaLink="true">https://bilelbenaouda.com/blog/canvas-ou-model-driven-comment-choisir-le-bon-type-dapp-pour-votre-besoin-metier/</guid>
      <pubDate>Tue, 27 Jan 2026 16:54:11 GMT</pubDate>
      <description>La Power Platform offre deux approches majeures pour créer des applications avec Power Apps : Canvas Apps et Model-Driven Apps.</description>
      <category>Power Apps</category>
      <content:encoded><![CDATA[<p>La Power Platform offre deux approches majeures pour créer des applications avec Power Apps : <strong>Canvas Apps</strong> et <strong>Model-Driven Apps</strong>.</p>
<p>Sur le papier, le choix semble simple :</p>
<ul>
<li>Canvas → flexibilité et design.</li>
<li>Model-Driven → structure et robustesse.</li>
</ul>
<p>En réalité, ce choix est stratégique : il impacte directement la <strong>scalabilité, la performance et la maintenabilité</strong> de votre solution. Un mauvais choix au départ peut coûter cher par la suite.</p>
<h2 id="canvas-apps--la-flexibilité-maximale">Canvas Apps : la flexibilité maximale<a class="anchor" aria-label="Lien vers cette section" href="#canvas-apps--la-flexibilité-maximale">#</a></h2>
<p>Les <strong>Canvas Apps</strong> sont comparables à une feuille blanche. Le concepteur contrôle totalement l’interface et l’expérience utilisateur.</p>
<ul>
<li><strong>Design sur-mesure</strong> : interface 100 % personnalisable.</li>
<li><strong>Connectivité large</strong> : plus de 700 connecteurs disponibles (SharePoint, SQL, API, Excel…).</li>
<li><strong>Ciblage mobile/tablette</strong> : parfait pour des apps tactiques sur le terrain.</li>
<li><strong>Logique intégrée avec Power Fx</strong> : langage low-code simple mais puissant.</li>
</ul>
<p>👉 Exemple typique : une app mobile pour techniciens qui scannent des QR codes, prennent des photos et saisissent leurs rapports.</p>
<h3 id="points-forts">Points forts<a class="anchor" aria-label="Lien vers cette section" href="#points-forts">#</a></h3>
<ul>
<li>Grande flexibilité UX/UI.</li>
<li>Compatible avec plusieurs sources de données.</li>
<li>Rapide à mettre en œuvre pour des besoins spécifiques.</li>
</ul>
<h3 id="limites-techniques">Limites techniques<a class="anchor" aria-label="Lien vers cette section" href="#limites-techniques">#</a></h3>
<ul>
<li><strong>Délégation</strong> : les Canvas Apps ne peuvent traiter qu’un volume limité de données en local (500 à 2000 lignes par défaut). Au-delà, il faut configurer la délégation, et certains connecteurs ne la supportent pas.</li>
<li><strong>Performance</strong> : plus une app contient de composants, de règles ou de galeries imbriquées, plus elle devient lente.</li>
<li><strong>Maintenance</strong> : les apps créées par des citizen developers peuvent vite devenir difficiles à maintenir sans standards de gouvernance.</li>
</ul>
<h2 id="model-driven-apps--la-robustesse-des-données">Model-Driven Apps : la robustesse des données<a class="anchor" aria-label="Lien vers cette section" href="#model-driven-apps--la-robustesse-des-données">#</a></h2>
<p>Les <strong>Model-Driven Apps</strong> fonctionnent sur Dataverse. Ici, c’est le <strong>modèle de données</strong> qui guide la construction de l’application.</p>
<ul>
<li>L’interface est générée automatiquement à partir des tables, relations et formulaires.</li>
<li>Les fonctionnalités standard sont incluses : recherche avancée, sécurité par rôle, vues, graphiques, intégration avec Dynamics 365.</li>
<li>L’approche est idéale pour des <strong>process métiers complexes</strong> et des données fortement structurées.</li>
</ul>
<p>👉 Exemple typique : la gestion de dossiers clients avec opportunités, contrats, documents et facturation.</p>
<h3 id="points-forts-1">Points forts<a class="anchor" aria-label="Lien vers cette section" href="#points-forts-1">#</a></h3>
<ul>
<li>Structure robuste et gouvernance native via Dataverse.</li>
<li>Sécurité granulaire et intégration avec Azure AD.</li>
<li>Fonctionnalités prêtes à l’emploi (recherche, graphiques, formulaires).</li>
</ul>
<h3 id="limites-techniques-1">Limites techniques<a class="anchor" aria-label="Lien vers cette section" href="#limites-techniques-1">#</a></h3>
<ul>
<li><strong>Licensing</strong> : Dataverse est inclus dans certaines licences premium (Power Apps per user, Dynamics 365). Pour des organisations déjà sous Microsoft 365 E3/E5, il faut prévoir un coût supplémentaire.</li>
<li><strong>Moins de liberté sur l’UI</strong> : l’interface reste standardisée Microsoft, même si elle est ergonomique.</li>
<li><strong>Complexité initiale</strong> : nécessite une bonne conception du modèle de données.</li>
</ul>
<h2 id="cas-client-vécu--quand-un-mauvais-choix-coûte-cher">Cas client vécu : quand un mauvais choix coûte cher<a class="anchor" aria-label="Lien vers cette section" href="#cas-client-vécu--quand-un-mauvais-choix-coûte-cher">#</a></h2>
<p>Chez un client, une application de type formulaire a été créée par un <strong>citizen developer</strong> sous forme de <strong>Canvas App</strong>.</p>
<p>Au départ, l’objectif était simple : permettre aux utilisateurs de saisir quelques données via un formulaire.</p>
<p>Mais avec le temps :</p>
<ul>
<li>Les données sont devenues le <strong>cœur du processus métier</strong>.</li>
<li>De nouveaux composants, écrans et règles ont été ajoutés.</li>
<li>L’app s’est alourdie, jusqu’à devenir <strong>trop lente et instable</strong>.</li>
</ul>
<p>Résultat : nous avons dû <strong>refondre l’app en Model-Driven</strong>, car la logique métier et la gestion des relations entre entités auraient dû être confiées dès le départ à Dataverse.</p>
<p>⚠️ Morale : <strong>un choix initial mal adapté peut mener à une dette technique coûteuse et une adoption difficile.</strong></p>
<h2 id="tableau-comparatif">Tableau comparatif<a class="anchor" aria-label="Lien vers cette section" href="#tableau-comparatif">#</a></h2>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Critère</th>
<th>Canvas App</th>
<th>Model-Driven App</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Approche</strong></td>
<td>Centrée sur le design et l’UX</td>
<td>Centrée sur le modèle de données</td>
</tr>
<tr>
<td><strong>Sources de données</strong></td>
<td>Multiples (SharePoint, Excel, API…)</td>
<td>Exclusivement Dataverse</td>
</tr>
<tr>
<td><strong>UI</strong></td>
<td>100 % personnalisable</td>
<td>Standardisée Microsoft</td>
</tr>
<tr>
<td><strong>Complexité métier</strong></td>
<td>Faible à moyenne</td>
<td>Moyenne à forte</td>
</tr>
<tr>
<td><strong>Scalabilité</strong></td>
<td>Limitée (risque de lenteur sur gros volumes)</td>
<td>Haute (optimisée Dataverse)</td>
</tr>
<tr>
<td><strong>Cas typiques</strong></td>
<td>App mobile, formulaires spécifiques</td>
<td>CRM, ERP, gestion de dossiers</td>
</tr>
<tr>
<td><strong>Coût</strong></td>
<td>Faible si connecteurs standards</td>
<td>Plus élevé (licences premium Dataverse)</td>
</tr>
</tbody>
</table></div>
<h2 id="scalabilité-gouvernance-et-alm">Scalabilité, gouvernance et ALM<a class="anchor" aria-label="Lien vers cette section" href="#scalabilité-gouvernance-et-alm">#</a></h2>
<p>Au-delà du choix fonctionnel, il faut considérer :</p>
<ul>
<li><strong>La scalabilité</strong> : un Canvas fonctionne bien pour &#x3C;10 000 enregistrements, mais au-delà, Dataverse + Model-Driven sont plus fiables selon ce que j’ai pu lire dans la littérature tech.</li>
<li><strong>La gouvernance</strong> : Model-Driven hérite des politiques de sécurité Dataverse (sécurité hiérarchique, champs masqués, etc.), quand un Canvas dépend davantage de la discipline du créateur.</li>
<li><strong>L’ALM (Application Lifecycle Management)</strong> : Model-Driven s’intègre plus facilement dans une stratégie DevOps avec solutions, pipelines et déploiements contrôlés.</li>
</ul>
<h2 id="alors-comment-choisir-">Alors, comment choisir ?<a class="anchor" aria-label="Lien vers cette section" href="#alors-comment-choisir-">#</a></h2>
<p>👉 <strong>Canvas si :</strong></p>
<ul>
<li>L’UX est au cœur de l’app.</li>
<li>Plusieurs sources de données externes sont nécessaires.</li>
<li>L’application est simple ou tactique (formulaire, mobilité).</li>
</ul>
<p>👉 <strong>Model-Driven si :</strong></p>
<ul>
<li>Le processus métier repose sur un modèle de données complexe.</li>
<li>Vous avez besoin de scalabilité, sécurité et intégration native.</li>
<li>Votre organisation utilise déjà Dataverse ou Dynamics 365.</li>
</ul>
<p>👉 <strong>Et souvent, le combo gagnant :</strong></p>
<p>Une <strong>Model-Driven App</strong> pour la gestion robuste des données + une <strong>Canvas App</strong> pour offrir une interface ergonomique à certains profils d’utilisateurs.</p>
<h2 id="conclusion">Conclusion<a class="anchor" aria-label="Lien vers cette section" href="#conclusion">#</a></h2>
<p>Canvas et Model-Driven ne s’opposent pas : ils répondent à des besoins différents. Mais <strong>le choix initial est stratégique</strong>.</p>
<p>Un mauvais choix peut mener à une dette technique, comme dans l’exemple de l’app devenue trop lente. À l’inverse, un choix éclairé garantit une adoption fluide, une performance durable et une solution qui évolue avec l’entreprise.</p>
<p>👉 Vous avez un projet Power Platform ? Discutons-en : mieux vaut prendre la bonne décision dès maintenant que de réécrire demain.</p>]]></content:encoded>
    </item>
    <item>
      <title>Découvrez les Combobox Modernes</title>
      <link>https://bilelbenaouda.com/blog/decouvrez-les-combobox-modernes/</link>
      <guid isPermaLink="true">https://bilelbenaouda.com/blog/decouvrez-les-combobox-modernes/</guid>
      <pubDate>Tue, 20 Jan 2026 14:15:08 GMT</pubDate>
      <description>Le contrôle Modern Combobox (combobox moderne) est l’une des nouveautés “Modern Controls” de Power Apps dans les apps Canvas. Il remplace ou complète l’ancien combobox classique dans de nombreux scénarios. Mais qu’est‐ce qu’il apporte vraiment ? Quand l’utiliser, quelles sont…</description>
      <category>Power Apps</category>
      <content:encoded><![CDATA[<p>Le contrôle <strong>Modern Combobox</strong> (combobox moderne) est l’une des nouveautés “Modern Controls” de Power Apps dans les apps Canvas. Il remplace ou complète l’ancien combobox classique dans de nombreux scénarios. Mais qu’est‐ce qu’il apporte vraiment ? Quand l’utiliser, quelles sont ses limites, et comment l’optimiser ? C’est ce que nous allons voir.</p>
<h2 id="1-quest-ce-que-le-modern-combobox-">1. Qu’est-ce que le Modern Combobox ?<a class="anchor" aria-label="Lien vers cette section" href="#1-quest-ce-que-le-modern-combobox-">#</a></h2>
<p>Le Modern Combobox est un contrôle qui permet à l’utilisateur de :</p>
<ul>
<li>sélectionner une ou plusieurs valeurs parmi une liste (SelectMultiple)</li>
<li>rechercher (IsSearchable) parmi les options</li>
<li>afficher des champs personnalisés (ex : afficher le nom, ou un nom + sous‐titre, etc.) selon les sources de données</li>
</ul>
<p>Ce contrôle fait partie de la famille des <strong>Modern Controls et Themes</strong>, qu’il faut activer dans les paramètres de l’app Canvas.</p>
<h2 id="2-propriétés-clés--comportements-importants">2. Propriétés clés &#x26; comportements importants<a class="anchor" aria-label="Lien vers cette section" href="#2-propriétés-clés--comportements-importants">#</a></h2>
<p>Voici les propriétés qu’il faut bien connaître, et ce qu’elles impliquent :</p>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Propriété</th>
<th>Description / Utilité</th>
<th>Remarques importantes</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Items</strong></td>
<td>Source de données ou collection d’options que le combobox affiche.</td>
<td>Si vous avez plusieurs colonnes, définir quelle colonne sera affichée via <code>DisplayFields</code> / <code>Value</code>.</td>
</tr>
<tr>
<td><strong>SelectMultiple</strong></td>
<td>Permet la sélection multiple ou unique.</td>
<td>Quand multiple, utiliser <strong>SelectedItems</strong> (table) plutôt que <strong>Selected</strong> (dernier élément).</td>
</tr>
<tr>
<td><strong>IsSearchable</strong></td>
<td>Permet d’activer une zone de recherche dans le combobox afin de filtrer les options.</td>
<td>Nécessite que la source de données ait au moins un champ texte. La recherche utilise <code>SearchText</code>.</td>
</tr>
<tr>
<td><strong>DefaultSelectedItems</strong></td>
<td>Valeurs par défaut (initiales) du contrôle.</td>
<td>Vous devez donner un record ou une table selon SelectMultiple, et le correspondance doit être exacte.</td>
</tr>
<tr>
<td><strong>SearchFields</strong></td>
<td>Champ(s) sur lesquels la recherche s’applique (si IsSearchable est activé).</td>
<td>Seuls les champs texte sont supportés. Vous pouvez donner une liste de champs.</td>
</tr>
<tr>
<td><strong>DisplayFields</strong> / Layout</td>
<td>Pour choisir ce qui s’affiche dans la liste (texte, sous‐texte, image selon le type de données).</td>
<td></td>
</tr>
</tbody>
</table></div>
<h2 id="3-avantages-du-modern-combobox">3. Avantages du Modern Combobox<a class="anchor" aria-label="Lien vers cette section" href="#3-avantages-du-modern-combobox">#</a></h2>
<p>Le Modern Combobox apporte plusieurs améliorations par rapport au combobox classique, notamment :</p>
<ul>
<li><strong>Look &#x26; Feel plus moderne</strong> (UI plus soignée, styles améliorés, support des thèmes modernes).</li>
<li><strong>Support de la recherche intégrée</strong>, ce qui améliore l’expérience utilisateur quand il y a beaucoup d’options.</li>
<li><strong>Sélection multiple facilitée</strong> avec une interface plus claire.</li>
<li>Meilleure compatibilité pour certaines tailles d’écran : sur petit écran, le flyout de sélection devient plein écran pour améliorer l’ergonomie.</li>
</ul>
<h2 id="4-limites-et-pièges-à-connaître">4. Limites et pièges à connaître<a class="anchor" aria-label="Lien vers cette section" href="#4-limites-et-pièges-à-connaître">#</a></h2>
<p>Toute innovation a ses limites. Voici les principales auxquelles faire attention :</p>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Limite / Problème</th>
<th>Détails</th>
<th>Possibles solutions ou contournements</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Nombre maximum d’items affichés (~ 800)</strong></td>
<td>Le Modern Combobox impose une limite d’affichage d’environ 800 éléments dans le résultat.</td>
<td>Utiliser des filtres dynamiques, segmentation (catégorie, région, etc.), ou n’afficher que les options pertinentes.</td>
</tr>
<tr>
<td><strong>Délégation / performance</strong></td>
<td>Quand la source de données est volumineuse, les fonctions comme Search, Filter doivent être délégables pour éviter que l’app ne soit lente.</td>
<td>Choisir des connecteurs délégables (Dataverse, Azure SQL), limiter la quantité de données via des critères, ou charger en “lazy loading”.</td>
</tr>
<tr>
<td><strong>Sélection dans une galerie</strong></td>
<td>Quand un Modern Combobox est utilisé dans une galerie scrollable, sa sélection peut ne pas être maintenue lors du scroll.</td>
<td>Éviter dans les galleries scrollables ou stocker les sélections indépendamment (collection, variable).</td>
</tr>
<tr>
<td><strong>Complexité de <code>DefaultSelectedItems</code></strong></td>
<td>Il faut fournir le bon format (record ou table selon le mode), et ce record doit correspondre exactement à ce qui est dans Items.</td>
<td>Tester avec LookUp, s’assurer que les champs de correspondance sont identiques.</td>
</tr>
<tr>
<td><strong>Fonctions non supportées / non délégables</strong></td>
<td>Certains opérateurs ou fonctions dans l’expression Items ou dans le Search ne sont pas délégables.</td>
<td>Utiliser StartsWith, Filter sur champs texte, vérifier les avertissements de délégation dans l’app.</td>
</tr>
</tbody>
</table></div>
<h2 id="5-bonnes-pratiques-pour-réussir-son-usage">5. Bonnes pratiques pour réussir son usage<a class="anchor" aria-label="Lien vers cette section" href="#5-bonnes-pratiques-pour-réussir-son-usage">#</a></h2>
<p>Voici des recommandations pour que le Modern Combobox serve vraiment bien votre app :</p>
<ol>
<li><strong>Activer les Modern Controls dès le début</strong> Si votre app est neuve, activez Modern Controls dans les paramètres → General → Modern Controls &#x26; Themes.</li>
<li><strong>Commencer avec un prototype</strong> pour tester les scénarios réels.</li>
<li><strong>Limiter les options affichées par défaut</strong> Par exemple, ne pas charger tous les utilisateurs de l’organisation au démarrage, mais utiliser la recherche pour filtrer.</li>
<li><strong>Surveiller la délégation</strong> Tester avec de gros volumes de données, vérifier les avertissements, préférer des sources de données performantes.</li>
<li><strong>Gérer les valeurs par défaut soigneusement</strong> Quand vous utilisez DefaultSelectedItems, s’assurer que ce soit un record exact.</li>
<li><strong>UX / Accessibilité</strong>
<ul>
<li>S’assurer que le contrôle soit utilisable au clavier.</li>
<li>Ajouter un label accessible (AccessibleLabel).</li>
<li>Vérifier le rendu sur mobile.</li>
</ul>
</li>
</ol>
<h2 id="6-quand-privilégier-le-modern-combobox--et-quand-rester-sur-le-classique">6. Quand privilégier le Modern Combobox — et quand rester sur le classique<a class="anchor" aria-label="Lien vers cette section" href="#6-quand-privilégier-le-modern-combobox--et-quand-rester-sur-le-classique">#</a></h2>
<p>Voici quelques scénarios concrets pour vous aider à choisir :</p>
<div class="table-wrap" tabindex="0" role="region" aria-label="Tableau défilant"><table>
<thead>
<tr>
<th>Scénario</th>
<th>Modern Combobox conseillé si…</th>
<th>Classique Combobox préférable si…</th>
</tr>
</thead>
<tbody>
<tr>
<td>Liste longue d’éléments (utilisateurs, produits)</td>
<td>Vous voulez une interface moderne + recherche + esthétique, et vous pouvez pré-filtrer les données.</td>
<td>Si vous avez besoin d’afficher tous les éléments au-delà de 800.</td>
</tr>
<tr>
<td>App mobile / tablette</td>
<td>Le Modern offre meilleure ergonomie et thème moderne.</td>
<td>Si vos besoins sont très simples ou statiques.</td>
</tr>
<tr>
<td>Sources volumineuses</td>
<td>Si votre source est Dataverse ou SQL, avec bonne délégation.</td>
<td>Si vous utilisez SharePoint avec beaucoup de données non délégables.</td>
</tr>
<tr>
<td>Besoin de personnalisation UI</td>
<td>Modern prend en charge thèmes et styles récents.</td>
<td>Si vous dépendez de propriétés encore absentes dans le Modern.</td>
</tr>
</tbody>
</table></div>
<h2 id="7-exemple-concret--liste-des-fournisseurs">7. Exemple concret : liste des fournisseurs<a class="anchor" aria-label="Lien vers cette section" href="#7-exemple-concret--liste-des-fournisseurs">#</a></h2>
<p>Chez un client, nous avions un besoin : permettre aux utilisateurs de choisir un fournisseur dans une liste d’environ 2 500 éléments stockés dans SharePoint.</p>
<ul>
<li>En utilisant le Modern Combobox, seuls ~800 fournisseurs apparaissaient par défaut.</li>
<li>La recherche était parfois tronquée si l’expression n’était pas délégable.</li>
<li>Les performances étaient médiocres sur mobile.</li>
</ul>
<p><strong>Solution :</strong></p>
<ul>
<li>Mise en place d’un filtre initial (catégorie, région).</li>
<li>Utilisation de <code>StartsWith()</code> pour la recherche, afin de rester délégable.</li>
<li>Tests sur plusieurs appareils pour garantir une bonne expérience utilisateur.</li>
</ul>
<p>Résultat : l’UX a été nettement améliorée, mais cela a confirmé qu’il fallait <strong>adapter le design</strong> et ne pas se reposer uniquement sur le contrôle par défaut.</p>
<h2 id="8-conclusion">8. Conclusion<a class="anchor" aria-label="Lien vers cette section" href="#8-conclusion">#</a></h2>
<p>Le Modern Combobox de Power Apps est une excellente évolution : plus esthétique, plus moderne, avec des options de recherche et de sélection multiple qui améliorent l’expérience utilisateur.</p>
<p>Mais ce contrôle a ses limites. Il impose des choix de conception : filtrage des données, gestion de la délégation, paramétrage précis des valeurs par défaut.</p>
<p>👉 Mon conseil : utilisez-le pour vos applications modernes, mais <strong>testez tôt avec vos données réelles</strong> et prévoyez une stratégie de filtrage pour éviter les mauvaises surprises.</p>]]></content:encoded>
    </item>
    <item>
      <title>Qu’est-ce que la Power Platform ? (et pourquoi tout le monde en parle)</title>
      <link>https://bilelbenaouda.com/blog/quest-ce-que-la-power-platform-et-pourquoi-tout-le-monde-en-parle/</link>
      <guid isPermaLink="true">https://bilelbenaouda.com/blog/quest-ce-que-la-power-platform-et-pourquoi-tout-le-monde-en-parle/</guid>
      <pubDate>Wed, 14 Jan 2026 12:54:51 GMT</pubDate>
      <description>En discutant avec d’autres développeurs Power Platform, j’ai découvert un point commun que l’on partage souvent : l’incompréhension de nos proches sur ce que l’on fait.</description>
      <category>Gouvernance &amp; Sécurité</category>
      <content:encoded><![CDATA[<p><strong>En discutant avec d’autres développeurs Power Platform, j’ai découvert un point commun que l’on partage souvent : l’incompréhension de nos proches sur ce que l’on fait.</strong></p>
<p>La fameuse phrase : <em>“Mais en fait Bilel, tu fais quoi concrètement dans la vie ?”</em></p>
<p>Deux options s’offrent alors à moi :</p>
<ul>
<li>L’option floue : <em>“Je développe des applications et des automatisations pour des entreprises.”</em></li>
<li>L’option précise : <em>“Je suis développeur/architecte sur la Power Platform.”</em></li>
</ul>
<p>La seconde option m’oblige systématiquement à présenter la fameuse Power Platform. Et c’est exactement l’objectif de cet article : expliquer simplement ce qu’est la Power Platform, à quoi elle sert, et à qui elle s’adresse.</p>
<h2 id="1-quest-ce-que-la-power-platform-et-de-quoi-est-elle-composée-">1. Qu’est-ce que la Power Platform et de quoi est-elle composée ?<a class="anchor" aria-label="Lien vers cette section" href="#1-quest-ce-que-la-power-platform-et-de-quoi-est-elle-composée-">#</a></h2>
<p>La <strong>Power Platform</strong>, c’est un ensemble d’outils développés par Microsoft pour <strong>créer rapidement des solutions numériques</strong> : applications, automatisations, sites web, rapports, chatbots… même sans savoir coder.</p>
<p>Elle repose sur <strong>5 piliers principaux</strong> :</p>
<h3 id="️-power-apps">⚙️ Power Apps<a class="anchor" aria-label="Lien vers cette section" href="#️-power-apps">#</a></h3>
<p>Pour créer des <strong>applications web ou mobiles</strong>, sans avoir à développer comme un dev full-stack. Parfait pour numériser un processus métier.</p>
<h3 id="-power-automate">🔁 Power Automate<a class="anchor" aria-label="Lien vers cette section" href="#-power-automate">#</a></h3>
<p>Pour <strong>automatiser des flux de travail</strong> : envois d’emails, synchronisation de données, notifications, approbations, etc. Moins de tâches répétitives, plus de temps utile.</p>
<h3 id="-power-bi">📊 Power BI<a class="anchor" aria-label="Lien vers cette section" href="#-power-bi">#</a></h3>
<p>Pour <strong>analyser et visualiser les données</strong> dans des dashboards interactifs. L’outil idéal pour prendre des décisions basées sur des chiffres, pas sur l’intuition.</p>
<h3 id="-copilot-studio-anciennement-power-virtual-agents">🤖 Copilot Studio (anciennement Power Virtual Agents)<a class="anchor" aria-label="Lien vers cette section" href="#-copilot-studio-anciennement-power-virtual-agents">#</a></h3>
<p>Pour <strong>créer des agents conversationnels (chatbots)</strong>. Désormais enrichi d’<strong>IA générative</strong> (via GPT), Copilot Studio permet à n’importe qui de construire un bot capable de comprendre des questions complexes et d’y répondre intelligemment.</p>
<h3 id="-power-pages">🌐 Power Pages<a class="anchor" aria-label="Lien vers cette section" href="#-power-pages">#</a></h3>
<p>Pour <strong>créer des sites web professionnels</strong> (portails clients, formulaires sécurisés, extranets…), connectés à vos données, sans forcément maîtriser HTML/CSS. Un indispensable pour les projets orientés externes.</p>
<h3 id="et-au-cœur--microsoft-dataverse">Et au cœur : <strong>Microsoft Dataverse</strong><a class="anchor" aria-label="Lien vers cette section" href="#et-au-cœur--microsoft-dataverse">#</a></h3>
<p>Une base de données centralisée, sécurisée, connectée à l’ensemble des outils ci-dessus. C’est le cerveau de la Power Platform.</p>
<h2 id="2-à-quel-besoin-est-ce-quelle-répond-">2. À quel besoin est-ce qu’elle répond ?<a class="anchor" aria-label="Lien vers cette section" href="#2-à-quel-besoin-est-ce-quelle-répond-">#</a></h2>
<p>La Power Platform a été conçue pour <strong>accélérer la transformation numérique</strong> des entreprises.</p>
<h3 id="avant-">Avant :<a class="anchor" aria-label="Lien vers cette section" href="#avant-">#</a></h3>
<p>Créer une application ou automatiser un processus, c’était :</p>
<ul>
<li>Long (plusieurs mois),</li>
<li>Coûteux,</li>
<li>Réservé à l’IT ou à des prestataires externes.</li>
</ul>
<h3 id="aujourdhui-">Aujourd’hui :<a class="anchor" aria-label="Lien vers cette section" href="#aujourdhui-">#</a></h3>
<p>La Power Platform permet aux <strong>équipes métiers de créer leurs propres outils</strong>, sans forcément faire appel à des développeurs.</p>
<p>👉 Exemples concrets :</p>
<ul>
<li>Une DRH crée une app de demande de congés dans Power Apps.</li>
<li>Un chef de projet connecte ses outils dans Power Automate pour gagner 2 h/jour.</li>
<li>Un conseiller clientèle met en place un chatbot avec Copilot Studio pour filtrer les demandes.</li>
<li>Un cabinet de conseil publie un portail client sécurisé avec Power Pages.</li>
<li>Une PME visualise son chiffre d’affaires en temps réel dans Power BI.</li>
</ul>
<p>C’est ce qu’on appelle le <strong>low-code</strong> : créer des solutions personnalisées, rapidement, avec peu (ou pas) de code.</p>
<h2 id=""></h2>
<h2 id="3-citizen-dev-vs-pro-dev--qui-utilise-la-power-platform-">3. Citizen dev vs Pro dev : qui utilise la Power Platform ?<a class="anchor" aria-label="Lien vers cette section" href="#3-citizen-dev-vs-pro-dev--qui-utilise-la-power-platform-">#</a></h2>
<p>En école d’ingénieurs, on m’a appris qu’il fallait être développeur professionnel pour déployer une solution IT. Lors d’une expérience en cabinet de conseil, mon manager de l’époque, Paul LEGEARD (qui a fondé par la suite le cabinet <a href="https://www.tribu-conseil.com/" rel="noopener noreferrer">Tribu Conseil</a>), a complètement changé ma vision des choses. C’est là que j’ai découvert que la Power Platform a la particularité de <strong>s’adresser à tous les profils</strong>, techniques ou non :</p>
<h3 id="-citizen-developers">👩‍💼 Citizen Developers<a class="anchor" aria-label="Lien vers cette section" href="#-citizen-developers">#</a></h3>
<p>Ce sont des utilisateurs métiers (RH, Finance, Logistique…) qui créent eux-mêmes des outils pour répondre à leurs besoins du quotidien.</p>
<p>Grâce au low-code, ils deviennent acteurs de la transformation digitale de leur entreprise.</p>
<h3 id="-pro-developers">👨‍💻 Pro Developers<a class="anchor" aria-label="Lien vers cette section" href="#-pro-developers">#</a></h3>
<p>Ils vont plus loin : intégrations complexes, API, authentification, composants personnalisés…</p>
<p>Ils permettent d’<strong>industrialiser</strong>, <strong>sécuriser</strong> et <strong>maintenir</strong> les solutions construites avec la Power Platform.</p>
<p>👉 La <strong>magie opère quand les deux collaborent</strong>.</p>
<p>Les citizen dev lancent des idées. Les pro dev les solidifient.</p>
<p>C’est une nouvelle manière de travailler ensemble, plus agile, plus rapide, plus collaborative.</p>
<h2 id="conclusion">Conclusion<a class="anchor" aria-label="Lien vers cette section" href="#conclusion">#</a></h2>
<p>La Power Platform, c’est bien plus qu’une suite d’outils Microsoft.</p>
<p>C’est une nouvelle façon de <strong>digitaliser son entreprise plus vite</strong>, avec les bons outils, entre les bonnes mains.</p>
<p>Alors, la prochaine fois qu’on me demande ce que je fais concrètement dans la vie, je pourrai dire :</p>
<p><em>« J’aide les entreprises à construire elles-mêmes leurs outils numériques… sans dépendre systématiquement de l’IT. »</em></p>
<p>Et vous, vous vous y mettez quand ?</p>]]></content:encoded>
    </item>
  </channel>
</rss>
