28/4/09

Modificar el filtrado de los campos lookup

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:

SNAG-0001

Añadimos el campo Cliente principal:

SNAG-0000

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.

23/4/09

Buscar relaciones N:N en CRM

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;

16/4/09

Lanzamiento del Microsoft Dynamics CRM Dev Toolkit

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:

  • Ver un listado de entidades
  • Crear entidades y atributos
  • Crear clases wrapper para entidades
  • Desarrollar Plug-Ins
  • Desplegar una solución completa en uno o varios servidores

Desde luego, una buena noticia para los que nos peleamos con CRM (a diario).

7/4/09

Formularios de actividades direccionables

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.