Most of the client asks for this requirement. They want to hide picklist options based on security roles. Let’s take an example for this, for example if we have picklist “Customer Status” having four option like “Request for Approve”,”Approved”,”Rejected”,”Black Listed”. Let’s say we have requirement to show only first option to all users having security roles other then “System Admin”. Only “System Admin” should be able to see all of these options, you can implement this using below code
//First check user have “sys admin” role or not
function CheckSecurityRole() {
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;
if (resultXml != null) {
//select the node text
var RoleResponse = resultXml.selectNodes(“//BusinessEntity/q1:name”);
if (RoleResponse != null) {
for (i = 0; i < RoleResponse.length; i++) {
if (RoleResponse[i].text == ‘System Administrator’) {
return true;
}
}
}
}
return false;
}
//if your does not have sys admin role remove picklist options
//Let consider I have used index 1,2,3,4 for our picklist options
function HidePicklistOptions()
{
If(!CheckSecurityRole())
{
var Picklist=crmForm.all.new_customerstatus; // get picklist
Picklist.DeleteOption(2); //use approval index to remove Approved from piclist
Picklist.DeleteOption(3); //to remove Rejected
Picklist.DeleteOption(4); //to remove Black Listed
}
}
DeleteOption basically removes picklist option temporary, it does not remove them from database permanently.
Enjoy !!!