Problématique
Si vous avez besoin d’exporter sous Excel une liste de comptes ou de contacts dans le but de faire des retouches à droite à gauche puis de réinjecter le tout dans CRM, vous ne pouvez pas vous en sortir avec CRM seul.
En effet, l’export sous Excel ne permet pas d’extraire les id des enregistrements (que ce soit des comptes, des contacts ou toute autre entité). Or ceux-ci sont nécessaires pour retrouver les enregistrements au moment de réimporter les modifications dans CRM.
Solution
Je ne vois que trois outils sur le net susceptibles de nous aider :
Quelques remarques
Ces outils sont simples d’utilisation. Quelques remarques toutefois :
- Microsoft Dynamics CRM 4.0 Bulk Update and Export Tool :
- Attention, pour cet outil, il faut installer le Framework 3.5.
- Vous pouvez faire des updates et des deletes en masse d’enregistrements mais la création de nouveaux enregistrements fonctionnent mal.
- La liaison entre entités, c’est-à-dire l’utilisation de champs lookup n’est pas très simple. En effet, par exemple, pour indiquer le contact principal d’un compte, vous devez transmettre un champ avec une valeur au format : “contact,60cde26b-92c1-dc11-9a60-0003ff562152”. Il n’est donc pas possible de transmettre le nom du contact directement. Vous devez fournir le Guid de l’enregistrement lié !
Conseil pour s’en sortir : Exportez les comptes et les contacts dans deux fichiers csv séparés. Editez ces fichiers dans Excel. Retrouvez le Guid associé à un contact en utilisant la fonction VLookup d’Excel.
- Tool to Update MSCRM 4.0 data inline and Export to CSV for Re-import
- Les champs Lookup ne sont pas rapatriés correctement (notamment s’ils sont mis à jour dans Excel)
- Les nouveaux enregistrements doivent être importés séparément dans CRM et ne peuvent être ajoutés en même temps que les enregistrements mis à jour.
- Un enregistrement n’est pas mis à jour s’il a été modifié entre temps dans CRM.
- Import Manager 2008
- Cet outil est indubitablement le plus complet des trois. Il permet notamment de programmer des imports sous forme de batch. Il permet notamment de mapper les colonnes des fichiers à importer avec les attributs des entités de CRM.
- Par contre, au delà de 10 enregistrements importés, il faut acheter une licence.
Problématique
Lorsqu’on affiche une liste d’éléments associés dans une iFrame au sein d’un formulaire Dynamics CRM (cf. article précédent explicitant le procédé pour y parvenir) , il reste un espace blanc de chaque côté de celle-ci :

Comment supprimer ces espaces de couleur blanche ?
Proposition de solution
Si vous observez l’élément HTML dans la page, à l’aide par exemple de l’Internet Explorer Toolbar (ou des outils de développement de IE8), vous constaterez que ces espaces sont dû :
- d’abord au padding de l’élément HTML correspondant qui n’est malheureusement pas à 0,
- mais aussi, sur la droite, à la zone prévue pour une éventuelle barre de défilement (ce qui explique d’ailleurs que l’espace blanc est plus important à droite qu’à gauche puisqu’il cumule le problème du padding et de la scrollbar).
Conclusion, pour s’en débarrasser il suffit de supprimer les deux :-)
Le code
Voici le code à rajouter dans l’évènement onLoad du formulaire :
ATTENTION : pensez à remplacer le nom de l’iFrame (IFRAME_Clubs) par le nom de votre iFrame à vous !
crmForm.all.IFRAME_Clubs.attachEvent('onreadystatechange',func);
function func(event) {
//Récupération de l'élément HTML (iframe) sur lequel porte l'évènement
var target = event.target || event.srcElement;
//Vérification du statut de chargement du contenu de l'iframe
if(target.readyState=='complete') {
//Récupération du body de l'iframe
iframeBody=target.contentWindow.document.body;
//Suppression du padding
iframeBody.childNodes[0].rows[0].cells[0].style.padding = 0;
//Suppression de l'emplacement de la scrollbar verticale
iframeBody.scroll = "no";
}
}
Pourquoi attacher dynamiquement une fonction en réponse à l’évènement onreadystatechange sur l’iFrame ?
Tout simplement parce que vous risquez d’accéder au contenu de l’iFrame avant même que celle-ci soit chargée ! L’évènement onreadystatechange se déclenche sur un élément justement lorsque le statut de celui-ci change. On l’utilise donc pour valider que le statut de l’iframe est à la valeur complete, indiquant la fin du chargement de son contenu!
Problématique
Dans CRM tout est rangé dans des tiroirs, et ça ne plait pas toujours. En effet, dans un formulaire, tous les éléments associés à l’enregistrement en cours sont accessibles par le volet de navigation situé sur le côté gauche.
Par exemple, imaginons qu’un contact possède des biens qu’on veut pouvoir enregistrer dans Dynamics CRM. Il suffit pour cela de créer une entité personnalisé, que l’on appellerait Bien et d’associer celle-ci à l’entité Contact par une relation de type N-1. Le résultat est que tous les biens d’un contact sont accessibles par le menu Biens dans le volet gauche du formulaire de l’entité Contact.
Il faut donc au moins un clic pour accéder à la liste des biens du contact. Une fois la liste des biens affichée, l’utilisateur n’a plus évidemment de visibilité sur les informations générales du Contact (son adresse, son téléphone etc…)
Comment faire pour que l’utilisateur puisse avoir en un coup d’œil, à la fois la liste des biens du contact, à la fois les informations générales de celui-ci ?
Alternative
Une alternative à la présentation par défaut proposée par Dynamics CRM consiste à utiliser les iFrame pour afficher la liste d’un élément associé directement sur le formulaire. Cela permet de revenir à une approche plus “portail” où tous les éléments sont visibles dans une seule et même page.
Par exemple, pour voir d’un seul coup d’œil, les informations d’un contact et la liste de ses biens, vous pouvez remplacer le nœud dans le volet de navigation à gauche par une iFrame positionnée sur n’importe quel onglet du formulaire :
Le code
Pour ramener une liste d’éléments dans une iframe sur un formulaire, voici la procédure à suivre :
- Utilisez les outils de développement de IE 8, ou si vous avez une version antérieure de IE, munissez vous d’une extension permettant de visualiser le modèle d’objets en mémoire d’une page html tel que l’Internet Explorer Developer Toolbar.
- Pour faire apparaître la barre de menu lorsque vous visualisez un enregistrement contact, appuyez par exemple la combinaison de touches CTRL-N.
- Une fois la barre de menu de IE visible, vous pouvez sélectionnez votre extension ou les outils de développement de IE 8 pour afficher le modèle d’objets en mémoire de la page en cours.
- Retrouvez dans la hiérarchie des nœuds celui de l’entité associée qui vous intéresse. Par exemple, le nœud Biens correspond à la SubArea d’id nav_new_contact_new_bien ou new_contact_new_bien est le nom de la relation entre l’entité contact et l’entité new_bien.
- Notez qu’il y a une procédure nommé loadArea sur l’évènement onclick de l’élément HTML.
C’est cette procédure justement qui affiche la liste dans le volet de droite lorsque l’utilisateur clique sur le nœud. Le code de cette procédure est situé dans le fichier Details.js que vous trouverez sous la structure de répertoire du site web CRM dans …\_static\_common\scripts :
Si vous éditez le source de la page HTML du formulaire, vous verrez qu’en effet ce fichier de script est chargé dans la page par une balise script :
En analysant la procédure loadArea, on constate que la page qui affiche la vue associée de l’élément enfant est une page nommée areas.aspx.

En analysant complètement cette procédure, on peut donc retrouver l’url de la page qui s’affiche dans le volet droit du formulaire lorsque l’utilisateur clique sur le nœud dans le volet de navigation de gauche. C’est cette url qu’il suffit donc de reproduire dans une iFrame dessinée sur le formulaire pour basculer le nœud du volet de navigation directement sur le formulaire. Elle est du type :
areas.aspx?oId=<Id de l'objet>&oType=<Type de l'objet>&security=<info de securité>&tabSet=<Nom du noeud>;
- Créez maintenant une iFrame dans le formulaire de l’entité parent à l’emplacement souhaité. Elle doit avoir les caractéristiques suivantes :
- Ajoutez le script suivant dans le code de l’évènement onLoad du formulaire :
ATTENTION : n’oubliez pas de remplacer le nom IFRAME_Biens de l’iFrame dans cet exemple par le nom de votre iFrame à vous ! Remplacez également le nom de la SubArea (ici new_contact_new_bien) par celui de votre nœud à vous (que vous retrouvez en paramètre de l’appel à la fonction loadArea en réponse à l’évènement onclick sur l’élément HTML vu dans l’extension de IE)
var CRMFORMTYPE_CREATE =1;
var CRMFORMTYPE_UPDATE = 2;
var CRMFORMTYPE_READONLY = 3;
var CRMFORMTYPE_DISABLED = 4;
var CRMFORMTYPE_BULKEDIT = 6;
var CRMFORMTYPE_QUICKCREATE =5 ;
crmForm.all.IFRAME_Biens.src = GetFrameSource('new_contact_new_bien');
function GetFrameSource(tabSet)
{
var oId = crmForm.ObjectId;
var oType = crmForm.ObjectTypeCode;
var security = crmFormSubmit.crmFormSubmitSecurity.value;
var uri ="";
if (crmForm.ObjectId != null)
{
var oId = crmForm.ObjectId;
var oType = crmForm.ObjectTypeCode;
var security = crmFormSubmit.crmFormSubmitSecurity.value;
var url = "areas.aspx?oId=" + oId + "&oType=" + oType + "&security=" + security + "&tabSet=" + tabSet;
uri = url;
}
else
{
uri = "about:blank";
}
switch (crmForm.FormType)
{
case CRMFORMTYPE_UPDATE:
case CRMFORMTYPE_READONLY:
case CRMFORMTYPE_DISABLED:
return uri;
break;
case CRMFORMTYPE_BULKEDIT:
case CRMFORMTYPE_QUICKCREATE:
case CRMFORMTYPE_CREATE:
return "about:blank";
break;
default:
break;
}
}
Le switch à la fin de la procédure permet d’envisager tous les modes possible d’un formulaire Dynamics CRM. Par exemple, lorsque l’utilisateur créé un nouveau contact, la liste doit apparaître vide. C’est seulement une fois le contact sauvegardé qu’il est alors possible de lui associer des biens.
- Sauvegardez les changements, n’oubliez pas de cocher l’activation de l’évènement onLoad et publiez l’entité.
- Pour faire disparaître le nœud de l’élément associé dans le volet gauche de navigation du formulaire, il suffit de sélectionner Ne pas afficher dans la liste des option d’affichage dans l’écran de définition de la relation 1-N entre les deux entités.
Et voilà ! Votre liste est opérationnelle dans le formulaire !
Cas particulier d’un élément associé par une relation N-N native
Attention au cas des relations N-N native pour laquelle il y a une petite subtilité. Par exemple, un contact peut être membre de plusieurs clubs de sport (où club de sport serait défini en tant qu’entité personnalisée), ceux-ci ayant également plusieurs contacts membres. Une simple relation N-N native suffit donc à la mise en place d’une telle relation entre les entités contact et new_clubdesport. Sauf que, dans ce cas, l’affichage de la liste des clubs fait intervenir un paramètre supplémentaire appelé roleOrd.
En effet, vous savez qu’en base de données, toute relation N-N entre deux tables nécessitent la mise en place d’une table intermédiaire rapatriant la clé de chacune des tables impliquées dans la relation. Cette table existe bel et bien dans CRM lorsque vous tirez une relation N-N native entre deux entités, mais elle n’est pas visible et se comporte comme une table intrinsèque.
Cela veut dire que lorsqu’un utilisateur clique sur le nœud Clubs de sport dans le volet gauche d’un formulaire Contact, en théorie, c’est une liste des éléments de cette table intermédiaire qui devrait apparaître dans le volet droit. Or, Dynamics CRM fait bien les choses puisqu’il affiche directement la liste des clubs de sport dont le contact est membre.
Si on scrute le modèle objets de la page HTML en mémoire, on s’aperçoit que la fonction loadArea récupère un second paramètre :
Notez au passage que le nom de la SubArea (dans l’exemple areanew_new_clubdesport_contact) est toujours celui de la relation, mais préfixé par le mot area.
Le second paramètre est \x26roleOrd\x3d2. Que signifie-t-il ?
\x est le caractère d’échappement utilisé en javascript pour exprimer le code hexadecimal qui suit. 26 est le caractère “&” et 3d est le signe “=”. Cela donne donc la chaîne &roleOrd=2. roleOrd est donc en fait un Nième paramètre de l’url de la page areas.aspx qui constitue la source de l’iFrame de notre formulaire. En fait, si on se positionne sur l’entité Contact, par ce paramètre on indique qu’on veut voir le niveau 2 de la relation avec la table Club, c’est-à-dire la liste des clubs. Le niveau 1 représenterait la liste des éléments de la table intrinsèque…
- Jetez un œil dans le fichier Details.js. Vous constatez que le second paramètre passé à la fonction loadArea (appelé sParams) est concaténé à l’url à la suite des autres paramètres (oId, oType, security et tabSet) :
- Modifiez donc la fonction GetFrameSource dans le code de réponse à l’évènement onLoad du formulaire de l’entité parente pour inclure ce nouveau paramètre. Cela donne :
var CRMFORMTYPE_CREATE =1;
var CRMFORMTYPE_UPDATE = 2;
var CRMFORMTYPE_READONLY = 3;
var CRMFORMTYPE_DISABLED = 4;
var CRMFORMTYPE_BULKEDIT = 6;
var CRMFORMTYPE_QUICKCREATE =5 ;
crmForm.all.IFRAME_Biens.src = GetFrameSource('new_contact_new_bien');
//A ajouter : le second paramètre que vous pouvez récupérer dans le modèle objet de la page HTML
crmForm.all.IFRAME_Clubs.src = GetFrameSource('areanew_new_clubdesport_contact','\x26roleOrd\x3d2');
//A ajouter : le paramètre roleOrd dans la fonction
function GetFrameSource(tabSet, roleOrd)
{
var oId = crmForm.ObjectId;
var oType = crmForm.ObjectTypeCode;
var security = crmFormSubmit.crmFormSubmitSecurity.value;
var uri ="";
if (crmForm.ObjectId != null)
{
var oId = crmForm.ObjectId;
var oType = crmForm.ObjectTypeCode;
var security = crmFormSubmit.crmFormSubmitSecurity.value;
var url = "areas.aspx?oId=" + oId + "&oType=" + oType + "&security=" + security + "&tabSet=" + tabSet;
//A ajouter : traitement du paramètre optionnel roleOrd
var roleOrdParamMissing = (typeof(roleOrd) == "undefined") || (roleOrd == null);
if (!roleOrdParamMissing) {
//Si le paramètre est présent, concaténez le à la suite de l'url
url += roleOrd;
}
uri = url;
}
else
{
uri = "about:blank";
}
switch (crmForm.FormType)
{
case CRMFORMTYPE_UPDATE:
case CRMFORMTYPE_READONLY:
case CRMFORMTYPE_DISABLED:
return uri;
break;
case CRMFORMTYPE_BULKEDIT:
case CRMFORMTYPE_QUICKCREATE:
case CRMFORMTYPE_CREATE:
return "about:blank";
break;
default:
break;
}
}
et à l’exécution :

Requête Ajax
Voici la structure type d’une requête Ajax que l’on peut émettre depuis le code javascript d’un formulaire CRM pour interroger les services web de Dynamics CRM.
Par exemple voici la tuyauterie nécessaire pour invoquer la méthode RetrieveMultiple :
Méthode RetrieveMultiple avec un critère simple
Le corps de la balise RetrieveMultiple doit reprendre le schéma suivant :
- q1:ColumnSet définit les colonnes attendues en réponse de la requête SELECT (le type q1:AllColumns correspond à un SELECT * et q1:ColumnSet permet de spécifier des colonnes précises)
- q1:Criteria correspond à la clause WHERE de la requête SELECT. Il s’agit d’une collection de conditions définie dans l’élément q1:Conditions, elles-même associées par l’opérateur défini dans l’élément q1:FilterOperator. Chaque élément q1:Condition représente un critère de filtre défini par un attribut, un opérateur et les valeurs associées.
Exemple : Supposons que vous cherchez parmi vos contacts tous les directeurs informatiques basés sur la France, cela donnerait la requête suivante :
Cette première structure de requête permet de combiner uniquement des conditions par un même opérateur (And ou Or).
Exemples :
- WHERE condition a ET condition b,
- ou WHERE condition a OU condition b OU condition c,
- etc…
Méthode RetrieveMultiple avec multicritères
Si vous avez à traiter un groupement de conditions plus complexe associant plusieurs opérateurs du type WHERE (condition a ET (condition b OU condition c)), il faut exploiter un élément supplémentaire q1:filters qui permet d’imbriquer plusieurs filtres.
Le schéma est le suivant :
q1:Filters est une collection de filtres supplémentaires associée à l’ensemble des conditions de premier niveau du critère par l’opérateur q1:FilterOperator.
q1:Filter définit une collection de conditions q1:Conditions, elles-même associées par l’opérateur défini dans le sous élément q1:FilterOperator. Exemple : Supposons que vous cherchez parmi vos contacts tous les directeurs informatiques basés sur la France ou la Belgique, cela donnerait la requête suivante :

Quelle est la problématique ?
Le Form Object Model de Dynamics CRM 4.0 ne permet pas de cacher dynamiquement un champ dans un formulaire. Du coup, il faut exploiter le DHTML.
Comment faire ?
Avant d’appliquer les propriétés et méthodes du DHTML il faut vous demander quel est le rendu HTML du champ (contrôle) que vous voulez cacher dans le formulaire CRM. Par exemple un attribut de type nvarchar, représenté par une zone de texte dans un formulaire CRM, a pour rendu un élément INPUT de type text dans la page HTML résultante (Notez que rien ne garantit que le choix du rendu d’un attribut de type nvarchar sera maintenu en INPUT dans la prochaine version de CRM…)

Une fois que vous connaissez le type d’élément HTML, vous pouvez donc appliquer les propriétés et méthodes de l’objet correspondant du DHTML. Pour cacher le champ Prénom du formulaire, vous pourriez donc écrire :
crmForm.all.firstname.style.display = 'none';
Mais ce code a pour effet de cacher l’élément INPUT uniquement, c’est-à-dire sans le libellé associé, donc vous obtenez :
Pour supprimer un champ intégralement du formulaire, vous devez donc aussi repérer la structure de table dans laquelle il est affiché. Par exemple, pour cacher le champ Prénom du formulaire, vous devez cacher les deux balises <td> correspondant au libellé Prénom et à la zone de texte associée. Les deux balises ont pour Identifiant respectif firstname_c et firstname_d. Cela donne le code suivant :
crmForm.all.firstname_c.style.display = 'none';
crmForm.all.firstname_d.style.display = 'none';
Pour réafficher le champ, on coderait :
crmForm.all.firstname_c.style.display = '';
crmForm.all.firstname_d.style.display = '';
Pour supprimer la ligne entière (contenant le champ Prénom et le champ Téléphone personnel), il ne faut pas hésiter à supprimer la balise <tr> englobant les balises <td>. Celle-ci n’ayant aucun identifiant, on pourrait procéder ainsi :
crmForm.all.firstname.parentElement.parentElement.style.display = 'none';
S’il s’agit d’un attribut de type ntext (zone de texte de plusieurs lignes) en revanche, le rendu n’est pas un élément INPUT mais un élément textarea.
Les propriétés de cet élément HTML n’étant pas les mêmes que pour un élément INPUT, le code pour le cacher est le suivant :
crmForm.all.description.style.visibility = 'hidden';
Liens utiles : Pour vous aider à trouver le rendu des champs et la structure de la page HTML généré par Dynamic CRM, utilisez l’Internet Explorer Developer Toolbar. Attention celle-ci n’est pas compatible avec IE8 pour lequel vous pouvez utiliser les outils de développement intégrés.
Un peu de théorie…
Les entités de Dynamics CRM 4.0 possèdent automatiquement deux attributs statecode et statuscode , de type picklist, permettant de gérer le cycle de vie d’un enregistrement de ce type :
-
l’attribut statecode (cf. figure (1)) donne le statut de l’enregistrement, c’est-à-dire l’état de l’enregistrement dans son cycle de vie.
Exemple : un enregistrement de type devis peut être dans les états brouillon, actif, conclu, perdu etc…
Les valeurs de l’attribut statecode ne sont pas personnalisables. Pour une entité personnalisée, elles sont automatiquement positionnées à : actif/inactif
-
l’attribut statuscode(cf. figure (2)) permet de préciser la raison pour laquelle l’enregistrement se trouve dans un statut donné.
Exemple : un enregistrement de type lead peut être à l’état exclu pour différentes raisons : parce que le client est injoignable, parce que ces coordonnées sont incorrectes etc…
Les valeurs de l’attribut statuscode sont évidemment personnalisables, et ce, en fonction des valeurs disponibles pour l’attribut statecode de l’entité concernée.
Là où cela devient intéressant c’est qu’un enregistrement peut se comporter différemment selon l’état dans lequel il se trouve. Plus précisément, pour certains états d’un enregistrement d’une entité système, Dynamics CRM est capable de figer l’enregistrement pour bloquer toute action de l’utilisateur.
Exemple : un devis à l’état actif signifie que celui-ci a été soumis au client et est donc en attente de la réponse de ce dernier. Du coup, Dynamics CRM bloque en lecture seule l’enregistrement de façon à empêcher l’utilisateur d’effectuer une quelconque modification sur un devis déjà présenté au client. Seul un changement d’état (révision du devis par exemple) lui permettra de repasser le devis en mode édition.
Quelle est la problématique ?
Le problème se pose lorsque vous créez votre propre entité personnalisée. En effet, pour ces entités, Dynamics CRM, ne pouvant deviner comment modéliser un cycle de vie complexe pour l’enregistrement, ne leur attribue que deux valeurs possibles : actif et inactif. Dans le premier statut, l’enregistrement est éditable et dans le second, il ne l’est plus. Du coup, si vous voulez imaginer un cycle de vie plus subtil, avec différents états successifs pour l’enregistrement, il n’y a pas beaucoup de marge de manœuvre…
Quelle solution alors ?
-
Une solution consiste à exploiter l’attribut statuscode pour nuancer les valeurs de l’attribut statecode. Mais attention, quand l’enregistrement est à l’état inactif il n’apparaît plus dans les vues standards (sauf celles qui affichent les éléments inactifs bien sûr) et notamment dans la vue associée de l’entité, c’est-à-dire dans le contexte d’un enregistrement parent. L’état inactif ne convient donc pas si l’utilisateur doit pouvoir voir une liste des enregistrements désactivés en même temps que ceux qui sont actifs.
Il reste la possibilité de jouer sur l’état actif pour ajouter des “raisons pour lesquelles l’enregistrement se situerait dans une sorte d’état actif intermédiaire”.
Cette première solution convient si votre enregistrement à l’état actif peut évoluer d’un état à l’autre via l’attribut statuscode tout en restant en permanence en mode édition.
Exemple : une demande de renseignement est active ou inactive (valeurs de l’attribut statecode). Lorsqu’elle est dans l’état actif, l’utilisateur peut jouer sur la raison du statut (valeurs de l’attribut statuscode) pour suivre son cycle de vie : ce pourrait être en cours de traitement, en attente d’une autre personne, en cours de validation, validée…etc
Cette solution n’est cependant pas pleinement satisfaisante si vous avez besoin de “figer” l’enregistrement en lecture seule dans certains états.
Par exemple, comment faire pour figer une demande de renseignement lorsqu’elle est dans la raison du statut “Traitée” pour garantir qu’aucune modification ne lui sera plus apportée maintenant qu’on a répondu à la demande ?
La simulation obtenue n’est cependant pas entièrement satisfaisante dans le mesure où idéalement, il faudrait également bloqué l’ajout d’association sur l’enregistrement. Par exemple, pour un enregistrement bloqué, il ne devrait pas être possible d’y associer de nouvelles activités.
Voici quelques idées pour mettre en œuvre cette solution :
var iLen = crmForm.all.length;
for (counter = 0; counter < iLen; counter++)
{
crmForm.all[counter].Disabled = true;
}

Le problème survient (sans raison apparente) lorsqu' on essaie de se connecter à l’application Dynamics CRM 4.0 via Internet Explorer. L’accès à CRM est bloqué avec le message suivant :
Le code d’erreur que l’on peut voir dans l’url et dans le gestionnaire d’évènement référence une erreur connue de CRM (cf. liste des codes d’erreur du SDK) indiquant un problème de génération de clé invalide (code error 8004A106).
J’ai trouvé une proposition de solution (sans explication du problème) sur Internet qui consiste à redémarrer le service Service de traitement asynchrone Microsoft CRM (http://peitor.blogspot.com/2008/12/microsoft-crm-4-crmexception-expired.html). Mais que faire si ce service est correctement démarré ?
En cherchant dans le Gestionnaire de déploiement de CRM, il s’avère que mon serveur CRM (ayant tous les rôles de serveur cumulés) était dans un état “désactivé”. En le réactivant, l’accès à CRM est rétabli !

Vous êtes plusieurs à me rapporter des erreurs qui vous bloquent dans le processus d’installation de CRM 4.0 sur Windows Server 2008 et SQL Server 2008. Et pour cause car il y a en effet des problèmes du fait que CRM 4.0 a été conçu pour être compatible notamment avec les anciennes versions des deux produits c’est-à-dire Windows Server 2003 et SQL Server 2005.
Il y a évidemment plein d’infos à droite à gauche sur Internet sur le sujet. En voici une petite compilation :
-
- Pour résoudre le message d’erreur « Le service msftesql est introuvable » dû à SQL Server 2008, je vous conseille cet article : http://support.microsoft.com/kb/952601/. La solution est en fait toute simple.
Il suffit de télécharger la dernière version des fichiers d’installation lorsque le programme d’installation vous le suggère (au tout début du processus d’install) :
Important : Notez que cette étape consiste à mettre à jour uniquement les fichiers d’installation de CRM et ne remplace donc pas l’installation des rollup de CRM qui doit être réalisée après l’installation du produit.
Le dernier rollup actuel pour CRM 4.0 est le N°4 téléchargeable ici :
http://www.microsoft.com/downloads/details.aspx?displaylang=fr&FamilyID=0ddf8e83-5d9c-4fe7-9ae6-f2713a024071 Autre remarque : Si vous avez un souci de connexion à Internet (par exemple sur une machine virtuelle) vous pouvez télécharger séparément les fichiers d’installation depuis l’url correspondante indiquée ici :
http://support.microsoft.com/kb/948917/
Bonne installation !
Le problème rencontré est le suivant :
Lorsqu’on exécute un site web (une page aspx quelconque) à partir de Visual Studio, le serveur de développement ASP.NET s’exécute mais Internet Explorer renvoie le message suivant :
Pour résoudre le problème, suivez la procédure suivante :
- Exécutez le Bloc-notes de Windows en tant qu’administrateur.
- Ouvrez le fichier C:\Windows\System32\drivers\etc\hosts
- Changez la ligne “::1 localhost” en “:::1 localhost” c’est-à-dire en rajoutant encore deux points (:) devant le chiffre 1.
- Sauvegardez le fichier en cliquant Fichier > Enregistrer sous puis en sélectionnant le type Tous les fichiers :
- Répondez Oui à la question qui vous est posé pour écraser le fichier existant avec les changements.
Si vous avez un problème plus spécifique concernant le fonctionnement du serveur de développement ASP.NET, vous trouverez ici quelques pistes de réflexion/solution : http://msdn.microsoft.com/fr-fr/library/w566a94d.aspx
Parallèlement à la consultation de rapports disponible dans l'interface de Dynamics CRM, il est possible d'envoyer automatiquement un rapport à un utilisateur en pièce attachée ou directement dans le contenu d'un message électronique.
J'ai déjà rencontré plusieurs fois ce besoin notamment pour des responsables faisant partie d'un pôle de direction d'entreprise, qui apprécient de trouver chaque semaine leurs rapports de synthèse dans leur boîte de messagerie, plutôt que de devoir faire la démarche par eux-même d'aller consulter les dits rapports dans CRM. Il y a comme un effet reminder appréciable.
Du point de vue technique, le procédé n'est pas particulièrement compliqué mais il est vrai qu'il est difficile de trouver une procédure claire et précise sur Internet sur le sujet. D'autant que la solution n'est techniquement pas faisable à partir de CRM seul et repose au contraire entièrement sur Report Server qui gère les rapports de ce dernier.
Le principe consiste à configurer un abonnement (subscription en anglais) sur Report Server pour l'utilisateur sur chaque rapport concerné.
Voici quelques éléments qui j'espère vous aideront dans la mise en oeuvre d'un abonnement avec SRS sur un rapport CRM :
Première étape : configuration de Report Server pour l' abonnement par email
- Sur le serveur installé avec SQL Reporting Services, lancez Start > All programs > Microsoft SQL Server 2005 > Configuration Tools > Reporting Services Configuration
- Sélectionnez Email Settings dans la barre de navigation à gauche.
- Indiquez l' adresse de l' expéditeur à utiliser pour les messages. Il faut que cet utilisateur ait les permissions évidemment d' envoyer des emails via le serveur SMTP spécifié dans le point suivant.
- Indiquez le nom du serveur SMTP (ce peut être une adresse IP, un nom UNC...etc. Par exemple, vous pouvez indiquer le nom du serveur Exchange si vous utilisez Exchange Server pour l'envoi de message)
- Appliquez les paramètres en cliquant le bouton Apply puis quitter le gestionnaire.
Seconde étape : configuration d'une source de données personnalisée pour le rapport concerné
- Lancez le gestionnaire de rapport de SRS dans Internet Explorer. Il doit s' agir d' une URL du type http://<NomDuServeurSRS>/Reports
- Cliquez Afficher les détails tout à droite dans la barre d' outils du gestionnaire, pour faire apparaître le détail des répertoires disponibles.
- Cliquez sur le répertoire du même nom que l' organisation contenant les rapports CRM, par exemple AdventureWorksCycle_MSCRM dans l' exemple ci-dessous :
- Cliquez ensuite sur le dossier 4.0 dans lequel doit se trouver le rapport sur lequel porte l' abonnement.
- Par défaut, les rapports de Dynamics CRM sont configurés sur une source de données qui s' appelle MSCRM_DataSource que vous trouverez tout en bas dans la liste des rapports.
Il se peut que vous rencontriez des problèmes en configurant un abonnement sur la base de cette source de données définie par défaut, y compris si celle-ci s' appuie sur le connecteur SRS installé pour CRM. Si vous tentez de configurer un abonnement sur le rapport, vous risquez de vous trouver face à ce message :
Pour que cela fonctionne sans encombre, une solution consiste à définir une source de données personnalisée dont vous maîtriserez parfaitement les paramètres de configuration.
- Sélectionnez Nouvelle source de données dans la barre de menu du gestionnaire pour créer une source de données personnalisée.
- Nommez la source par exemple Custom_DataSource.
- Donnez lui une description précise par exemple : Custom DataSource used for report subscriptions.
- Cochez la case Activer cette source de données.
- Sélectionnez Microsoft SQL Server dans la liste Type de connexion.
- Entrez la chaîne de connexion à la base de données CRM dans la zone de texte Chaîne de connexion, par exemple :
data source="<NomDuServeurSQLContenantLaBaseCRM>";initial catalog="<NomDeLOrganisation_MSCRM>"
Cela donne par exemple :
- Cochez Informations d'identification stockées en sécurité dans le serveur de rapports.
- Entrez un nom d'utilisateur et un mot de passe ayant accès à CRM.
- Cochez Utiliser comme informations d'identification Windows lors de la connexion à la source de données.
Cela donne par exemple :
- Validez en cliquant le bouton Appliquer.
- Revenez sur la liste des rapports Dynamics CRM 4 et sélectionnez le rapport sur lequel porte l' abonnement à réaliser.
- Sélectionnez l'onglet Propriétés.
- Sélectionnez Sources de données dans la zone de navigation à gauche.
Vous constatez que la source de données du rapport est par défaut MSCRM_DataSource qui se trouve dans le dossier 4.0. Remplacez cette source de données par celle personnalisée que vous venez de configurer.
- Cliquez Parcourir.
- Sélectionnez la source de données personnalisée Custom_DataSource en parcourant la hiérarchie de répertoires de l'organisation.
- Validez par OK.
- De retour dans l' écran de propriétés du rapport, cliquez Appliquer.
Troisième étape : configuration de l' abonnement au rapport Dynamics CRM
- Toujours sur le rapport concerné, basculez sur l' onglet Abonnements.
- Cliquez Nouvel abonnement dans la barre d' outils.
- Sélectionnez Messagerie comme option de remise du rapport.
- Entrez l' adresse email du ou des destinataires du rapport dans la zone A:
- Entrez éventuellement des destinataires en copie et copie cachée si besoin.
- Cochez Inclure un lien ou Inclure un rapport selon si l' utilisateur souhaite recevoir le rapport en pièce jointe ou directement dans le corps du message.
- Sélectionnez le format du rapport de votre choix.
- Planifiez l 'abonnement pour une réception hebdomadaire par exemple en cliquant Sélectionnez une planification.
- Configurez manuellement les paramètres de rapport dont vous auriez besoin.
Cela donne par exemple :
- Terminez en cliquant sur OK.
- Vous pouvez consulter votre abonnement dans la liste des abonnements et voir notamment la date de sa dernière exécution et l' état correspondant.
Quelques liens utiles :
Le cinquième atelier du coach VB.NET 2008 est en ligne à cette adresse : http://msdn.microsoft.com/fr-fr/vbasic/msdn.coachvb.atelier5.aspx
Dans la lignée de l'atelier 4 qui traitait de la manipulation de données de fichier, ce cinquième atelier pose les bases de l'accès aux données stockées cette fois en base de données.
Donc, si vous ne savez pas du tout comment vous y prendre pour accéder à des données en base à partir d'une application écrite en VB.NET, cet atelier est pour vous
. Il comprend des exemples d'accès à une base SQL Server Express 2005 et une base Microsoft Office Access 2007.
A vos claviers !
Symptôme
Si une action A dans CRM est déclenchée dans le cadre d'une autre action B, un plugin enregistré pour l'action A ne se déclenche pas.
Par exemple, si vous exécutez un plugin sur l'action de création d'une commande (donc enregistré pour le message Create de l'entité salesorder), cela fonctionne à la création directe d'une commande. En revanche le plugin ne s'exécute pas lors de la création d'une commande déclenchée automatiquement suite à la conversion d'un devis.
Explication
Le souci vient du fait que l'action A est le pipeline d'exécution principal alors que l'action B donne lieu à un pipeline d'exécution enfant du premier. Voici l'ordre d'exécution des deux pipelines :
Solution
Pour que le pipeline B déclenche l'exécution du plugin, il faut enregistrer le plugin en tant que Child Pipeline au moment de l'enregistrement.
Par exemple, en utilisant CRM Plugin Registration Tool (v2.1), cela revient à sélectionner Child Pipeline pour la propriété Triggering Pipeline à l'enregistrement du step comme suit :
Autre problème
Il faut savoir que lorsque vous exécutez un plugin dans un pipeline enfant, vous êtes dans un contexte un peu particulier. Si vous reprenez la figure 2 ci-dessus qui montre l'ordre d'exécution des deux pipelines imbriqués, vous constatez que le pipeline enfant s'exécute complètement alors que le pipeline parent n'est toujours pas terminé.
La transaction ouverte par le pipeline parent n'étant pas terminée au moment de l'exécution du pipeline enfant, il n'est pas possible d'invoquer le service web CrmService depuis le pipeline enfant. En effet, la transaction produit des locks sur la base qui empêche tout autre accès, même en lecture seule...
Microsoft recommande donc de ne pas se connecter à CRM dans un pipeline enfant pour lire ou mettre à jour des entités. Si vous avez besoin de le faire, la bonne marche à suivre et d'enregistrer votre plugin en mode asynchrone de façon à ce qu'il s'exécute bien après l'exécution du pipeline parent.
Cela revient à sélectionner Asynchronous pour la propriété Execution Mode au moment de l'enregistrement du step :

Pensez à vérifier que le service Microsoft CRM Asynchronous Processing Service est bien démarré sur le serveur CRM qui détient le rôle associé.
Pour rappel, en mode asynchrone, le plugin s'exécute au moment de l'exécution du pipeline enfant mais la subtilité est que le message est aussitôt envoyé dans une file d'attente sous la charge du service Microsoft CRM Asynchronous Processing Service qui l'exécutera en asynchrone, à un moment où les locks sur la base seront levés :
Dans le cas du mode asynchrone, si vous êtes en phase de développement et que vous avez besoin de déboguer le plugin, l'astuce consiste à attacher le process non plus à une instance de IE exécutant CRM, mais directement à l'instance du service Microsoft CRM Asynchronous Processing Service.
Quelques liens intéressants sur le sujet :
- Les vues Membres d'une liste marketing sont au nombre de trois : Tous les membres, Membres actifs, Membres inactifs.
Il n'est pas possible de modifier la présentation des colonnes dans ces trois vues via les outils de personnalisation de l' interface standard du fait que les listes marketing peuvent porter sur trois entités différentes : les prospects (lead), les contacts (contact) et les comptes (account).
Pour contourner le problème, il est possible de suivre la procédure suivante :
- Exporter l'entité concernée (Compte/Contact ou Prospect) au format XML via l' interface en cliquant le menu Paramètres > Personnalisation > Exporter les personnalisations
- Editez le fichier XML dans Notepad ou un autre éditeur (par exemple Visual Studio)
- Recherchez l'intitulé de la vue par exemple la chaîne "Membres actifs" pour la vue Membres actifs. La balise <savequery> qui l'encapsule est la balise qui regroupe l' intégralité de la définition de la vue.
- La présentation de la vue est définie dans la balise enfant <layoutxml> :
- Alors que la balise <fetchxml> définit les critères de filtre :
- C'est un peu moins convivial que dans l'interface, mais vous pouvez donc directement retoucher dans l'XML la largeur des colonnes des vues, les changer etc ...
- Ensuite, suivez le processus inverse pour réimporter les changements dans CRM. Cliquez Paramètres > Personnalisation > Importer les personnalisations et uploader le fichier XML modifié.
- N'oubliez pas de publier l'entité correspondante (Compte/Contact ou Prospect) depuis Paramètres > Personnalisation > Personnaliser les entités.
Et voilà, le tour est joué !
Microsoft France a créé trois tests blancs (proposant chacun 80 questions) pour vous aider à préparer les examens suivants :
- Customization and configuration in Microsoft Dynamics™ Dynamics CRM 4.0 (MB2-631)
- Applications in Microsoft Dynamics™ Dynamics CRM 4.0 (MB2-632)
- Installation and deployment in Microsoft Dynamics™ CRM 4.0 (MB2-633)
Ce sont des tests destinés à vous aider à vous évaluer avant de vous lancer dans le passage de l'examen. Ils ne fournissent donc pas les réponses mais vous donnent un résultat détaillant le pourcentage de bonnes réponses dans chaque catégorie de question, comme le fait l'examen réel.
Vous trouverez les trois tests sur le site d'Avolys à l'adresse suivante : http://www.test-tami.com/avolys
Pour vous connectez, suivez la procédure en pièce jointe.
Bonne prép !
Si vous souhaitez vous certifier sur Microsoft Dynamics CRM 4.0 et passer l'un des tests suivants :
- Customization and configuration in Microsoft Dynamics™ Dynamics CRM 4.0 (MB2-631)
- Applications in Microsoft Dynamics™ Dynamics CRM 4.0 (MB2-632)
- Installation and deployment in Microsoft Dynamics™ CRM 4.0 (MB2-633)
sachez que les tests sont plutôt chauds (en tous cas plus que pour la version 3).
Pour une préparation optimale, je vous conseille la journée de prépa organisée en collaboration avec Microsoft par ib formation à la Défense à Paris le 12 juin prochain. C'est moi qui anime
et je compte bien vous aider de mon mieux pour que vous ayez un maximum de chance de réussite au passage de la certif.
Tous les détails ici.
Et penser à l'offre 2ème Chance qui permet de repasser l'examen une seconde fois gratuitement en cas d'échec. Elle s'applique également aux examens Dynamics. Par contre, il faut bien le prévoir dès la première inscription.
Tous les détails ici.
Symptôme du problème :
Le problème est le suivant. Lorsque vous lancez Microsoft Virtual PC 2007, le splash screen bleu s'affiche mais la console n'apparâit pas. Pourtant la barre de tâche indique que Virtual PC est bien démarré et un icone de notification apparait même dans la barre de notification en bas à droite de Windows. En fait, ce qui se passe, c'est que la console est positionnée quelque part en dehors des dimensions de l'écran et semble donc cacher.
Fausse et bonne piste :
J'ai longtemps cru que cela devait avoir un rapport avec Windows Vista mais j'ai enfin trouvé comment résoudre la solution par le biais d'un internaute ayant rencontré le même souci sur une config Windows XP.
La solution pour retrouver la console positionnée correctement au centre de votre écran est donnée ici : http://www.essjae.com/blog/default.asp?id=43
A qui la faute ?
Là par contre, je n'ai toujours pas la moindre piste sur ce qui peut provoquer cela. J'ai d'ailleurs eu deux fois de suite le souci. La première fois je l'avais résolu en réussissant à récupérer ma fenêtre par le biais de la commande Déplacer qu'on trouve dans le menu contextuel de n'importe quelle application sur la barre de tâche de Windows.
Si quelqu'un sait le pourquoi du comment, je suis donc preneuse...
Cet article propose une solution simple pour gérer ses documents clients avec Microsoft Dynamics CRM 4.0 sur la base d'une bibliothèque de documents réseau.
Le résultat est un onglet dédié du formulaire correspondant (Contact ou Compte ou toute autre entité) qui affiche directement le contenu du dossier réseau dans un volet Windows Explorer intégré à CRM :
Structure de la base documentaire
Pour établir la bibliothèque de documents clients, le principe consiste à travailler sur la base d'un répertoire partagé sur le réseau d'entreprise. Pour être à même d'attacher les documents au compte ou directement au contact dans CRM, la structure de la base documentaire peut s'appuyer tout simplement sur une organisation comme suit :
- dossier racine [partagé] avec un nom de votre choix
- un dossier par compte client reprenant le nom du compte lui-même
- un sous-dossier par contact client reprenant le nom du contact complet (par exemple : <prénom nom>)
Intégration de Windows Explorer à CRM
J'ai lu un article très intéressant sur le blog de l'équipe de Corp qui présentait une intégration de Windows Explorer basée sur l'utilisation d'un web part standard fourni par WSS (Windows SharePoint Services) nommé Page Viewer WebPart.
Mais en creusant un peu, il s'avère que ce webpart n'a finalement pour rendu qu'une simple iFrame standard HTML!! Ce qui m'amène à une méthode bien plus simple qui ne nécessite aucunement l'installation de WSS (d'ailleurs pas franchement super intuitive et évidente sur votre serveur en prod) et vise à mettre en oeuvre un champ de type IFRAME dans les formulaires des entités Compte et Contact. En effet, une iFrame peut référencer une url pour afficher le contenu d'une page web, mais également un chemin réseau !
Exemple de mise en oeuvre pour l'entité COMPTE
Prenons l'exemple de l'entité Compte : Le principe consiste donc à :
- créer un nouvel onglet dans le formulaire, que l'on nommerait par exemple "Documents".
- créer une section sans titre en acceptant les paramètres par défaut.

- ajouter un champ de type IFRAME dans la section. Attribuez lui un nom.
- configurer l'IFRAME pour qu'elle occupe tout l'espace disponible sur le formulaire.
- désactiver la sécurité de script inter-frame.
- attribuer au formulaire une url vide par défaut : "about:blank". Le chemin du dossier associé au compte doit être déterminé par script dynamiquement au moment de l'exécution.
Au final, le formulaire ressemble à ceci :

Code de chargement dynamique du chemin en fonction du contexte
- Ajouter au code du formulaire de l'entité Compte en réponse à l'évènement Form_OnLoad le code suivant :
//----------------------------------------------------------------------------------
//Déclarations de constante pour le type de formulaire
var CRM_FORM_TYPE_CREATE = 1;
var CRM_FORM_TYPE_UPDATE = 2;
var CRM_FORM_TYPE_READONLY = 3;
var CRM_FORM_TYPE_DISABLED = 4;
var CRM_FORM_TYPE_QUICKCREATE = 5;
var CRM_FORM_TYPE_BULKEDIT = 6;
//Affichage de la bibliothèque de documents du compte
displayDocumentLibrary();
// Affichage de la base documentaire pour le compte en cours
function displayDocumentLibrary()
{
//Cas du mode formulaire en création rapide
if(crmForm.FormType == CRM_FORM_TYPE_QUICKCREATE){
return;
}
//Dans tous les autres modes du formulaire
//Initialisation de l'iFrame à vide
crmForm.all.IFRAME_Documents.src = "about:blank";
//Le nom du compte donne le nom du dossier dans la base documentaire
//contenant les documents relatifs au compte
var folderName = crmForm.all.name.DataValue ;
//Selon le type d'affichage
switch (crmForm.FormType)
{
case CRM_FORM_TYPE_CREATE:
case CRM_FORM_TYPE_BULKEDIT:
//iFrame par défaut à vide
break;
case CRM_FORM_TYPE_UPDATE:
case CRM_FORM_TYPE_READONLY:
case CRM_FORM_TYPE_DISABLED:
if(folderName != null)
{
//Chargement dans l'iFrame du chemin vers le dossier du compte dans la base documentaire
crmForm.all.IFRAME_Documents.src = "\\\\<NomDuServeur>\\<NomDuPartage>\\" + folderName;
}
break;
}
}
//----------------------------------------------------------------------------------
- Sauvegarder les changements puis publier l'entité Compte.
- Vous obtenez le résultat suivant (à condition que le dossier correspondant existe dans la base documentaire) :
Dans cette fenêtre, vous avez le menu de Windows Explorer qui s'affiche sur un clic droit. Le drag and drop est disponible et en cliquant sur un document, vous l'ouvrez instantanément.
Exemple de mise en oeuvre pour l'entité CONTACT
Pour l'entité Contact, reprenez l'ensemble de la procédure précédente avec le code :
//----------------------------------------------------------------------------------
var CRM_FORM_TYPE_CREATE = 1;
var CRM_FORM_TYPE_UPDATE = 2;
var CRM_FORM_TYPE_READONLY = 3;
var CRM_FORM_TYPE_DISABLED = 4;
var CRM_FORM_TYPE_QUICKCREATE = 5;
var CRM_FORM_TYPE_BULKEDIT = 6;
// Affichage de la base documentaire pour le contact en cours
displayDocumentLibrary();
// Affichage de la base documentaire pour le contact en cours
function displayDocumentLibrary()
{
//Cas du mode formulaire en création rapide
if(crmForm.FormType == CRM_FORM_TYPE_QUICKCREATE){
return;
}
//Dans tous les autres modes du formulaire
//Initialisation de l'iFrame à vide
crmForm.all.IFRAME_Documents.src = "about:blank";
//Le nom complet du contact donne le nom du dossier dans la base documentaire
//contenant les documents relatifs au contact
var contactFolderName = crmForm.all.firstname.DataValue + " " + crmForm.all.lastname.DataValue ;
//Le nom du compte parent donne le nom du dossier dans la base documentaire
//contenant le dossier contact
var parentAccount = new Array();
parentAccount = crmForm.all.parentcustomerid.DataValue;
if(parentAccount != null)
var accountFolderName = parentAccount[0].name;
else
//Erreur : Ce contact est incomplet car il ne contient pas de compte parent
return;
//Selon le type d'affichage
switch (crmForm.FormType)
{
case CRM_FORM_TYPE_CREATE:
case CRM_FORM_TYPE_BULKEDIT:
//iFrame par défaut à vide
break;
case CRM_FORM_TYPE_UPDATE:
case CRM_FORM_TYPE_READONLY:
case CRM_FORM_TYPE_DISABLED:
if(contactFolderName != null &&accountFolderName != null)
{
//Chargement dans l'iFrame du chemin vers le dossier du compte dans la base documentaire
crmForm.all.IFRAME_Documents.src = "\\\\<NomDuServeur>\\<NomDuPartage>\\" + accountFolderName + "\\" + contactFolderName;
}
break;
}
}
//----------------------------------------------------------------------------------
- Sauvegarder les changements puis publier l'entité Contact.
- Vous obtenez le résultat suivant (à condition que le dossier correspondant existe dans la base documentaire) :
Pour terminer, il faudrait bien sûr définir une stratégie pour la création des dossiers.
Si vous optez pour une création dynamique, vous pouvez par exemple créer le dossier par script en vous appuyant sur la remarque fait par un internaute dans l'article de Corp qui exploite l'objet Scripting.FileSystemObject.
Bonne continuation !
J'ai enfin trouvé une procédure qui tient la route !
http://zune-france.monforum.fr/installer-zune-sur-un-windows-vista-en-francais-vp1662611.html
Juste deux petits conseils : d'abord exécuter les commandes "net localgroup" sous le prompt MS-DOS en lançant l'Invite de commande en tant qu'administrateur de votre poste, sinon les commandes échouent. Ensuite, pensez à redémarrer (ou en tous cas, fermer la session) pour que l'insertion de votre compte utilisateur dans les deux groupes soit prise en compte. Avec ça, l'installation est tip top.
Pour utiliser l'API de cartographie de Virtual Earth dans un formulaire CRM, rien de plus simple. Voici un exemple de la procédure à suivre pour afficher sur une carte la position d'un compte enregistré dans CRM :
- La première étape consiste à créer une page sur la base du modèle ci-dessous :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="http://dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=5"></script>
<script>
//Déclaration des variables globales
var map = null;
var line = null;
var city = null;
var postalcode = null;
var country = null;
var destinationAddress = null ;
function DisplayMap(){
//Récupération des informations d'adresse dans le formulaire CRM
line = parent.document.forms[0].all.address1_line1.DataValue;
postalcode= parent.document.forms[0].all.address1_postalcode.DataValue;
city = parent.document.forms[0].all.address1_city.DataValue;
country = parent.document.forms[0].all.address1_country.DataValue;
//Création de la carte
map = new VEMap('myMap');
map.LoadMap();
//Construction de l'adresse du compte à transmettre à Virtual Earth
destinationAddress = line + "," + city + "," + country ;
//Recherche de l'adresse du compte sur la carte (traitement asynchrone avec fonction de callback)
map.Find(null, destinationAddress, null, null, null, null, null, null, false, null, callback);
}
//Traitement de la fin de la recherche
function callback() {
//Configuraton du zoom au niveau voulu (entre 1 et 19)
map.SetZoomiLevel(16);
//Affichage d'une punaise personnalisée au centre de la carte
DisplayPushpin();
}
//Affichage d'une punaise au centre de la carte
function DisplayPushpin() {
//Création de la forme au point central de la carte
var shape = new VEShape(VEShapeType.Pushpin, map.GetCenter());
//Configuration du titre
shape.SetTitle("Par exemple adresse du compte");
shape.SetDescription(line + "<br/>" + npa + " " + city + "<br/>" + country);
map.AddShape(shape);
}
</script>
</head>
<body onload="DisplayMap();">
<div id='myMap'>Chargement en cours, veuillez patienter...</div>
</body>
</html>
- Publiez cette page ensuite sur le site CRM (c'est-à-dire sous C:\Program Files\Microsoft CRM\CRMWeb pour une installation par défaut sur le port 5555) par exemple dans un nouveau dossier nommé VE. Nommez la page VE.htm.
- Pour ajouter la carte sur le formulaire de l'entité Compte, il suffit d'ajouter une iFrame à l'endroit voulu dans le formulaire (par exemple, sous un nouvel onglet dans une section vierge). Configurez les paramètres de l'iFrame comme suit :
Attention de ne pas oublier de décocher la restriction de sécurité pour le cross-scripting. Cela bloquerait toute intéraction entre l'iFrame et votre formulaire.
- Publiez les modifications sur l'entité Compte.
- Vous obtenez un rendu du type :
Attention toutefois à l'algorithme de recherche de l'adresse dans la page html. N'hésitez pas à l'ajuster en fonction des adresses que vos utilisateurs renseignent dans CRM. Il suffit par exemple que les champs de CRM ne soient pas correctement renseignés, typiquement l'information concernant le pays est manquante, et vous vous retrouvez sur la carte à Tombouctou...
Melle coach ASP.NET a ajaxisé tout l'été. Résultat, de nouveaux ateliers sont en ligne ici !
Voici la trame de ce nouveau cursus pour découvrir le Framework Microsoft Ajax :
Atelier 1 : Installer l’environnement de développement avec ASP.NET 2.0 AJAX.
Le premier atelier vous présente les étapes de création d’un environnement pour découvrir gratuitement le développement avec ASP.NET 2.0 AJAX. Il décrit les composants minimums nécessaires et la procédure à suivre pour l’installation.
Atelier 2 : Activer les extensions AJAX sur vos projets web
L’atelier 2 présente la marche à suivre pour configurer vos projets de développement web avec les extensions AJAX, que vous démarriez sur un nouveau projet web vierge ou que vous souhaitiez configurer une application web existante développée avec ASP.NET 2.0 de façon à enrichir et améliorer son interface.
Atelier 3 : Développer avec la technologie AJAX
L’atelier 3 montre comment avec les contrôles serveur web fournis par les Extensions AJAX, il est possible d’exploiter très facilement la technologie Ajax dans vos applications web de façon à diminuer la bande passante et améliorer la rapidité de vos applications.
Atelier 4 : Développer avec les contrôles Extender standards
L’atelier 4 montre comment facilement étendre les contrôles serveurs web ASP.NET 2.0 standards avec les nouveaux contrôles serveurs web Extender fournis par le Control Toolkit AJAX de façon à étendre et enrichir leur comportement et leur rendu.
Atelier 5: Développer avec les contrôles Extender et les services d’ASP.NET 2.0
L’atelier 5 illustre l’utilisation des services d’ASP.NET 2.0, tel que le service de Profil, au travers des nouveaux contrôles serveur web Extender fournis par le Control Toolkit AJAX.
Atelier 6: Développer avec les contrôles Extender et les services web
L’atelier 6 montre comment exploiter des contrôles serveur web Extender avancés du Control Toolkit AJAX, qui combinent les approches de développement client et serveur via l’utilisation des services web.
Atelier 7: Développer un contrôle Extender personnalisé
Pour terminer ce tutorial, nous vous proposons de découvrir comment vous aussi vous pouvez apporter votre contribution au projet communautaire du Control Toolkit AJAX, en développant un contrôle serveur web Extender entièrement personnalisé.
A vos claviers !
Les 10 derniers blogs postés
-
Comment mapper une vue SQL sur une collection de complex type? par
Matthieu MEZIL le il y a 14 heures et 40 minutes
-
SQL Server : Query Notification ou comment être notifié de modifications de données côté application (SqlDependency) par
SQL Server vu par Christian Robert le il y a 20 heures et 39 minutes
-
[WF4] Un Binding Activity/ActivityDesigner qui passe mal? par
Blog de Jérémy Jeanson le il y a 22 heures et 2 minutes
-
MyTIC – SharePoint 2010 : déjà un mythe Microsoft ? par
Le Blog (Vert) d'Arnaud JUND le 03-19-2010, 08:54
-
TechDays 2010 Genève : Retrouvez-moi pour une session sur la Haute disponibilité et le ScaleOut avec SQL Server par
SQL Server vu par Christian Robert le 03-18-2010, 15:45
-
[MIX10] Keynote deuxième journée – Internet Explorer 9, Html5, Visual Studio 2010, OData par
Atteint de JavaScriptite Aiguë [Cyril Durand] le 03-17-2010, 19:40
-
Certifications beta .NET 4 par
Kévin Gosse le 03-17-2010, 19:33
-
[Mix 2010] – Microsoft Translator Technology Preview V2 par
RedoBlog - The .NET Gentleman !!! le 03-17-2010, 18:53
-
Lancement en Preview de Cyclone lors des TechDays 2010! par
Blog de Frédéric Queudret le 03-17-2010, 16:30
-
[WP7] Je ne veux pas d’un nouvel iPhone par
Le blog de FremyCompany le 03-17-2010, 13:11