16 noviembre 2012

Consultando la Configuración de Usuario

- La configuración de cada usuario incluido en la organización de CRM 2011 está establecida en la entidad de sistema UserSettings

- En este ejemplo vamos a comprobar los valores de configuración para el usuario actual, obteniendo los datos de campos significativos como "localeid", "timezonecode", o "dateformatstring", establecidos en su configuración

- El código de consulta es el siguiente

static void RetrieveCurrentUsersSettings()
{
    UserSettings currentUserSettings = orgService.RetrieveMultiple(
    new QueryExpression(UserSettings.EntityLogicalName)
    {
        ColumnSet = new ColumnSet(new string[] 
        { 
            "localeid", "timezonecode", "dateformatstring", "timeformatstring", 
            "systemuserid", "businessunitid", "currencyformatcode", 
            "currencydecimalprecision", "homepagesubarea", 
        }),
        Criteria = new FilterExpression
        {
            Conditions = {
              new ConditionExpression("systemuserid", ConditionOperator.EqualUserId)}
        }
    }).Entities[0].ToEntity<UserSettings>();

    foreach (KeyValuePair<string, object> attribs in currentUserSettings.Attributes)
    {
        Console.WriteLine(attribs.Key + " : " + attribs.Value);
    }
}


- Y el resultado a continuación



- Mediante una sencilla consulta podemos comprobar en una vista valores de configuración importantes como configuración de idioma: 1033 (Inglés), código de zona horaria: 105 ((UTC+01:00) Bruselas, Copenhague, Madrid, París), formatos de fecha y hora, ids, etc.


Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

20 octubre 2012

Filtrando la generación de Clases Early con crmsvcutil

- La herramienta incluida en el SDK crmsvcutil.exe es utilizada para generar las clases tipadas de early bound con todos los atributos (de sistema y custom) de nuestra organización CRM

- El enfoque early mejora notablemente el acceso mediante programación

- El fichero generado por la herramienta crmsvcutil contiene todas las entidades de nuestra organización, resultando un fichero de aproximadamente 5MB, por lo que es conveniente analizar qué entidades son realmente necesarias para el acceso desde diferentes puntos, por ejemplo plugins, aspx custom, desarrollos a medida etc.

- En este ejemplo vamos a crear una extensión para la herramienta crmsvcutil que filtre la generación de clases early de nuestra organización CRM, para incluir en el fichero sólo las entidades Cuenta, Contacto, Referencia, y Oportunidad

El proceso es el siguiente:

- Cree un nuevo proyecto Class Library desde Visual Studio, llamado SvcUtilFilter

- Incluya en el proyecto las siguientes referencias:

>> crmsvcutil.exe
>> Microsoft.Xrm.Sdk.dll
>> System.Runtime.Serialization

- El código de la librería es el siguiente

namespace SvcUtilFilter
{
    /// <summary>
    /// CodeWriterFilter for CrmSvcUtil that reads list of entities from an xml file to
    /// determine whether or not the entity class should be generated.
    /// </summary>
    public class CodeWriterFilter : ICodeWriterFilterService
    {
        //list of entity names to generate classes for.
        private HashSet<string> _validEntities = new HashSet<string>();

        //reference to the default service.
        private ICodeWriterFilterService _defaultService = null;

        /// <summary>
        /// constructor
        /// </summary>
        /// <param name="defaultService">default implementation</param>
        public CodeWriterFilter(ICodeWriterFilterService defaultService)
        {
            this._defaultService = defaultService;
            LoadFilterData();
        }

        /// <summary>
        /// loads the entity filter data from the filter.xml file
        /// </summary>
        private void LoadFilterData()
        {
            XElement xml = XElement.Load("filter.xml");
            XElement entitiesElement = xml.Element("entities");
            foreach (XElement entityElement in entitiesElement.Elements("entity"))
            {
                _validEntities.Add(entityElement.Value.ToLowerInvariant());
            }
        }

        /// <summary>
        /// /Use filter entity list to determine if the entity class 
        /// /should be generated.
        /// </summary>
        public bool GenerateEntity(EntityMetadata entityMetadata, 
            IServiceProvider services)
        {
           return
           (_validEntities.Contains(entityMetadata.LogicalName.ToLowerInvariant()));
        }

        //All other methods just use default implementation:

        public bool GenerateAttribute(AttributeMetadata attributeMetadata,
            IServiceProvider services)
        {
            return _defaultService.GenerateAttribute(attributeMetadata, services);
        }

        public bool GenerateOption(OptionMetadata optionMetadata, 
            IServiceProvider services)
        {
            return _defaultService.GenerateOption(optionMetadata, services);
        }

        public bool GenerateOptionSet(OptionSetMetadataBase optionSetMetadata, 
            IServiceProvider services)
        {
            return _defaultService.GenerateOptionSet(optionSetMetadata, services);
        }

        public bool GenerateRelationship(RelationshipMetadataBase 
            relationshipMetadata, EntityMetadata otherEntityMetadata, 
            IServiceProvider services)
        {
            return _defaultService.GenerateRelationship(relationshipMetadata, 
               otherEntityMetadata, services);
        }

        public bool GenerateServiceContext(IServiceProvider services)
        {
            return _defaultService.GenerateServiceContext(services);
        }
    }
}


- Incluya un nuevo fichero xml, llamado filter.xml, con la siguiente estructura

<?xml version="1.0" encoding="utf-8" ?>
<filter>
  <entities>
    <entity>account</entity>
    <entity>contact</entity>
    <entity>lead</entity>
    <entity>opportunity</entity>
  </entities>
</filter>


- Compile el proyecto, y asegúrese de copiar la dll y el fichero xml en la misma carpeta que la aplicación crmsvcutil.exe

- Ahora lance la aplicación crmsvcutil, incluyendo los siguientes parámetros

  crmsvcutil /url:http://<<organización>>/XRMServices/2011/Organization.svc 
  /o:<<class name>> /n:<<namespace>> /serviceContextName:<<context name>> 
  /codewriterfilter:SvcUtilFilter.CodeWriterFilter,SvcUtilFilter


- Ahora el fichero generado ocupará tan solo unos cientos KB y contendrá solo las clases específicas para nuestro desarrollo




Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

22 septiembre 2012

Colores Custom en la Grid

- El despliegue de Microsoft Dynamics CRM puede ser personalizado a través de la modificación de los archivos del web site localizados en la carpeta CrmWeb

- Antes de proceder debe tener en cuenta que este tipo de personalizaciones son englobadas en tipo de desarrollo no soportado, por lo que se debe actuar con el máximo conocimiento de la base de despliegue de Dynamics CRM

- En este ejemplo veremos una customización muy demandada, el coloreo de la grid según criterios de valores de campo

- En la entidad Oportunidades, haremos diferenciación de color de los registros según su campo Rating (Clasificación), coloreando en verde los que contengan el valor “Cold”, y de rojo los que contengan el valor “Hot”

- En primer lugar veamos el contenido de la carpeta CrmWeb



- En la carpeta ISV, crearemos desde el principio el archivo colorizeGrid.htc, con el siguiente contenido

<public:component lightweight="true">
<public:attach event="ondocumentready" onevent="Init()"/>
<script type="text/javascript">

    var valueKey1 = null;
    var valueKey2 = null;
    var indexKey = null;
    
    function Init() {
    
        if (this.oname == "3") { // Opportunities

            indexKey = 7;
            valueKey1 = "Hot";
            valueKey2 = "Cold";

            colorize(indexKey, valueKey1, valueKey2);                                 
        }        
    }

    function colorize(indexKey, valueKey1, valueKey2) {

        for (var i = 0; i < this.rows.length; i++) {
            if (this.rows[i].cells[indexKey].innerText == valueKey1) {
                for (var j = 0; j < this.rows[i].cells.length; j++) {
                    var cell = this.rows[i].cells[j];
                    cell.style.backgroundColor = "FFB4B4";
                }
            }
            else if (this.rows[i].cells[indexKey].innerText == valueKey2) {
                for (var j = 0; j < this.rows[i].cells.length; j++) {
                    var cell = this.rows[i].cells[j];
                    cell.style.backgroundColor = "99FF99";
                }
            }
        }
    }    
 
</script>
</public:component>



- A continuación añadiremos la referencia a este archivo en el atributo de comportamiento de la CSS del fichero AppGrid.css.aspx, localizado en la carpeta _grid, del siguiente modo

.ms-crm-List-Data
{
    table-layout: fixed;
    width: 100%;
    behavior: 
    url(<%=CrmUri.Create("/_static/_grid/appgrid_defaultdata.htc", 
        Microsoft.Crm.Application.Security.UserInformation.Current).ToString()%>) 
    url(<%=CrmUri.Create("/ISV/colorizeGrid.htc", 
        Microsoft.Crm.Application.Security.UserInformation.Current).ToString()%>);
}


- El resultado es el siguiente



- Para que el despliegue sea completo, debe tener en cuenta los siguientes puntos una vez tenga realizado el cambio de color de registros de la grid:
>> Mantener el color de la columna de ordenación
>> Cambiar el color de registro seleccionado
>> Cambiar el color de múltiples selecciones






Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

16 septiembre 2012

Mapas de Datos

En Dynamics CRM 2011 podemos importar datos a más de una entidad simultáneamente desde un solo fichero fuente

Para indicar a la herramienta de importación de datos que vamos a crear dos tipos de registro utilizando un solo fichero csv, debemos especificar un Mapa de Datos

Un Mapa de Datos es un fichero que contiene información sobre cómo se corresponden los datos desde la fuente con los datos en CRM

En primer lugar veamos el contenido de un Mapa de Datos. Para esto vamos a exportar un mapa de datos de sistema




Este mapa de datos, como podemos comprobar, es utilizado para importaciones de Contactos y Cuentas

Haremos las modificaciones necesarias para utilizarlo en la importación de Coches y Fabricantes

Para asegurarnos de no importar datos duplicados, vamos a cambiar la regla del atributo Dedupe, de “Ignore” a “Eliminate”



Guardamos el fichero y lo importamos a nuestra colección de Mapas de Datos



Ahora importaremos los datos contenidos en un solo archivo csv a dos entidades diferentes mediante nuestro Mapa de Datos custom

El fichero Excel es el siguiente



Lo exportamos como fichero de valores separados por coma y lo importamos a CRM

El proceso de importación y mapeo de campos es el siguiente







Procedemos a confirmar la importación



Comprobamos los resultados en Importaciones



Y navegamos hasta las entidades para visualizar los datos





Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

11 agosto 2012

Consulta de Actividades según Scheduled Start


- Cuando consultamos actividades según su fecha de inicio, debemos tener en cuenta el tipo de fecha que enviamos en la consulta

- La base de datos de CRM almacena dos valores diferentes para la fecha de cada actividad, uno es el valor de la fecha ScheduledStart indicada durante la creación del registro en nuestra zona horaria, y el otro valor es la fecha UTC (Coordinated Universal Time)

- El manejo interno de CRM hace que una consulta retrieve según el campo ScheduledStart compruebe el campo ScheduledStartUtc cuando la fecha de consulta no especifica la zona horaria, y ambos valores no siempre coinciden, dependiendo de la zona horaria de nuestro sistema. En nuestro caso (Barcelona) es 1 hora menos en relación a las coordenadas de UTC, lo que es suficiente para que las actividades con ScheduledStart de las 00:00 pasen a informar el campo ScheduledStartUtc a las 23:00 del día anterior

- Podemos comprobar estos campos en la base de datos de nuestra organización



- Ahora comprobemos el número de actividades con ScheduledStart mayor o igual a 7 de enero de 2012



- Tenemos 12 actividades de diverso tipo con fecha mayor o igual a 7 de enero de 2012

- Ahora lancemos un programa que consulte estas actividades

- El código es el siguiente:

   
    protected void btnConsultar_Click(object sender, EventArgs e)
    {
        using (contexto = new CrmOrganizationServiceContext(service))
        {
            DateTime fechaConsulta = new DateTime(2012, 1, 7);

            var actividades = (from acts in contexto.CreateQuery<ActivityPointer>()
                               where acts.ScheduledStart >= fechaConsulta
                               orderby acts.ScheduledStart descending
                               select new
                               {
                                   ActivityTypeCode = acts.ActivityTypeCode,
                                   ScheduledStart = acts.ScheduledStart
                               });

            foreach (var actividad in actividades)
            {
                TableRow fila = new TableRow();
                fila.Cells.AddRange(new TableCell[2] 
                { 
                    new TableCell() { Text = actividad.ActivityTypeCode },
                    new TableCell() { Text = actividad.ScheduledStart.ToString() }
                });
                 
                tblActividades.Rows.Add(fila); 
            }
        }
    }



- Y la respuesta es la siguiente



- Como podemos comprobar, el conjunto de resultados no incluye las 12 actividades que se corresponden con la consulta, debido a que 10 de éstas tienen el campo ScheduledStartUtc informado con el día anterior a las 23 horas

- Este mecanismo de retrieve de CRM 2011 comprueba el tipo de fecha enviado en la consulta, para decidir la comprobación sobre el campo ScheduledStart o ScheduledStartUtc

- Para consultar con precisión las actividades según fecha de inicio, convertiremos la fecha de consulta a Universal Time, el código es el siguiente
  
        DateTime fechaConsulta = new DateTime(2012, 1, 7);
        fechaConsulta = fechaConsulta.ToUniversalTime();



- De este modo el mecanismo de consulta de CRM comprobará el campo ScheduledStart original, al saber que la fecha ya viene informada en tipo UTC

- El conjunto de datos devuelto por la consulta ahora es correcto, 12 actividades



- El ultimo paso será convertir la fecha UTC devuelta por CRM de nuevo a nuestra zona horaria para desplegar los datos de forma coherente

- El código a añadir es el siguiente


        foreach (var actividad in actividades)
        {
            DateTime fechaLocal =
              TimeZoneInfo.ConvertTimeFromUtc(actividad.ScheduledStart.Value, 
              TimeZoneInfo.Local);
            TableRow fila = new TableRow();
            fila.Cells.AddRange(new TableCell[2] 
            { 
                new TableCell() { Text = actividad.ActivityTypeCode },
                new TableCell() { Text = fechaLocal.ToString() }
            });
              
            tblActividades.Rows.Add(fila); 
        }



- El resultado ahora es coherente con los datos originales almacenados por el usuario



- Para más información sobre formatos de fecha hora en Dynamics CRM, consulte el siguiente link

Date/Time Values in Microsoft Dynamics CRM


Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

08 mayo 2012

RollUp 8 Dynamics CRM


El día 3 de mayo de 2012 fue liberado el paquete de Roll Up 8 para CRM 2011 que es mayormente una actualización acumulativa, por lo que para instalarlo no es necesario pasar por instalar las actualizaciones anteriores.
Este Roll up de actualizaciones es en gran medida correctivas las que pueden ver en detalle en el siguiente link: http://support.microsoft.com/default.aspx?kbid=2600644

No contiene nuevas características significativas, pero corrige varios errores, e incluye varias mejoras de rendimiento.
Para bajar los componentes que se incluyen en este Roll Up, lo puede hacer en:
http://www.microsoft.com/en-us/download/details.aspx?id=29692
Para información sobre como hacer el download, puede verlos en:
http://support.microsoft.com/kb/119591 

Seguimos esperando el más importante que se dará a conocer más adelante
probablemente en el paquete acumulativo de 9, quizás en Junio o Julio y que contiene varias características nuevas altamente esperadas como el soporte para otros navegadores (Firefox, Chrome o Safari),
Power Pivot, Mobile Clients, noticias sobre la tableta digital y más.

18 abril 2012

Gráficas 3D

Innovar Tecnologías ©

- En este ejemplo demostraremos como mediante una sencilla customización podemos mejorar la visualización de los gráficos en nuestra organización CRM

- El primer paso será exportar el gráfico a customizar, en nuestro ejemplo “Caso por prioridad (por día)”




- Para la edición del documento xml de nuestro gráfico utiilzaremos Visual Studio

- Mediante la customización de este xml podemos personalizar diversos aspectos del gráfico, como apariencia, colores, etiquetas, título, agrupaciones etc.

- Para desplegar el gráfico en 3D añadiremos la siguiente sección al xml:

<
<Area3DStyle Enable3D="True" LightStyle="Simplistic" />


- Editaremos también el nombre del gráfico:

<name>Casos por prioridad agrupados por día</name>


- Y el texto de las etiquetas para cada eje:

    <AxisY Title="Mis Casos activos" …

    <AxisX Title="Agrupados por Día" …


- Guardaremos las personalizaciones e importaremos el resultado de nuevo a nuestra organización CRM






- Publicaremos las personalizaciones y comprobaremos el resultado:





Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

09 abril 2012

Edición del Sitemap

Innovar Tecnologías ©

- En este ejercicio editaremos el mapa de sitio de nuestra organización CRM, para añadir un nuevo grupo al área de Workplace (“Área de Trabajo”)

- En primer lugar, exportaremos la solución que contenga el mapa de navegación, podemos utilizar la solución actual o crear una nueva que contenga sólo el sitemap

- De los archivos xml obtenidos, nos centraremos en el llamado customizations.xml



- El área que customizaremos es Workplace, a la cual añadiremos un nuevo grupo llamado Ejemplo, con un nuevo sub-área, llamada “Nuevo Grupo”

- Añadiremos código de customización con las siguientes especificaciones:
Group: 
       Id: NuevoGrupo
       ResourceId: Group_Ejemplo
       Title: Ejemplo, LCID: 3082
   • SubArea:
       Id: nav_NuevoGrupo
       Url: new_htmlpage.htm 
       Title: Nuevo Grupo, LCID: 3082


- El LCID especificado es 3082, el correspondiente a idioma de la organización español

- Guardaremos los cambios realizados e importaremos la solución con las personalizaciones



- El resultado es el siguiente:




_



Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

31 marzo 2012

XRM scripting

Innovar Tecnologías ©

- En este ejemplo trabajaremos con el objeto Xrm, para comprender el mecanismo de control del formulario CRM mediante Javascript

- En primer lugar, veamos el diagrama que forma el objeto Xrm.Page



- Mediante el control del formulario podemos introducir nuestra lógica de negocio en los procesos de creación, actualización, creación rápida, etc.

- En nuestro ejemplo estableceremos un control de datos básico sobre el formulario de “Nuevo Fax”, recogiendo los valores de cada campo y confirmando con el usuario los valores introducidos antes de guardar el registro

- El primer paso será codificar nuestro archivo Javascript e incluirlo entre los recursos web de nuestra organización CRM, para posteriormente referenciarlo desde el formulario en sus eventos onLoad y onSave

- El evento onLoad comprobará de que tipo de formulario se trata, ya que en nuestro ejemplo queremos que el código funcione en casos de creación de Nuevo Fax

- El evento onSave es el que realizará la parte de comprobación de datos y guardado en función de la respuesta de usuario



- El código de la función de chequeo de tipo de página que se ejecutará en el onLoad del formulario, y de la función de captura del evento onSave, son los siguientes:

   
   var isNewForm;
   var saveHolded;

   function checkPage() {
       var formType = Xrm.Page.ui.getFormType();
       isNewForm = (formType == 1);
   }

   function holdSaveEvent() {
       if (isNewForm && !saveHolded) {
          event.returnValue = false;
          confirmSave();
          saveHolded = false;
       }
   }



- Cuando el usuario realice la entrada de datos, y guarde el registro, se lanzará la función confirmSave(), cuyo código se expone a continuación:

   
function confirmSave() {
    
  var sender = Xrm.Page.getAttribute("from").getValue();
  var recipient = Xrm.Page.getAttribute("to").getValue();
  var faxnumber = Xrm.Page.getAttribute("faxnumber").getValue();
  var direction = (Xrm.Page.getAttribute("directioncode").getValue()) 
      ? "Saliente" : "Entrante";
  var subject = Xrm.Page.getAttribute("subject").getValue();
  var regardingobjectid = Xrm.Page.getAttribute("regardingobjectid").getValue();  
  var owner = Xrm.Page.getAttribute("ownerid").getValue();
  var duration = Xrm.Page.getAttribute("actualdurationminutes").getValue();
  var priority;
  switch (Xrm.Page.getAttribute("prioritycode").getValue()) {
   case 0: priority = "Baja"; break;
   case 1: priority = "Normal"; break;
   case 2: priority = "Alta"; break;
  }
  var due = Xrm.Page.getAttribute("scheduledend").getValue();
  var coverpage = Xrm.Page.getAttribute("coverpagename").getValue();
  var category = Xrm.Page.getAttribute("category").getValue();
  var subcategory = Xrm.Page.getAttribute("subcategory").getValue();
  
  var message = "Remitente: " + sender[0].name;
  message += "\nDestinatario: " + recipient[0].name;
  message += "\nNúmero de fax: " + faxnumber;
  message += "\nDirección: " + direction;
  message += "\nAsunto: " + subject;
  message += "\nReferente a: " + regardingobjectid[0].name;
  message += "\nPropietario: " + owner[0].name;
  message += "\nDuración " + duration;
  message += "\nPrioridad: " + priority;
  message += "\nVencimiento: " + due;
  message += "\nPortada: " + coverpage;
  message += "\nCategoría: " + category;
  message += "\nSubcategoría: " + subcategory;
    
  if(confirm('¿Guardar el registro con los datos siguientes\n\n' + message)) {
   saveHolded = true;
   Xrm.Page.data.entity.save();
  }
 }



- Este código ejemplifica la forma de referenciar valores del formulario según el tipo de campo, para finalmente llamar al método save() de la entidad desde código

- El resultado es el siguiente:



_

Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

23 febrero 2012

Early-Bound Entity Classes

Innovar Tecnologías ©

- En este ejemplo utilizaremos las clases de entidad Early-Bound generada mediante la aplicación crmsvcutil.exe para crear registros en la entidad Contact

- Los objetos necesarios para obtener el punto de acceso al contexto de nuestro sistema CRM son los siguientes

namespace netcrm
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        CrmConnection conexion;
        OrganizationService servicio;
        OrganizationServiceContext contexto;


- El código necesario para realizar la inserción de un nuevo Contacto en la entidad Contact es el siguiente

    protected void btnCreatContacto_Click(object sender, EventArgs e)
    {
        conexion = new CrmConnection("Crm2011");
        servicio = new OrganizationService(conexion);
        contexto = new OrganizationServiceContext(servicio);
        Contact contacto = new Contact()
        {
            FirstName = txtNombre.Text,
            LastName = txtApellidos.Text,
            Address1_Line1 = txtDireccion.Text,
            Address1_City = txtCiudad.Text,
            Address1_PostalCode = txtCP.Text,
            Telephone1 = txtTelefono.Text
        };
        contexto.AddObject(contacto);
        contexto.SaveChanges();
    }


- Este código es posible gracias a las clases de entidad tipadas generadas por la herramienta crmsvcutil.exe, incluida en el SDK de Dynamics CRM 2011

- El resultado de esta aplicación es el siguiente





_


Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

22 febrero 2012

LINQ 2 CRM

Innovar Tecnologias ©

- En este ejemplo conectaremos con nuestro servidor Dynamics CRM 2011 para realizar consultas mediante LINQ.
- Para obtener las clases tipadas correspondientes a las entidades de nuestro sistema necesitamos previamente hacer uso de la aplicación de servicio incluida con el SDK, crmsvcutil.exe, en la carpeta Bin, mediante la siguiente instrucción

crmsvcutil /url:"http://<url>/<org>/xrmservices/2011/organization.svc" /username:"---" /password:"---" /language:cs /namespace:DevCrm /out:"Earlys.cs" /servicecontextname:Xrm


- Esto crea una clase con todas las entidades de nuestro sistema CRM
- El último parámetro de la instrucción es /servicecontextname:xrm, este parámetro indica a la aplicación de servicio que cree una clase proxy de acceso al contexto crm, llamada xrm
- En este momento iniciaremos un nuevo proyecto tipo aplicación web, al que le incluiremos la clase DevCrm recién creada



- Para acceder al servidor, necesitamos las siguientes clases



- El parámetro de conexión Crm2011 es una cadena de conexión al CRM almacenada en el archivo web.config
- El objeto myService de tipo xrm, es el correspondiente a nuestro objeto creado en la instrucción de creación de clases del CRM, el cual nos dará acceso a todo el contexto de clases tipadas correspondientes a todas las entidades de nuestro sistema
- En este momento incluiremos código para realizar la consulta LINQ, en este ejemplo, la consulta será tipo join entre las entidades Account y Opportunity



- El resultado de la aplicación es el siguiente:




_


Desde la comunidad de developers de Dynamics CRM, queremos agradecer sus contribuciones a los creadores de los siguientes blogs y sitios web:

- CRM Consultancy

http://crmconsultancy.wordpress.com/2011/06/06/using-linq-in-crm-2011-plugins/


Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa

14 febrero 2012

CRM Anywhere!

Dynamics CRM va más lejos

Innovar Tecnologías ©



A lo largo de 2012 Dynamics CRM incluirá nuevas capacidades, a través del denominado R8 Service Update

Las áreas de interés de este Service Update son las siguientes:

- Movilidad
- Soporte multi-navegador
- Mejoras de Red Social
- Mejoras de Business Intelligence
- SQL Server 2012
- Certificaciones


Movilidad

El lanzamiento de un nuevo producto llamado Dynamics CRM Mobile, el cual habilitará CRM Online, partner-hosted y on-premise. Habrá clientes nativos, lo que se traduce en soporte offline, en todas las plataformas móviles principales incluyendo:

- Windows Phone 7.5
- iPhone y iPad
- Android
- BlackBerry



Soporte multi-navegador

Esta capacidad llega finalmente. R8 aplicado a su servidor CRM le proveerá de acceso a CRM utilizando los siguientes navegadores

- Internet Explorer 7 o superior sobre Windows 7, Vista y XP
- Safari 5.1.1 o superior sobre Mac OS-X o iOS5
- Firefox 6 o superior sobre Windows 7, Vista y XP o Mac OS-X o iOS5
- Chrome 13 o superior sobre Windows 7, Vista y XP



Mejoras de red social

Microsoft puso en funcionamiento la nueva feature Activity Feeds en Noviembre de 2011, la cual provee de features de Red Social a CRM 2011. R8 introduce una serie de mejoras a esta característica incluyendo:

- Like/dislike
- Filtros mejorados, por ejemplo @me, tipos de registros que sigo, vistas de registros…
- Un cliente de activity feeds mobile actualizado para Windows Phone 7.5






_Hoy en día utilizamos una gran variedad de plataformas y tecnologías desde diferentes lugares y dispositivos, de modo que resulta vital que la solución de software que elija para los servicios de venta, marketing y gestión de clientes de su empresa se adapten al mundo real

Mejoras de Business Intelligence

Un punto muy interesante de este reléase se centra en las nuevas capacidades de
Business Intelligence, y nuevas Templates adaptadas a la industria.

Las primeras plantillas serán:

- Wealth Management (gestión de riqueza)
- Health Sales Plans (planes de ventas en Salud)
- y Relationship Management for Health (gestión de relaciones para la Salud)

Las plantillas incluirán customizaciones de modelos de datos, dashboards (gráficos), workflows (flujos de trabajo) y datos de ejemplo

Están diseñadas para ayudar a los clientes en aquellas industrias que visualizan cómo Dynamics CRM puede ayudar a sus negocios, y acelerar la implementación sin desplegar necesariamente el paquete completo de forma vertical



SQL Server 2012

Los centros de datos propios de Microsoft ya han sido migrados a SQL Server 2012 y el R8 Service Update trae soporte oficial para partners y clientes que quieren migrar sus despliegues a esta plataforma. Adicionalmente, habrá algunas nuevas features que harán del uso de las nuevas capacidades de SQL Server 2012. Por ejemplo: mejoras en performance, en recuperación de bases de datos, la próxima generación de Business Intelligence (“Crescent”), tales como modelos de pivots predefinidos, informes de views e informes time-animated

Certificaciones

Las certificaciones son un punto esencial en la adopción por parte de la empresa, y Microsoft ha estado trabajando duro durante el último año para asegurar que sus centros de datos y servicios de CRM coincidan con los estándares más extendidos: : ISO27001, SAS 70 Type II, SOX, SSAE 16 SOC1, Safe Harbor, Data Processing Agreement, EU Model Clauses and HIPAA compliance (supported through Business Partner Agreements)



_


Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su elección de Dynamics CRM ®

Para más información sobre el nuevo release de CRM:

Release Preview Guide

Web de la empresa

27 enero 2012

Plug-Ins en CRM 2011

Innovar Tecnologías ©

- El objetivo de este desarrollo es diseñar y programar un plug-in para su despliegue en nuestro servidor CRM 2011

- El proceso de despliegue de un plug-in en CRM 2011 se divide en los siguientes pasos:

· Compilar la herramienta de registro de plug-ins para uso con CRM 2011 incluida en el SDK
· Desarrollar y registrar el plug-in acorde a la lógica de nuestro proceso custom

- En primer lugar abriremos el proyecto de Plugin Registration Tool incluido en el SDK de Dynamics CRM 2011 para compilar la herramienta



- Compilamos el proyecto y establecemos conexión con nuestro servidor mediante el uso de nuestras credenciales:





- Una vez establecida la conexión desarrollaremos nuestro plug-in con código custom para realizar los procesos diseñados
- Mediante el uso de código personalizado en procesos de CRM, el rango de posibilidades para incluir lógica de negocio se amplia de forma muy considerable

- Los pasos para crear un plug in mediante Visual Studio 2010 son los siguientes:

· Crear un nuevo proyecto Class Library
· Agregar las siguientes referencias del SDK del CRM
>> Microsoft.Crm.Sdk.Proxy
>> Microsoft.Xrm.Sdk
· Agregar las siguientes referencias del framework de .NET
>> System.ServiceModel
>> System.Runtime.Serialization

· El ensamblado del plug-in debe estar firmado mediante strong-key para ser desplegado en el servidor CRM 2011



- Codificando la librería para nuestro plug-in:
· La clase que implementemos en nuestro plug-in heredará de la interface IPlugin del SDK

   
 public class MyPlugin: IPlugin



· Esto entonces nos permite implementar el método Execute, el cual, es la función Main() central que el plug-in ejecuta como parte del pipeline de mensajes de CRM

   
 public void Execute(IServiceProvider serviceProvider)


· Este método transfiere el objeto serviceProviderque contiene los detalles entrantes sobre CRM directos desde el pipeline de mensajes de CRM, mediante este objeto podemos derivar el contexto de ejecución del plug-in

- El plug-in de ejemplorealiza una pequeña validación en la creación de un nuevo registro de la entidad Cuenta, mediante el siguiente código:

   
public class MyPlugin : IPlugin
{

    public void Execute(IServiceProvider serviceProvider)
    {
        try
        {
            IPluginExecutionContext context =
                (IPluginExecutionContext)serviceProvider.GetService(
                 typeof(IPluginExecutionContext));

            Entity accountEntityImage = (Entity)context.InputParameters["Target"];

            string accountName = (string)accountEntityImage["name"];

            if (contieneNumeros(accountName))
            {
                string message = "El nombre de la cuenta no puede llevar números";

                throw new InvalidPluginExecutionException(message);
            }

        }
        catch (Exception ex)
        {
            throw new InvalidPluginExecutionException("CRM2011.Example Plug In 
                      --> Execute '" + ex.Message + "'");
        }
    }

    private bool contieneNumeros(string nombre)
    {
        bool contieneNums = false;

        for (int i = 0; i < nombre.Length; i++)
        {
            if (char.IsNumber(nombre[i]))
            {
                contieneNums = true;
                break;
            }
        }
        return contieneNums;
    }
}


- Compilamos la clase y estará lista para ser desplegada como parte integral de nuestro entorno CRM

- Los pasos para el registro y despliegue mediante la herramienta del SDK compilada y testada previamente, son los siguientes:

· Establecer conexión con nuestro servidor CRM 2011
· Registrar nuestro ensamblado
· Registrar los pasos de ejecución para el plug-in








- Las opciones de registro del ensambladode nuestro plug-in consisten en la elección del modo de aislamiento de nuestro proceso, en este caso modo seguro (Sandbox), y el lugar de almacenaje del ensamblado, en este caso en la base de datos de CRM

- En este punto registraremos un nuevo paso para nuestro plug-in





- Las propiedades que debemos configurar para nuestro plug-in son las siguientes:
· Message: es el evento de triggering del plug-in
· Primary Entity: la entidad para la cual se desencadena el plug-in
· Execution order: configurable para la secuencia de ejecución de 2 o más plugins
· Stage: en este caso la validación se realizará post-operation, ya que durante la operación Create (del mismo modo que comparándolo con un trigger de sql disparado para una operación de inserción, la tabla de pre insert no contiene datos), la pre-imagen no contiene datos del registro creado
· Execution mode: en este caso será síncrono, considérese el caso de ejecución asíncrona para casos de ejecución de procesos de carga de datos etc., en los que no se espera una respuesta del plug-in inmediata o los procesos de negocio que realiza el plug-in son de mayor embergadura
· Deployment: elegiremos los tipos de despliegue en los que se ejecutará el plug-in, al menos uno, es este caso Server


- Realizados estos pasos procederemos a probar el funcionamiento del plug-in






_


Desde la comunidad de developers de Dynamics CRM, queremos agradecer sus contribuciones a los creadores de los siguientes blogs y sitios web:

CRM Consultancy


Desde Innovar Tecnologías
esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa