{"id":3175,"date":"2022-06-10T10:57:38","date_gmt":"2022-06-10T08:57:38","guid":{"rendered":"https:\/\/devbloomppm.wpengine.com\/?p=3175"},"modified":"2022-06-15T08:59:43","modified_gmt":"2022-06-15T06:59:43","slug":"planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse","status":"publish","type":"post","link":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/","title":{"rendered":"Planisware : comment optimiser le parcours d&rsquo;une classe avec la relation inverse ?"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"3175\" class=\"elementor elementor-3175\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-725e085 elementor-section-stretched elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"725e085\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;stretch_section&quot;:&quot;section-stretched&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-78dadd8\" data-id=\"78dadd8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-50 elementor-top-column elementor-element elementor-element-7a06bdb\" data-id=\"7a06bdb\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b6c83ad elementor-widget elementor-widget-heading\" data-id=\"b6c83ad\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Planisware : comment optimiser le parcours d'une classe avec la relation inverse ?<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-22f5647 elementor-section-stretched elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"22f5647\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;stretch_section&quot;:&quot;section-stretched&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-33 elementor-top-column elementor-element elementor-element-4706b90\" data-id=\"4706b90\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d8a3fd1 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"d8a3fd1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c858b96 elementor-widget elementor-widget-heading\" data-id=\"c858b96\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">Sommaire<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7c52820 elementor-align-start elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"7c52820\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"#title1\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-chevron-right\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Probl\u00e9matique<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"#title2\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-chevron-right\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">1. Les relations natives Planisware<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"#title3\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-chevron-right\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">2. Cas de relations non natives<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<a href=\"#title4\">\n\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fas fa-chevron-right\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">3. Relation inverse et fromobject<\/span>\n\t\t\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-66 elementor-top-column elementor-element elementor-element-e69c542\" data-id=\"e69c542\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b2c4aed elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"b2c4aed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-fb764c9 elementor-widget elementor-widget-heading\" data-id=\"fb764c9\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"title1\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-medium\">Probl\u00e9matique<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7c1997c elementor-widget elementor-widget-text-editor\" data-id=\"7c1997c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Il est fr\u00e9quent en script Planisware (OJS) d\u2019avoir \u00e0 rechercher des \u00e9l\u00e9ments dans une classe donn\u00e9e (affectations, t\u00e2ches, d\u00e9penses, etc\u2026). La performance de cette recherche d\u00e9pend principalement de deux facteurs :<\/p><p style=\"padding-left: 40px;\"><span style=\"color: #003333;\">\u2192<\/span> <span style=\"color: #000000;\"><strong>La volum\u00e9trie totale des objets de la classe parcourut<\/strong><\/span><br \/><span style=\"color: #000000;\"><strong><span style=\"color: #003333;\">\u2192<\/span> La mani\u00e8re dont les objets de la classe sont parcourus<\/strong><\/span><\/p><p>Pour optimiser ce deuxi\u00e8me point, Planisware met \u00e0 disposition un outil permettant de parcourir des ensembles d\u2019objets restreints : <span style=\"text-decoration: underline; color: #000000;\">les relations inverses.<\/span><\/p><p>Cette m\u00e9thode\u00a0permet de ne parcourir que les objets en relation avec un objet donn\u00e9, et de la sorte, optimiser grandement les temps de parcours.<\/p><p>Dans la suite de cet article, nous allons pr\u00e9senter les diff\u00e9rents types de relations inverses qu\u2019il est possible de rencontrer dans Planisware<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b0956d7 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"b0956d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-74cdd93 elementor-widget elementor-widget-heading\" data-id=\"74cdd93\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"title2\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-medium\">1. Les relations natives Planisware<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c78c4d9 elementor-widget elementor-widget-text-editor\" data-id=\"c78c4d9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Pour illustrer comment fonctionne le parcours de relation inverse native Planisware, nous allons nous baser sur l\u2019exemple de la relation activit\u00e9-affectations (N affectations pour 1 activit\u00e9). Dans ce cas particulier, la relation est native du noyau Planisware (chaque affectation poss\u00e8de un lien vers une activit\u00e9). On pourra alors\u00a0utiliser l\u2019instruction \u00ab\u00a0fromobject\u00a0\u00bb permettant de limiter le parcours des objets \u00e0 ceux li\u00e9s \u00e0 mon activit\u00e9 de d\u00e9part.<\/p><p>C\u00f4t\u00e9 script cela se traduit de la mani\u00e8re suivante :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d5aa313 elementor-widget elementor-widget-code-highlight\" data-id=\"d5aa313\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>var o_activity = \"OpxActivity\".get(\"ID_ACTIVITY\");\r\n\r\nfromobject(o_activity)\r\n{\r\n   for(var o_allocation in OpxAllocation)\r\n   {\r\n    \u2026\r\n   }\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-29050e7 elementor-widget elementor-widget-text-editor\" data-id=\"29050e7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Ici la boucle sur les affectations n\u2019it\u00e8rera que sur les affectations li\u00e9es \u00e0 mon activit\u00e9 dont l\u2019identifiant est ID_ACTIVITY. Dans application poss\u00e9dant des milliers de projets et des millions d\u2019affectations utiliser ce type de parcours est indispensable.<\/p><p>Dans ce cas le parcours des affectations est optimis\u00e9 par les r\u00e8gles heuristiques de l\u2019instruction \u00ab\u00a0fromobject\u00a0\u00bb.<\/p><p>On peut utiliser cette m\u00eame m\u00e9thode pour la recherche d\u2019objets (affectations, activit\u00e9s\u2026) dans un projet donn\u00e9.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7845c04 elementor-widget-divider--view-line_text elementor-widget-divider--element-align-center elementor-widget elementor-widget-divider\" data-id=\"7845c04\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-7e8e3de elementor-widget elementor-widget-heading\" data-id=\"7e8e3de\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"title3\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-medium\">2. Cas de relations non natives<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e82b3da elementor-widget elementor-widget-text-editor\" data-id=\"e82b3da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>On parle de relation non native lorsque la relation entre 2 objets est issue du param\u00e9trage Processes standard ou de param\u00e9trage sp\u00e9cifique \u00e0 une application donn\u00e9e. Cela se traduit par la d\u00e9finition d\u2019un champ attribut relation dans le mod\u00e8le de donn\u00e9es Planisware.<\/p><p>Par exemple la table des \u00ab\u00a0Issues\u00a0\u00bb dans Processes (_IS_RA_ISSUE_ACTIVITY. Si l\u2019on souhaite parcourir les \u00ab\u00a0Issues\u00a0\u00bb d\u2019une activit\u00e9 donn\u00e9e, le fromobject n\u2019est pas recommand\u00e9 (il est possible qu\u2019il ne fonctionne pas\u00a0: exemple de r\u00e9gression sur ce point entre la version 5.3.2.9 et la 5.3.2.10).<\/p><p>Pour plus de s\u00e9curit\u00e9, il est pr\u00e9f\u00e9rable d\u2019opter pour le m\u00e9canisme des relations inverse qui est pr\u00e9conis\u00e9 comme \u00e9tant la meilleure pratique par l\u2019\u00e9diteur.<\/p><p>Voici un exemple de script utilisant la relation inverse dans le cas du parcours des Issues :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-66149c2 elementor-widget elementor-widget-code-highlight\" data-id=\"66149c2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>var o_activity = \"OpxActivity\".get(\"ID_ACTIVITY\");\r\n\r\nfor(var o_issue in o_activity.get(<span >_IS_RA_ISSUE_ACTIVITY<\/span>._IS_PT_WF_ISSUE<\/span>))\r\n{\r\n \u2026\r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5f81d67 elementor-widget elementor-widget-text-editor\" data-id=\"5f81d67\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dans ce cas on sp\u00e9cifie \u00e0 Planisware de ne parcourir que les Issues li\u00e9es \u00e0 mon activit\u00e9 de d\u00e9part via le champ _IS_RA_ISSUE_ACTIVITY.<\/p><p>On peut illustrer la recherche par l\u2019illustration suivante :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cf24238 elementor-widget elementor-widget-image\" data-id=\"cf24238\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"724\" height=\"549\" src=\"https:\/\/bloomppm.com\/wp-content\/uploads\/2022\/06\/ONB_activite_classe.png\" class=\"attachment-large size-large wp-image-3176\" alt=\"Tableau ONB\" srcset=\"https:\/\/bloomppm.com\/wp-content\/uploads\/2022\/06\/ONB_activite_classe.png 724w, https:\/\/bloomppm.com\/wp-content\/uploads\/2022\/06\/ONB_activite_classe-300x227.png 300w\" sizes=\"(max-width: 724px) 100vw, 724px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5a59a1a elementor-widget elementor-widget-text-editor\" data-id=\"5a59a1a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Recherche via relation inverse<br \/>Gr\u00e2ce \u00e0 cette syntaxe, Planisware parcourt uniquement les lignes surlign\u00e9es en bleu.<\/p><p>Une syntaxe fonctionnement \u00e9quivalente serait la suivante mais les performances seraient tr\u00e8s d\u00e9grad\u00e9es.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6e99d2a elementor-widget elementor-widget-code-highlight\" data-id=\"6e99d2a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>var o_activity = \"OpxActivity\".get(\"ID_ACTIVITY\"); \r\n\r\nfor(var o_issue in Opx<span >_IS_RA_ISSUE_ACTIVITY<\/span>==o_activity)\r\n{ \r\n \u2026 \r\n}<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d0d32e0 elementor-widget elementor-widget-text-editor\" data-id=\"d0d32e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Dans cette\u00a0syntaxe non optimis\u00e9e Planisware parcourt toutes les lignes puis s\u00e9lectionne celles\u00a0surlign\u00e9es en bleu.<\/p><p>Pour g\u00e9n\u00e9raliser la syntaxe de rechche via relation inverse est donc la suivante :<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b5b5c38 elementor-widget elementor-widget-code-highlight\" data-id=\"b5b5c38\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-default copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-javascript line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-javascript\">\n\t\t\t\t\t<xmp>for (var o_linked_object in o_origin_object.get(<span ><\r\nCLASSE_DES_OBJETS_PARCOURUS><\/span>)<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e2e0004 elementor-widget elementor-widget-text-editor\" data-id=\"e2e0004\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Cette syntaxe est \u00e0 ce jour la meilleure mani\u00e8re d\u2019optimiser ce type de parcours.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8df3128 elementor-widget-divider--view-line_text elementor-widget-divider--element-align-center elementor-widget elementor-widget-divider\" data-id=\"8df3128\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1606894 elementor-widget elementor-widget-heading\" data-id=\"1606894\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"title4\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-medium\">3. Relation inverse et fromobject<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-98081cd elementor-widget elementor-widget-text-editor\" data-id=\"98081cd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Il est important de noter que la syntaxe d\u2019une relation inverse utilise l\u2019instruction \u00ab\u00a0get\u00a0\u00bb. Cette instruction bypasse les restrictions comme le fromobject. Par exemple si je fais un fromobject sur un projet et que j\u2019impl\u00e9mente ensuite une boucle de relation inverse sur les affectations d\u2019une ressource donn\u00e9e, Planisware va renvoyer l\u2019ensemble des affectations de la ressource et pas seulement celles contenues dans mon projet de d\u00e9part.<\/p><p>Dans ce cas il faudra imp\u00e9rativement rajouter une clause \u00ab\u00a0where\u00a0\u00bb dans la boucle de recherche pour la restreindre aux objets contenus dans le projet souhait\u00e9.<\/p><p>A noter que dans un tel cas on pourra se poser la question de la condition la plus restrictive (entre le fromobject et la relation inverse) pour optimiser le traitement.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Planisware : comment optimiser le parcours d&rsquo;une classe avec la relation inverse ? Sommaire Probl\u00e9matique 1. Les relations natives Planisware 2. Cas de relations non natives 3. Relation inverse et fromobject Probl\u00e9matique Il est fr\u00e9quent en script Planisware (OJS) d\u2019avoir \u00e0 rechercher des \u00e9l\u00e9ments dans une classe donn\u00e9e (affectations, t\u00e2ches, d\u00e9penses, etc\u2026). La performance de&hellip;&nbsp;<a href=\"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/\" rel=\"bookmark\">Lire la suite &raquo;<span class=\"screen-reader-text\">Planisware : comment optimiser le parcours d&rsquo;une classe avec la relation inverse ?<\/span><\/a><\/p>\n","protected":false},"author":5,"featured_media":3176,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"left","neve_meta_author_avatar":"","neve_post_elements_order":"[\"meta\",\"thumbnail\",\"content\",\"tags\",\"comments\"]","neve_meta_disable_header":"off","neve_meta_disable_footer":"","neve_meta_disable_title":"","_themeisle_gutenberg_block_has_review":false,"cybocfi_hide_featured_image":"yes","footnotes":""},"categories":[9],"tags":[],"class_list":["post-3175","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-non-classifiee"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.0 (Yoast SEO v28.0) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Planisware : comment optimiser le parcours d&#039;une classe avec la relation inverse ? - BLOOM PPM<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/\"},\"author\":{\"name\":\"Antoine Hirschenhahn\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#\\\/schema\\\/person\\\/beb0bf75e386466a086d6a396e9112b7\"},\"headline\":\"Planisware : comment optimiser le parcours d&rsquo;une classe avec la relation inverse ?\",\"datePublished\":\"2022-06-10T08:57:38+00:00\",\"dateModified\":\"2022-06-15T06:59:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/\"},\"wordCount\":756,\"publisher\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/bloomppm.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/ONB_activite_classe.png\",\"articleSection\":[\"Non classifi\u00e9(e)\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/\",\"url\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/\",\"name\":\"Planisware : comment optimiser le parcours d'une classe avec la relation inverse ? - BLOOM PPM\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/bloomppm.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/ONB_activite_classe.png\",\"datePublished\":\"2022-06-10T08:57:38+00:00\",\"dateModified\":\"2022-06-15T06:59:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Planisware : comment optimiser le parcours d&#8217;une classe avec la relation inverse ?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#website\",\"url\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/\",\"name\":\"BLOOM PPM\",\"description\":\"We make your projects grow\",\"publisher\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#organization\",\"name\":\"Bloom PPM\",\"url\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/bloomppm.com\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Blue_without_background.png\",\"contentUrl\":\"https:\\\/\\\/bloomppm.com\\\/wp-content\\\/uploads\\\/2020\\\/10\\\/Blue_without_background.png\",\"width\":602,\"height\":204,\"caption\":\"Bloom PPM\"},\"image\":{\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/company\\\/bloomppm\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/#\\\/schema\\\/person\\\/beb0bf75e386466a086d6a396e9112b7\",\"name\":\"Antoine Hirschenhahn\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e6ee81cbc975109949822918ee666922009c32622b2da432a1a3904c52375d60?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e6ee81cbc975109949822918ee666922009c32622b2da432a1a3904c52375d60?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/e6ee81cbc975109949822918ee666922009c32622b2da432a1a3904c52375d60?s=96&d=mm&r=g\",\"caption\":\"Antoine Hirschenhahn\"},\"url\":\"https:\\\/\\\/bloomppm.com\\\/fr\\\/author\\\/antoine-hirschenhahnbloomppm-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Planisware : comment optimiser le parcours d'une classe avec la relation inverse ? - BLOOM PPM","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/#article","isPartOf":{"@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/"},"author":{"name":"Antoine Hirschenhahn","@id":"https:\/\/bloomppm.com\/fr\/#\/schema\/person\/beb0bf75e386466a086d6a396e9112b7"},"headline":"Planisware : comment optimiser le parcours d&rsquo;une classe avec la relation inverse ?","datePublished":"2022-06-10T08:57:38+00:00","dateModified":"2022-06-15T06:59:43+00:00","mainEntityOfPage":{"@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/"},"wordCount":756,"publisher":{"@id":"https:\/\/bloomppm.com\/fr\/#organization"},"image":{"@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/#primaryimage"},"thumbnailUrl":"https:\/\/bloomppm.com\/wp-content\/uploads\/2022\/06\/ONB_activite_classe.png","articleSection":["Non classifi\u00e9(e)"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/","url":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/","name":"Planisware : comment optimiser le parcours d'une classe avec la relation inverse ? - BLOOM PPM","isPartOf":{"@id":"https:\/\/bloomppm.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/#primaryimage"},"image":{"@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/#primaryimage"},"thumbnailUrl":"https:\/\/bloomppm.com\/wp-content\/uploads\/2022\/06\/ONB_activite_classe.png","datePublished":"2022-06-10T08:57:38+00:00","dateModified":"2022-06-15T06:59:43+00:00","breadcrumb":{"@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/bloomppm.com\/fr\/planisware-comment-optimiser-le-parcours-dune-classe-avec-la-relation-inverse\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/bloomppm.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Planisware : comment optimiser le parcours d&#8217;une classe avec la relation inverse ?"}]},{"@type":"WebSite","@id":"https:\/\/bloomppm.com\/fr\/#website","url":"https:\/\/bloomppm.com\/fr\/","name":"BLOOM PPM","description":"We make your projects grow","publisher":{"@id":"https:\/\/bloomppm.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/bloomppm.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/bloomppm.com\/fr\/#organization","name":"Bloom PPM","url":"https:\/\/bloomppm.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/bloomppm.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/bloomppm.com\/wp-content\/uploads\/2020\/10\/Blue_without_background.png","contentUrl":"https:\/\/bloomppm.com\/wp-content\/uploads\/2020\/10\/Blue_without_background.png","width":602,"height":204,"caption":"Bloom PPM"},"image":{"@id":"https:\/\/bloomppm.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/bloomppm\/"]},{"@type":"Person","@id":"https:\/\/bloomppm.com\/fr\/#\/schema\/person\/beb0bf75e386466a086d6a396e9112b7","name":"Antoine Hirschenhahn","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/e6ee81cbc975109949822918ee666922009c32622b2da432a1a3904c52375d60?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/e6ee81cbc975109949822918ee666922009c32622b2da432a1a3904c52375d60?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6ee81cbc975109949822918ee666922009c32622b2da432a1a3904c52375d60?s=96&d=mm&r=g","caption":"Antoine Hirschenhahn"},"url":"https:\/\/bloomppm.com\/fr\/author\/antoine-hirschenhahnbloomppm-com\/"}]}},"_links":{"self":[{"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/posts\/3175","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/comments?post=3175"}],"version-history":[{"count":0,"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/posts\/3175\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/media\/3176"}],"wp:attachment":[{"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/media?parent=3175"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/categories?post=3175"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bloomppm.com\/fr\/wp-json\/wp\/v2\/tags?post=3175"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}