martes, 27 de enero de 2015

Cálculo de campos Rollup desde Workflows (Calculate Rollup Field)

Siguiendo un poco el hilo de mi post anterior, le he dado una vuelta mas.

He detectado una posible necesidad de forzar el cálculo de campos de Rollup en momentos determinados, y de forma dinámica. Me he puesto a pensar entonces una solución que pudiese ser reutilizada para cualquier campo de tipo Rollup, sin necesidad de estar compilando plugins todo el tiempo.

Entonces, he creado un nuevo componente que he publicado en Codeplex: http://calculaterollupfield.codeplex.com/

La idea es simple, crear una actividad de workflow, que ejecute un calculo de un campo de rollup de una entidad padre. Se puede descargar desde ahí el código fuente y la propia solución directo para ser ejecutada. Una vez instalada, tendrán disponible la nueva actividad de workflow:

image

Los parámetros que recibe esta actividad de workflow son:

image

Los parámetros que se reciben son:

  • FieldName: Nombre del campo de tipo consolidad (rollup) padre
  • Parent Record URL: Aquí deben añadir de forma dinámica el campo “URL del registro(Dynamics)” del registro padre

Esto de la URL es un “truco” (por llamarlo de alguna manera) para pasar un registro de tipo “EntityReference” a una actividad de Workflow, sin definir un tipo fijo. Esta URL tiene el siguiente formato
https://<orgname>.crm4.dynamics.com:443/main.aspx?etc=9105&id=67a87f79-7f98-e411-80d5-c4346bad10f0&histKey=474087586&newWindow=true&pagetype=entityrecord

Esta URL nos da el ObjectTypeCode (etc) desde el cual puedo recoger el nombre de esquema de la entidad, y el ID del registro.

Las funcionalidades que nos puede dar esta solución, pueden ser diversas y creo que bastante útiles ya que recogemos el control de algo que ocurre por “detrás” para que se comporte como requieran los usuarios.

Espero les guste, por favor añadir comentarios en codeplex o ideas de nuevas funcionalidades, así la voy mejorando por el bien de todos: http://calculaterollupfield.codeplex.com/workitem/list/basic

abrazo!

@demian_rasko

sábado, 24 de enero de 2015

Como hacer campos consolidados síncronos (Sync Rollups)

Buenas, como muchos ya conocen y (espero) estén utilizando ya, en Dynamics CRM 2015 tenemos la posibilidad de utilizar campos de tipo “Consolidados” o de tipo “Rollup” (a veces las traducciones no me suenan muy bien y prefiero hablar con conceptos en inglés).
Bien, este tipo de campos tiene la particularidad que se calculan de forma asíncrona, es decir que es posible que el dato que estemos consultando o viendo, no sea esté actualizado. Esto se puede minimizar, bajando los tiempos de cálculo hasta un mínimo de una hora, pero aún así, en algunos escenarios esto no alcanza y es requerido que los cálculos sean totalmente online.
Hoy les voy a enseñar como convertir un campo de tipo Rollup (asíncrono por naturaleza), a un campo de Rollup 100% síncrono.
Me he inventado un escenario donde tengo Cuentas y Contactos (muy original por cierto) y quiero un campo en las Cuentas que me muestre el total de Contactos relacionados que dispone.
El campo de Rollup en Cuenta tiene la siguiente definición:
image
image
Bien, solamente con esto ya dispongo del campo que me calcula el total de contactos relacionados con una Cuenta. Pero esto se calcula de forma asíncrona nomás, o síncrona de forma manual desde el mismo formulario.
Para convertirlo en totalmente síncrono, debemos crear un Plugin y hacer una llamada a un nuevo mensaje llamado “CalculateRollupFieldRequest” que permite disparar el cálculo de un campo de tipo Rollup.
El código completo del Plugin está aquí:
using Microsoft.Crm.Sdk.Messages;using Microsoft.Xrm.Sdk;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Web;
namespace Plugin_Recalculate_Rollup
{
    public class Recalculate_Rollup  :IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)    
        {
            ITracingService tracingService =(ITracingService)serviceProvider.GetService(typeof(ITracingService));        
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));        
            if (context.InputParameters.Contains("Target") &&            context.InputParameters["Target"] is Entity)        
            {
                Entity entity = (Entity)context.InputParameters["Target"];
                if (entity.LogicalName != "contact")
                    return;
                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
                try
                {
                    Entity contact=(Entity)context.PostEntityImages["Imagen"];
                    CalculateRollupFieldRequest calculateRollup = new CalculateRollupFieldRequest();
                    calculateRollup.FieldName = "new_totaldecontactos";
                    calculateRollup.Target = new EntityReference("account", ((EntityReference)contact.Attributes["parentcustomerid"]).Id);
                    CalculateRollupFieldResponse resp = (CalculateRollupFieldResponse)service.Execute(calculateRollup);
                }
                catch (Exception ex)
                {
                    tracingService.Trace("MyPlugin: {0}", ex.ToString());
                    throw;
                }     
            }
        }
    }
}

En la llamada al “CalculateRollupFieldRequest”, solamente hay que pasarle los siguientes parámetros:
  • FieldName: con el nombre del campo Rollup en Cuenta
  • Target: que debe ser un EntityReference al registro “padre”
Este plugin, lo complilamos y lo registramos con el PluginRegistrationTool como siempre.

NOTA: para registrar plugins a mí el PluginRegistrationTool de la versión 7.0.0 (CRM 2015) no me funciona, ya que se me queda la pantalla en blanco al conectar. Para este ejemplo he utilizado el PluginRegistrationTool que viene en la SDK de CRM 2013 SP1 (6.1.0).

image

Adicionalmente he credo una Imagen Post para recoger el “ParenCustomerId” del contacto:

image

Ahora cada vez que crea un Contacto nuevo relacionado con una Cuenta, se recalcula el campo de tipo Rollup:

image

Advertencia!: los campos de tipo Rollup síncronos pueden penalizar (y mucho) el rendimiento del CRM, por esto, si bien una práctica 100% soportada, utilizarlos con cuidado.

lunes, 19 de enero de 2015

Paneles en CRM 2015 y Tablets

Hola, como ya estamos todos los del mundo del Dynamics CRM empezando a trabajar con CRM 2015, seguiré hablando de cosas nuevas, pruebas y ejemplos de código de nuevas funcionalidades.

Una de las nuevas funcionalidades de CRM 2015, es la posibilidad de definir que paneles (dashboards) estará visibles los clientes de Tablets.

Para definir esto, vamos al panel y hacemos click en Propiedades:

image

y luego ahí habilitamos la opción:

image

Una de las nuevas funcionalidades de CRM 2015 es la posibilidad de acceder a iframes desde las tablets. Por eso vamos a probarlo y añado un iframe llamando a Bing maps en un panel:

image

Guardo, publico y vuelvo a abrir la aplicacion movil de tablets y le damos a descargar lo nuevo:

image

Si entro ahora al panel de actividad de ventas lo veo así (no se ve el iframe):

image

Esto es porque no he habilitado esta funcionalidad de forma general que debe realizarse en la configuración del sistema:

image

Esta funcionalidad esta disponible sobre para temas de desarrollo y pruebas. Esperemos que con el feedback recibido de las mismas el equipo de producto lo deje como funcionalidad soportada e incluida en la plataforma, porque es un punto importante para la adopción de los clientes de movilidad.

Tener en cuenta unos temas importantes:

  • Es una funcionalidad en “preview” por lo tanto no utilizarlo en entornos de producción aún
  • Solo funciona en entornos CRM Online (no Onpremise)
  • Solo funciona para iPads y Android
  • No se pueden abrir popups (ventanas emergentes) desde los iframes
  • No disponible para web resources de tipo Silverlight o Imágenes

Genial! esto nos permitirá llegar a donde no podíamos hasta ahora con las aplicaciones móviles, y nos ofrece un nuevo abanico funcional, donde añadir desarrollos externos en un sitio donde hasta ahora no se podía.

Un abrazo!

viernes, 28 de noviembre de 2014

CRM 2015: Como definir una lista de precios predeterminada por Territorio

CRM 2015 ya esta disponible en Online, así que ya no hay excusas…Ir a por las trials ya mismo a probar todo lo nuevo!

Una de las funcionalidades que han pasado algo desapercibidas de lo nuevo en CRM 2015, es la posibilidad de que las listas de precios se selecciones automáticamente en las Oportunidades dependiendo de la Zona de ventas (Territory).

En muchos de los proyectos nos enfrentamos a que debemos autoseleccionar una Lista de precios en las Oportunidades, por un lado porque es un campo requerido, y por otro lado porque los usuarios suelen seleccionar siempre la misma lista de precios.

En CRM 2015, ya podemos configurar esto de forma general, y hoy voy a explicar como configurar esta ESTUPENDA funcionalidad.

Lo primero que hay que hacer es ir a ventas dentro de la configuración del sistema y confirmar que esta opción esta a Sí:

image 

Luego, creamos una una nueva zona de ventas:

image

Y se la asignamos a mi usuario:

image

Luego voy a la lista de precios, y le defino la zona de ventas con una conexión que define que para los usuarios de dicha zona, se defina de forma predeterminada:

image

image

image

Una vez hecho, esto, vamos a crear una nueva oportunidad, y el campo de la lista de precios se rellena solo:

image

Ojo, esta funcionalidad esta un poco “escondida”, pero es simplemente genial.

Otro ejemplo de como el equipo de producto de Dynamics CRM hace caso a mucho de lo que se publica como requerimientos en Connect.

Un saludo

@demian_rasko

sábado, 15 de noviembre de 2014

CRM 2015: Personalización de la ayuda

Una de las funcionalidades que vuelve a Dynamics CRM con la nueva versión 2015, es la de la posibilidad de personalizar la ayuda.

Un tema recurrente en las implementaciones de CRM es que si queremos añadir la ayuda personalizada de nuestra implementación en el botón de ayuda, no se podía hacer. Al darle a la ayuda, aparece una ventana de ayuda estándar que no se ajusta a la realidad en la gran mayoría de los proyectos.

En versiones antiguas de CRM se podía modificar el HTML de las ayudas, pero era algo no muy robusto y por supuesto no serviría para entornos Online.

Es por esto que ahora esta hecho de mejor manera. La idea es primero definir a nivel general en la configuración que activamos la ayuda. Además se puede definir una URL genérica y configurar que se pasen parámetros del contexto a dicha llamada de ayuda.

Para activar la ayuda personalizada se hace desde la configuración del sistema, allí defino una url de un sitio mío donde alojaría la ayuda:

image

Luego debemos activar la ayuda personalizada en las entidades (en este caso en Cuentas):

image

Como he dejado la URL de la ayuda de cuentas vacías, al darle ayuda, lo que hace es abrirnos mi sitioweb definido en la configuración global:

image

image

La URL que me ha abierto es: https://secure.mycompany.com/help.aspx?entrypoint=form&formid=8448b78f-8f42-454e-8e2a-f8196b0419af&typename=account&userlcid=1033

Pero lo ideal es que la ayuda este dentro del CRM, y que sea “Solution Aware”, es decir, que se actualice dentro de las soluciones de CRM. Por esto, lo que hago ahora es crear un Web resource de tipo HTML, con el texto de la ayuda de cuentas:

image

Luego actualizo la configuración de la ayuda de la Cuenta, añadiendo la URL del web resource:

image

Y luego si le doy a la ayuda, lo que hace es abrirme mi HTML:

image

De esta manera funciona la personalización de ayudas de CRM, es sencillo y robusto.

Ahora a incluir horas de trabajo en estas ayudas para los usuarios.

Saludo

miércoles, 12 de noviembre de 2014

CRM 2015: Nuevas posibilidades que ofrecen múltiples enfoques

En Dynamics CRM 2015 tenemos una serie de nuevas funcionalidades que nos abren caminos nuevos. Estos nuevos caminos nos llevan a los implementadores de soluciones a identificar el camino mas adecuado para los intereses del cliente y del proyecto.

Un ejemplo clave lo voy e enseñar hoy con un ejemplo. Imaginemos la siguiente situación: queremos que si la categoría del cliente es “Cliente preferido” se haga algún automatismo como poner un valor o hacer algún cálculo.

Esto ahora se podría hacer de tres manera sin desarrollar:

1) Con una Business Rule (de Formulario o de Entidad):

image

2) Con un campo Calculado:

image

3) Con un Workflow (síncrono o asíncrono)

image

Obviamente, no hay que olvidar que siempre existen las opciones de desarrollar estos automatismos con Javascript o C# en plugins por ejemplo u otras estrategias.

Hasta ahora me surgían dudas a veces de si hacer cosas con un plug¡n o un Workflow síncrono. El problema que nos va a surgir a partir de CRM 2015 será mas complejo de decidir…

Como se puede observar, ahora al tener que implementar una misma funcionalidad requerida para el proyecto, tenemos muchos mas caminos, y debemos ser muy cuidadosos para decidir el que mejor lo resuelva y sobre todo el que mejor se integre con los demás.

No me canso de decirlo, pero ahí va una vez mas: Dynamics CRM es una plataforma de implementación que se puede adecuar a cualquier escenario de negocio (no únicamente gestión de CLIENTES) y cada vez salen mas herramientas para potenciar esta plataforma y así reafirmar esta idea.

@demian_rasko

domingo, 9 de noviembre de 2014

CRM 2015: Reglas de negocio a nivel de Entidad

Hola, hoy voy a hablar de una de esas funcionalidades que mas estamos esperando los implementadores de Dynamics CRM desde siempre.

Con CRM 2013 aparecieron las Business Rules (Reglas de negocio), por medio de las cuales se podían definir reglas que ponían valores, ocultaban campos, etc en los formularios si necesidad de tirar ni una sola línea de Javascript. Este fue un gran “step-forward” en las implementaciones de Dynamics CRM, en donde cada vez mas las nuevas herramientas que se van añadiendo a la plataforma permiten no tener que desarrollar para extender sus funcionalidades.

Obviamente que lo que hacen las Business Rules pueden ser realizadas de forma mas o menos sencilla con Javascript en los formularios, pero apoyarnos en las herramientas estándar de la solución nos garantizan optimización en el rendimiento y sobre todo evolución.

A esto último me refiero hoy. En CRM 2015, se ha añadido una nueva funcionalidad que puede pasar un poco “desapercibida” y es la posibilidad de que las Reglas de negocio se puedan ejecuta a nivel de “Entidad”. Esta funcionalidad nos permitirá que una Regla de negocio que introduce un valor predeterminado por ejemplo según alguna condición, se pueda ejecutar tanto en el Javascript del formulario sino también del lado servidor (cuando se crea por ejemplo un registro por un workflow o por SDK).

La idea es muy sencilla, una vez definida la Regla de negocio:

image

En el desplegable donde anteriormente se podía seleccionar los formularios a los que aplicaba la regla de negocio, ahora se puede seleccionar el valor “Entidad”:

image

Excelente! la verdad que es buenisimoooooo!!

@demian_rasko