Rechercher dans ce blog

dimanche 7 septembre 2014

Numérotation automatique par workflow : Différents paramétrages possibles

Suite de l'article : Numérotation automatique par workflow : Activité de workflow personnalisée

Rappel :
Dans l'article précédent, nous avons créé une activité de workflow personnalisée pour générer une numérotation automatique. Dans cette article, nous allons décrire les différents paramétrages possibles de numérotation.

1/ Préfixe-000001-Suffixe

Paramétrage :
 Résultat :

2/ 000001-Suffixe

Paramétrage :
 Résultat :

3/ Préfixe-000001

Paramétrage :
 Résultat :


4/ 000001

Paramétrage :
 Résultat :


5/ Modification de la taille du numéro incrémental

Paramétrage :

Résultat :

Paramétrage :
 Résultat :

Numérotation automatique par workflow : Activité de workflow personnalisée

Suite de l'article : Numérotation automatique par workflow temps réel vs Plugin

Rappel de l'article précédent :
La numérotation automatique par workflow est facilement paramétrable mais son impact sur la création d'enregistrement est plus important qu'un plugin (120 % en plus).

Dans cet article, nous allons créer une activité de workflow personnalisée pour réduire le temps de traitement du workflow tout en gardant la flexibilité de paramétrage du workflow.

1/ Créer une entité Counter avec les attributs :
  • Name : Chaîne de caractères
  • Prefix : Chaîne de caractères
  • Number : Décimal
  • Number Length : Décimal
  • Suffix : Chaîne de caractères

2/ Créer l'activité de Workflow personnalisé.

En paramètre d'entrée, l'enregistrement Counter correspondant à la numérotation d'une entité.
En paramètre de sortie, la numérotation générée.

namespace AutoNumberingWorkflowActivity
{
    using System;
    using System.Activities;
    using System.ServiceModel;
    using System.Text;
    using Microsoft.Xrm.Sdk;
    using Microsoft.Xrm.Sdk.Messages;
    using Microsoft.Xrm.Sdk.Query;
    using Microsoft.Xrm.Sdk.Workflow;

    public sealed class AutoNumbering : CodeActivity
    {
        /// 
        /// Executes the workflow activity.
        /// 
        /// The execution context.
        protected override void Execute(CodeActivityContext executionContext)
        {
            // Create the tracing service
            ITracingService tracingService = executionContext.GetExtension();

            if (tracingService == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve tracing service.");
            }

            tracingService.Trace("Entered Class1.Execute(), Activity Instance Id: {0}, Workflow Instance Id: {1}",
                executionContext.ActivityInstanceId,
                executionContext.WorkflowInstanceId);

            // Create the context
            IWorkflowContext context = executionContext.GetExtension();

            if (context == null)
            {
                throw new InvalidPluginExecutionException("Failed to retrieve workflow context.");
            }

            tracingService.Trace("Class1.Execute(), Correlation Id: {0}, Initiating User: {1}",
                context.CorrelationId,
                context.InitiatingUserId);

            IOrganizationServiceFactory serviceFactory = executionContext.GetExtension();
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

            try
            {

                //Create a request
                RetrieveRequest _retrieveRequest = new RetrieveRequest();
                _retrieveRequest.ColumnSet = new ColumnSet(new string[] { "new_prefix", "new_number","new_numberlength","new_suffix" });
                _retrieveRequest.Target = Counter.Get(executionContext);

                //Execute the request
                RetrieveResponse _retrieveResponse = (RetrieveResponse)service.Execute(_retrieveRequest);

                //Retrieve the Counter Entity
                Entity _counterRecord = _retrieveResponse.Entity as Entity;

                StringBuilder _sbuilder = new StringBuilder();
                if (_counterRecord.Contains("new_prefix"))
                {
                    _sbuilder.Append((String)_counterRecord["new_prefix"]);
                    _sbuilder.Append("-");
                }
                if (_counterRecord.Contains("new_numberlength"))
                {
                    _sbuilder.AppendFormat(String.Concat("{0:D", (int)(Decimal)_counterRecord["new_numberlength"], "}"), (int)(Decimal)_counterRecord["new_number"]);
                }
                else 
                {
                    _sbuilder.AppendFormat("{F0}",(Decimal)_counterRecord["new_number"]);
                }
                if (_counterRecord.Contains("new_suffix"))
                {
                    _sbuilder.Append("-");
                    _sbuilder.Append((String)_counterRecord["new_suffix"]);
                }

                //Set the variable
                Number.Set(executionContext, _sbuilder.ToString());

                //Increment
                decimal _value = (Decimal)_counterRecord["new_number"];

                Entity _updateCounter = new Entity("new_counter");
                _updateCounter.Id = _counterRecord.Id;
                _updateCounter["new_number"] = _value + 1;
                service.Update(_updateCounter);


            }
            catch (FaultException e)
            {
                tracingService.Trace("Exception: {0}", e.ToString());

                // Handle the exception.
                throw;
            }

            tracingService.Trace("Exiting Class1.Execute(), Correlation Id: {0}", context.CorrelationId);
        }

        [RequiredArgument]
        [Input("Select Counter Record")]
        [ReferenceTarget("new_counter")]
        public InArgument Counter { get; set; }

        [Output("Number")]
        public OutArgument Number { get; set; }

    }
}

3/Importer cette assembly dans la solution.

4/Création du workflow.

La première étape permet de renseigner l'enregistrement pour la numérotation.
 La seconde étape modifie l'attribut sur l'enregistrement cible avec le champ retourné par l'activité de workflow.
Après activation du workflow, voici les tests.


Tableau de comparaison pour un chargement de 100 enregistrements par la méthode CreateRequete.

Type de compteurDurée en msRemarque
Workflow temps réel7583Impossible de définir la longueur du nombre incrémental
Plugin3450Trop spécifique à l'entité cible
Activité de workflow5060Paramétrable à souhait

L'utilisation d'une activité de workflow personnalisé permet de réduire le temps d'exécution de 30 %. De plus, le paramétrage du compteur est plus souple et permet d'ajouter une numérotation automatique sur n'importe quelle entité. Le prochain article décrira les différentes possibilités de numérotation.

samedi 6 septembre 2014

Numérotation automatique par workflow temps réel vs Plugin

Je me suis inspiré de l'article : Auto-Numbering with CRM Workflows: Real-Time vs. Asynchronous.

1/ Création d'une entité Compteur. On ajoute les attributs :
  • Entité : Chaîne de caractères
  • Préfixe : Chaîne de caractères
  • Numéro : Décimal
  • Suffixe : Chaîne de caractères
 
 Ce qui donne :

2/ Création d'une relation 1:N entre l'entité où l'on souhaite la numérotation (dans cet exemple, elle se nomme Maison) et l'entité compteur.

3/ Création du Workflow temps réel
La première étape permet de lier l'enregistrement à l'enregistrement Compteur.
 La seconde étape renseigne le numéro.
La dernière étape incrémente la valeur au niveau du compteur.
4/ Activer le workflow et regardons les résultats après des essais d'import de fichier.

 Comparons maintenant les performances d'intégration de données entre la numérotation automatique par workflow temps réel et par plugin avec un chargement de 100 enregistrements importés en utilisant la fonction CreateRequest.

Type de compteurDurée en msRemarque
Workflow temps réel7583Impossible de définir la longueur du nombre incrémental
Plugin3450Trop spécifique à l'entité cible

Pour réaliser un compteur générique qui possèdent à la fois un impact minimum sur le chargement de données et tout en ayant un paramétrage aisé, il faut donc utiliser une activité de workflow personnalisée appelée depuis un workflow temps réel. Ce sera le sujet du prochain article.

vendredi 5 septembre 2014

Dynamics CRM Online 2015 : la feuille de route révélée

JDN du 05/09/2014

D'ici la fin de l'année, une nouvelle version de l'outil de CRM sera dévoilée. Au programme : extension de l'API et ouverture sur de nouveaux terminaux. La mise à jour 2015 est aussi dévoilée.

Microsoft vient de dévoiler la feuille de route de Dynamics CRM pour les 12 mois à venir. Au quatrième trimestre 2014, l'éditeur prévoit de sortir une nouvelle version de son outil de gestion de la relation client (nom de code : Vega). Elle devrait être lancée à la fois en version SaaS et pour les serveurs internes d'entreprise (version on-premise). Vega étendra notamment la compatibilité de la solution à de nouveaux types de terminaux mobiles. Elle devrait aussi améliorer la prise en charge des scénarios de vente : la gestion des relations entre produits, des bundle de produits, ou encore des suggestions par exemple.
Autre évolution saillante, Microsoft annonce vouloir booster les fonctions de gestion de la relation étendue (ou eXtended Relationship Management), qui visent à couvrir la relation avec tous les interlocuteurs de l'entreprise (clients, mais également partenaires, actionnaires, contacts tiers, fournisseurs...). L'analytics est également au menu, via une meilleure intégration de l'outil de reporting Power BI, et la prise en charge du reporting transactionnel pour les apps Windows Mobile. Enfin, on relève l'extension des possibilités d'API client.
Quant à la version suivante de Dynamics CRM, sa sortie est annoncée pour le deuxième trimestre 2015. Ses améliorations se limiteront aux briques de la suite disponibles uniquement en mode cloud : Microsoft Social Listening (reporting social), Dynamics Marketing (gestion de campagnes marketing multicanales) et Parature (la technologie de help desk acquise par Microsoft en janvier dernier).

jeudi 28 août 2014

Sessions Microsoft le 1 Octobre aux Salons Solutions

10h00 - 11h30 Grandir avec le Cloud : L'ERP Microsoft vu par ses clients
11h30 - 12h30 Cloud, Mobilité, Verticalisation : analyse en profondeur des nouveautés de Microsoft Dynamics NAV
14h00 - 15h00 Témoignage d'un client Dynamics CRM
15h00 - 16h00 CRM, Mobilité, Réseaux Sociaux, découvrez en live toutes les capacités de Microsoft Dynamics CRM pour vos force de vente !
16h00 - 17h00 Club utilisateurs des solutions Dynamics

dimanche 24 août 2014

Gartner : Magic Quadrant for Sales Force Automation du 15 Juillet 2014

Magic Quadrant for Sales Force Automation



Microsoft (Dynamics CRM Online)

Microsoft a mis plus de moyen sur la version Cloud, avec de nouvelles fonctionnalités apparaissant avant la version On-premise. Microsoft Dynamics CRM Online intègre plusieurs services Microsoft Azure, mais elle est construite sur une plate-forme spécifique, appelée XRM. Microsoft Dynamics CRM Online n'est plus seulement pour les petites ou moyennes entreprise. Au cours des 12 derniers mois, Microsoft a gagné d'importants clients (de plus de 700 utilisateurs).


Microsoft (Dynamics CRM)

En plus de Microsoft Dynamics CRM Online, il est également proposé un modèle On-premise. Les deux produits sont les mêmes, et le passage à la version Online dépend plus de la volonté du client de migrer vers le Cloud.
Les entreprises considèrent Microsoft CRM On-premise principalement pour :
* Le coût total de possession (TCO) plus attrayant que la version Online,
* L'intégration avec Microsoft Outlook et la capacité d'utiliser les technologies Microsoft tels que SharePoint et SQL Server,
* La confidentialité des données et les problèmes d'intégration en temps réel.

mercredi 20 août 2014

[Livre] CRM 2013 QuickStart

CRM 2013 QuickStart
Auteurs : David Yack, Joel Lindstrom, David Berry, Richard Knudson, Dylan Haskins et Jukka Niiranen

dimanche 17 août 2014

OptionSets CRM 2013 pour PowerShell

Le Microsoft Dynamics CRM 2013 SDK contient la définition des OptionSets pour C# et VB.NET dans les dossiers respectifs:
* SDK\SampleCode\CS\HelperCode
* SDK\SampleCode\VB\HelperCode

Voici la définition des OptionSets pour PowerShell : http://1drv.ms/1t7F60P

Pour l'exemple lors de l'import de fichier,  la valeur pour DoubleQuote s'obtient en écrivant :
[ImportFileDataDelimiterCode]::DoubleQuote -as [int]

Ce qui donne :
$DoubleQuoteValue = ImportFileDataDelimiterCode]::DoubleQuote -as [int];
$DoubleQuote = New-Object -TypeName  "Microsoft.Xrm.Sdk.OptionSetValue" -ArgumentList $DoubleQuoteValue;
$ImportFile = New-Object -TypeName Microsoft.Xrm.Sdk.Entity -ArgumentList "importfile";
$ImportFile["datadelimitercode"] = [Microsoft.Xrm.Sdk.OptionSetValue] $DoubleQuote;

Pour plus d'information sur l'utilisation des OptionSets, vous pouvez consulter l'article d'Aymeric Mouillé : CRM data Management With PowerShell.

jeudi 3 juillet 2014

Statistiques début Juillet de mes livres blancs sur MS CRM 2011 \ CRM 2013


Le Guide Utilisateur CRM 2011 est toujours le plus vue avec 3425 visites, suivi du Guide de personnalisation pour CRM 2011 avec 3170 visites. Le Guide de Personnalisation pour CRM 2013 démarrage avec 1026 visites.