miércoles, 30 de junio de 2010

Estados de los Emails

Al crear actividades de tipo Email, las mismas van cambiando de estados. en este artículo intentaré explicar un poco de como es este cambio de estados.
El flujo sería mas o menos el siguiente:
Flujo de estados de emails

Pongamos por ejemplo que planificamos un envío de un Email, simplemente lo creamos.
En este momento los valores serían:
StateCode=0 (Abierto)
StatusCode=1 (Borrador)

Ahora bien, supongamos que le damos el botón de "Enviar". Al hacer eso, el CRM simplemente marcará el correo electrónico para reaizar el envío. Los estados ahora serían:
StateCode=1 (Completado)
StatusCode=6 (Envío pendiente)

Luego lo que ocurre es que el servicio asíncrono de CRM (CRMAsyncService) ejecutará el evento "BackgroundSendEmail" que lo que hace es buscar todos los emails en "Envío pendiente" (statuscode=6) para marcarlos para que el Email Router haga efectivo el envío. Despues de ejecutar este evento los estados serían:
StateCode=1 (Completado)
StatusCode=7 (Enviando)

Lo que ocurre ahora es que el Email Router busca todos esos correos electrónico en estado "Enviando" para intentar entregar los mismos al servidor que tenga configurado. En caso de fallar, volverá al estado "Envío pendiente" para intentarlo enviar de nuevo. En caso de ir correctamente el estado quedaría así:
StateCode=1 (Completado)
StatusCode=3 (Enviado)

Espero les sirva, cuando le damos al "Enviar" desde el CRM ocurren muchas cosas por detrás...

abrazo.

miércoles, 23 de junio de 2010

Correos electrónicos enviados varias veces por el Email router

Existe algunos casos en los cuales el Email Router envia un correo electrónico mas de una vez, y en este post intentaré dar respuesta a la pregunta de por qué este servicio del CRM realiza esta operación de forma tan "inesperada".
Imaginense que creo un correo electrónico normal de CRM como el siguiente:
Correo electrónico

En donde "Prueba 1" y "Prueba 2" son contactos de la empresa y por lo tanto tienen correos electrónicos de dentro del dominio, pero uno de los dos contactos tiene el correo incorrectamente en el CRM (por un error al crear el mismo).

Al enviar este E-mail, el Email Router intentará entregar este correo electrónico al Exchange, pero este devolverá un error de "User unknown" ya que una de las direcciones del dominio no existe. Esto en realidad no significa que el correo electrónico no haya salido, sino simplemente que no se ha podido entregar a uno de los destinatarios, pero al resto de destinatarios sí que le llegará correctamente.

Este error devuelto por el Exchange provoca que el E-mail en CRM quede marcado como con error, por lo que intentará realizar el envio de nuevo.

Es por esto que a los destinatarios de este correo electrónico les podrá llegar este E-mail mas veces.

Para solucionar esto, se debe introducir correctamente la dirección de correo electrónico o revisar los parámetros del Email Router en relación con las repeticiones ante errores.

Para la configuración del Email Router, recomiendo la SDK en el artículo "Outbound Provider Configuration Settings":
http://msdn.microsoft.com/en-us/library/cc906239.aspx

Un saludo!

lunes, 21 de junio de 2010

Consultado los Workflows desde SQL Server

Los flujos de trabajo se ejecutan con el servicio asíncrono de CRM (AsyncService) y van dejando en el SQL Server registro del estado de los mismos, los pasos y el seguimiento de los mismos.
Como todos sabemos, no esta soportado el acceso a ciertas tablas del SQL Server directamente, pero el CRM nos ofrece unas "FilteredViews" para poder consultar los Workflows para hacer un seguimiento de la ejecución de los mismos.
Las vistas se llaman "FilteredAsyncOperation" y "FilteredWorkflowLog"
La consulta para recoger todas las ejecuciones de workflows es la siguiente:

select asyncoperationid, name,statecodename,statuscodename, createdon
from FilteredAsyncOperation
WHERE messagename='ExecuteWorkflow'
order by createdon desc

y para recoger el estado de cada uno de los "Steps" (pasos) del workflow:

select stepname,activityname,description, completedon,statusname
from FilteredWorkflowLog
where asyncoperationid='8C6D813F-0C73-DF11-955A-000C299E8D82' --(aqui poner un "id" recogido de la consulta anterior)

De esta forma por ejemplo lo que podemos hacer es un monitor de ejecución de flujos de trabajo, de forma muy sencilla con una aplicación de escritorio o web que se vaya actualizando automáticamente.


un saludo

sábado, 5 de junio de 2010

Microsoft publica el Rollup 11

Como cada 2 meses, Microsoft ha publicado un nuevo Update Rollup 11.
Puede ser descargado de aquí: http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=f84f2bfb-393d-4b90-bf1b-300a82ec6083
Para mas información mirar la descripción de los cambios aquí:
http://support.microsoft.com/default.aspx?kbid=981328
y en el blog del equipo de CRM:
http://blogs.msdn.com/b/crm/archive/2010/06/04/update-rollup-11-for-microsoft-dynamics-crm-4-0.aspx

Como siempre: mucho cuidado y probar bien la instalación de esto antes de instalar en producción.

Un saludo

viernes, 4 de junio de 2010

Cuidado con los "Otros"


Se ha publicado un artículo en el blog del equipo de CRM con unos consejos realizados por el MVP Joel Lindstrom, que creo que son interesantes, ya que surgen de la experiencia de diversas implementaciones en muchos clientes.
El artículo es el siguiente:
Lost: Beware of the "Others"
Si bien el título es gracioso y nos hace referencia a la serie finalizada recientemente (tristemente), los consejos son muy útiles.
Habla de los típicos campos de tipo picklist para categorizar Cuentas o Contactos, en donde después de una seria de valores, se añade el "peligroso" valor de "Otros" para definir el registro.
El tema es que como a los usuarios les suele ser mas "fácil" poner "Otros" que seleccionar el valor que debería ser, o porque la categorización no recoge el valor que se necesite(no siempre es culpa del usuario), resulta que puede ocurrir que la gran mayoría de los registros terminen teniendo el valor "Otros".
Esto puede provocar que se dificulte mucho la explotación de esta información, y para evitar esto da algunos consejos:

  • Dentro de lo posible, no incluir el valor "Otros" en los picklists.

  • En su lugar, diseñar un proceso sencillo para que los usuarios puedan solicitar nuevos valores para el picklist.

  • En caso de ser muy necesario el valor "Otros", tener el mismo muy controlado, para que no ocurra lo descrito.

  • En caso de que la categorización pueda ser muy cambiante, analizar la posibilidad de poner un "Lookup" en lugar de un "Picklist", y que sean los mismos usuarios los que puedan gestionar la categorización. (esta recomendación es añadida)


  • un abrazo

    miércoles, 2 de junio de 2010

    Haciendo consultas con LINQ usando Microsoft Xrm

    Siguiendo con el artículo Usando la nueva SDK 4.0.12 (Microsoft xRM) voy a mostrar como seguir aprovechando las nuevas posibilidades que nos permite la nueva SDK (4.0.12).
    En este artículo mostraré un par de ejemplos de como poder hacer consultas en LINQ al CRM.
    En el siguiente cósigo muestro como se podrían hacer consultas en LINQ, para recoger datos de contactos en CRM, filtrando por el email:

    var crm = new Xrm.XrmDataContext("Crm");

    var namedContacts =
    from contact in crm.contacts
    where contact.emailaddress1 == "demianr@demo.com"
    select contact;
    foreach (var c in namedContacts)
    {
    System.Console.WriteLine(c.fullname);
    }

    var contacts4 =
    from contact in crm.GetEntities("contact")
    where contact.GetPropertyValue("emailaddress1") == "demianr@demo.com"
    select contact.GetPropertyValue("fullname");

    foreach (var c in contacts4)
    {
    Console.Write("{0}, ", c);
    }


    Como se ve, hay 2 formas de hacer las consultas, la primera es con los objetos creados por crmsvcutil.exe, y la segunda manera es realizandolo con "Dynamics Entities".