Spiga

Error al crear una nueva entidad en Microsoft Dynamics CRM 3.0 /4.0 - Parte 2

Cumpliendo con lo prometido en la entrada anterior (Error al crear una nueva entidad en Microsoft Dynamics CRM 3.0 /4.0 - Parte 1), les voy a contar como solucionar de forma manual el problema que ocurre al eliminar los roles de sistema en Microsoft Dynamics CRM 4.0.

 

Solución 1:

 

Microsoft CRM 4.0 nos da la posibilidad de importar e exportar roles de seguridad como si fuese una entidad cualquiera.

 

Por lo cual si contamos con otra instalación de CRM (No hace falta que sea instalación basada en la que tenemos el problema, es decir, puede ser una totalmente nueva). Podemos exportar los roles de sistema e importarlos en nuestro CRM.

Publicar todo y problema resuelto.

 

Solución 2:

 

Si no contamos con otra instalación lo debemos hacer manualmente (Este es el procedimiento que se realizaba en la versión 3.0 antes de que saliera el rollup 3.)

 

Para comenzar vamos a la instancia de SQL Server donde esta instalado nuestro CRM.

Si abrimos la tabla RoleTemplateBase. Vamos a ver que siguen existiendo las plantillas de los roles de sistema.

 

roles1

 

Lo que debemos hacer es en CRM crear nuevos roles (a través de la aplicación) y luego por SQL copiar el RolTempleteId correspondiente y pegarlo en la tabla RoleBase

 

roles2

 

Saludos

Error al crear una nueva entidad en Microsoft Dynamics CRM 3.0 /4.0 - Parte 1

Una de las ultimas cosas que se realizan cuando uno esta finalizando una implementacion de CRM es generalmente el ajuste de los roles de seguridad.

Creamos y copiamos roles modificando los permisos sobre las entidades y sus acciones según nuestras necesidades.

 

Una de las cosas que se explican en los libros de CRM desde la versión 1.2 es el evitar borrar los roles de sistema, es decir, esos roles que se crean al instalar la aplicación.

 

Ahora bien, en contraposición a lo anterior el CRM nos permite borrar los roles de sistema!!!!.. Entonces por que no hacerlo???...y acá comienzan los problemas...

 

Un motivo ya se lo están imaginando por el título de esta entrada... y si, efectivamente, al borrar los roles de sistema CRM nos da un error al crear una nueva entidad.

 

Como siempre el error que vamos a obtener es:

Se ha producido un error, consulte con el administrador.

 

Pero si hacemos un trace:

>Crm Exception: Message: roleId, ErrorCode: -2147220989, InnerException: System.ArgumentException: roleId
[2008-03-12 15:35:39.6] Process: w3wp |Organization:c21461e1-7398-4eef-893a-1dc10cfd626a |Thread:    9 |Category: Platform.Metadata |User: 00000000-0000-0000-0000-000000000000 |Level: Error | EntityService.Create
>EntityService.Create caught exception: Microsoft.Crm.CrmArgumentException: roleId ---> System.ArgumentException: roleId
   --- End of inner exception stack trace ---
   at Microsoft.Crm.Exceptions.ThrowIfGuidEmpty(Guid parameter, String name)
   at Microsoft.Crm.ObjectModel.RoleServiceInternal`1.AddPrivileges(Guid roleId, RolePrivilege[] privileges, ExecutionContext context)
   at Microsoft.Crm.Metadata.SecurityHelper.AddPrivilegesToUserRole(RolePrivilege[] privileges, Guid[] roleTemplates, ExecutionContext context)
   at Microsoft.Crm.Metadata.SecurityHelper.CreateEntityHelper(IEntityDescription entityDescription, OwnershipTypes ownershipTypeMask, ExecutionContext context)
   at Microsoft.Crm.Metadata.EntityService.CreateInternal(EntityCreateInfo entityInfo, ExecutionContext context)
   at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo, ExecutionContext context)
[2008-03-12 15:35:39.6] Process: w3wp |Organization:c21461e1-7398-4eef-893a-1dc10cfd626a |Thread:    9 |Category: Application |User: 00000000-0000-0000-0000-000000000000 |Level: Error | ErrorInformation.LogError
>MSCRM Error Report:
--------------------------------------------------------------------------------------------------------
Error: roleId

Error Number: 0x80040203

Error Message: roleId

Error Details: roleId

Source File: Not available

Line Number: Not available

Request URL: http://crmserver:5555/COR/AppWebServices/SystemCustomization.asmx

Stack Trace Info: [ArgumentException: roleId]

[CrmArgumentException: roleId]
   at Microsoft.Crm.Exceptions.ThrowIfGuidEmpty(Guid parameter, String name)
   at Microsoft.Crm.ObjectModel.RoleServiceInternal`1.AddPrivileges(Guid roleId, RolePrivilege[] privileges, ExecutionContext context)
   at Microsoft.Crm.Metadata.SecurityHelper.AddPrivilegesToUserRole(RolePrivilege[] privileges, Guid[] roleTemplates, ExecutionContext context)
   at Microsoft.Crm.Metadata.SecurityHelper.CreateEntityHelper(IEntityDescription entityDescription, OwnershipTypes ownershipTypeMask, ExecutionContext context)
   at Microsoft.Crm.Metadata.EntityService.CreateInternal(EntityCreateInfo entityInfo, ExecutionContext context)
   at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo, ExecutionContext context)
   at Microsoft.Crm.Metadata.EntityService.Create(EntityCreateInfo entityInfo)
   at Microsoft.Crm.Application.WebServices.SystemCustomization.EntityCreate.Execute(IUser user, ParameterBag paramBag)
   at Microsoft.Crm.Application.WebServices.SystemCustomization.SystemCustomization.CreateEntity(XmlNode data)

 

Si prestamos atención al trace, (donde esta en azul), vamos a ver que el problema esta efectivamente en los roles de seguridad.

 

Este problema se da por que CRM al crear una nueva entidad, automáticamente le intenta dar permisos al rol de personalización (System Customizer) sobre la nueva entidad a crear. Si llegado el caso se nos ocurrió borrar ese rol de seguridad vamos a recibir el error arriba mencionado.

 

En Microsoft CRM 3.0 eso ya esta solucionado con el Rollup 3. (Paquete acumulativo de actualizaciones 3 para Microsoft Dynamics CRM 3.0 (KB 935364))

 

En Dynamics CRM 4.0 tenemos el mismo problema y hasta la fecha no hay un fix que lo solucione.

 

En la próxima entrada les voy a explicar como solucionar de forma manual este problema en la versión 4.0

 

Hasta la próxima!!

Como modificar el foco sobre un campo en Microsoft CRM

Hola a todos!,

La entrada de hoy va a ser corta, y básicamente les quiero contar cómo modificar el campo que tiene el foco por defecto al abrir un formulario en CRM.

Por defecto el campo que tiene el foco en el formulario es el primer campo que se encuentra en la columna de la izquierda (en el caso de tener 2 campos por columna).

Para poder modificar esto lo que hay que utilizar es JavaScript:

crmForm.all.accountnumber.SetFocus();

Por ejemplo si la anterior linea de código la agregamos en el onload del formulario de la entidad "Account" lo que estamos diciendo, es que al abrir el formulario el foco (cursor) se posicione por defecto en el campo "accountnumber" o numero de cuenta.

Por supuesto esto se puede utilizar en otro evento como en el onchange, por ejemplo, al finalizar de cargar un lookup (en el cual el foco queda en el campo), lograr el efecto de que pase al siguiente


Bueno eso es todo

Saludos!!!!!!

Nueva versión de la guía de implementación (Ver. 4.1.0). Microsoft Dynamics CRM 4.0

Hola a todos,

Escribo esta entrada para comentarles que ya esta disponible una nueva versión 4.1.0 de la guía de implementación (Implementation Guide) para Microsoft Dynamics 4.0.

Por ahora solo se encuentra disponible en idioma Ingles. Se espera que en algunos días ya lo tengamos disponible, con todas estas correcciones de la versión anterior, también en español.

Les dejo el enlace! Aqui

Saludos!

Como obtener el UserId, BusinessUnitId, OrganizationId con JavaScript (WhoAmIRequest) en Microsoft CRM 4.0

Hace un tiempo en la versión 3.0 de Microsoft CRM mediante el uso de "RemoteCommand", podíamos obtener el UserId del usuario que estaba actualmente haciendo uso de la aplicación.

Con la venida de la versión 4.0 de CRM, y con el conocimiento de que el uso del comando "RemoteCommnad" no estaba soportado, nos dimos cuenta que para la nueva versión no funciona. (Por lo menos como es se esperaba).

Ahora bien, la necesidad de saber quien es el que esta logeado en el sistema desde codigo de scripting es muchas veces fundamental para hacer ciertas cosas desde Java Script. Lo cierto es que Microsoft no nos da la posibilidad hoy por hoy de saberlo. Por lo menos de una manera "soportada". Quizá el hecho de que no se provean de herramientas para conocer datos del usuario en el sistema sea por una cuestión de seguridad.

Pero como hay muchos que están dispuestos a asumir "ciertos riegos" (como yo). Les voy a dejar una forma de saber cual es el GUID del Usuario logeado, su organización e unidad de negocio.

Antes de pasar el código, le quiero agradecer a Jian Wang por la data.

Aca les va el código:

var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
xmlhttp.open("POST", "/mscrmservices/2007/crmservice.asmx", false);
xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlhttp.setRequestHeader("SOAPAction", "
http://schemas.microsoft.com/crm/2007/WebServices/Execute");
var soapBody = "<soap:Body>"+
"<Execute xmlns='
http://schemas.microsoft.com/crm/2007/WebServices'>"+
"<Request xsi:type='WhoAmIRequest' />"+
"</Execute></soap:Body>";
var soapXml = "<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'>";
soapXml += GenerateAuthenticationHeader();
soapXml += soapBody;
soapXml += "</soap:Envelope>";
xmlhttp.send(soapXml);
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(xmlhttp.responseXML.xml);
var userid = xmlDoc.getElementsByTagName("UserId")[0].childNodes[0].nodeValue;
var buid = xmlDoc.getElementsByTagName("BusinessUnitId")[0].childNodes[0].nodeValue;
var orgid = xmlDoc.getElementsByTagName("OrganizationId")[0].childNodes[0].nodeValue;
alert("UserId: " + userid + "\r\nBusinessUnitId: " + buid + "\r\nOrganizationId: " + orgid);

Espero que les sea de utilidad!!

Ah, ultima aclaración si se fijan bien dentro del xml hay una función GenerateAuthenticationHeader() - Esta función es global y propia de CRM que nos provee del token de autenticación. Esta función se encuentra solo en la version 4.0 y no esta disponible en las anteriores.

Ahora si, Saludos