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.


Friday, 20 May 2016

Delete Record in in Microsoft Dynamics CRM 2016 using Web API


  function DeleteAccount() {
      //get Server url
        var serverURL = Xrm.Page.context.getClientUrl();

        //create Xml request object 
        var service = new XMLHttpRequest();

        //below line is used to delete the entity record  
        service.open("DELETE", serverURL + "/api/data/v8.0/accounts(1DD18913-11CB-E511-80D2-C4346BDC11C1)", 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.send();

        if (service.readyState == 4 /* complete */) {
        if (service.status == 204) {
            //show alert message 
            alert('Field Value Deleted');
        }
        else {
            var error = JSON.parse(service.response).error;
            //show error message
            alert(error.message);
        }
    }      
}
 

Update Record in Microsoft Dynamics CRM 2016 using Web API


  function UpdateAccount() {

    var serverURL = Xrm.Page.context.getClientUrl();
    var account = {};
    account["name"] = "Create record Web API Example"; //set single line of text field
    account["address1_city"] = "Islamabad";//set single line of text field
    //Lookup
    account["primarycontactid@odata.bind"] = "/contacts(0D7AFC02-891C-E611-80E1-5065F38B0371)";  //setting existing lookup
    //Below code will create contact on fly and set in primarycontact 
    //account["primarycontactid"] = {
    //    "firstname": "Mahender",
    //    "lastname": "Pal"
    //};

    //optionset
    account["industrycode"] = 1; // set optionSet field
    //two options
    account["donotphone"] = true; //set boolean field
    //number
    account["numberofemployees"] = 20;//set whole no field
    //date time
    //account["him_approvaldate"] = new Date();

    var req = new XMLHttpRequest();
    req.open("PATCH", serverURL + "/api/data/v8.0/accounts(1DD18913-11CB-E511-80D2-C4346BDC11C1)", false);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.send(JSON.stringify(account));

    if (req.readyState == 4 /* complete */) {
        if (req.status == 204) {
            
        } else {
            
        }
    }
}
 

Create Record in Microsoft Dynamics CRM 2016 using Web API


  function CreateAccount() {

    var serverURL = Xrm.Page.context.getClientUrl();
    var account = {};
    account["name"] = "Create record Web API Example"; //set single line of text field
    account["address1_city"] = "Islamabad";//set single line of text field
    //Lookup
    account["primarycontactid@odata.bind"] = "/contacts(0D7AFC02-891C-E611-80E1-5065F38B0371)";  //setting existing lookup
    //Below code will create contact on fly and set in primarycontact 
    //account["primarycontactid"] = {
    //    "firstname": "Mahender",
    //    "lastname": "Pal"
    //};

    //optionset
    account["industrycode"] = 1; // set optionSet field
    //two options
    account["donotphone"] = true; //set boolean field
    //number
    account["numberofemployees"] = 20;//set whole no field
    //date time
    //account["him_approvaldate"] = new Date();

    var req = new XMLHttpRequest();
    req.open("POST", serverURL + "/api/data/v8.0/accounts", false);
    req.setRequestHeader("Accept", "application/json");
    req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
    req.setRequestHeader("OData-MaxVersion", "4.0");
    req.setRequestHeader("OData-Version", "4.0");
    req.send(JSON.stringify(account));

    if (req.readyState == 4 /* complete */) {
        if (req.status == 204) {
            var accountUri = this.getResponseHeader("OData-EntityId");
            var ID = accountUri.substr(accountUri.length - 38).substring(1, 37); //get only GUID
           // Xrm.Utility.openEntityForm("account", ID); //Open newly created account record
        } else {
            var error = JSON.parse(req.response).error;
            alert(error.message);
        }
    }
}
 

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...