Dynamics CRM

Release del Analytics Accelerator para CRM 4.0

Por fin llega el lanzamiento tan esperado del Analytics para Microsoft Dynamics CRM 4.0.
Por el momento solo se ha lanzado la primera versión de tres. Esta primera versión ofrece la integración de Business Intelligence con el CRM 4.0. En la segunda se ofreceran los Dashboards para SQL 2008 y el Pipeline de ventas y en la tercera versión ofrece capacidades más avanzadas con SQL Server Analysis Services (SSAS) así como Microsoft Office PerformancePoint Server.


La descarga de los archivos la podemos encontrar como siempre en Codeplex en el siguiente enlace: http://www.codeplex.com/crmaccelerators/Release/ProjectReleases.aspx?ReleaseId=20449.

Lanzamiento del Event Management Accelerator

Ayer, día 04/11/2008, se produjo el lanzamiento de la versión 1.0 del Event Management Accelerator de Microsoft Dynamics CRM 4.0 del que ya expliqué su funcionalidad hace unos días.

Si quieren descargarlo pueden hacerlo en:
http://www.codeplex.com/crmaccelerators/Release/ProjectReleases.aspx?ReleaseId=19077

CRM Notifications Accelerator

Este Accelerator permite a los usuarios de Microsoft Dynamics CRM 4.0 suscribirse a los "Business Events" que les son de interés dentro del CRM.

Las notificaciones de dichos eventos son entregados vía RSS y pueden ser consumidos con diferentes herramientas de escritorio como Microsoft Outlook 2007 o el gadget de newsfeed de Windows Vista.

Para realizar estas funciones se basa en dos nuevas páginas ASP.NET, un assembly .NET y personalizaciones en el SiteMap añadiendo código JavaScript para realizar las llamadas a dichas páginas

Este componente está disponible desde el día 04/11/2008 y podemos encontrarlo en: http://www.codeplex.com/crmaccelerators/Release/ProjectReleases.aspx?ReleaseId=19071

Nueva actualización de la guía de implementación de CRM 4.0

Recientemente, se ha realizado la tercera actualización de la guía de implementación de Microsoft Dynamics CRM 4.0.

Entre otras muchas cosas, en esta nueva versión se han agregado los siguientes temas:


  • Como instalar Microsoft Dynamics CRM 4.0 usando los mínimos permisos posibles

  • Instalar Microsoft Dynamics CRM 4.0 Server usando Microsoft SQL Server Cluster Environment

  • Internet Facing Deployments(IFDs)

  • Upgrade del cliente de Microsoft Dynamics CRM 3.0 para Outlook

  • Mover una implementación de Microsoft Dynamics CRM 4.0

  • Resolver error originado cuando imprimimos un reporte

  • Resolver error de time-out originado cuando trabajamos con listas muy amplias de marketing


Podemos encontrar dicha versión de esta guía en: www.microsoft.com/downloads/details.aspx?FamilyID=1ceb5e01-de9f-48c0-8ce2-51633ebf4714&DisplayLang=en

Event Management Accelerator

Ayer se realizó la parte más técnica de la Release de los Accelerators de Microsoft, uno de los que se trató a fondo es el Event Management Accelerator.

Este Accelerator sirve como su nombre indica para la gestión a través del CRM de todo lo que tiene que ver con la organización de un evento como el equipo, reportes, horarios, ponentes, lugar de las ponencias...


Otras cosas muy interesante son los desarrollos .NET que permiten el registro en los eventos a través de una web y la invitación a los eventos a través de campañas de CRM.


En total, el accelerator se compone de archivos de customización para las entidades Campaign y Campaign Response, 11 nuevas entidades, Workflows, desarrollo .NET para el registro a los eventos a través de un portal y varios reportes.

El lanzamiento se prevee para finales de esta semana en inglés y en otros idiomas para finales del 2008.

Release de los Accelerators Microsoft Dynamics CRM 4.0

Los Accelerators de Microsoft Dynamics CRM 4.0 sirven para reforzar la competitividad de este, proporcionando funcionalidad para los usuarios que no está disponible en la versión 4.0 original.

El día 20 y 21 se producirá la presentación de los siguientes Accelerators del CRM:

  • Analytics

  • Event Management

  • E-Service Portal

  • Enterprise Search

  • Extended Sales Forecasting

  • CRM Notifications

  • Business Productivity

  • Sales Methodologies

El día 20 se realizará una presentación desde la perpectiva de ventas y marketing y el 21 el enfoque será más hacia la parte técnica.

Pasado esta fecha, informaré más detalladamente sobre cada uno de estos.

Vertical de CRM 4.0 para soluciones sanitarias

Microsoft a lanzado un vertical de Microsoft Dynamics CRM 4.0 para tratar soluciones relacionadas con el mundo de la salud.

En el siguiente link podemos ver una demo de este vertical integrado con Outlook.

Si os interesa él tema, hay más información sobre este vertical en el siguiente enlace, incluyendo una máquina virtual con el CRM operativo, el XML de las customizaciones y un mapa de la demo entre otras utilidades.

http://www.codeplex.com/crmverticaltemplates/Release/ProjectReleases.aspx?ReleaseId=13323

Borrado de campos del CRM desde la aplicación

Realizando una migración de una base de datos ORACLE al SQL SERVER 2005 del Microsoft Dynamics CRM 4.0 he descubierto una cosa curiosa respecto al borrado de campos desde la aplicación.

Cuando una entidad tiene un campo lookup de otra, como es lógico, la entidad origen debe estar migrada antes de empezar la migración de la segunda. Para rellenar el lookup tengo que recuperar el GUID del registro que quiero de dicha entidad y luego junto con los otros datos de los registros lanzar con la API del CRM la importación.

Ejecutando una consulta a la base de datos del SQL SERVER me he dado cuenta que al hacer un inner join con una de las tablas del CRM me sacaba todo duplicado.
Después de darle muchas vueltas a la consulta he observado que aunque en el CRM la entidad de origen no estuviera duplicada, en la base de datos seguía teniendo registros de más.
Esto es debido a que al borrar desde la aplicación los campos de la base de datos NO SE BORRAN. El mecanismo que utiliza el CRM es que el atributo DELETESTATECODE se pone a 2 y la aplicación no muestra dichos campos.


Esta es la causa de que la consulta que estaba realizando sacara duplicados.
Por ello si vais a borrar y después realizar una consulta en la base de datos este detalle puede hacer que ahorremos mucho tiempo.

Acceder a los campos de un lookup desde un formulario.

Vamos a ver en este post un código JavaScript de como podemos recuperar el valor de los campos de un elemento referenciado en un lookup en un formulario de Microsoft Dynamics CRM 4.0.

La solución más habitual, pero también mas costosa es hacer un Fetch a partir del campo que deseamos y con este construir un SOAP que nos devuelva el elemento que queremos.

Propongo aquí una manera que aunque devuelva sólo el valor del campo, es más rápida de llevar a cabo y funciona a la perfección.

function OnCrmPageLoad()
{
crmForm.all.<nombre_campo>.attachEvent("onafterselect",
OnLocationSelected);
}



function OnLocationSelected()
{
// Cogemos el elemento del lookup que queremos
var lookupValues = crmForm.all.<nombre_campo>.items[0].keyValues;
// Cogemos el campo que deseamos del lookup
var nota = lookupValues.<nombre_campo>.value;
// Modificamos el campo que queramos con el valor recogido antes.
crmForm.all.<nombre_campo>.DataValue = nota;
}



OnCrmPageLoad();


Ojo! Hay que tener en cuenta que el campo que queramos recoger tiene que estar en la vista de búsqueda de la entidad a la que pertenece el lookup.

Microsoft Dynamics CRM 4.0 SDK V4.0.6

Recientemente en el blog del CRM Team se ha publicado la sexta versión del SDK de CRM 4.0. Esta incluye las siguientes novedades:

  • Documentación para crear un proveedor de emails personalizado.
  • Formas de usar las URLs en CRM 4.0.
  • Actualización de los plugins para usar entidades dinámicas.
  • Como trabajar con el archivo de cusomización.
  • Nuevos ejemplos de código.

Puedes descargarlo desde aquí: SDK CRM 4.0

Aumentar el máximo de registros visibles simultáneamente en una vista

Hay veces que los 250 registros que deja el CRM ver de una vista como máximo se quedan cortos. Hay una manera de aumentarlos, que aunque no está soportado, es bastante útil.

En el SQL Server buscamos la tabla UserSettingBase en la base de datos <organizacion>_MSCRM. En esta se encuentra una tabla llamada En dicha tabla hay un atributo llamado PagingLimit que equivale en CRM a Herramientas/Opciones/General/Registros por página.

Buscamos el SystemUserID del usuario al que queremos cambiarle el número de registros que pueda ver y ponemos como máximo 500( para más no funciona bien).

Adjunto unas capturas que pueden ayudar a entender el proceso.

Herramientas/Opciones/General/Registros por página:











Tabla UserSettingBase:





Resultado del proceso:

Galeria de vídeo-tutoriales de CRM 4.0

He encontrado una página con vídeos de Microsoft Dynamics CRM 4.0 sobre todo orientados a personas que se estén iniciando en CRM. Esta contiene tutoriales de como crear usuarios, importar datos, hacer relaciones entre entidades o trabajar con cuentas y contactos entre otros muchos.

Espero que os sea útil.

http://www.democrmonline.com/

Robot traductor para messenger: Tbot

Microsoft ha lanzado un robot que traduce tus conversaciones de Messenger simultáneamente. Se llama TBot y su dirección es mtbot@hotmail.com . Para ponerlo en funcionamiento basta con agregarlo con tu cuenta de Messenger e invitarlo a la conversación que quieras que traduzca.

El robot tiene los idiomas inglés, árabe, chino, alemán, francés, italiano, japonés, koreano, portugués, holandés y español.

Podeís encontrar una versión de pruebas en: http://wltbot.spaces.live.com/

Tus presentaciones online con 280 slides

280slides es una utilidad que sirve para crear tus propias presentaciones online, acceder a ellas desde cualquier parte y compartirlas con quién quieras.

Como se puede observar en la imagen tiene una interfaz bastante amigable y es muy fácil de manejar.

280slides

Además permite incrustarlas en tu propia web, añadir videos y fotos en la presentación y muchas cosas más.

Anímate y pruébalo!

Cambiar el logo de Dynamics del menú archivo por uno personalizado

Una manera de dar un toque personalizado a la interfaz de CRM 4.0 es introducir el logo de la empresa en él.

Un sitio donde queda bastante bien, si el logo tiene más o menos el mismo alto que ancho, es en el botón de Menú Archivo.

En la carpeta CrmWeb/_imgs podremos encontrar tres imágenes:
llamados dynbutton_rest, dynbutton_hover y dynbutton_down.

Dynbutton_rest.jpg es el estado del botón por defecto.

Dynbutton_hover.jpg es el estado del botón cuando está el cursor sobre él.

Dynbutton_down.jpg es el estado del botón cuando se pincha sobre él y se despliega el menú.

Aquí sus imágenes por defecto.



Sólo falta diseñar las imágenes a nuestro gusto y sustituirlas por las anteriormente mencionadas.

Por cierto! hay que tener en cuenta que hay que darle permisos a las nuevas imágenes. Sino, al entrar con un usuario que no sea el administrador en una pantalla que contenga dichas imágenes te pedirá que te loguees y aunque te muestre la página no se verán las nuevas imágenes.

Personalizar el título de la barra de navegación

Una propiedad muy útil para hacer personalizaciones vistosas en CRM es el innerHTML. A continuación explico un código sencillo para poner el título de la barra de navegación en función de lo que hay en un campo del formulario que estamos viendo.

//Comprobamos que haya valores en los campos usados

if ((document.all._NA_Info != null) && (document.all.<campo_elegido>.DataValue!=null))  

{  

document.getElementById("_NA_Info").innerHTML ="<span style='color: red;fontsize:16px;'>"+  crmForm.all. <campo_elegido>.DataValue +"</span><img class='ms-crm-Nav-Group-RightIcon'  alt='Expandido, haga clic aquí para contraer' src='/_imgs/navup.gif'/>";

}


En el innerHTML introduzco las propiedades color, fuente y la imagen de las flechas que llevan todos los títulos de la barra de navegación. Para mantener el estilo y comportamiento de la barra de navegación que da CRM, la etiqueta < img > debe tener la propiedad class=ms-crm-Nav-Group-RightIcon.

El resultado sería este.

Barra sin contraer

Barra contraída

Ntext, Text and Image serán borrados en versiones futuras de Microsoft SQL Server

Navegando por el MSDN encontré un enlace que me llamó a la atención.

En él se comenta que no son aconsejados los tipos ntext, text, and image y que en su lugar se use varchar (max), nvarchar (max) y varbinary (max) en su lugar.

En CRM 4.0 la primera medida que se puede tomar al respecto es no usar los atributos ntext cambiándolos por nvarchar con formato área de texto cuya apariencia es idéntica.

http://msdn.microsoft.com/en-us/library/ms191262.aspx

Botones de búsqueda avanzada

En este post voy explicar como añadir botones distintos de búsqueda avanzada en los menús de las entidades. Estos botones tendrán enlaces a la búsqueda avanzada pasandole parámetros para que la búsqueda esté en cierto modo predefinida y evitar al usuario el tener que escoger ciertos parámetros.

Para empezar tendremos que modificar el ISV.config para añadir los diferentes botones que queramos.

En mi caso he añadido un botón de Buscar Tercero(Cuenta) y otro de Buscar Tarea. Para ello he añadido el siguiente código en el menuBar de la entidad account en el Microsoft Customer Relationship Management Entities del ISV.

<Menu>

<Titles>

<Title LCID="1033" Text="Busqueda Avanzada" />

</Titles>

<MenuItem Url ="http://localhost:5555/<nombreOrganizacion>/AdvancedFind/AdvFind.aspx?EntityCode=1" WinMode="2">

<Titles>

<Title LCID="1033" Text="Busqueda Tercero" />

</Titles>

</MenuItem>

<MenuItem Url ="http://localhost:5555/<nombreOrganizacion>/AdvancedFind/AdvFind.aspx?EntityCode=4212" WinMode="2">

<Titles>

<Title LCID="1033" Text="Busqueda Tareas" />

</Titles>

</MenuItem>

<MenuSpacer />

</Menu>


Con esto quedaría así la ventana de la entidad.















Pasamos ahora a explicar un poco la URL de los botones, por ejemplo esta:

<MenuItem Url ="http://localhost:5555/<nombreOrganizacion>/AdvancedFind/AdvFind.aspx?EntityCode=1" WinMode="2">


Esta Url llama a la página Adv.Find.aspx pasándole el EntityCode de la entidad sobre la que queremos buscar, en este caso Cuenta.

¿Cómo obtenemos el entityCode de una entidad? Muy sencillo, vamos al código JavaScript del Onload de la entidad y en el insertamos la siguiente sentencia.

alert("Este es el entityCode: " + crmForm.ObjectTypeCode);


Con ello nos saldrá un mensaje de alerta cuando abramos un objeto de dicha entidad diciendonos su código.

Además, el elemento MenuItem tiene otros parámetros que podemos modificar como el winMode que sirve para especificar el tipo de ventana y que puede admitir los valores:

0 = Window [default]
1 = Modal Dialog
2 = Modeless Dialog

Además el elemento también admite JavaScript que se ejecutará cuando el Item sea clickeado. En caso de incluir JavaScript, la URL se ignora y al pinchar sobre el botón hace caso sólo al código Jacascript.

Para más información sobre este elemento en el sdk vienen detallados todos los parámetros con sus posibles valores.

Habilitar/Deshabilitar campos según roles

Este código Javascript que expongo sirve para obtener el rol del usuario que está navegando por el CRM.
Una vez tenemos el rol, con la funcion UserHasRole compruebo si es igual que un rol a mi elección y según si lo es o no bloqueo un campo del formulario o lo dejo habilitado para escribir en él.

Edito los permisos de un campo según el rol:

if (UserHasRole("<nombredelrol>"))

{

// Permito la escritura en el campo

document.crmForm.all.<nombrecampo>.Disabled=false;

}

else

{

// Pongo sólo lectura el campo que quiero

document.crmForm.all.<nombrecampo>.Disabled=true;

}


Compruebo si el rol es el mismo que le paso a la función:

function UserHasRole(roleName)  

{  

//oXml es un objeto que llama a obtener el rol  

var oXml = GetCurrentUserRoles();  

if(oXml != null)  

{  

  //Selecciono el nodo Texto  

  var roles = oXml.selectNodes("//BusinessEntity/q1:name");  

  if(roles != null)  

  {  

   for( i = 0; i < roles.length; i++)  

   {      

   if(roles[i].text == roleName)  

     {  

     //Devuelve true si el rol es el indicado  

     return true;  

     }  

   }  

  }  

}  

//Sino devuelve falso  

return false;  

}  


Obtengo el rol del usuario que entra en el CRM:

function GetCurrentUserRoles()  

{

// Compongo el xml

var xml = "" +  

"<?xml version=\"1.0\" encoding=\"utf-8\"?>" +  

"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +  

GenerateAuthenticationHeader() +  

" <soap:Body>" +  

" <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +  

" <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +  

" <q1:EntityName>role</q1:EntityName>" +  

" <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +  

" <q1:Attributes>" +  

" <q1:Attribute>name</q1:Attribute>" +  

" </q1:Attributes>" +  

" </q1:ColumnSet>" +  

" <q1:Distinct>false</q1:Distinct>" +  

" <q1:LinkEntities>" +  

" <q1:LinkEntity>" +  

" <q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>" +  

" <q1:LinkFromEntityName>role</q1:LinkFromEntityName>" +  

" <q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>" +  

" <q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>" +  

" <q1:JoinOperator>Inner</q1:JoinOperator>" +  

" <q1:LinkEntities>" +  

" <q1:LinkEntity>" +  

" <q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>" +  

" <q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>" +  

" <q1:LinkToEntityName>systemuser</q1:LinkToEntityName>" +  

" <q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>" +  

" <q1:JoinOperator>Inner</q1:JoinOperator>" +  

" <q1:LinkCriteria>" +  

" <q1:FilterOperator>And</q1:FilterOperator>" +  

" <q1:Conditions>" +  

" <q1:Condition>" +  

" <q1:AttributeName>systemuserid</q1:AttributeName>" +  

" <q1:Operator>EqualUserId</q1:Operator>" +  

" </q1:Condition>" +  

" </q1:Conditions>" +  

" </q1:LinkCriteria>" +  

" </q1:LinkEntity>" +  

" </q1:LinkEntities>" +  

" </q1:LinkEntity>" +  

" </q1:LinkEntities>" +  

" </query>" +  

" </RetrieveMultiple>" +  

" </soap:Body>" +  

"</soap:Envelope>" +  

"";  

var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");  

xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);  

xmlHttpRequest.setRequestHeader("SOAPAction"," http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");  

xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");  

xmlHttpRequest.setRequestHeader("Content-Length", xml.length);  

xmlHttpRequest.send(xml);  

var resultXml = xmlHttpRequest.responseXML;  

return(resultXml);  

}

Customizar Formularios y Barras de Navegación

Estreno la parte técnica de mi blog con una entrada de sentencias en JavaScript muy útiles para la personalización de formularios y barras de navegación:

Ocultar un campo:

crmForm.all.<nombre_campo>_d.style.visibility = 'hidden';


Ocultar una etiqueta:

crmForm.all.<nombre_campo>_c.style.visibility = 'hidden';


Cambiar una etiqueta:

crmForm.all.<nombre_campo>_c.innerText = 'Aquí tu label';


Cambiar el texto de una sección de la barra de navegación:

document.getElementById("_NA_SFA").innerHTML = "Servicio <img class="'ms-crm-Nav-Group-RightIcon'" alt="'Expandido," src="/_imgs/navup.gif" />";


Ocultar elemento de la barra de navegación:

var navBar;
navBar= document.all.<nombre_navbaritem>;
if (navBar != null) { navBar.style.display = "";}


Próximamente seguiré añadiendo nuevos trucos que espero que os sirvan para poder personalizar vuestro CRM con más facilidad.

Arrancando

Hola a todos, me llamo Juan José García Lajara, soy de Madrid y a partir de hoy compartiré con vosotros mis conocimientos de Microsoft Dynamics CRM asi como de otros productos Microsoft y cosas relacionadas con la creación de páginas web.

Actualmente estoy trabajando en Raona S.L como Software Engineer en un proyecto de CRM 4.0 y además hago diseño y programación web en la empresa Vivenet S.C.

Espero que os guste y encontréis muchas cosas que os séan útiles.