Monday 19 August 2013

How to hide the “New” or “Properties” button from the CRM 2011 Lookup Dialog

How to hide the “New” or “Properties” button from the CRM 2011 Lookup Dialog.

Here’s the new way to hide the “New” button:

var lookupControl = Sys.Application.findComponent("some_lookupid");
 
  if (lookupControl != null)
  {
       lookupControl._element._behaviors[0].AddParam("ShowNewButton", 0);

   }

Display Custom Advance Find view in Iframe in CRM 2011 by Guru Prasad

Display Custom Advance Find view in Iframe in CRM 2011  by Guru Prasad

Hi All, To bind FetchXml to Iframe Adi Katz,MVP has provided nice article to do in CRM4.0. Thanks Adi Katz for the great article. I just started converting it to work with CRM 2011. Here is the working copy of mine, to bind FetchXml to Iframe.


function loadIFrame() {

    window.fetchActivtities = new FetchViewer("IFRAME_TEST");
    fetchActivtities.FetchXml = getFetchXml();
    fetchActivtities.LayoutXml = getLayoutXml();
    fetchActivtities.Entity = "activitypointer";
    fetchActivtities.QueryId = "{00000000-0000-0000-00aa-000010001899}"; // view GUID
    fetchActivtities.RegisterOnTab(2); //IFRAME TAB INDEX


}



function getFetchXml() {

//  FetchXML Query
    return ' <fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">' +
                '<entity name="activitypointer">' +
                 ' <attribute name="subject" />' +
                 ' <attribute name="scheduledstart" />' +
                 ' <attribute name="regardingobjectid" />' +
                 ' <attribute name="prioritycode" />' +
                 ' <attribute name="scheduledend" />' +
                 ' <attribute name="activitytypecode" />' +
                 ' <attribute name="instancetypecode" />' +
                 ' <order attribute="scheduledend" descending="false" />' +
                '<filter type="and">'+
                  '<condition attribute="regardingobjectid" operator="in">'+
                    '<value  uitype="account">{7CC58DF6-3114-E111-8E22-1CC1DEEAE7D7}</value>'+                  
                 ' </condition>'+
                '</filter>'+
                '  <attribute name="activityid" />' +
               ' </entity>' +
             ' </fetch>';

}

function getLayoutXml() {

// grid layout, you can get easily from Customization.xml file
    return '<grid name="resultset" object="4200" jump="subject" select="1" icon="1" preview="1">' +
               ' <row name="result" id="activityid" multiobjectidfield="activitytypecode">' +
               '   <cell name="instancetypecode" width="100" ishidden="1" />' +
               ' </row>' +
             ' </grid>';

}

function FetchViewer(iframeId) {
    var Instance = this;
    var vDynamicForm;
    var m_iframeTab;
    var m_iframeDoc;

    Instance.Entity = "";
    Instance.Iframe = null;
    Instance.FetchXml = "";
    Instance.QueryId = "";
    Instance.LayoutXml = "";

    Instance.RegisterOnTab = function (tabIndex) {
        Instance.Iframe = document.getElementById(iframeId);

        if (!Instance.Iframe)
            return alert("Iframe " + iframeId + " is undefined");

        m_iframeDoc = getIframeDocument();
        var loadingGifHTML = "<table height='100%' width='100%' style='cursor:wait'>";
        loadingGifHTML += "<tr>";
        loadingGifHTML += "<td valign='middle' align='center'>";
        loadingGifHTML += "<img alt='' src='/_imgs/AdvFind/progress.gif'/>";
        loadingGifHTML += "<div/><b>Loading View...</b>";
        loadingGifHTML += "</td></tr></table>";
        m_iframeDoc.body.innerHTML = loadingGifHTML;

        Instance.Refresh();

    }

    function RefreshOnReadyStateChange() {

        if (Instance.Iframe.readyState != 'complete')
            return;

        Instance.Refresh();
    }

    Instance.Refresh = function () {
   
        if (!Instance.Iframe)
            return alert("Iframe " + iframeId + " is undefined");

        m_iframeDoc = getIframeDocument();

        Instance.Iframe.detachEvent("onreadystatechange", RefreshOnReadyStateChange);

        var create = m_iframeDoc.createElement;
        var append1 = m_iframeDoc.appendChild;
        vDynamicForm = create("<FORM name='vDynamicForm' method='post'>");

        var append2 = vDynamicForm.appendChild;
        append2(create("<INPUT type='hidden' name='FetchXml'>"));
        append2(create("<INPUT type='hidden' name='LayoutXml'>"));
        append2(create("<INPUT type='hidden' name='EntityName'>"));
        append2(create("<INPUT type='hidden' name='DefaultAdvFindViewId'>"));
        append2(create("<INPUT type='hidden' name='ViewType'>"));
        append1(vDynamicForm);

        vDynamicForm.action = prependOrgName("/AdvancedFind/fetchData.aspx");
        vDynamicForm.FetchXml.value = Instance.FetchXml;
        vDynamicForm.LayoutXml.value = Instance.LayoutXml;
        vDynamicForm.EntityName.value = Instance.Entity;
        vDynamicForm.DefaultAdvFindViewId.value = Instance.QueryId;
        vDynamicForm.ViewType.value = 1039;
        vDynamicForm.submit();


        Instance.Iframe.attachEvent("onreadystatechange", OnViewReady);
    }

    function OnViewReady() {
        if (Instance.Iframe.readyState != 'complete') return;

        Instance.Iframe.style.border = 0;
        Instance.Iframe.detachEvent("onreadystatechange", OnViewReady);
        m_iframeDoc = getIframeDocument();
        m_iframeDoc.body.scroll = "no";
        m_iframeDoc.body.style.padding = "0px";
    }

    function getIframeDocument() {
        return Instance.Iframe.contentWindow.document;
    }

}

Monday 12 August 2013

Sub Grid Custom Filter in MSCRM 2011

function FilterContactsBasedLookUpFiled() {

    var grid = document.getElementById('gridname');

    if (grid == null) {
        setTimeout('FilterContactsBasedOnShipTo()', 2000);
    }
    else {

        var lookupfield = new Array;
        var lookupid = null;

        lookupfield = Xrm.Page.getAttribute("Lookup").getValue();

        if (lookupfield != null) {

            lookupid = lookupfield[0].id;
        }

        //Else the function will return and no code will be executed.

        else {

            return;
        }

        //This method is to ensure that grid is loaded before processing.


        //This is the fetch xml code which will retrieve all the order products related to the order selected for the case.
        var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>";
        fetchXml += "<entity name='qcg_contact_shipping_address'>";
        fetchXml += " <attribute name='qcg_shippingaddress' />";
        fetchXml += "<attribute name='qcg_role' />";
        fetchXml += "<attribute name='qcg_contact' />";
        fetchXml += "<order attribute='qcg_shippingaddress' descending='false' />";
        fetchXml += "<link-entity name='contact' from='contactid' to='qcg_contact' alias='am'>";
        fetchXml += " <filter type='and'>";
        fetchXml += "  <condition attribute='parentcustomerid' operator='eq'  value='" + lookupid + "' />";
        fetchXml += "</filter>";
        fetchXml += "</link-entity>";
        fetchXml += "</entity>";
        fetchXml += "</fetch>";

        //Setting the fetch xml to the sub grid.

        grid.control.SetParameter("fetchXml", fetchXml);

        //This statement will refresh the sub grid after making all modifications.

        grid.control.refresh();
    }

}

Thursday 8 August 2013

Formula filed functionality in MSCRM 2011 like Sales Force.

This needs Jquery  Library support


// This function is called in onchange of some  look up field.
function RetrieveAccountInfo() {

// Get the lookup filed id value
    customerAttribute = XP.data.entity.attributes.get("xxxid");

    if (customerAttribute != null) {

        customerValue = customerAttribute.getValue();
        if (customerValue != null && customerValue[0] != null) {
            customerType = customerValue[0].typename;
            customerId = customerValue[0].id;
            return retrieveRecord(customerId, "AccountSet", retrieveCompleted, null);
        }
    }
}

// Firing the Rest call to get the all the attributes of this look up record
function retrieveRecord(id, odataSetName, successCallback, errorCallback) {
    //var context = GetGlobalContext();

    var odataEndPoint = "/XRMServices/2011/OrganizationData.svc";
    if (!id) {
        alert("record id is required.");
        return;
    }
    if (!odataSetName) {
        alert("odataSetName is required.");
        return;
    }

    $.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        datatype: "json",
        url: serverUrl + odataEndPoint + "/" + odataSetName + "(guid'" + id + "')",
        beforeSend: function (XMLHttpRequest) {

            XMLHttpRequest.setRequestHeader("Accept", "application/json");
        },
        success: function (data, textStatus, XmlHttpRequest) {
            if (successCallback) {
                successCallback(data.d, textStatus, XmlHttpRequest);
            }
        },
        error: function (XmlHttpRequest, textStatus, errorThrown) {
            if (errorCallback)
                errorCallback(XmlHttpRequest, textStatus, errorThrown);
            else
                errorHandler(XmlHttpRequest, textStatus, errorThrown);
        }
    });
}

// Call Back method to parse values from response
function retrieveCompleted(data, textStatus, XmlHttpRequest) {
    /*Display the required fields and hide if the fields are null */
    entity = data;
    if (!IsNull(entity.xxxxfield. value)) {

        if (entity.xxxxfield.LogicalName == "pricelevel") {

            var lookupValue = new Array();
            lookupValue[0] = new Object();
            lookupValue[0].id = entity.xxxxfield.Id;
            lookupValue[0].name = entity.xxxxfield.Name;
            lookupValue[0].entityType = entity.xxxxfield.LogicalName;
            XP.getAttribute("pricelevelid").setValue(lookupValue);


        }
        else {
            XP.getAttribute("xxxxfiledvalue").setValue(null);
        }
    }
    else {
        XP.getAttribute("xxxxfiledvalue").setValue(null);
    }
}

Get Object type code for MSCRM entities


  •  Using SQL Query :-
Get Object Type codes by Sql Query
Query>
SELECT ObjectTypeCode,*
FROM
ENTITYVIEW
Using JScript  :-
  • The “ObjectTypeCode” can be extracted from Query String using JScript
  • “ObjectTypeCode” resides in “etc” query string  parameter
  • Below is the JScript statement to get “ObjectTypeCode”
var currEntityObjTypeCode= Xrm.Page.context.getQueryStringParameters().etc
Key Points
  • Type codes below 10,000 are reserved for OOB entities.
  • Custom entities have a value greater than or equal to 10,000.
Note:- Custom entity object type codes may change during import and are not guaranteed to be the same between systems.
Getting Object Type Code by ‘Entity Name’ using Jscript
Below script uses CRM inbuilt logic and return the entity type code (or) object type code for the given entity name.
function getObjectTypeCodeByName(entityName) {
try {
var lookupService = new RemoteCommand(“LookupService”, “RetrieveTypeCode”);
lookupService.SetParameter(“entityName”, entityName);
var result = lookupService.Execute();
if (result.Success && typeof result.ReturnValue == “number”) {
return result.ReturnValue;
} else {
return null;
}
} catch (e) {
alert(“Error while getting ETC by Name – ” + e.description);
}
}



BY  

Tuesday 6 August 2013

Parsing MSCRM Retrieved Data values in Plugin

Entity _Account = service.Retrieve(“account”, new Guid(“XXXXX”), new ColumnSet(new string[] { “name”, “accountcategorycode”, “new_collectiondate”, “creditlimit”, “parentaccountid”, “new_executivecommission”, “new_isbilled” }));
//To fetch string value
string Name = _Account["name"].ToString();
//To fetch optionset selected value
int OptionSetValue = ((OptionSetValue)_Account["accountcategorycode"]).Value;
//To fetch date time field value
DateTime CollectionDate = ((DateTime)_Account["new_collectiondate"]).Date;
//To fetch money field value
decimal Creditlimit = ((Money)_Account["creditlimit"]).Value;
//To fetch decimal field value
decimal Executivecommission = (decimal)_Account["new_executivecommission"];
//To fetch lockup field
Guid ParentAccountID = ((EntityReference)_Account["parentaccountid"]).Id;
//To fetch Boolean field
Boolean IsBilled=(Boolean)_Account["new_isbilled"];

BY Mahendarpal

Friday 2 August 2013

Code to Get the Sub grid row values in Mscrm 2011


    function GettheSubGridRowValues() {
   

       // Get the Grid conrttol using its name
      var  grid = document.getElementById("Events");
      // Chek the grid is loaded or not
       if (grid.readyState != "complete") {
        // delay one second and try again. to wait  for grid loading 
        setTimeout(SubGridRefresh, 1000);
        return;
    }
    if (grid) {
         var gridControl = document.getElementById("Events").control;
        //Get the Row ids 
         var  ids = gridControl.get_allRecordIds();
         var  IslogicExecutionRequired= false;
        //Iterate by row wise
        for (i = 0; i < ids.length; i++) {
              // Get the call value by its column name
            var cellValue = gridControl.getCellValue('sci_name', ids[i]);
             if (cellValue == "xxxxx") {
                  IslogicExecutionRequired= true;
            }          
        }
   
    }
}

Attaching Sub Grid Refresh Event In MSCRM 2011



var grid = null;
var gridControl = null;
var ids = null;
var IsScottsdaleShowdown = false;



// call this finction on form laod
function Form_onload() {

// time out set as the grod will load littile late asynchronously after form laod , so we are waiting 2.5 seconds
    setTimeout("SubGridRefresh();", 2500);
}


// Attach  Sub grid refresh event
function SubGridRefresh() {

     grid = document.getElementById("Events");

     // Chek gris controll loaded or not 
    if (grid.readyState != "complete") {
        // delay one second and try after one second whether grid is loaded or not  
        setTimeout(SubGridRefresh, 1000);
        return;
    }

    if (grid) {
    // Attach  grid refresh event
        grid.attachEvent("onrefresh", CustomLogic);

      //cALLING THE CUSTOM LOGIC WHICH NEED TO BE EXECUTED R SUB GRID REFRESH
        grid.control.add_onRefresh(CustomLogic);

    }

    function CustomLogic() {

// Write the custom Logic which need to be executed in Grid Refresh.
    }