How to create a simultaneous fetch XML for contacts and leads - dynamics-crm

I'm using the following XML to fetch all the contacts.
<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
<entity name='contact'>
<attribute name='fullname' />
<attribute name='emailaddress1' />
<order attribute='fullname' descending='false' />
<link-entity name='listmember' from='entityid' to='contactid' visible='false' intersect='true'>
<link-entity name='list' from='listid' to='listid' alias='aa'>
<filter type='and'>
<condition attribute='listname' operator='eq' value='myList' />
</filter>
</link-entity>
</link-entity>
</entity>
</fetch>
However, I'd like the CRM also to produce the leads (preferably in the same list). Is it doable and if so, how?

As far as I know this isn't possible.
Mscrm will return zero or more records for a single entity and zero or more records from entities linked to those in a single call.
For example your fetch above gets contacts and list members linked to contacts.
You could retrieve leads linked to your contacts in a single call, but if you want all leads you will have to perform a separate call.
Edit:
"(a) two different <entity> section in the same <fetch>" - This wont work because its not valid schema.
FetchXML Schema
entity element - used for specifying the root element for a fetch,
only
one root entity is allowed in a given fetch, all others
are dependent on this entity and are marked as
link-entity
"(b) on a super class that both contacts and leads inherit from" - This wont work because as far as I know it doesn't exist. Although a single object Entity exists that can be used to represent all records in code, I don't believe this allows querying of multiple entities at once.

Related

Dynamics FetchXML condition checking text field beginning with pattern "xxABC"

In Microsoft Dynamics 365 FetchXML, is there a way to check a text field with the condition that it begins with "xxABC", where "xx" can be anything?
This is actually possible (to my surprise).
I created a few Account records, named:
"aacd"
"abcde"
"zxcdef"
Using _ as the placeholder for single characters I got the desired result:
<fetch top="50">
<entity name="account">
<attribute name="name" />
<filter>
<condition attribute="name" operator="like" value="__cd%" />
</filter>
</entity>
</fetch>
Under the hood this like condition appears to be translated into T-SQL. Take a look at the documentation LIKE (Transact-SQL) and have fun!

How to unmerge records which are merged from D365 OOB feature?

How to unmerge records which are merged from D365 OOB feature? Is there any custom code solution ?
Unfortunately, un-merging cannot be achieved in any OOB option and AFAIK, no community solutions are available.
As this is totally a rare requirement, we can build some console app for this.
We know that the master record will get/copy all the subordinate record field values after merging (based on choice in Merge screen), the subordinate record will get deactivated (still holding its original field values only). All the related records will be remapped to master record. So we have to reverse engineer all this for un-merging.
From my research, looks like the deactivated subordinate record will hold the master record as a link in masterid field. We have to pull all these records using the query below & iterate through each record, and then achieve what we want.
<fetch>
<entity name="contact" >
<attribute name="fullname" />
<attribute name="merged" />
<attribute name="masterid" />
<filter>
<condition attribute="merged" operator="eq" value="1" />
</filter>
</entity>
</fetch>

How to get records from multiple entities by text search in dynamics crm by javascript or api?

I want to retrieve records from multiple entities by matching text. Is it possible using fetchxml or web api? I want to use it by javascript.
This is certainly achievable using FetchXML. Specifically you want to use the like operator. For example the following Fetch Query searches contact name and email for a given value:
<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">
<entity name="contact">
<attribute name="fullname" />
<attribute name="contactid" />
<filter type="and">
<filter type="or">
<condition attribute="fullname" operator="like" value="%[Insert Dynamic Value]%" />
<condition attribute="emailaddress1" operator="like" value="%[Insert Dynamic Value]%" />
</filter>
</filter>
</entity>
</fetch>
Write a similar fetch query for each table you wish to search.
Is it possible to combine all entities together instead of requesting separately using fetchXml?
No, by design FetchXML does not support querying multiple unrelated records. Although you can query against related records in a single fetch expression, you are not able to enforce OR conditions across multiple tables. For example, you cannot write a FetchXML query comparable to the following SQL:
SELECT *
FROM contact
JOIN account on contact.accountid = account.accountid
WHERE contact.fullname like '%foo%'
OR account.name like '%foo%'
It appears to be possible, though unsupported, to access Relevance Search via an API: https://bguidinger.com/blog/relevance-search-api

Loading Data from Dynamics CRM to SQL Server

Not able to get optionset string from Dynamics CRM to SQL Server using Azure data factory.
I am using Azure data factory to move data from Dynamics CRM to SQL DB. I used fetchXML query to get the data from source (CRM). I am able to get normal string and guid type values without any issue.
But the optionset field from CRM is coming as Int32 type (ie, I am getting the value of optionset, not the string).
How can I fix this issue?
I'm going to have to sync the stringmaps entity too as I exceeded the link-entity limit for a given FetchXML query.
The following will bring in the textual value of an OptionSet selection.
<link-entity name="stringmap" from="attributevalue" to="____" visible="false" link-type="outer" alias="____">
<filter type="and">
<condition attribute="objecttypecode" operator="eq" value="___"/>
</filter>
<attribute name="value"/>
</link-entity>
to should be the name of the OptionSet column on the host/root entity
alias whatever you want to call the column in the output. I used the same value as to
value This is the object type code for your host/root entity. It is an integer value.
Probably you are using this approach to get the fetchxml resultset as Dynamics source to dumping into SQL using Azure Data factory. The problem you are facing is unable to consume the formatted text value for that picklist option.
We will do consume the formatted value using below syntax in code: Reference
//Option set
var industrycodeValue = accountDetails['industrycode'];
var industrycodeTextValue = accountDetails['industrycode#OData.Community.Display.V1.FormattedValue'];
If you cannot do such thing, then it’s better to dump another table in your SQL called stringmap which will store all the picklist options across the system.
Then you can inner join both tables to get the necessary data.
select INC.TicketNumber[Case ID],SMT.Value[Status Name], SMT.AttributeValue[Status Value]
from incident as INC inner join StringMap as SMT
on INC.StatusCode = SMT.AttributeValue
where SMT.AttributeName='statuscode' and SMT.ObjectTypeCode=112
Read more

Understanding Link-entity in FetchXML

I understand <link-entity> is used to do joins, but can you help me translate the following into english?
<entity name = "example">
*insert a bunch of attributes*
<link-entity name="providercertification" from="providerid" to="vendorid" alias="aa">
I understand <link-entity> is used for joins, but the join type is not specified, so that is throwing me off. How does the link-entity work if no join type is specified? Is it automatically an inner join?
Also, which column does the from part apply to? The very first entity or the one specified in the <link-entity>?
Same question for the from part.
Per documentation the below query is totally valid, which means alias, from & link-type are optional.
from always refer to same entity as link-entity node (primary key systemuserid of systemuser in this case). to refers to attribute of entity parent node (owninguser of account in this case)
<entity name='account'>
<attribute name='accountid'/>
<attribute name='name'/>
<link-entity name='systemuser' to='owninguser'>
Use a left outer join in FetchXML to query for records "not in"
So explicit link-type='outer' is required for outer join but inner join is default.
Interestingly Fetchxml is full of surprises. You can also refer FetchXML schema

Resources