Dynamics CRM
Mostrando entradas con la etiqueta Formularios. Mostrar todas las entradas
Mostrando entradas con la etiqueta Formularios. Mostrar todas las entradas

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.

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.