viernes, 28 de diciembre de 2012

“Polaris” (UR12) y su impacto en implantaciones actuales

Hola, como muchos conocerán, este mes está saliendo la nueva actualización de Dynamics CRM 2011 conocida como “Polaris”, “UR12”, o “December 2012 Service Update”. Sinceramente esto de los nombres, versiones y demás, cada vez es mas complicado. Creo que el lío de los nombres pasa porque hay que ponerle un nombre técnico, otro de “marketing” y otro con un marco temporal.

En definitiva, está saliendo el nuevo rollup, que incluye entre otras mejoras integración con Yammer, Skype, y Bing Maps, compatibilidad con Microsoft Office 2013, y la nueva API de gestión de datos masivos (bulk data API). Además se incluyen nuevos navegadores soportados por Dynamics CRM (el tan esperado “cross-browser”)

Las fechas estimativas de despliegue de esta actualización son las siguientes (https://community.dynamics.com/product/crm/crmnontechnical/b/nakedcrm/archive/2012/12/18/polaris-release-dates.aspx):

  • Nuevos CRM trial registrados en EEUU desde el 14 ene 2013
  • Nuevos CRM trial registrados en EMEA y APAC desde el 16 ene 2013
  • Clientes existentes desde el 1 de ene 2013 hasta el 31 de ene 2013
  • Para versiones “On premise” estará disponible el 10 de ene 2013
  • Integración con Yammer y IPAD desde feb 2013 hasta el 28 de feb 2013

Bien, como ven esto se nos viene encima a partir del año nuevo, pero la pregunta es: ¿podemos actualizar sin mas nuestros entornos actuales a la nueva UR12?

Antes de hacer esta actualización, lo mejor sería tener en cuenta unos controles y pasos a seguir que nos harán dar el paso de forma segura (basado en lo recomendado por Steven Foster):

  1. Descargar e instalar el “Microsoft Dynamics CRM 2011 Custom Code Validation Tool”, desde Microsoft (gratis): http://www.microsoft.com/en-us/download/details.aspx?id=30151
  2. Importar la solución en el CRM en el entorno de desarrollo
  3. Ejecutando la solución, nos identificará con colores que partes del código podrían fallar con el UR12
  4. Será necesario un desarrollador para solucionar estos errores modificando el código javascript
  5. Una vez modificado el javascript, se deberá probar la actualización, a ver si funciona todo ok.

Existen una serie de videos en la “Microsoft Partner Network” (MPN) que enseñan como serán las nuevas funcionalidades (http://blogs.msdn.com/b/ukcrm/archive/2012/11/16/crm-online-polaris-release-q4-2012-details.aspx):

Ver también el artículo de Steven Foster: https://community.dynamics.com/product/crm/crmnontechnical/b/nakedcrm/archive/2012/12/27/microsoft-dynamics-crm-2011-polaris-release-and-its-potential-impact-on-current-deployments.aspx?wa=wsignin1.0

un saludo,

martes, 11 de diciembre de 2012

Usuarios y Roles de seguridad

Hola, hoy voy a poner un par de ejemplos de como trabajar con los temas de los roles de seguridad y los usuarios con un par de métodos que suelen ser necesarios.
Frecuentemente necesitamos consultar que usuarios tienen un rol o que roles tiene un usuario determinado. Los roles de seguridad tienen un funcionamiento un poco extraño. Al crearnos un nuevo rol de seguridad, en realidad se duplica el rol por cada una de las unidades de negocio que hay en el sistema. Por esto hay que tener mucho cuidado, ya que si nuestro sistema tiene una gran cantidad de unidades de negocio (mas de mil, por ejemplo), con cada rol que creemos, en realidad se irán creando mil registros. Esto provoca que todo el sistema se ralentice mucho, así que hay que tener mucho cuidado de no crear grandes volúmenes de unidades de negocio.
A continuación, detallo un par de métodos que pueden ser útiles para el trabajo con usuarios y sus roles. En realidad son simplemente dos ejemplos que muestran como mediante consultas de tipo “FetchXml”, se puede consultar. Ambos métodos devuelven un objeto de tipo ArrayList con los resultados.

1) Para consultar que roles tiene un usuario (por guid del usuario):

   1: public ArrayList getUserRoles(string User_Guid)

   2:        {
   3:            ArrayList user_roles = new ArrayList();
   4:            StringBuilder fetch2 = new StringBuilder();
   5:            fetch2.Append("<fetch distinct='true' mapping='logical' output-format='xml-platform' version='1.0'> ");
   6:            fetch2.Append(" <entity name='role'>");
   7:            fetch2.Append(" <attribute name='name'/> ");
   8:            fetch2.Append(" <order descending='false' attribute='name'/> ");
   9:            fetch2.Append("     <link-entity name='systemuserroles' intersect='true' visible='false' to='roleid' from='roleid'>");
  10:            fetch2.Append("         <link-entity name='systemuser' to='systemuserid' from='systemuserid' alias='aa'> ");
  11:            fetch2.Append("             <filter type='and'> ");
  12:            fetch2.Append(String.Concat("   <condition attribute='systemuserid' value='{0}' uitype='systemuser' operator='eq'/> ",User_Guid));
  13:            fetch2.Append("             </filter> ");
  14:            fetch2.Append("         </link-entity> ");
  15:            fetch2.Append("     </link-entity> ");
  16:            fetch2.Append(" </entity> ");
  17:            fetch2.Append("</fetch>");
  18:  
  19:            EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2.ToString()));
  20:  
  21:            foreach (var c in result.Entities)
  22:            {
  23:                user_roles.Add(c.Attributes["name"].ToString());
  24:            }
  25:            return user_roles;
  26:        }



2) Para consultar qué usuarios están en un determinado rol (por nombre del rol):


   1: public ArrayList getUserinRole(string Role_Name)
   2:         {
   3:             ArrayList usersinrole = new ArrayList();
   4:             StringBuilder fetch2 = new StringBuilder();
   5:             fetch2.Append("<fetch distinct='true' mapping='logical' output-format='xml-platform' version='1.0'> ");
   6:             fetch2.Append(" <entity name='systemuser'>");
   7:             fetch2.Append(" <attribute name='systemuserid'/> ");
   8:             fetch2.Append("     <link-entity name='systemuserroles' intersect='true' visible='false' to='systemuserid' from='systemuserid'> ");
   9:             fetch2.Append("         <link-entity name='role' to='roleid' from='roleid' alias='aa'> ");
  10:             fetch2.Append("                <filter type='and'> ");
  11:             fetch2.Append(String.Concat("                     <condition attribute='name' value='{0}' operator='eq'/> ",Role_Name));
  12:             fetch2.Append("                 </filter> ");
  13:             fetch2.Append("         </link-entity> ");
  14:             fetch2.Append("     </link-entity>");
  15:             fetch2.Append(" </entity> ");
  16:             fetch2.Append("</fetch>");
  17:  
  18:             EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2.ToString()));
  19:  
  20:             foreach (var c in result.Entities)
  21:             {
  22:                 usersinrole.Add(c.Attributes["systemuserid"].ToString());
  23:             }
  24:             return usersinrole;
  25:         }
 
 

Un saludo,