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