Monday, 22 April 2019

Fetch Xml query in webapi Javascript Dynamic 365

    try {

    var fetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical'                                                              distinct='false'>";
fetchXml += "<entity name='opportunity'>";
fetchXml += "<attribute name='budgetamount' />";
fetchXml += "<attribute name='statuscode' />";
fetchXml += "<attribute name='opportunityid' />";
fetchXml += "<attribute name='name' />";
fetchXml += "<attribute name='createdby' />";
fetchXml += "<attribute name='ss_requesttype' />";
fetchXml += "<order attribute='name' descending='false' />";
fetchXml += "<filter type='and'>";
fetchXml += "<condition attribute='opportunityid' operator='in'>";
for (var i = 0; i < arrayVals.length; i++) {
var oppId = arrayVals[i].replace("{", "").replace("}", "");
fetchXml += "<value uitype='opportunity'>" + oppId + "</value>";
}
fetchXml += "</condition>";
fetchXml += "</filter>";
fetchXml += "</entity>";
fetchXml += "</fetch>";

        var webapiPath = lXrm.Page.context.getClientUrl() + "/api/data/v9.1/opportunities?fetchXml=" + encodeURIComponent(fetchXml);
        var service = new XMLHttpRequest();
        service.open("GET", webapiPath, false);
        service.setRequestHeader("Accept", "application/json");
        service.setRequestHeader("Content-Type", "application/json; charset=utf-8");
        service.setRequestHeader("OData-MaxVersion", "4.0");
        service.setRequestHeader("OData-Version", "4.0");
        service.setRequestHeader("Prefer", "odata.include-annotations=*");
        //service.setRequestHeader("Prefer", "odata.maxpagesize = 3"); this tag isused to retrieve no of //records
        service.send(null);

        if (service.readyState == 4 /* complete */) {
            if (service.status == 201 || service.status == 200) {
                var result = eval('(' + service.responseText + ')');
                if (result.value.length > 0) {
                   
                    for (var i = 0; i < result.value.length; i++) {
                        var opportunityid = result.value[i].opportunityid;
                        var name = result.value[i].name;
                        var budgetamount = result.value[i].budgetamount;
                        var createdby = result.value[i]['_createdby_value@OData.Community.Display.V1.FormattedValue'];
                       
                    }
                   
                }
            }
        }
    } catch (ex) {

    }

Monday, 15 April 2019

Web API request to refresh Rollup field Dynamic 365 through JavaScript

The following JS function is used to refresh Rollup field through webapi fom javascript

function calcRollupField(serverURL,strTargetEntitySetName, strTargetRecordId, strTargetFieldName)
{
    strTargetRecordId = strTargetRecordId.replace("{", "").replace("}", "");
    var req = new XMLHttpRequest();
    req.open("GET", serverURL + "/api/data/v9.0/" +
        "CalculateRollupField(Target=@p1,FieldName=@p2)?" +
        "@p1={'@odata.id':'" + strTargetEntitySetName + "(" + strTargetRecordId + ")'}&" +
        "@p2='" + strTargetFieldName + "'", false);
    req.setRequestHeader("OData-Version", "4.0");
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.onreadystatechange = function () {
        if (req.readyState === 4) {
            req.onreadystatechange = null;
            if (req.status === 200) {
                var results = JSON.parse(this.response);
            }
            else {
                Xrm.Utility.alertDialog(this.statusText);
            }
        }
    };
    req.send(JSON.stringify({}));
}

Monday, 25 February 2019

Show only Account or Contact in customer lookup dynamic 365


To show only account or contact in customer lookup, follow the below steps

1) On Load of form add the following code

if (Xrm.Page.getControl("customerid") != null) {
            Xrm.Page.getControl("customerid").addPreSearch(function () {
                filterCustomerLookup ();
            });
        }

2)Register this function on OnChange event of customer lookup to show only account in customer lookup

    function filterCustomerLookup () {

        var lookup = Xrm.Page.getControl('customerid');

        //check if multiple type dropdowns enabled for this lookup
        if (lookup.getEntityTypes().length > 1) {
            lookup.setEntityTypes(['account']);
        }

        var fetchXml = "<filter type='and'>";
        fetchXml += "<condition attribute='statecode' operator='eq' value='0'/>";
        fetchXml += "</filter>";

        if (Xrm.Page.getAttribute("customerid") != null) {
            Xrm.Page.getControl("customerid").addCustomFilter(fetchXml, "account");
        }
    }



To show only contact  then change account to contact.

function filterCustomerLookup () {

        var lookup = Xrm.Page.getControl('customerid');

        //check if multiple type dropdowns enabled for this lookup
        if (lookup.getEntityTypes().length > 1) {
            lookup.setEntityTypes(['account']);
        }

        var fetchXml = "<filter type='and'>";
        fetchXml += "<condition attribute='statecode' operator='eq' value='0'/>";
        fetchXml += "</filter>";

        if (Xrm.Page.getAttribute("customerid") != null) {
            Xrm.Page.getControl("customerid").addCustomFilter(fetchXml, "contact");
        }
    }


Tuesday, 13 June 2017

SSRS Custom Report Loaded Partial Images from Notes Entity in Dynamics CRM

For One of Our Client , I have to show images from  Notes entity in custom SSRS report.
I have to show Quote information and related Product information with images in report.


When i use this fetch XML query images display partially.



<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true">
  <entity name="quote">
    <attribute name="owneridname" />
    <attribute name="customerid" />
    <attribute name="quotenumber" />
    <attribute name="totalamount" />
    <attribute name="discountpercentage" />
    <attribute name="totallineitemamount" />
    <attribute name="quoteid" />
    <attribute name="modifiedon" />
    <attribute name="new_billtoaddress" />
    <attribute name="new_shiptoaddress" />
    <attribute name="new_termsconditions" />
    <attribute name="new_projectname" />
    <attribute name="new_contactphonecell" />
    <attribute name="new_fax" />
    <attribute name="discountamount" />
    <attribute name="new_properties" />
 <attribute name="new_quoteapprovedbygm" />
 <attribute name="new_salesconsultant" />
    <filter type="and">
      <condition attribute="quoteid" operator="eq"  uitype="quote" value="@QuoteId" />
    </filter>
    <link-entity name="quotedetail" from="quoteid" to="quoteid" alias="am" link-type="outer">
   <attribute name="productid" alias="am_productidname"/>
      <attribute name="priceperunit" alias="am_priceperunit"/>
      <attribute name="quantity" alias="am_quantity"/>
      <attribute name="extendedamount" alias="am_extendedamount"/>
      <attribute name="productdescription" alias="am_proddescription"/>
      <attribute name="new_properties" alias="am_properties"/>
      <attribute name="manualdiscountamount" alias="am_manualdiscountamount"/>
      <attribute name="new_discount" alias="am_discountPercentage"/>
      <link-entity name="product" from="productid" to="productid" alias="an">
        <link-entity name="annotation" from="objectid" to="productid" alias="ao">
            <attribute name="subject" />
            <attribute name="notetext" />
            <attribute name="filename" />
            <attribute name="documentbody" />
            <attribute name="annotationid" />
  </link-entity>
      </link-entity>
    </link-entity>
  </entity>
</fetch>

The issue is with    distinct="true"  make it  distinct="false" the issue resolved

Actually when distinct="true"  image is retrieved as base 64 string like BST25SASDFSDFOSDFSD09FSD9F78SDFPSODFSDF9SDF789SD7F9S8DF7S


distinct remove the repetition which results in almost half string

so the images display partially.



Thursday, 26 May 2016

CRM 2016/2015/2013: Applying custom FetchXml to a subgrid using JavaScript

I have faced a scenario to show Account related contacts emails in sub-grid on account form.
In my scenario there is a many to many relationship between account and contact.
and i want to show Account related contacts emails in sub-grid on Account.

To achieve this goal i add a sub-grid of emails on account form.



Then i developed fetch XML in advanced find to show account related contacts emails.

var FetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" +
                                "<entity name='email'>" +
                                    "<attribute name='subject' />" +
                                    "<order attribute='subject' descending='false' />" +
                                    "<attribute name='to' />" +
                                    "<attribute name='from' />" +
                                    "<attribute name='createdon' />" +
                                    "<attribute name='activityid' />" +
                                    "<link-entity name='activityparty' from='activityid' to='activityid' alias='ad'>" +
                                       "<link-entity name='contact' from='contactid' to='partyid' alias='ae'>" +
                                       "<link-entity name='new_account_contact' from='contactid' to='contactid' visible='false' intersect='true'>" +
                                           "<filter type='and'>" +
                                            "<condition attribute='accountid' uitype='account' value='" + accountid + "' operator='eq'/>" +
                                         "</filter>" +
                                       "</link-entity>" +
                                     "</link-entity>" +
                                    "</link-entity>" +
                                    "</entity>" +
                                  "</fetch>";


To apply this custom fetch XML  to the sub-grid i used the below JavaScript function.

function dynamicallyFilterSubGrid() {
    var objSubGrid = window.parent.document.getElementById("RelatedContactEmails");
    //CRM loads subgrid after form is loaded.. so when we are adding script on form load.. need to wait unitil subgrid is loaded.
    // thats why adding delay..
    if (objSubGrid == null) {
        setTimeout(dynamicallyFilterSubGrid, 2000);
        return;
    }
    else {
        if (objSubGrid.control != null) {
            var accountid = Xrm.Page.data.entity.getId();
            var FetchXml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>" +
                                "<entity name='email'>" +
                                    "<attribute name='subject' />" +
                                    "<order attribute='subject' descending='false' />" +
                                    "<attribute name='to' />" +
                                    "<attribute name='from' />" +
                                    "<attribute name='createdon' />" +
                                    "<attribute name='activityid' />" +
                                    "<link-entity name='activityparty' from='activityid' to='activityid' alias='ad'>" +
                                       "<link-entity name='contact' from='contactid' to='partyid' alias='ae'>" +
                                       "<link-entity name='new_account_contact' from='contactid' to='contactid' visible='false' intersect='true'>" +
                                           "<filter type='and'>" +
                                            "<condition attribute='accountid' uitype='account' value='" + accountid + "' operator='eq'/>" +
                                         "</filter>" +
                                       "</link-entity>" +
                                     "</link-entity>" +
                                    "</link-entity>" +
                                    "</entity>" +
                                  "</fetch>";
            objSubGrid.control.SetParameter("fetchXml", FetchXml);
            objSubGrid.control.Refresh();
        }
        else {
            setTimeout(dynamicallyFilterSubGrid, 2000); // this setTimeout function is necessay because first objSubGrid.control is null
        }
    }
}

Lead not able to qualify in Microsoft Dynamics CRM

When qualifying Lead and it throw error like 

"An error has occurred. Either the data does not exist or you do not have sufficient privileges to view the data. Contact your system administrator for help" 

This error is basically occur because someone have deleted Stakeholder connection role from the CRM.

The Process of adding Stakeholder connection role to the CRM.
Create a solution in the org in which lead is qualifying successfully.
then add the Stakeholder connection role to the solution then export the solution and import the solution to the org in which lead is not qualifying and the above error is coming.
and publish the solution.

so the  above error will be resolved.


Read only field , get latest value from read only field in in power app portal

Below line is used to make field readonly in power app portal through js $( "#bdo_relationshiprole_name" ).parent().css( "po...