CRM 2013 Tool – CRM 2013 Duplicate Detection

So I recently learnt Duplicate detection had been removed from CRM 2013.  I was thinking about this and I guess you could add functionality to check this with a plugin yourself but this would of course mean you have to store configs and etc code and testing, which is quite annoying for functionality that use to be out of the box.

Then I saw that someone else has already created a solution to do it, yippeeee

It’s called CRM 2013 Duplicate Detection and is on codeplex, click the link to have a look

I will say I haven’t check it out myself yet but I’m blogging it here for future reference, just in case I need some duplicate checking in CRM 2013 project.  Also I want to let the CRM community know that someone has created a solution that might save you doing it yourself.
Below is the description and details from the codeplex site

Purpose

Provides the ability to show potential duplicate records on the client side when creating or updating records.

Specifics

Uses the native duplicate detection rules

Works on standard and Quick Create Forms*

Not available for the tablet client

Configuration allows preventing save when potential duplicates exist

CRM 2013 – Duplicate Detection during Record Create and Update Operations Not Supported

With all new releases of Microsoft Dynamics CRM, Microsoft gives us some tasty enhancements and at the same time throws in some cheeky gotcha’s, CRM 2013 is no exception.

Someone at Ciber sent me a link saying here is a CRM 2013 duplicate detection solution because that functionality got removed in CRM 2011.

At this point you are probably thinking, is Hosk sure about that, well this page from Microsoft might clarify a few things

Duplicate Detection during Record Create and Update Operations Not Supported

hmmmm, well the title seem quite conclusive but let us delve a little deeper with some more details (taken from the link above)

Duplicate detection during create and update operations will not be supported for Microsoft Dynamics CRM updated user interface entities. Duplicate detection of individual records won’t be supported for custom entities as well. However, to detect duplicates in bulk, you can use the BulkDetectDuplicatesRequest message and the RetrieveDuplicatesRequest message. For more information, see Detect Duplicate Data in Microsoft Dynamics CRM. For information about updated user experience, see Updated User Experience for Sales and Customer Service and Product Update Functionality.

It explains that it isn’t supported but it doesn’t really say why they have taken this functionality away, I’m guessing autosave maybe has something to do with it because saving has changed from one save when you have finished changing an entity to lots of little continuous saves as you edit the entity

So how do you check for duplicates, well you have to run duplicate detection jobs, which will generate a list of duplicates which you will then fix.  I’m not sure if this functionality has changed but this was always a slow tricky process thanks to a clunky GUI.

So what records no longer have duplicate checking functionality, I can summarise this up very quickly – practically all of the entities no longer has duplicate checking but for a more detailed list, The following table contains a list of the updated user interface entities available in the next major release of Microsoft Dynamics CRM. These entities will not have duplicate detection support during record create or update operations:

Schema Name Display Name
Account Account
Appointment Appointment
Campaign Campaign
CampaignActivity Campaign Activity
CampaignResponse Campaign Response
Competitor Competitor
Contact Contact
Contract Contract
Email Email
Fax Fax
Incident Case
Invoice Invoice
Lead Lead
Letter Letter
List Marketing List
Opportunity Opportunity
OpportunityProduct Opportunity Product
PhoneCall Phone Call
Product Product
ProductPriceLevel Price List Item
Quote Quote
RecurringAppointmentMaster Recurring Appointment
SalesLiterature Sales Literature
SalesOrder Order
SystemUser User
Task Task
Team Team

 

 

Build Queries with FetchXML instead of QueryExpression

When developing I like a good QueryExpression because once you have got one in code it’s easy to change it to the new query you are doing.  I usually work out the rough logic with an advanced find and then download the xml to see the names of the fields etc.

You can read some of my great blog posts on QueryExpression’s below or read on for some FetchXML fun

CRM 2011 – QueryExpressions where a field is null

CRM 2011 – How to select an Id in a QueryExpression

CRM 2011 – How to do Like statement in QueryExpression

Recently I was doing a QueryExpression but I need to link the query expression to two or three different entities and the query expression was getting out of hand.  I could do the query with an Advanced find so I was thinking if I could just use that it would be a whole lot easier than trying to convert the FetchXML to a QueryExpression.   So after a bit of googling I found that you can use FetchXML queries inside plugins.

It was while I was studying for CRM 2011 Extending CRM exam that I found this page – Build Queries With FetchXML and this line

A FetchXML query can be executed by using the IOrganizationService.RetrieveMultiple method. You can convert a FetchXML query to a query expression with the FetchXmlToQueryExpressionRequest message.

If you want to use FetchXML in your plugin/Custom Workflow you will need to download the FetchXML from your advanced find.  There is a very helpful button on the advanced find that appears after you have run the advanced find, which you can see below magnetismsolutions blog)

You will have to do a bit of conversion from the downloaded fetchXML because all the fields will be in double quotes and these will need to be in single quotes and you will need to put an @ at the front and double quotes around the whole FetchXML query whilst you save it to a string variable.  You then pass the string RetrieveMultiple as shown in the example below

The example below is taken from here

// Retrieve all accounts owned by the user with read access rights to the accounts and 
// where the last name of the user is not Cannon. 
string fetch2 = @"
   <fetch mapping='logical'>
     <entity name='account'> 
        <attribute name='accountid'/> 
        <attribute name='name'/> 
        <link-entity name='systemuser' to='owninguser'> 
           <filter type='and'> 
              <condition attribute='lastname' operator='ne' value='Cannon' /> 
           </filter> 
        </link-entity> 
     </entity> 
   </fetch> "; 

EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2));

foreach (var c in result.Entities)
   {
   System.Console.WriteLine(c.Attributes["name"]);
   }

The results are same EntityCollection you would get from a QueryExpression, which makes it easy to reuse code you have written for query expressions.

The other thing you will probably need to do is integrate values and guids into the FetchXML.  You can pass in a guid and then put in double quotes, the guid variable with a + sign either side.  You can see the example below

Guid contactGuidVariable;

EntityReference contactEntityRef;

string fetch = @”<fetch version=’1.0′ output-format=’xml-platform’ mapping=’logical’ distinct=’false’>
<entity name=’contact’>
<attribute name=’fullname’ />
<attribute name=’address1_upszone’ />
<attribute name=’address1_line1′ />
<attribute name=’address1_postalcode’ />
<attribute name=’createdon’ />
<attribute name=’contactid’ />
<order attribute=’fullname’ descending=’false’ />
<filter type=’and’>
<condition attribute=’statecode’ operator=’eq’ value=’0′ />
<condition attribute=’contactid’ operator=’eq’ uiname=’BEN HOSK’ uitype=’contact’ value='” + ContactGuidVariable + “‘ />
</filter>
</entity>
</fetch>”

if you pass in a guid you can just pass in the guid variable but if it’s an EntityReference then you would need to contactEntityRef.Id

Microsoft have written some good articles on this you can read here

Build Queries With FetchXML

Use FetchXML to Construct a Query – this one is good because it has code examples, which I have borrowed in this blog

Some good articles on this are

http://www.magnetismsolutions.com/blog/roshanmehta/2012/04/16/dynamics_crm_2011_querying_data_using_fetchxml

CRM Certification Passed – Extending Microsoft Dynamics CRM 2011

I have finally passed the CRM 2011 Extending Microsoft Dynamics exam this week.

I took the exam and passed it on my birthday, now that is dedication to Microsoft Dynamics CRM and something I certainly think the CRM MVP panel should take into account 🙂

As usual it’s good to get the exam out of the way and I can relax over Christmas and not think about the exam, although I wouldn’t rule out thinking about CRM for a little bit during the Xmas period.

It’s certainly worth studying for exams because there were a number of things I learnt which I didn’t know and other facts which have really been reinforced in my mind.

The exam was fairly enjoyable, the difference between a more developer focused exam seemed to me it was easier to discard the obviously wrong answers and sniff out the right answer.  In some of the other CRM exams  it can seem there are more than one right way to do things and it can be more of a choice of preference of how you do things.

So after Christmas I shall start to have a look at the course material for the CRM 2013 certifications, the MOC’s have been created by there is no sign yet on dates when the exams will be released and available to the general public.  Perhaps a nice MVP might let us know??

I noticed that on your birthday, google change the search (unless they were actually celebrating my birthday with whole world!)

birthday

CRM 2011 – IExecutionContext and the useful variables you can access

Whilst studying for the Extending CRM 2011 exam, I have been looking at the IExecutionContext and it has some interesting properties you can access in the plugins.

Firstly you have

IExecutionContext Interface

This is a base interface that defines the contextual information passed to a plug-in or custom workflow activity at run-time.    The properties of this base class are populated by the event execution pipeline before the plugin or custom workflow code is run.

To see the various properties, I found this useful page, which I have copied below.   I have probably used most of these variables at one time or another, depth to see how many times the plugin has run is one of the most useful.

IExecutionContext Properties

This topic has not yet been rated – Rate this topic
[Applies to: Microsoft Dynamics CRM 2011] Public Properties


Name Description
public property BusinessUnitId Gets the global unique identifier of the business unit that the user making the request, also known as the calling user, belongs to.
public property CorrelationId Gets the global unique identifier for tracking plug-in or custom workflow activity execution.
public property Depth Gets the current depth of execution in the call stack.
public property InitiatingUserId Gets the global unique identifier of the system user account under which the current pipeline is executing.
public property InputParameters Gets the parameters of the request message that triggered the event that caused the plug-in to execute.
public property IsExecutingOffline Gets a value indicating if the plug-in is executing from the Microsoft Dynamics CRM for Microsoft Office Outlook with Offline Access client while it is offline.
public property IsInTransaction Gets a value indicating if the plug-in is executing within the database transaction.
public property IsOfflinePlayback Gets a value indicating if the plug-in is executing as a result of the Microsoft Dynamics CRM for Microsoft Office Outlook with Offline Access client transitioning from offline to online and synchronizing with the Microsoft Dynamics CRM server.
public property IsolationMode Gets a value indicating if the plug-in is executing in the sandbox.
public property MessageName Gets the name of the Web service message that is being processed by the event execution pipeline.
public property Mode Gets the mode of plug-in execution.
public property OperationCreatedOn Gets the date and time that the related System Job was created.
public property OperationId Gets the global unique identifier of the related System Job.
public property OrganizationId Gets the global unique identifier of the organization that the entity belongs to and the plug-in executes under.
public property OrganizationName Gets the unique name of the organization that the entity currently being processed belongs to and the plug-in executes under.
public property OutputParameters Gets the parameters of the response message after the core platform operation has completed.
public property OwningExtension Gets a reference to the related SdkMessageProcessingingStep or ServiceEndpoint.
public property PostEntityImages Gets the properties of the primary entity after the core platform operation has been completed.
public property PreEntityImages Gets the properties of the primary entity before the core platform operation has begins.
public property PrimaryEntityId Gets the global unique identifier of the primary entity for which the pipeline is processing events.
public property PrimaryEntityName Gets the name of the primary entity for which the pipeline is processing events.
public property RequestId Gets the global unique identifier of the request being processed by the event execution pipeline.
public property SecondaryEntityName Gets the name of the secondary entity that has a relationship with the primary entity.
public property SharedVariables Gets the custom properties that are shared between plug-ins.
public property UserId Gets the global unique identifier of the system user for whom the plug-in invokes web service methods on behalf of.

CRM 2013 Tool – Sync Filter Manager

I (and everyone who uses Microsoft Dynamics CRM) subscribe to Tanguy Touzard’s excellent blog Dynamic CRM Tools .  For those of you who don’t know about Tanguy he is a CRM MVP and has created many many tools for Microsoft Dynamics CRM.

In fact when I think we  should get Tanguy to change his surname to TOOLzard

The best thing about Tanguy’s tool is it’s completely free and available on codeplex, click here to get it, it has the catchy name

He has created a swiss army knife tool, which has all these tools/plugins inside it

Solution Transfer Tool
Access Checker
Attribute Bulk Updater
Audit Center
FetchXml Tester
Iconator
Metadata Document Generator
Privileges Discovery
Role Updater
Script Finder
SiteMap Editor
Solution Import
Easy Translator
View Layout Replicator
Web Resources Manager

but today people he has added another tool to the growing list and he calls it

The Magical Sync Filter Whizzbang Manager

well actually he didn’t call it that but I think if he did it would definitely make it sound more exciting, the real name is

Sync Filter Manager

Here is a picture of the tool

The next question you are asking yourself is what does it do and why is it good.  Well the tool allows you to globally manage users filters and this very useful because usually each user has to manage their own filters but in reality what this really means is a CRM person has to go to every laptop and setup and manage the filters which can take quite a lot of time and involve synchronizing schedules so people are in the office etc.

here is what the tool can do

With this tool, you can:

  • List and delete System Synchronization filter: These filters applies to all users and users can’t change them.
  • List, delete, define as default and apply Synchronization Filters Templates to users: These filters applies to users you choose and users can delete these filters if they want to. (Note: Although there can be multiple filters per entity listed in the Default Local Data Rules, CRM only allows one rule per entity to have the “Is Default” attribute set to “True” – Only Default Local Data Rules where the “Is Default” attribute is “True” will be copied to the selected user when a user is ‘created’ or ‘reset’)
  • List, enable, disable and delete Users synchronization filters: They are the filters currently in use for users.
  • List System views. You can also create a system rule or a rule template from a system view. It is also possible to update an existing system rule or rule template from a system view.
  • List users: This action will replace all synchronization rules for the selected user(s) with the organization’s default local data rules. Any user-created rules will be removed.

 

If you have used Tanguy’s tools and it has helped you out then you can thank by giving him some money via paypal on his blog

http://mscrmtools.blogspot.co.uk/

 

 

Microsoft Dynamics CRM 2013 Update Rollup 1 is available

It was released yesterday but I clearly was snoozing and wasn’t fully awake

go the link to go get it – http://support.microsoft.com/kb/2891271/en-us

When I went to the page there is a big button on the top with the words

HOTFIX DOWNLOAD AVAILABLE 

ahhh yes I thought, it’s release one I bet there are some important fixes in this release. On the page it does say there are are no manual hotfixes which is a good sign

At my recent Christmas do one of our Ciber consultants has done two projects using the CRM 2013 beta, now that really is living on the edge, so I’m sure those customers will be glad to see a new Rollup is available.

Below is a list of the issues resolved in this rollup

  • Publishing a CRM report fails as the parent report already links to another report with same name.
  • Invalid Argument when navigating to view with related entity lookup.
  • The chart (for any other entity) does not display in Korean due to System.ArgumentException: “Value of ‘Malgun Gothic, Segoe UI, 9.5px’ is not valid for ‘units’.”
  • Script error occurs when moving from a form. “Unable to get property ‘get_filterType’ of undefined or null reference”
  • Disabling checkbox fields using the JavaScript API does not work.
  • Creating a workflow to update an appointment with fields from the regarding Lead field fails. “An unexpected error occurred.”
  • Hiding the last field of a section does not hide the section. Hiding the last field of a tab does not collapse the tab.
  • Unable to create automatic full address field workflows, as the spaces and tabs are removed if there are no other symbols like comma.
  • Using the Quick Search in Outlook and clicking Advanced Find right afterwards, the Advanced Find filter is populated with irrelevant criteria.
  • Re-import of existing solution fails with The label for base language code 1033 is not set.
  • Users cannot associate multiple records at once for N:N relationships.
  • CRM 2013 no longer warns you when you are about to delete a parent record that child records with cascade delete set on their relationships to the parent will also be deleted.
  • Unable to set a web resource to visible in script if ‘Visible by default’ not set in designer.
  • You´ve created a new business process flow and assigned that process flow to the security role of “sales manager”, “system administrator” and “system customizer”. You publish this modification and expect the process the be visible only for these security roles.Instead the BPF is hidden for all users.Instead the BPF is hidden for all users.
  • When data is entered into a form, the Save button can be clicked multiple times which results in multiple of the same record being created.
  • For a custom duration field Xrm.Page.getAttribute(“durationfield”).getValue() method returns a formatted value like30 minutes instead of 30 as expected.
  • When organization is deleted and then immediately imported back, import organization wizard unexpectedly displays a warning about version mismatch.
  • Autosave off: Entity form looses command bar after navigating away and re-opening.
  • Consider you’ve created a Business Process for cases having a related task stage with several steps and you’d like to translate all stages to different language. Your solution contains task and case entity as well as Business Process. You’re exporting translation files and try to edit those. You’ll find all stage names from case entity, but you do not find those of the related task step. Therefore you cannot translate those.
  • “Email a link” URL does not navigate to the specified entity if opened in existing browser tab.
  • Errors occur when using different country formats with currency attributes.
  • When browsing to various locations in CRM, a JavaScript exception is thrown that reports “Object expected”.
  • The .addCustomFilter javascript function does not work properly.
  • Workflow triggered on Before Delete event cannot be imported in a new organization.
  • When email activity with unresolved email recipient is created and saved, on load on email, value in TO field is hidden, field is empty.
  • Not able to see “Page Index” on subgrids from dashboards.
  • Published customization changes do not roll down to mobile client consistently.
  • Opportunity closed as won does not take custom status reason while closing.
  • Notes control shows time but not date for notes created before yesterday.
  • Mobile clients crash with UI Error: “We’re sorry. Sorry, something went wrong while initializing the app. Please try again, or restart the app”
  • Access team does not use correct metadata driven by Advanced Find view and hence fails in Mobile Clients.
  • If you create a new email message in the Microsoft Dynamics CRM 2013 web application, you discover that you cannot modify the Description field when using the latest version of Google Chrome.