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);  

}

5 comentarios:

  Julio L.C.

2 de septiembre de 2008, 17:15

hola... tngo una consulta... cuando deshabilito un campo q es modificado por JScript, ese cambio no se almacena en la BD... tienes alguna solución????. Gracias

  Juan José García

8 de septiembre de 2008, 12:09

Hola, ¿Qué tipo de campo modificas por JScript? ¿Modificas antes o lo deshabilitas antes? Si puedes copiarme el código te podría servir de más ayuda.

Un saludo.

  Unknown

28 de julio de 2009, 22:18

Hola este codigo lo pongo en onload todo?? y que campos del codigo hay que cambiarle por que me genera error...

gracias.

  Unknown

28 de julio de 2009, 22:19

Hola este codigo lo pongo en onload todo?? y que campos del codigo hay que cambiarle por que me genera error...

gracias.

  Carlos

10 de febrero de 2010, 16:52

Hola,

Acabo de implementar el codigo y funciona correctamente así que gracias por este gran ejemplo!

Sabes si es posible, para no tener que ir desactivando campos segun los roles, crear formularios?? por lo poco que se solo me deja crear vistas y ademas no me deja ni relacionar una vista con un determinado rol! muy raro no? CRM OnDemand de Siebel permite crear formularios y asociarlos a los roles que quieras...

Un saludo!