Monday, May 7, 2012

CRM2011 oData: Retrieve Lookup and String field values using JS and REST Endpoints


CRM2011 oData: Retrieve Lookup, String field values using JS and REST Endpoints 

// JScript source code
function lookupvalidation() {
    var TechExpert = new Array();
    TechExpert = Xrm.Page.getAttribute("msft_technicalexpertiseid").getValue();

    if (TechExpert != null) {
        var name = TechExpert[0].name;
        var uniqueid = TechExpert[0].id;
        var entType = TechExpert[0].entityType;

        //Required ODataQuery
        var context = parent.Xrm.Page.context;
        var serverUrl = context.getServerUrl();
        var odataSelect = serverUrl + "/xrmservices/2011/OrganizationData.svc/msft_technologySet?$select=msft_CategoryId,msft_PandL&$filter=msft_technologyId eq guid'"
+ uniqueid + "'";
        //  alert(odataSelect);

        $.ajax({
            type: "GET",
            contentType: "application/json; charset=utf-8",
            datatype: "json",
            url: odataSelect,
            beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("Accept", "application/json"); },
            success: function (data, textStatus, XmlHttpRequest) {

                // Multiple Entities retrieval
                ProcessReturnedEntities(data.d.results);

            },
            error: function (XmlHttpRequest, textStatus, errorThrown) { alert('OData Select Failed: ' + odataSelect); }
        });

    }

}

function ProcessReturnedEntities(ManyEntities) {
    // var AwardCategory = new Array();
    //AwardCategory = ManyEntities[0].msft_CategoryId;  

    var id = ManyEntities[0].msft_CategoryId.Id;
    var name = ManyEntities[0].msft_CategoryId.Name;
    var entityType = ManyEntities[0].msft_CategoryId.LogicalName;

    var AwardCategory = new Array();
    AwardCategory[0] = new Object();
    AwardCategory[0].id = id;
    AwardCategory[0].name = name;
    AwardCategory[0].entityType = entityType;

    var PL = ManyEntities[0].msft_PandL;

    //Assign AwardCategory based on Technical Experitise
     if (AwardCategory != null)
     Xrm.Page.getAttribute("msft_awardcategoryid").setValue(AwardCategory);


    //Assign Product&Language based on Technical Expertise
    if (PL != null)
        Xrm.Page.getAttribute("msft_pl").setValue(PL);

}

Wednesday, May 2, 2012


CRM2011-MultiForm: Display default form based on the Optionset/Lookup field values on the form.



  var programlookup = new Array();
    programlookup = Xrm.Page.getAttribute("msft_programid").getValue();

    if (programlookup != null)
    {

        var name = programlookup[0].name;
        var guid = programlookup[0].id;
        var entType = programlookup[0].entityType;
        // alert(Xrm.Page.ui.formSelector.getCurrentItem().getLabel());

        if (Xrm.Page.ui.formSelector.getCurrentItem() != null)
        {
            var formlabel = Xrm.Page.ui.formSelector.getCurrentItem().getLabel();
            if (formlabel != name)
            {
                var items = Xrm.Page.ui.formSelector.items.get();
                for (var i in items)
                {
                    var item = items[i];
                    var itemId = item.getId();
                    var itemLabel = item.getLabel()

                    if (itemLabel == name)
                    {
                        var attributes = Xrm.Page.data.entity.attributes.get();
                        for (var j in attributes)
                            attributes[j].setSubmitMode("never");
                        item.navigate();
                    }

                }
            }
        }
    }

Disadvantages: 
1. Performance(Form will load twice if last opened form is not same as field value)
2. On load page will blink
3. Make optionset/lookup field readonly so that user can't change the values

Plugin: Revoke sharing permissions to all USERS/TEAMS associated to a record

Plugin: Revoke sharing permissions to all USERS/TEAMS associated to a record


              public void Execute(IServiceProvider serviceProvider)

        {
            try
            {
                IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
                IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                service = factory.CreateOrganizationService(context.UserId);

                if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
                {
                    Entity entity = (Entity)context.InputParameters["Target"];

                    string _contact = entity.LogicalName;
                    Guid _contactid = entity.Id;

                    if (entity.LogicalName == "contact")
                    {
                        RetrieveSharedPrincipalsAndAccessRequest retrieveSharedRequest = new RetrieveSharedPrincipalsAndAccessRequest()
                    {
                        Target = new EntityReference(context.PrimaryEntityName, context.PrimaryEntityId)

                    };
                        RetrieveSharedPrincipalsAndAccessResponse retrieveSharedResponse = (RetrieveSharedPrincipalsAndAccessResponse)service.Execute(retrieveSharedRequest);
                        RevokeAccessRequest revokeRequest = new RevokeAccessRequest();
                        revokeRequest.Target = new EntityReference(_contact, _contactid);

                        foreach (PrincipalAccess principal in retrieveSharedResponse.PrincipalAccesses)
                        {
                            revokeRequest.Revokee = principal.Principal;
                            service.Execute(revokeRequest);
                        }


                    }
                }
            }


Note: Please test before using this code