Un nuevo espacio para la comunidad de CRM en español. Revisado, monitorizado y respondido (cuando no son preguntas sobre Hotmail) por el equipo de MVPs de CRM de habla española. O sea, Marco Amoedo. Y allá va el enlace:
Un nuevo espacio para la comunidad de CRM en español. Revisado, monitorizado y respondido (cuando no son preguntas sobre Hotmail) por el equipo de MVPs de CRM de habla española. O sea, Marco Amoedo. Y allá va el enlace:
Esta es una de esas pequeñas modificaciones (no soportadas) que pueden hacer que nuestros usuarios ganen mucho tiempo. Los campos de tipo lookup tienen su propia vista asociada, que se puede modificar para que en lugar de mostrarnos todos los registros de un determinado tipo, realice algún tipo de filtrado sobre ellos. El ejemplo más típico: cuando establecemos el contacto principal de una cuenta, no queremos ver todos los contactos, sino sólo aquellos que pertenecen a esa cuenta. Pues bien, gracias a un post de Atilio en las news que me llevó a este otro de Jim Wang que explica cómo hacerlo. Resulta que los campos lookup admiten un parámetro additionalparams donde podemos añadir un texto cualquiera para que aparezca en la caja de búsqueda. Si añadimos como campo de búsqueda a la vista de contactos el nombre de la empresa, ya tenemos resuelto el tema.
Modificamos el OnLoad del formulario de Cuenta para que añada el parámetro:
if (crmForm.FormType == 2 && crmForm.ObjectId != null) {
var name = crmForm.all.name.DataValue;
crmForm.all.primarycontactid.additionalparams = 'search=' + name;
}
Ahora modificamos la vista de búsqueda de contactos para que incluya el nombre de la cuenta:
Añadimos el campo Cliente principal:
Y ya está. Ahora, cuando abramos el lookup de Contacto principal, tendremos rellenado el nombre de la empresa. Si pulsamos buscar aparecerán sólo los contactos de esa cuenta.
Una de las funcionalidades añadidas en la versión 4.0 fue la de permitir crear relaciones múltiples entre entidades. Aunque internamente se está creando una tabla intermedia o Intersect Table los Web Services de la SDK no la publican como una entidad más que podamos crear o editar. Para asociar dos entidades de esta relación tendremos que usar el mensaje específico AssociateEntitiesRequest. ¿Y para buscar? Hay que recurrir a dos LinkEntities, igual que en SQL necesitaríamos dos JOIN. Lo cuelgo aquí para cuando se me olvide. Por cierto, creo que en la SDK hay un pequeño error.
// Buscar todos los "B" relacionados con "A"
QueryExpression qe = new QueryExpression();
qe.EntityName = "pre_entidad_b";
qe.ColumnSet = new AllColumns();
// Crear el enlace entre la tabla buscada(B) y la intermedia
LinkEntity le1 = new LinkEntity();
le1.LinkFromEntityName = "pre_entidad_b";
le1.LinkFromAttributeName = "pre_entidad_bid";
le1.LinkToEntityName = "pre_entidad_b_entidad_a";
le1.LinkToAttributeName = "pre_entidad_bid";
// Enlace entre la tabla intermedia y la conocida(A)
LinkEntity le2 = new LinkEntity();
le2.LinkFromEntityName = "pre_entidad_b_entidad_a";
le2.LinkFromAttributeName = "entidad_aid";
le2.LinkToEntityName = "entidad_a";
le2.LinkToAttributeName = "entidad_aid";
// Crear la condición para filtrar por la entidad conocida
ConditionExpression ce = new ConditionExpression();
ce.AttributeName = "entidad_aid";
ce.Operator = ConditionOperator.Equal;
ce.Values = new object[] { entidad_aId };
// Añadir la condición al segundo enlace
le2.LinkCriteria = new FilterExpression();
le2.LinkCriteria.Conditions = new ConditionExpression[] { ce };
// Añadir el segundo enlace al primero
le1.LinkEntities = new LinkEntity[] { le2 };
qe.LinkEntities = new LinkEntity[] { le1 };
// Crear la petición
RetrieveMultipleRequest req = new RetrieveMultipleRequest();
req.Query = qe;
RetrieveMultipleResponse resp = (RetrieveMultipleResponse)crm.Execute(req);
resp.BusinessEntityCollection;
Leo en el blog del equipo de CRM que se ha lanzado un nuevo toolkit integrado en Visual Studio para facilitar el desarrollo sobre CRM.
Aquí tenemos el enlace al post del Microsoft Dynamics CRM Team Blog:
Announcing the Microsoft Dynamics CRM Dev Toolkit
Y aquí el enlace al instalador:
The Microsoft Dynamics CRM Developer Toolkit
Hasta ahora, la SDK sólo proporcionaba poco más que un fichero de documentación y un par de dlls. El desarrollo sobre Visual Studio se realizaba de la manera estándar, sin muchas ayudas específicas para CRM. Con este lanzamiento se facilita el famoso XRM o CRM como plataforma de desarrollo. Pero no es sólo una ayuda para el desarrollo puro. Además, con este Toolkit podemos hacer directamente desde Visual Studio algunas tareas que suelen hacerse pesadas desde la interfaz de CRM:
Desde luego, una buena noticia para los que nos peleamos con CRM (a diario).
Una de las funcionalidades más útiles de CRM para los desarrolladores es la posibilidad de lanzar formularios y vistas desde aplicaciones externas. Lo que en la SDK se describe como URL-Addressable Forms and Views (que por cierto, no sé muy bien como traducir, porque Formularios y vistas direccionables por URL suena raro) es lo que nos permite lanzar un Internet Explorer con la dirección:
http://crm:5555/Org/CS/cases/edit.aspx?id={guid} Por ejemplo, para editar un caso para el que conocemos su id. Si lo que queremos es crear un nuevo caso, simplemente no ponemos el parámetro id y ya está:
http://crm:5555/Org/CS/cases/edit.aspx Aún mejor, si queremos rellenar para el usuario algún campo en el formulario, la URL lo admite con la forma habitual campo=valor así que podemos escribir, por ejemplo:
http://crm:5555/Org/sfa/accts/edit.aspx?name=Spenta&telephone1=1234556 Para rellenar el nombre y el teléfono de una nueva cuenta. Hasta aquí todo perfecto.Bueno, pues en la SDK está documentado una serie de entidades (cuenta, contacto, caso etc.) pero no dice nada acerca de las actividades. En un proyecto en el que estoy trabajando que incluye integración con Silverlight, necesitaba lanzar una ventana para crear actividades y me di cuenta de su formato de URL no estaba en la lista. No hace falta ser un hacker para darse cuenta de que cuando lanzas una ventana de actividad, la URL tiene una forma ligeramente distinta. Además, para rellenar los campos de tipo partylist hay que hacer un pequeño truco adicional.
http://crm:5555/Org/activities/phone/edit.aspx
?pId={guid}&pType=2&pName=Nombre&partyid={guid}&partytype=2&partyname=Nombre No es para tanto, es sólo que el parámetro pId para el destinatario no está documentado. Y que con los campos partyid y partyname se añaden destinatarios a los campos de tipo partylist.
Estos últimos días me he estado
peleando ocupando de instalar y extender el acelerador de CRM que más coincide con la funcionalidad del proyecto CSP. El eService Accelerator es una extensión de CRM que permite "abrir" nuestro CRM publicando una selección de funcionalidades en una web al estilo portal público o extranet. Aquí nuestros clientes (o ciudadanos) pueden acceder a información o aportarla en tareas como:
Además, esta plataforma inicial es fácilmente ampliable, de manera que si una empresa quisiera, por ejemplo, dar acceso al autoservicio de presupuestos para clientes, lo podría hacer publicando la entidad Oferta. Un conjunto de controles UserControl de ASP.NET permiten a un equipo de desarrollo añadir esta funcionalidad con poco esfuerzo.
El proceso de instalación del eService es bastante sencillo, aunque hay una serie de problemas menores que mejor no tener que encontrarse una segunda vez. Los comparto aquí por si sirven de algo. La parte de personalización y ampliación se queda un poco corta en explicaciones, así que también pondré mi granito de arena.
Os recomiendo crear un acceso directo por si tenemos que volver aquí.
Además de cambiar el nombre, tendremos que rellenar todos los campos de esta entidad: SmtpServer, SmtpPassword, Default Subject. Aquí encontramos también el usuario que va a identificar al portal de eService para CRM. Este usuario debe tener los permisos exactos (ni más ni menos) para realizar las tareas de eService:
Os recomiendo que creéis un rol específico para este usuario. El usuario, además, debe tener cumplimentado el atributo internalemailaddress.
La base de datos de Membership (eServiceMembership) tiene que tener permisos de lectura para el usuario de identidad del pool donde se esté ejecutando el portal. En micaso este usuario es NT Autority\Network Service.
Editar el Workflow de Sign-up, que es el responsable de enviar un correo al usuario que acabamos de registrar en el portal. El email contiene un enlace a la página createuser.aspx que debe tener la base correcta, algo así como http://emp.com/eservice/createuser.aspx?id=x
La forma de añadir nuevas entidades a eService es (por decirlo suavemente) un poco incómoda, ya que la lista se encuentra hardcoded en el código de la página EntityList. Por otro lado, en la parte de código fuente, el proyecto que nos proporcionan no es de tipo Web Application Project, sino Web Site. Sin embargo, el modo de desplegar la consola de eService implica copiar su dll en la carpeta bin de CRMWeb. Como consecuencia, tendremos que fabricar un nuevo proyecto de tipo Web Application Project, copiar las páginas y usar la opción Convertir a Aplicación Web.
Para crear una nueva página que dé soporte a una nueva entidad, el proceso sería el siguiente:
En este artículo de MSDN se presentan dos herramientas muy útiles para cualquiera que esté desarrollando una aplicación de negocio sobre CRM.
ISV Utilities for Comparing Customizations and Transferring Configuration Data
La primera de ellas nos permite comparar dos ficheros de personalizaciones customizations.zip extraidos de dos implementaciones CRM o de dos momentos del tiempo diferentes. Con una interfaz visual sencilla, muestra la estructura de dos ficheros y resalta las diferencias entre ellos.
La segunda de las herramientas es útil para un escenario también muy típico. Hemos generado un paquete de instalación para nuestra solución que crea las entidades, atributos, relaciones necesarias para nuestra personalización. Algunas de estas entidades suelen contener información de configuración de nuestras extensiones, de modo que después de hacer el despliegue nos toca crear esos registros y rellenar sus valores iniciales. Una forma es importar un fichero csv a través de la interfaz de importación de registros. Esta herramienta nos ofrece una interfaz más sencilla y nos evita tener que trabajar con Excel o pesados ficheros de texto.
Además, todo el código de estas dos herramientas está disponible, lo que nos permitirá adaptarlo a nuestras necesidades de despliegue y generación de datos iniciales.
Esta vez tomo prestado el trabajo de Simon Hutson, el responsable del blog de CRM de Microsoft UK. Si habéis desarrollado utilizando la clase DynamicEntity, en algún momento habréis tenido que poner un punto de ruptura en vuestro código e inspeccionar el contenido de una entidad. En ese momento empiezan los problemas, o mejor dicho la incomodidad, ya que una DynamicEntity puede tener docenas de propiedades almacenadas en un array que tenemos que ir abriendo una por una hasta que encontramos la que nos interesa. Un rollo. La herramienta que proporciona Simon habilita un nuevo visualizador para el depurador de Visual Studio. Así, además de las opciones estándar (Html, Texto, XML) tendremos una adicional: DynamicEntity.
De esta manera, vemos rápidamente todas las propiedades de la entidad, con su nombre y su valor asociado. En el artículo completo hay una descripción detallada de cómo desarrollar estos visualizadores:
Microsoft Dynamics CRM UK Blog : Creating A Debugger Visualizer For Dynamic Entities
Podéis descargar el proyecto de Visual Studio aquí.
Using Metadata for Generating Entity Diagrams in Microsoft Dynamics CRM 4.0
Esta herramienta genera diagramas de Visio con las entidades y atributos de una instalación de CRM. No hace falta decir el tiempo que podemos ganar cuando estamos generando documentación. El aspecto que tienen nos resultará familiar: con esta herramienta ha generado el equipo de CRM todos los esquemas que hay en la documentación de la SDK.
<a href="{0}">{0}</a>cscript adsutil.vbs get w3svc/NTAuthenticationProviderscscript adsutil.vbs set w3svc/NTAuthenticationProviders "NTLM"Esta nueva herramienta presentada por Jim Daly en este post del blog del equipo de desarrollo de CRM puede ser de mucha utilidad para los fans de la documentación de proyectos. El Microsoft CRM 4.0 Form Reporter es una aplicación que permite crear un documento Word 2007 con información de entidades, atributos, elementos de interfaz de usuario etc. Todo (o casi todo) lo que contiene un fichero customizations.xml exportado desde CRM.
Seguro que ahorrará mucho tiempo para documentar nuestros desarrollos o para - quizás más importante - entender los de terceros. Se ha desarrollado usando transformaciones XSL y la SDK para desarrollo de Open XML , así que requiere .NET Framework 3.5 y Word 2007.
En el último paso, un Plug-In se encarga de rellenar los campos que falten y que InfoPath no puede conocer. En este caso, se trata del Guid del ciudadano, que no está explícitamente en el formulario de InfoPath. Una de las ventajas que permite esta aproximación es su genericidad: si se añade un nuevo trámite, en principio, no habría que cambiar una sola linea de código. Sería tan sólo añadir la nueva transformación XSL. Este esquema es bastante flexible y se podría aprovechar para generar cualquier tipo de entidad.
Ultimamente se está oyendo hablar mucho de este tema: considerar CRM no sólo como un producto terminado, sino también como unos cimientos sobre los que construir aplicaciones de negocio de cualquier orientación. Siempre que haya clientes implicados y considerando que la capa de plataforma de CRM incluye:
Generador de Interfaz de Usuario
Generador de consultas
Trabajo offline
Podéis descargar las PPTs de mi parte del evento aquí.
Actualización Otro enlace interesante: el Developer Ramp up kit for Microsoft Dynamics CRM 4.0 Contiene Powerpoints, videos y documentos con laboratorios paso a paso para aprender a desarrollar sobre CRM.
El contenido de UIXmlHash se volverá a rellenar una vez se haya reiniciado Outlook
Esto es una prueba doble: por un lado utilizo una librería para CRM que permite hacer consultas con Linq: LinqtoCRM. Está en Codeplex y su autor está aquí: http://www.itu.dk/~friism/blog/ Todavía es muy, muy preliminar pero aún así es interesante. Para mi es la excusa para meterme en la jungla de Linq. Por el otro lado, estreno Jing + ScreenCast para subir vídeos de programación, a ver qué tal está la calidad del video. Como es grande para embeberlo en el blog, dejo sólo el enlace:


<SubArea Id="nav_accts" Entity="account" DescriptionResourceId="Account_SubArea_Description" />
<SubArea Id="nav_proveedores"
Url="http://10.1.4.129:5555/CRMDemo/_root/homepage.aspx?etc=1&viewid=%7b60ACDB4C-210D-DD11-A3F2-0003FF8B31FE%7d">
<Titles>
<Title LCID="3082" Title="Proveedores" />
</Titles>
</SubArea>