lundi 29 février 2016

Remplacer la requête d'une grille

Lorsqu'on crée une sous-grille sur un formulaire, la seule option qui est disponible est d'afficher les enregistrements associées. Cette possibilité montre rapidement ses limites dès lors que l'on souhaite afficher des résultats provenant d'une requête plus complexe.
Prenons l'exemple suivant : le client me demande d'afficher les rendez-vous effectués sur le compte ainsi que ceux effectués sur les comptes enfants.
Par défaut MS CRM n'affichera que les rendez-vous directement associés au compte courant.
Attention, la solution apportée dans cette article, bien que relativement simple n'est pas supportée par Microsoft étant donné qu'elle n'utilise pas l'API JavaScript.
Pour afficher les rendez-vous issue de la hiérarchie du compte courant, suivez la procédure suivante :
  1. Ouvrez le formulaire Compte.
  2. Insérez sur celui-ci une sous-grille en sélectionnant dans le groupe d'options Enregistrements la valeur Tous les types d'enregistrements. Sélectionnez une Vue par défaut qui contient l'ensemble des colonnes que vous souhaitez afficher dans l'ordre voulu.
  3. Ajoutez une ressource JavaScript avec les fonctions suivantes.
    var setGridFetchXml = function (gridId, fetchXml) {
        /// <summary>
        /// Remplace la requête FetchXML de la grille par la requête passée en paramètre
        /// </summary>
        /// <param name="gridId" type="String">Identifiant unique de la grille</param>
        /// <param name="fetchXml" type="String">Requête FetchXML à affecter à la grille</param>
        var grid = window.parent.document.getElementById(gridId); // Obtient le contrôle associée à la sous-grille
        if (!grid || !grid.control) {
            setTimeout(function () {
                setGridFetchXml(gridId, fetchXml);
            }, 2000); // Si la grille n'a pas été chargée, retenter dans 2 secondes
            return;
        }
    
        grid.control.SetParameter("fetchXml", fetchXml); // Affecte la requête FetchXML à la grille
        grid.control.Refresh(); // Rafraichit la sous-grille avec la nouvelle requête
    };
    
    var onLoad = function (){
        var fetchXml = [
            '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">',
              '<entity name="appointment">',
                '<attribute name="subject" />',
                '<attribute name="statecode" />',
                '<attribute name="scheduledstart" />',
                '<attribute name="scheduledend" />',
                '<attribute name="createdby" />',
                '<attribute name="regardingobjectid" />',
                '<attribute name="activityid" />',
                '<attribute name="instancetypecode" />',
                '<order attribute="subject" descending="false" />',
                '<link-entity name="account" from="accountid" to="regardingobjectid" alias="a">',
                  '<filter type="and">',
                    '<condition attribute="accountid" operator="eq-or-under" value="' + Xrm.Page.data.entity.getId() + '" />',
                  '</filter>',
                '</link-entity>',
              '</entity>',
            '</fetch>'
        ].join("");
        
        setGridFetchXml("RDVGrid", fetchXml); // Affecte la requête à la grille
    };
    
  4. Branchez la fonction onLoad sur l'Évènement OnLoad du Formulaire.
  5. Enregistrez, publiez et fermez : la grille affiche le résultat de la requête.
La fonction setGridFetchXml présentée dans cette article est adaptée aux TurboForms, remplacez simplement la ligne 7 par le bout de code suivant pour l'adapter aux versions antérieures.
var grid = document.getElementById(gridId);

Attention les opérateurs hiérarchiques (under, eq-or-under, above et eq-or-above) ne sont disponibles qu'à partir de CRM 2015 !