jueves, 25 de febrero de 2010

Tabindex en los formularios del CRM

En los formularios de CRM, el funcionamiento del "TabIndex" es un poco especial. Con el "TabIndex" me refiero al orden que va siguiendo el formulario cuando se introduce la información y se pulsa "Tab" para saltar al siguiente atributo.
El orden por defecto que va siguiendo el CRM, es el siguiente (ejemplo con secciones simples de 2 columnas):
1) Dentro de la primera Sección del formulario, en la primera columna hasta el último atributo.
2) Salta a la segunda columna hasta el final de la sección.
3) Salta al primer atributo de la siguiente sección. Y así sucesivamente...

Si quisiésemos modificar el orden que lleva el CRM con las tabulaciones, hay básicamente 2 formas, una soportada pero un poco tediosa, y otra no soportada.

Vamos primero por la no soportada: Se puede por Javascript definir el orden del TabIndex del formulario. Por ejemplo en el "OnLoad" del formulario se puede definir la propiedad "tabIndex" de cada atributo. Por ejemplo en el formulario de Cuentas:

crmForm.all.name.tabIndex = 1000;
crmForm.all.accountnumber.tabIndex = 1010;
crmForm.all.emailaddress1.tabIndex = 1020;

La forma soportada sería: Ir creando secciones con solo 2 atributos en cada una. De esta forma sería un poco mas "molesto" el añadir atributos, ya que tendría que ir creando una nueva sección cada 2 atributos nuevos, pero la ventaja es que no hay que definir ningún Javascript.
El formulario iría quedando por ejemplo así:


un saludo!

jueves, 18 de febrero de 2010

Roles de un usuario a través de FilteredViews

Hay muchas cosas en el CRM que pueden recogerse a través de los propios métodos de los Web Services, pero que también pueden accederse a través del SQL Server de forma soportada (a través de las "FilteredViews").
Este ejemplo es una consulta SQL que nos devuelve los nombres de los Roles de un usuario determinado, en este caso "DOMINIO\usuario":

SELECT RB.Name FROM FilteredRole RB
INNER JOIN FilteredSystemUserRoles UR ON UR.RoleId=RB.RoleId
INNER JOIN FilteredSystemUser U ON UR.SystemUserId=U.SystemUserId
WHERE U.DomainName='DOMINIO\usuario'


Ahora bien, si queremos saber un poco más de sus permisos por ejemplo que nivel de acceso tiene de lectura en contactos (Rol de seguridad "prvReadContact"), podemos acceder a traves del SQL Server, pero ahora de forma NO SOPORTADA:

SELECT RB.Name, RP.PrivilegeDepthMask FROM FilteredRole RB
INNER JOIN FilteredSystemUserRoles UR ON UR.RoleId=RB.RoleId
INNER JOIN FilteredSystemUser U ON UR.SystemUserId=U.SystemUserId
INNER JOIN RolePrivileges RP ON RP.RoleId=RB.RoleId
INNER JOIN Privilege P ON P.PrivilegeId=RP.PrivilegeId
WHERE
U.DomainName='DOMINIO\usuario' AND P.Name='prvReadContact'

El atributo "PrivilegeDepthMask" dará un número con el nivel de acceso, donde por ejemplo "1" es a nivel de usuario y "8" es a nivel de organización.

Para un listado de los permisos recomiendo este enlace:
http://msdn.microsoft.com/en-us/library/bb955027.aspx

Un saludo!

martes, 16 de febrero de 2010

Como recoger todas las entidades del CRM

Al trabajar con CRM, muchas veces nos desarrollamos nuestras propias herramientas para hacer las tareas rutinarias mas sencillas, o para ofrecer a los usuarios la posibilidad de hacer cosas que el CRM de forma estandar no recoge.
Para esto puede ser que necesitemos a veces conocer todas las entidades que hay en el CRM, como por ejemplo para rellenear una lista o un desplegable.
Aquí les dejo un pequeño código en donde se recogen todas las entidades del CRM y se devuelven en un ArrayList:

public ArrayList GetEntidades(string servidor, string empresa, string usuario, string password, string dominio)
{
ArrayList arrEntidades = new ArrayList();

MetadataService metadataService = ConectaMetadata(servidor, empresa, usuario, password, dominio);

RetrieveAllEntitiesRequest allEntitiesRequest = new RetrieveAllEntitiesRequest();
allEntitiesRequest.RetrieveAsIfPublished = false;
allEntitiesRequest.MetadataItems = MetadataItems.EntitiesOnly;

RetrieveAllEntitiesResponse allEntitiesResponse = (RetrieveAllEntitiesResponse)metadataService.Execute(allEntitiesRequest);

foreach (EntityMetadata entity in allEntitiesResponse.CrmMetadata)
{
arrEntidades.Add(entity.SchemaName);
}
arrEntidades.Sort();
return arrEntidades;
}

MetadataService ConectaMetadata(string servidor, string empresa, string usuario, string password, string dominio)
{
//1) Recojo los datos de la entidad original
CrmAuthenticationToken token = new CrmAuthenticationToken();
token.OrganizationName = empresa;
token.AuthenticationType = 0;

MetadataService metadataService = new MetadataService();
metadataService.Url = "http://" + servidor + "/MSCRMServices/2007/MetadataService.asmx";
metadataService.CrmAuthenticationTokenValue = token;
if (usuario != "")
{
metadataService.Credentials = new System.Net.NetworkCredential(usuario, password, dominio);
}
else
{
metadataService.Credentials = System.Net.CredentialCache.DefaultCredentials;
}
metadataService.PreAuthenticate = true;
return metadataService;
}

A la funcion "GetEntidades" hay que pasarle todos los datos de conexión y de autenticación, y dicha funcion devolverá el listado de todas las entidades del CRM.
La función "ConectaMetadata" conecta con el web service de metadatos, si el usuario es "vacío", se conectará con las credenciales por defecto (DefaultCredentials).

Un saludo!

lunes, 15 de febrero de 2010

Microsoft publica el Rollup 9

Hola a todos,
Microsoft ha publicado un nuevo Rollup (es el "9").
Pueden descargarlo de aquí:
http://www.microsoft.com/downloads/details.aspx?FamilyID=5869f2b3-d1a0-4f71-8be3-fde6e8053a2e&displayLang=en

Como siempre, recomiendo instalarlo en entornos de desarrollo primero para probar que todo el funcionamiento de nuestra implantación continúe siendo el mismo.

Un saludo!

lunes, 1 de febrero de 2010

Sincronización de Outlook y MSCRM 4.0

Microsoft ha publicado un artículo muy interesante y detallado acerca de como funciona la sincronización del Outlook con CRM.
La verdad a cualquiera que le interese entender como son las "tripas" de esta sincronización, recomiendo que se lea este documento.
Este artículo trata temas como las reglas de sincronización y de eliminación de Contactos, Tareas, Citas, Emails y los mapeos de datos de los mismos.

Puede ser descargado de aquí:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=2d497348-0a10-40ce-8edb-b0ee85f1215e




Un saludo!