24/12/07

CRM vs. SharePoint

Aparte de parecer el título de una película estilo "Alien vs. Predator", o más que un artículo es una declaración de intenciones de las que se hacen típicamente en estas fechas. Se trata de enumerar las maneras que existen (que se me ocurren) de conectar SharePoint y CRM, de forma más genérica primero y luego con ejemplos concretos en artículos individuales (y aquí es donde empiezan las buenas intenciones).

Integración visual en CRM Podemos añadir un IFRAME a un formulario de CRM que muestre una página de SharePoint. La página en cuestión podría (debería) estar libre de decoraciones estilo SharePoint para que el encaje sea más limpio. Esto se puede hacer fácilmente con SharePoint designer. Por ejemplo: para una cuenta de CRM, mostrar en su formulario una biblioteca de documentos de SharePoint con los documentos asociados al cliente. La URL de SharePoint se puede crear dinámicamente en el evento OnLoad del formulario, y debería incluir información para filtrar la biblioteca, por ejemplo el número de cliente.

CRM List Web Part Muestra una lista de entidades de CRM dentro de SharePoint (WSS o MOSS). También permite (como muchos otros web parts) filtrar detalles de otro web part. Por ejemplo: un Web Part con una lista de cuentas de CRM y otro conectado con los contactos asociados. Se puede descargar aquí y ya lo ha contado (mejor) Marco Amoedo en este post. Sencillo de configurar, pero con pocas funcionalidades y - en principio - no extensible, puesto que el código no está disponible.

Business Data Catalog Dentro de MOSS 2007 tenemos el gran invento del BDC: una herramienta que nos permite ver datos externos a SharePoint integrados como Web Parts. A diferencia del sistema anterior, es un sistema genérico que permite conectar a cualquier base de datos, (digamos Oracle, MySQL etc.) y necesita ser configurado abundantemente a nivel SQL. Para empezar, necesitaremos una Application Definition File específica para la fuente de datos. Hay gente que ha desarrollado la apropiada para CRM, en concreto Rehman Gul en este ejemplo.

Worflows/CallOuts/Plugins de CRM En cualquiera de sus versiones (la más clásica de CRM 3.0 o la nueva de CRM 4.0 integrada con Windows Workflow Foundation) podemos detectar eventos de CRM que actualicen o creen información en SharePoint. En el caso de los wf de CRM 3.0, estos eventos están limitados a la creación, cambio de estado y cambio de propietario. Con los CallOuts/Plugins no tenemos esta limitación. Por ejemplo: cada vez que se crea una cuenta de cliente en CRM, podríamos lanzar un proceso que cree una biblioteca de documentos en SharePoint. Habría que desarrollar la funcionalidad utilizando la SDK de SharePoint en una dll que integrar como una acción del workflow de CRM (versión 3.0). Para la versión 4.0 habría que desarrollar una CustomActivity.

Workflows de SharePoint Buenas noticias, también basados en WF. Tanto en WSS como en MOSS podemos asociar workflows a listas o bibliotecas de documentos. Las acciones elementales del workflow son actividades que pueden incluir cualquier código personalizado, incluyendo llamadas a la SDK de CRM. Por ejemplo: podríamos tener un sitio de SharePoint expuesto en Internet que permita al usuario dar de alta una solicitud de servicio en una lista especializada. El wf asociado a la lista podría crear un incidente en nuestro CRM a través de la SDK. Ventaja: la interfaz de usuario final es la propia de SharePoint. Si estamos en un sitio de "publishing" podemos darle el aspecto que queramos con sólo cambiar el diseño de la página con SharePoint designer.

Web Parts La SDK de WSS permite desarrollar nuestros propios Web Parts, que ahora además están totalmente integrados en ASP.NET 2.0, así que podemos probarlos en cualquier página aspx, no sólamente en un site de SharePoint. La idea es la misma que en el punto anterior, pero más cercano a la interfaz de usuario: el Web Part llama a la SDK de CRM directamente, sin que haya un almacenamiento en SharePoint. El ejemplo: el mismo del punto anterior, pero sin lista en SharePoint. La pega: tenemos que diseñar la interfaz de usuario directamente en código (C# o VB) sin un editor visual a través de un CustomControl de ASP.NET 2.0

Servicio Windows Esta es la versión asíncrona de algunas de las opciones que hemos visto. La idea es tener relacionados una entidad de CRM (digamos Artículos de la KB) con una lista/biblioteca de SharePoint. Un servicio periódico utlizaría ambas SDKs para sincronizar los elementos concordantes. Habría que añadir una columna a la lista con el GUID de CRM y un campo en la entidad de CRM con el identificador de SharePoint para hacerlo posible.

15/12/07

Mi primer Redeployment/Reimplementación de CRM 3.0

Suena como un anuncio de colonia, ya lo sé. El caso es que me he encontrado con algunos problemillas (qué sorpresa) y aquí van, para que no se olvide. En líneas generales, el proceso que se explica en la carpeta RedeploymentTool es correcto. Sólo añadir que:
  • El backup de la base de datos original no debería incluir los usuarios (SQLAccessGroup y demás) que crea la instalación de CRM. Estarán basados en el directorio activo antiguo. Aunque se vaya a instalar sobre el mismo directorio activo, no conviene que estén, pues la instalación intentará volver a crearlos y dará un error, poco explicativo, por cierto de tipo GrantDatabaseAccessAction.
  • Puede que dé un error AddLicenseAction. Se puede omitir, como recomienda Matt Parks aquí, pero también se puede entrar a la base de datos, tabla Licenses, y cambiar (por ejemplo) una letra de la clave de activación. El programa de instalación machacará esta tabla, en cualquier caso.
Por lo demás, todo fue bien, aunque me sorprendió no encontrar demasiada información en la web sobre Redeployment. Es una herramienta fundamental para fabricar entornos de prueba.

14/12/07

Plantillas de correo y "slugs"

Aviso que esta entrada es de las de "no te olvides de...". Se trata de las plantillas de correo electrónico, una herramienta muy potente de CRM que, sin embargo, tiene sus limitaciones. En principio podemos copiar cualquier HTML a nuestra plantilla con un copiar y pegar. Todo va bien hasta que intentas copiar estilos que hayan sido definidos en la cabecera. Por ejemplo:

<style type="text/css">
H1 {border-width:1;border:solid;text-align:center}
</style>

La primera en la frente: el "copiar y pegar" tan sólo copia la parte de BODY, no la de HEAD. Así que tendremos que utilizar el estilo directamente en cada etiqueta:

<h1 style="border-width:1;border:solid;text-align:center">Titulo</h1>

Vamos con otra: los slugs. Los slugs son cadenas que permiten introducir campos de la entidad en el texto de la plantilla. Por ejemplo, para insertar el nombre de un contacto, podemos poner

Estimado {!contact:firstname;}

Un cliente pensó (con razón) que sería interesante poner un enlace en HTML a una aplicación web en la plantilla. Algo como

<a href='http://www.emp.com/registro.aspx?id={!account:accountid;}>Registro online</a>

Como véis, hemos metido un slug dentro de una etiqueta de código HTML. Además, hemos escogido el campo accountid que es un GUID que en la interficie de usuario está oculto. ¿Funciona esto? Pues sí y no. Para empezar, no creo que esté soportado. De hecho, el editor de HTML de la plantilla da errores a veces imprevisibles. Lo que he aprendido (a base de golpes) es que, por ejemplo, si en lugar de poner comillas simples (como en el ejemplo anterior) ponemos comillas dobles el editor falla y no podemos guardar la plantilla. Es sólo un ejemplo de los problemas que puede dar. Pese a todo, merece la pena echarle un vistazo.