Get Data sent to server on Save using Dynamics 365 CRM JavaScript | GetDataXML function

D365 Demystified

Now, in case you are working on forms in Dynamics 365 CRM, and you want to know what all data is changed – There are 2 ways to get this

Scenario

Let’s look at the below scenario where this is useful –

  1. You have a record which you are about to Edit. This is how it looks as of now.
  2. Now, I have an OnSave event on which I’m calling a function to capture what all is being saved.
  3. Now, below is what I want to change and then click Save to save the changes.
  4. And then click Save. Now, I want to capture all this data upon Saving to know and further process what has been changed. Let’s see how we can achieve this using Dynamics 365 CRM JavaScript

getDataXml() method

Here’s how you will see the data to be changed

  1. Below, you see that I’m using to get…

View original post 329 more words

Improve fetch xml performance by using latematerialize option.

If you have been working on dynamics projects, I bet fetch xml is your best friend as it’s really an easiest way to query and execute in order to get required results. Along with that, constructing it in advanced find is super easy too.

Don’t forget about amazing XRM toolboxes which helps you creating even complex fetch xml queries.

It all sounds fun and easy till your fetch XML becomes really heavy with so many joins or you have a requirement where you need to make many joins.

A Quick tip!

You can have a maximum of 10 joins in fetch xml for dynamics CE.

You will notice that retrieval from dynamics is getting slower and slower as fetch xml becomes complicated. I have faced something similar multiple times. What I did?

well, there are multiple options one of which I want to cover today as using this option, there are no extra efforts.

latematerialize to the rescue!

All you got to do is add latematerialize=”true” in fetch xml properties like below and test is to see the magic.

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="true" latematerialize="true">
  <entity name="account">
    <attribute name="emailaddress1" />
    <attribute name="statecode" />
    <attribute name="statuscode" />
    <attribute name="ownerid" />
    <attribute name="accountnumber" />
    <link-entity name="contact" from="contactid" to="primarycontactid">
      <attribute name="birthdate" />
      <attribute name="createdon" />
      <attribute name="contactid" />
      <attribute name="parentcustomerid" />
    </link-entity>
  </entity>
</fetch>

There are many internal technicalities as to how it works but to summarize, It breaks the data into multiple smaller segments which makes the retrieval of data faster unlike normal fetch xml which tries to query every at once.

if you are looking for official documentation on the same, please go here: Improve FetchXML request performance – Power Apps | Microsoft Docs

No “Change Tracking” option available under entity definition?

No change tracking available under entity definition.

To be able to add an entity to data export service, you would need to make sure the change tracking option is enabled on the entity definition.

we generally go to Settings – > solution or customize the system -> look for the entity and under “Data services” option, you should see the change tracking option. However it’s not the case anymore.


The option has disappeared from classic UI entity definition.

So where is this setting now? Well, you will find it in https://make.powerapps.com portal now. In order to see it, go to powerapps portal or click on above url.


1. Make sure you in the right environment from top right corner.
2. Click on solutions from the left menu:

3. Select the solution in which entity is there or default solution.
4. Navigate to the tables and click on the desired table and click on edit.


5. Again click on “edit table properties”

6. Expand advanced option section and select the “Track Changes” Option:

And that it! you should be good to go after publishing.

Scribe Integration – Use Application User Or Clientid & SecretKey To Connect To Dynamics 365

 

Just a short blog on how you can use an application user or clientId & secret while using scribe integration for connection to Microsoft Dynamics Customer Engagement. 

Now we know we can very use a standard dynamics user with scribe. However, you will most likely hit the API limits. You can read about here : https://docs.microsoft.com/en-us/power-platform/admin/api-request-limits-allocations#microsoft-power-platform-requests-allocations-based-on-licenses

The only option remains is to use an application user which allows much much more number of request in 24 hours you can make. So, if you add a connector named as  Microsoft Dynamics 365/CRM in scribe, you will see below: 

So, you wont get option to use a client secret but all other option. 

Solution :
Make sure you are using the connection as Common Data Service (CDS) and post that when you connect, you will get the option:

I hope this helps!

Map A Multi Target Lookup Field In Azure Data Factory – Dynamics 365 Data Import

Dynamics 365 has these special lookup fields which can reference multiple entities. Meaning, you can select record not just from one entity but other as well. One of the typical example is an Owner field where you chose a user or a team as well, A customer field where you can chose an account or a contact as well. 

These fields have sister string fields which holds the entity schema name of the record in the main lookup field. i.e. for ownerid field, it will be owneridtype where it will be “systemuser” if owner is an user or “team” if team is the owner. These fields are often referred to as Virtual fields as well. 

In my case, I will be talking about Notes(Annotation) Entity. Notes can be associated with any entity in the system using the objectid or regarding field to be clear. The corresponding field for this lookup field is objectidtypecode which holds the target entity schema name. 

if you simply do the mapping to objectid in your target dynamics instance, you will error like below:

Operation on target Create Annotation failed: Failure happened on 'Sink' side. ErrorCode=DynamicsMissingTargetForMultiTargetLookupField,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Cannot find the target column for multi-target lookup field: 'objectid'.,Source=Microsoft.DataTransfer.ClientLibrary.DynamicsPlugin,'

Even if you map objectidtypecode to objectidtypecode directly, you will get error.

Solution: 
It was not possible to work with multi target fields at all earlier with ADF but now its possible by doing below. so now, you will have to map objectid to objectid(the main lookup field) from source to target. 
Along with that, you have to map objectidtypecode or any field which holds the schema name of the lookup field to an expression as “{lookup_field}@EntityReference”. So in my case it will be objectid@EntityReference.:

And there you go. It will work flawless if you do this. To explore more refer to https://docs.microsoft.com/en-us/azure/data-factory/connector-dynamics-crm-office-365

I hope this helps!

Add Dynamics 365 Marketing Trial To Your Instance

 

Here is the step by step process for adding Dynamics 365 Marketing to your dynamics 365 instance.
You can sign up for, install, and use a trial version of Dynamics 365 Marketing for free. Trials last for 30 days.

Few important points to remember :

  • You will receive a trial Dynamics 365 instance together with your Marketing trial. You must run the Marketing trial on a trial instance, and can’t install it on a production instance.
  • You can’t convert a trial instance into a production instance.
  • You can install, at most, one Dynamics 365 Marketing trial per Microsoft 365 tenant.
  1. Go to the admin platform of your tenant:  https://admin.powerplatform.microsoft.com/  
    Expand Admin centers and click on Dynamics 365:
    1

  2. In Dynamics 365 Admin centre, click on Applications tab  –> Select Dynamics 365 Marketing Application  –> Click on Manage:
    2

  3. Otherwise access this url directly :  https://port.crm8.dynamics.com/G/Applications 
    [Replace crm8 with appropriate region]. Follow the steps given on step 2. 

  4. On the next screen you will be asked to provide a portal name, Please note that a portal is needed to host your pages which can be accessed by customers publically. In this installation a portal of type “Events” will be created for us.
    3


  5. On the next screen, wait a few seconds:
    4

  6. Another important step : You must provide a physical address of the organization ; In our case its a trial, you can put it in anything and also accept the data consent.
    6

  7. The installation will start, though it says it will take approx 10 mins, I would suggest you leave it for sometime and come back later. 
    5
  8. Once that is done, You will see something like below:
    7


  9. And its done! Now to access the app, you can click on “Go to app” from the above screen or simply navigate to “Marketing” App from your dynamics 365 instance navigation as it will start appearing post installation:
    9

 

Hope this helps.

Cheers!

Get Contacts/Customers Used In A Customer Journey In Dynamics 365 Marketing

This is going to be a very short blog as I am going to just reference my previous blogs to achieve a solution for this.

I have talked about Customer Journey entity in dynamics in a recent post here:  The ‘Mysterious’ Customer Journey Entity In Dynamics 365 Marketing.

By now, we know that it’s not easy or straight forward to get any details from a customer journey from the back-end.

segment1

In a customer journey, customers are not directly added but rather through a “Marketing Segment”. Now we have seen in the blog above on how to get segment details used in the journey. Once we have the segment Id, the next step is to fetch the customers from the segment and for that I have another blog explaining it: Dynamics 365 For Marketing – Retrieve Contacts From A Segment

By doing the above mentioned, you should be able to get all customer that are part of a journey.

I hope this helps.
Cheers!

 

The ‘Mysterious’ Customer Journey Entity In Dynamics 365 Marketing

In today’s blog I am going to be talking about ‘Customer Journey’ entity in dynamics 365 for marketing app or to be specific the ‘Customer Journey Designer’ which looks like below:

customerjourney1

 

I call it ‘Mysterious’ because whatever happens in the journey ‘stays’ in the customer journey. i.e there is no way or its difficult to get the segment/contents being used in it. I am talking about Marketing Email, Marketing Page, Marketing Form etc. The question you might want to ask is why would I need that information? well, because of may be below:

  1. You might have some validations on the content you can use in the customer journey
  2. You might want to retrieve the data for reporting purpose

If you look into the relationships from customer journey to these entities, you wont find anything hence it gets difficult to retrieve these records or perform operations. In short Dynamics 365 Marketing works a little differently then our typical dynamics 365.

Whatever happens inside a customer journey designer sits in a field on this entity named as “msdyncrm_workflowdefintion“. It stores information about content added in this the journey in JSON format. 

customerjourney2

This is how it looks:
customerjourney3

 

Let’s understand what this JSON means:

  1. Each content is stored in a node called “ActivityTypeId“.
  2. The Id of the content is stored in property “Itemid“.
  3. To identify the type of content such as Marketing page form etc. refer to below table because it uses different names to each type of content:

Dynamics Entity Name Internal Name In Customer Journey
Marketing Page LandingPage
Marketing Form MarketingForm
SurveySurvey
Marketing EmailEmail
Marketing Event Event
Marketing SegmentSegment

If you debug and parse this field data into JSON, looks like something below:

customerjourney4

So when you retrieve/query this field, you have to loop through these JSON nodes and do validation using the Guids of these records like in the below example of Javascript:

 var workflowDefintion= formContext.getAttribute("msdyncrm_workflowdefinition").getValue();
 var workflowDefintionData = JSON.parse(workflowDefintion); //Parse it

                    var nodeLength = workflowDefintionData.length;
                    for (var i = 0; i < workflowDefintionData.length; i++) {
                        var node = workflowDefintionData[i];                        
                        /* Check if node is a Marketing page*/                       
                        if (node.ActivityTypeId === "LandingPage" && (i + 1) === nodeLength) {

// Perform Operations here
}

Same way you can do in the code if needed.

I hope this help!

Cheers!

Import Member/Contacts To A Marketing Segment

A segment in 365 for marketing app is an essential feature which lets you create a list of related contacts based on some criteria( similar to advanced find). Later it is used to target customers in a customer journey.

While you can define a criteria/search for contacts and add them in a Dynamic segment, you don’t have this facility in a “Static” Segment because contacts are manually added on a per-contact basis. hence, there should be ability to import these contacts in to a static segment. 

Now, there is no out of the box way I could find by which we can bulk update contacts into a segment, however after doing a bit digging, I found a working custom solution. 

Solution

If you look into segment entity, you will find a mysterious field named “msdyncrm_segmentmemberids” as below:

segment1

This field basically consists of the ids of the contacts in a JSON format prefixed with “crm”:

segment2

Hence, whatever contacts you manually select on the segment comes and sit in this field. So we just need to update this field with ids of the contact we want to include in this segment.

You can update this field either by WebApi or a Plugin. Its upto you how you want to design your solution. In my case I have placed button on the segment form which opens a web resource providing a flexibility to upload an excel/csv file containing these ids of the contacts which you can easily read, prepare the format of the guids(prefix with “crm”) and update using a simple web api request.

 var entity = {};
            var stringIfy = JSON.stringify(Prepared_ContactsArray);
            var entity = {};
            entity.msdyncrm_segmentmemberids = stringIfy;

            var req = new XMLHttpRequest();
            req.open("PATCH", GetGlobalContext().getClientUrl() + "/api/data/v9.1/msdyncrm_segments(" + segmentId + ")", true);
            req.setRequestHeader("OData-MaxVersion", "4.0");
            req.setRequestHeader("OData-Version", "4.0");
            req.setRequestHeader("Accept", "application/json");
            req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
            req.onreadystatechange = function () {
                if (this.readyState === 4) {
                    req.onreadystatechange = null;
                    Xrm.Utility.closeProgressIndicator();
                    if (this.status === 204) {
                        //Success - No Return Data - Do Something
                       
                    } else {
                        //Xrm.Utility.alertDialog(this.statusText);
                    
                    }
                }
            };
            req.send(JSON.stringify(entity));
        }

I hope this helps!

Cheers!

Enable Add New(+) Connection Button On Opportunity

Out of the box on opportunity form, we have a connection sub grid named “stakeholders”. You can add new connections of type stakeholder from this subgrid which is amazing , however what if we need ability to create any other type connections from opportunity. 

Connections ofcourse has inbuilt functionality for opportunity to behave this way.
The subgrid uses a default view “All Stakeholders” hence it will let you add only stakeholder connections. 

Let’s change this view to “All Active Connections” :

Select this view, save changes & publish the form. Lets see what happens now:

Strangely, we dont have a plus button , so person will have to click on see all records/see associated record and then add the connections from.

Solution:

I have found a workaround by playing around the ribbon workbench. 
1. To do this, create a temporary solution and add “connections” entity to it. 

2. Next step is to install ribbon workbench if you dont have already. You can get it from here:
https://www.develop1.net/public/rwb/ribbonworkbench.aspx  

3. Once you have download the solution, install the solution to your dynamics 365 instance.

 

4. Click on the ribbon workbench button from your solutions are and select the newly create solution in the popup ( which we create for connection entity):

We are now going to make some ribbon changes, i would recommend to take a backup of the newly solution we have created so if anything goes wrong we can always import it back.

5. Right click on the +New button the subgrid ribbon and right on it. 
 Select “customize button” then again right click and select “Customize command”:

6. Now move to the enable rule “Mscrm.ShowOnHomeGridAndOnSalesCustomSubGrids” under command “Mscrm.SubGrid.connection.NewRecord” & scroll down to the “Custom rule” as shown below.

7. In this rule make “Default” field to “true” as well as Invert rule to true as well:

8. Now click on publish button from the ribbon workbench which will take some time.

9. Navigate to your opportunity now and you will the + button from subgrid now:


I hope this helps, here are some final notes:

  1. Connections entity doesnt support quick create form hence do not expect it open a quick create on the right side when you click on this button.  It will open a new window , you have fill details and click on save & close.
  2. When new connection screen opens it will have opportunity in both connected to and connected from fields. You will have to apply basic javascript to clear one of the field so that user can select the customer /account in connected to field.
  3. Connections do not support business rule.

Cheers!