miércoles, 3 de marzo de 2010

Compartir registros desde Flujos de trabajo

Buceando por Codeplex encontré una utilidad que creo que puede ser bastante útil.
Se trata de una actividad de workflow que permite compratir el registro en cuestión, tanto con equipos como con usuarios, y actualizando cada uno de los permisos relacionados.
Tanto los fuentes como las DLLs pueden ser descargados de aquí: http://crm40sharestep.codeplex.com/releases/view/25317
Los pasos a seguir para su utilización son:
1) Registrar la Dll en el CRM:

2) En los flujos de trabajo aparecerá una nueva acción con el nombre "Share record". con las siguientes opciones:


Esta funcionalidad me pareció muy buena para hacer este tipo de cosas de forma asíncrona. Además, como se dispone de los fuentes, siempre tenemos la posibilidad de mejorar su funcionalidad (por ejemplo añadir mas de 2 equipos para compartir o mas de2 usuarios).

Espero les sea útil,

un saludo

lunes, 1 de marzo de 2010

Alineando importes a la derecha en vistas

Como sabéis, el CRM no nos permite alinear columnas a la derecha en las vistas.
Pero muchas veces, en especial en relación con los importes, sería interesante que se pueda alinear a la derecha.
En este artículo mostraré como utilizar la clase "jQuery" dentro de las vistas del CRM.
La idea es que se vea como la siguiente imagen donde se ven los "Ingresos estimados" alineados a la derecha:

La idea para hacer esto es TOTALMENTE no soportada. Lo que hay que hacer es lo siguiente:
1) Añadir lo siguiente al fichero "../_root/HomePage.aspx":

<script language="JavaScript" src="/ISV/jquery/jquery.js"></script>
2) Debajo de eso añadir:

<script language="JavaScript">
$(document).ready(function() {
$("NOBR.num").css("text-align","right");
});
</script>

3) Descargar el "jQuery.js" y copiarlo en la carpeta "ISV/jQuery". La librería "jQuery" puede ser descargada de aquí: http://docs.jquery.com/Downloading_jQuery

De esta forma utilizaremos el "jQuery" para alinear las columnas de tipo numérico a la derecha de la columna.

Un saludo

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!