Dynamics CRM

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.