The previous article on 10 tips for success when designing solutions when implementing CRM Solutions was very well received by many of you! It is always heart warming and encouraging to know that the work put into the blog is appreciated.
Last week we did an CRM UG Encore on this subject, so if you want to see this presentation on the net you can do so by viewing the recording here: https://attendee.gotowebinar.com/recording/2176751919296428290
Marcus Erlandsson at CRMRocks (https://www.facebook.com/crmrocks) also had a nice chat with me on the subject and I must say that the discussion we had really gave it something extra. If you like the subject, listen to all of it, and do miss the other nice stuff Marcus has done.
http://crmrocks.com/?p=329
I'm in the middle of trying to move some AD:s, not my cup of coffe, but someone gotta do it, and it's too close to x-mas to get help. Wish me luck... not sure I will be able to blog before christmas so Merry Christmas everyone!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
"Always start with where the error is, then what the error is" I am MVP, founder and CTO at CRM-Konsulterna AB a company specializing in only Microsoft Dynamics CRM.
Monday, December 21, 2015
Thursday, December 03, 2015
10 Tips for Success designing solutions for Dynamics CRM
A few weeks
ago I was in Reno, attending the CRM User Group Summit as a presenter and of
course CRM UG Medic. My most visited presentation with more around 80
participants, was on 10 tips for success designing CRM Solutions.
The general
idea is when designing solutions for Dynamics CRM there are some things that
you have to take special care for and that I often see people missing, so it is
partly in the positive, ie DO this, but also in the negative, DON’T DO this.
1. Most important issues first
Make sure
to focus on what is really important for the business when implementing CRM.
Too often focus is put on technical details instead of the issues that really
make differences for the business. Like making sure to never miss a quote,
never miss following up a lead and how the system is to support this.
Sadly often
a lot of effort is instead put into making more or less perfect solutions,
especially when working in more classical waterfall project methods when it is
not uncommon that an improportial amount of effort is put into fixing rather
insignificant features and features of high business impact are almost over
looked as “trivial”.
2. FIT-GAP
Base your
requirements on Microsoft CRM. Not on a blank sheet of paper. Some organizations
start off with trying to set requirements in a very general which might be
useful if you do not know if it is a CRM system that you are choosing. However,
the market is changing and more and more customers are becoming more and more
aware and have come further in their decision process prior to contacting a
partner or setting down any requirements. This usually results in the fact that
many organizations buying CRM already have chosen a CRM system when contacting
a partner, and hence defining requirements from the bottom up is not very
useful, it is a lot better to start from the system that has been selected and
based on this, look at what is missing.
Other beneficial
aspects of this can be that when defining requirements without the context of a
system, it is easy to get fixed on a certain way of solving a problem. If
instead, starting with a particular CRM system, it is much easier to define
what is missing or what needs to be changed in order for this system to work
for us, without being locked down by previous conceptions of how a particular
problem should be solved that were agreed upon during the requirement
gathering/analysis phase.
The most
typical non-fit-gap requirements I have seen are public procurements. In these
cases the procuring entity believes that it is more objective to not decide on
a system before hand and hence define the entire CRM system in the
requirements. It is not uncommon in these requirements to see requirements such
as:
·
Ability
to list all companies showing name and address of company
·
Ability
to edit company information from several different computers with different
user logins
And so on.
Imagine
trying to define all features of Dynamics CRM this way. Horrible.
It is much
easier to start with let’s say Dynamics CRM 2015 and then have requirements
such as:
·
New
field for storing Company Credit Level on account in the following levels AAA,
AA, A, B, B-
·
Only
specific group of users are to be allowed to change Company Credit Level on
account.
It becomes
a lot more to the point.
3. CRM
Functional Knowledge
Know what
Dynamics CRM does from a functional perspective out of the box.
-
What
is Sales Force Automation?
-
How
does customer service work?
-
What
is customer centricity/360 degree customer perspective?
-
How
do you manage a campaign in CRM?
These are
things that the people involved in implementing the CRM system need to know. I
have seen many implementations where this skill is lacking, it can usually
result in existing features being recreated with code, increasing total cost of
ownership for the solution. It may also reduce the ability to install addons as
these usually are based on the built in features being used.
4. CRM
Technical Knowledge
Technical
knowledge of the platform is also a vital skill when implementing CRM. These skills
include;
-
Configuring
CRM
-
Developing
CRM
-
Installing
CRM On-Prem
-
Setting
up CRM-Online
-
What
are supported customizations
-
How
to minimize TCO of customizations/developments
-
Peculiarities
of CRM
o
Native
vs manual N:N relationships
o
Date
only limitations of multi time zones
o
Visible
data model
-
Best
practices of developing in CRM
o
Using
solutions and publishers
o
Application
Lifecycle management (ALM) with Dynamics CRM
o
Solution
framework limitations and deployment strategies
As these
skills range from high level solution architecture, system architecture to
developer and application specialist, it can be hard to find people to fill all
these skills.
Due to this
reason, it is not uncommon that companies employ technical people without
specific Dynamics CRM skills. This often results in data models that are
suboptimal with too high level of abstraction, which can be a good idea in a
classic code-db application where the data model can be hidden, however, in CRM
where the data model becomes very visible, this is not a very good idea.
Another
common problem I see is that application specialist with too shallow technical
skills are charged with designing data models. This can result in data models
that store data in the wrong places, for example account information on contacts
due to not truly understanding how where information belongs. These people
often also lack the skills of designing more complex data models required for
complex problems, which cannot be solved with a too simplistic data model.
5. Business
Knowledge
How does
the customer’s business work? Sad to say so, but someone actually has to know
this when implementing the CRM system. It seems obvious to most of you I hope,
but trust me, I have seen and heard the weirdest things, like “oh, you want to
book meetings with a customer several
times, well, you should have said so”. Some things are so self evident that
most people would never think to put them into a requirement.
This skill
cannot only be on the customer side, people with some technical skills have to
have some business skills as well. Common examples can be that an organization
that are moving from an old CRM-system to a new are using sub-optimal business
processes due to the fact that the old system limited what they could do, or
they might have grown or transitioned. When challenging the business processes
that are put into the requirements, it might soon become evident that the best
action might actually be to reengineer the business processes to make them
leaner and better fit the new organization and also what the new system
actually can do. The benefits of this can be many, like faster processes
involving fewer steps, higher level of automation and higher quality control
abilities to mention a few. However, it is important to understand that it is
also scary for an organization that thought they might just start Dynamics CRM
Online to get some boost in their sales who start to realize that they might
need to undergo a larger organizational change management effort, whatever the
potential long term benefits of these are, as not all organizations have the
luxury of being able to act in a long term fashion. Hence approaching this
subject carefully, is probably advisable.
It is also
essential to have a clear high level vision for what role the system is to
play, what is its purpose? Sometimes this vision is either non-existent or very
blury resulting which makes it complicated to prioritize and focus the
implementation on what is important. A simple verison might be to make sure to
never drop a single lead and follow up on every quote in a timely manner. Then
that vision can guide prioritization of requirements during the implementation.
I have seen
this lacking often in several different ways. Sometimes it is simply that a
customer explains how they work and then that is implemented, even if the
underlying processes that the system is to support are obviously sub optimal,
without any discussion with the customer. Many customers I work with,
appreciate it when I ask why they want to implement something a certain way,
why they work a specific way and what the business goals they are trying to
support with the process are.
Another
common error I see is that when Dynamics CRM is to be implemented, the
requirement is “It is to work and look as much as the old system as possible,
but with all the cool features of Dynamics CRM”. This implicitly means that all
the old processes are to be used, nothing is to be rethought or reengineered
despite the investment in the new system. These implementations very seldom
become a hit, and the TCO of maintaining them are usually a nightmare since a
lot of code and weird customizations are required to make the system act and
look like the old. And the fact is that it never will, especially if the old
system was a tailor made, since those systems will always have specific areas
which will have an edge on an off-the-shelf system like Dynamics CRM. The
benefits of a system like Dynamics CRM are that you will get so much more bang
for the buck in OOB features, investments and maintenance that it will be worth
it every day of the week, as long as you are can stay within the bounds of what
the application supports.
6. Business
Goals and requirements
The picture
above shows the typical process of how functional and non-functional
requirements are based on business goals and then technical requirements are
based on functional requirements.
What I have
often experienced is that customers come to us directly with a technical
requirement, for example “Please put a dropdown with the values X, Y, Z” on the
account form.” Without actually describing the functional background to it or
even less the business goal behind that.
The other
common scenario, typical in large tenders, like public tenders, are that the
different parts are handled by different people and you are handed a list (in
excel typically), with a list of technical or sometimes functional,
requirements to which you are to respond to if you and your proposed solution
can meet to a different defined degrees. Sad to say, but these lists often set
me off laughing, but I guess I should be crying since it is sad, as it is a
very sad way of trying to handle requirements.
The people
trying to describe these requirements, if they are technical requirements would
need very high level of expertise in Dynamics CRM to be able write the
requirement properly, and hence almost already have designed the system,
pulling out the mat from under the feet from the supplier as this is typically
what you would expect them to do.
Hence the
arrows underneath pointing back, which indicate what I recommend, that is to
never accept a technical requirement without understanding the
functional/non-functional requirement behind it and also the business goal
behind that and making sure that the technical requirement is actually the best
way of solving that part of the business goal and functional requirement.
Perhaps both the functional requirement and the technical requirement should be
re-written to give a better fit to the system. To some of you, who are used to
working in what is called fit-gap perspective, this is a more natural way of
working, where you start with the vanilla system and see what is missing from
there.
If done
properly, and with the trust of the customer, this can greatly reduce the costs
of implementation and maintenance. For example, implementing a technical
requirement a specific way might require creating or purchasing a third party
editable grid, as the technical requirement describes that changes are to be
able to be done directly in the grid. However, when the business goals are
examined, this might not at all be so critical, it might just be that it the
person who wrote the technical requirement didn’t know that this is hard to
implement, and by changing this so that changes are done using a standard form,
the implementation can be greatly simplified.
The hard
part of trying to understand the entire process, from business goals through
functional requirements to technical requirements and how these fit Dynamics
CRM and then being able to reverse the process
7. User
centric
Make it
productive and they will use it! Business managers are naturally the people
setting the requirements for a CRM system but it is important to remember that
it is the normal end users that are the ones that most often will use the
system. When working with sales force automation, I often say that it is
important to make a sales automation system, not a sales manager automation system. It is sometimes
better to have a system with 95% or 98% of all customer records up to date but
with only a few fields than 60% of the all customer records with all fields you
could fathom.
As far as I
have understood it, during the late 1990:ies a lot of CRM-implementations
failed and for a few years the entire industry had a down period. Microsoft,
when envisioning Dynamics CRM, looked at what the reasons were for the failures
of these old systems and found that carrots and sticks had typically been the
only motivators used, which had a very limited success rate. Based on this,
they decided that a better approach would be to focus Dynamics CRM on personal
productivity. Or in other words, making the system so usable for each
individual in their own work that they choose to use Dynamics CRM instead of
other alternative programs. Despite the fact that Dynamics CRM is based on this
principle, it is also very versatile and has many customization options, so
this vision for individual business productivity, can easily be broken by an
implementor not adhering to this concept.
Consideration
also has to be taken on what will happen if your system is not engaging enough,
if users do not find it useful enough, my typical answer is that they would
probably use Excel to keep track of their personal items. Excel is a hugely
versatile tool, especially for 1 or only a few users on the same file. Hence,
your mindset should always be to be a lot better, for each individual user,
than Excel.
There has been
a lot of research on the subject on how to motivate people and what does not
motivate them. The interesting thing with this is that it shows that monetary
motivators only work for manual labor, not for more creative or more cognitive
work. Hence it is also important to align the system with this. If you want to
see more on the subject, here is a YouTube clip showing it in a popularized
version: https://www.youtube.com/watch?v=u6XAPnuFjJc.
8. CRM
System is just a system
Microsoft
Dynamics CRM is just a system after all, and it will not fix broken processes
or broken organizations. For this you need good management and perhaps even the
aid of good management consultants (note the word “good”, not just any
management consultant will do here…).
Sometimes
people call me and ask me to install Dynamics CRM so that they can get their
sales sorted out. Or they call me say that they just installed or activated CRM
Online and want some training. This rings some warning bells in my head and I
hope it does so in yours as well.
Sometimes
happy salespeople, working both with Dynamics CRM and with competing software,
promise the world with the CRM system. “Just start using the system and
everything will sort it self out! You’ll see!” – well, I’ve been in a couple of
implementations (somewhere between 50 and 100) and that’s not what I’ve seen.
If the organization
already is using a CRM system and you replace that with Dynamics CRM, then your
chance of success, is of course higher, as the company culture already includes
working in aligned processes in the CRM system. However, if it doesn’t and the
organization is just implementing CRM from scratch, which is where you have the
most to gain, you also have the most to do as people are usually not aligned in
harmonized processes but work as the like in their own separate ways and trying
to force a CRM system on top of that will just not work.
9. Align
with release cadence
So, you
have designed a great solution, 230 new entities, approximately 2 M lines of
code ontop of Dynamics CRM Online, customer is buying, sales guy is getting a
huge bonus and your manger is happier than ever. Looks like you are set for
life.
And then
Microsoft rolls out a new version of CRM Online every half year and you never
manage to finish your project as more and more development effort is put into
maintaining the code for every new release. Customer is not so happy any more,
sales guy has quit and moved to another company, and your manager is wondering
what to do if the customer actually will sue, as they threatened to do, as you
broken deliver plan after deliver plan. You seriously consider changing jobs
but wouldn’t it be nice to have finished this properly?
Not sure if
the story above is true, but it wouldn’t surprise me. Microsoft have decided on
an aggressive release cadence to be able to bring new features to the market in
time. Independently of if your CRM is in CRM Online or on-premise you need to
establish a strategy for how to handle upgrades. With CRM Online, there is not
that much lee room but with CRM on-premise you can for instance have a strategy
of upgrading every other version half a year after the release. That will make
it a lot easier to plan for it.
If you are
not aware of it, the release plan from Microsoft are that the major versions
are release late in Q4 and the minor version (only online) are release in Q2.
10. Addons
There are a
lot of addons available to Dynamics CRM and these can bring great value to you
system at a low cost. However, you do need to think about the kind of addon you
are installing. I like to do the following classification of addons:
1. CfMD
2. Dedicated product company
3. Other CRM Specialist
4. External Addon supplier
5. Open Source
Note that
these are not in any falling order. I will try to elaborate a bit more on each
of these.
CfMD –
Certified for Microsoft Dynamics
A product
for Dynamics CRM (and the other Dynamics products) can get the CfMD –
certification by going through a process which is rather bureaucratic and at
the time of writing this post, broken. However, to get you product certified
you have to jump to quite a few hoops which is costly and requires that the
product has been on the market for some time as one of the hoops is that it has
to have some customer references.
Dedicated
product Company
Most of the
companies suppling CfMD products are dedicated product companies. This means
that their entire existence is based on selling products and support of their
products. Hence they are very keen to keep up with Microsoft’s release cadence
and have a well-functioning support organization.
Other CRM
Specialist
These
companies are typically system integrators, consultancies, value added
resellers and similar. Their focus lies more in one-offs, understanding the
customer’s needs, adapting Dynamics CRM to those needs. Some of these companies
have decided to try to make products out of what they have learnt from several
project. These might be horizontal solutions, such an integration product to a
credit service, or a vertical like a financial services solution. The upside of
this is that these companies usually have a deep understanding of CRM and the
product they make is usually technically sound. However, the downside is that
they are at core not a product company, they sell services. This usually
surfaces in two manners. One is when the software needs an upgrade. In this
case, a normal product company will have thought of this, in their normal
product roadmap which of course is in harmony with the Microsoft cadence. Hence
the license cost at a dedicated product company covers the upgrade cost.
However, the service based companies typically do not have this mindset. They
think more in trying to sell hours and will therefore try to get a customer to
pay for the upgrade project, which sometimes succeeds due to good salespeople.
The other
time it surfaces is in support. Dedicated product companies usually have
support included in the subscription fee/license fee but service companies sell
services by the hour and if you call a consultant, you will be charged by the
hour.
Do note,
that these are generalizations and there are of course exceptions to these, but
my general recommendation when looking at addons is to look just as much at the
company supplying the addon as on the addon itself. You will probably be
entering a relationship for some time so it had better be a good company.
External
Addon supplier
These are
tricky, typically a company with a particular product seeing Dynamics CRM:s
position in the market and wanting to integrated with it so they make their own
integration, for CRM 2011 and then they don’t keep track of time and cadence.
As an example anyway. Can be CTI integration to a VoIP phone, even certain
verticals. I have just as recent as last week gotten a request from a customer
for a training for CRM 2011 due to a addon not being upgraded. I have also had
requests from new customers saying that they would like CRM 2011 Online as they
want this and that addon and it only supports CRM 2011 Online. In Sweden we
have a company supplying company credit and financial information which had an
integration made, and not upgraded.
Open Source
There are
many open source projects for Dynamics CRM. Many people love open source and it
can sometimes be nice but you need to be very careful about it as you have no
control of if the people developing the product will continue doing so or not.
Also there is typically no support to get. However there are some great
indispensible open source projects for Dynamics CRM, most namely xrmToolBox, by
Tanguy Touzard which included a ton of nice tools.
+ Be part of the community
Number 11,
I just couldn’t leave this one out. Of course you should use the great Dynamics
CRM community. There are tons of great blogs and stuff on forums. So if you
goog… Binged your questions a couple of times too many, don’t be afraid to ask.
And you don’t have to be best in the world in a subject to share. Remember that
everyone has always been a beginner, and might want to learn from your road to
greatness. So, start your CRM blog today. It is never too late, and never too
late to take it up again if you stopped.
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Tuesday, December 01, 2015
Dynamics CRM 2016 Released
Finally it is here! Dynamics CRM 2016 was announced yesterday as general availability. If you havn't tried it yet, do spin up a trial to test it out.
By the way, when doing that, don't do it the normal way, start an Office E3 trial by going here first https://products.office.com/en-us/business/office-365-enterprise-e3-business-software
and then start a CRM trial from within that. That way you can try out the SharePoint integration with OneNote etc. which is a lot harder to do if you just start a normal trial.
So, what is new? Well, Microsoft are kind enough to write a help page telling us! If you press the question mark in the right hand corner in CRM you will come to CRM Help & Training. At the bottom there is a "What's new link" which will show you, just that.
Personally I really like the excellent Interactive Service Hub but I really hope it will be a bit better integrated into the rest of the system.
The new solution framework also promises a lot. It is an area which a lot of us have been wishing for new stuff for a long long time. Sadly I havn't had time to dive deep into it yet, and you really need several instances to test it fully!
The new word and excel document generation functionality is also great!
In short, get cracking!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
By the way, when doing that, don't do it the normal way, start an Office E3 trial by going here first https://products.office.com/en-us/business/office-365-enterprise-e3-business-software
and then start a CRM trial from within that. That way you can try out the SharePoint integration with OneNote etc. which is a lot harder to do if you just start a normal trial.
So, what is new? Well, Microsoft are kind enough to write a help page telling us! If you press the question mark in the right hand corner in CRM you will come to CRM Help & Training. At the bottom there is a "What's new link" which will show you, just that.
Personally I really like the excellent Interactive Service Hub but I really hope it will be a bit better integrated into the rest of the system.
The new solution framework also promises a lot. It is an area which a lot of us have been wishing for new stuff for a long long time. Sadly I havn't had time to dive deep into it yet, and you really need several instances to test it fully!
The new word and excel document generation functionality is also great!
In short, get cracking!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Wednesday, November 04, 2015
Vids from TechDays
My new colleague Veronica Kamph and @ tech-days |
step method for Change management when implementing CRM to reduce the risk of bad user adoption and making sure that you make the organization accept the system. This presentation was a re-visit as I have held it before several times and presentations are just like training, they do get better and better the more times you do them. I have also written about it on this blog.
https://channel9.msdn.com/Events/TechDays-Sweden/TechDays-Sweden-2015/Change-CRM
I also held a presentation on how to set up CRM 2015 from scratch and see how much could be done in an hour. However, I was very unlucky as the CRM provisioning service was unavailable during the time of the demo, after a few minutes of trying, I switched to an instance I had set up the day before. The effect of this, however, was that the full effect of the demo, to set it up from scratch, was not fully achieved, but if you have not seen Dynamics CRM in action before, do check it out as I show some of the extensibility features and how easy they are to work with. And for those of you who wonder, the CRM provisioning service is very seldom down, this was the first time I had ever experienced it.
https://channel9.msdn.com/Events/TechDays-Sweden/TechDays-Sweden-2015/CRM-2015-0-to-200-in-an-hour
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Sunday, October 04, 2015
Rumours of Yammer's terminal health
Just read a very interesting post by Wictor Wilén, a SharePoint MVP here in Sweden. He strongly argues that Yammer is planned for termination by Microsoft and lists several, very good reasons for this. Do read it.
Why is this important for us working with Dynamics CRM? As you might know there is a built-in integration between Dynamics CRM and Yammer, where Yammer can be used to replace the Activity Feeds. This gives the organization using the Dynamics CRM system increased use of the feed functionality, as most of the features of Yammer Enterprise can be used directly from within CRM. It will create a thread for each record. For more information on how to set it up and how it works, read this Tech Net article: https://technet.microsoft.com/library/dn850385.aspx.
Recently, in CRM 2015 Spring Update (version 7.1) it is also possible to integrate CRM to Office Groups. If you read Wictor's Post, you will note his referal to how this most likely is the informal successor to Yammer internally within Microsoft. The Office Groups integration makes the collaboration Picture in Dynamics CRM even more complicated as there now are Three different ways of collaborating;
- Activity Feeds
- Yammer
- Office Groups
However, if Yammer really is to be deprecated, then this Picture clears a bit.
Another interesting fact is that there has been nothing done to the Yammer integration in CRM for several versions. It was released for CRM 2013 and it still has a lot of basic features missing, like if it is enabled for an organization, it cannot be removed. (https://msdn.microsoft.com/en-us/library/jj945277(v=crm.6).aspx)
If Yammer was to be officially terminated, do note that Wictor (and I in this post) are just speculating, migrating the existing data from Yammer to ActivityFeeds or OfficeGroups is also a non-trivial issue. As Wictor mentions briefly in his post, the Yammer API:s have some areas which can be improved.
So, based on this. I would not advice any current CRM system owners to enable the Yammer integration unless Microsoft starts investing in Yammer and/or the CRM-Yammer integration.
I would also be more than happy to have a discussion on this subject in the comments section below.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Is Yammer breaking up? |
Recently, in CRM 2015 Spring Update (version 7.1) it is also possible to integrate CRM to Office Groups. If you read Wictor's Post, you will note his referal to how this most likely is the informal successor to Yammer internally within Microsoft. The Office Groups integration makes the collaboration Picture in Dynamics CRM even more complicated as there now are Three different ways of collaborating;
- Activity Feeds
- Yammer
- Office Groups
However, if Yammer really is to be deprecated, then this Picture clears a bit.
Another interesting fact is that there has been nothing done to the Yammer integration in CRM for several versions. It was released for CRM 2013 and it still has a lot of basic features missing, like if it is enabled for an organization, it cannot be removed. (https://msdn.microsoft.com/en-us/library/jj945277(v=crm.6).aspx)
If Yammer was to be officially terminated, do note that Wictor (and I in this post) are just speculating, migrating the existing data from Yammer to ActivityFeeds or OfficeGroups is also a non-trivial issue. As Wictor mentions briefly in his post, the Yammer API:s have some areas which can be improved.
So, based on this. I would not advice any current CRM system owners to enable the Yammer integration unless Microsoft starts investing in Yammer and/or the CRM-Yammer integration.
I would also be more than happy to have a discussion on this subject in the comments section below.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Sunday, September 20, 2015
CRM 2016 Preview Guide with comments
CRM 2016 - The Preview is under way! If you havn't checked it out already, the Release Preview Guide is here: http://t.co/iH5IoBbF9Q! It is loaded with hot new features some will be available for both on-prem and online but some only for online, I am sad to say.
So why is this? Perhaps you have heard or seen "Cloud First, Mobile First", Satya Nadella's new Mantra, it is hence not only the Dynamics CRM mantra, but the entire Microsoft Mantra, with a large and very bold M. What that spells for on-prem is unclear at the moment. Microsoft are still, as we can see developing new versions of On-prem, and there are some very large customers running CRM On-prem which cannot so easily be moved to the cloud for many reasons. I'll get back to that further down. So, I do Think we will see on-prem being kept alive for several more years but the trend that the we are seeing in the CRM 2016 Release Preview Guide and have seen previously as well, that some features will be release first or only for online, is probably going to be even stronger. This will probably be more true in regards to integrations with integrations to aquired Products such as MSE, MDM, Power BI and so on. If you are currently thinking of starting up a CRM Project, the choice of CRM on-prem or Online needs to take this into consideration.
Ok, so there are a lot of cool new features, any of these that I especially like? Yes, of course there are!
Document Generation
One of the most common problems we have with CRM that we cannot fix without huge amounts of development or Mscrm-addons excellent Product Document Core Pack is to simply generate a Word document (Quote document) from a quote wiht a couple of quote lines. It needs to be very Quick, just a few clicks, and also modifying the template needs to be simple enough for a reasonably skilled sales manger to handle. This is something that is coming in CRM 2016, maybe not to the full extent of DCP, but at least to the basic need, and I am one of many who have asked for this since CRM 3.0. I just hope it is all I wish it is!
Guided Help
The help functionality in CRM has previously been rather hidden away and not used that much by most users. This has resulted in poor user adoption and increased cost of support and training. The Guided Help is an overlay help which can help the user along as he or she uses the system which makes it very natural.
Increased support for high demand customers in CRM Online
I Work with several high demand customers and have also trained several others and have discussed the pros and cons of CRM Online. Most of these are very hesitant to move to CRM Online due to some of the following reasons:
- Backup/Restore functionality is not granular or on-demand to their requirements. Cannot be downloaded.
- Performance tuning cannot be done
- They need to make sure/prove that the data cannot be accessed outside their network
- Data warehousing with large data - for instance tables with 10M-100M records - charts break at 50k
There are several parts of the 2016 release that address these high demand Customer needs, like
- First versions of TDE, Transparent Data Encryption - which will allow encryption of CRM data. Do read the details of this, not ful ownership of key by Customer yet.
- Data performance Dashboard - enable admins to understand what is using system Resources to better optimize system.
- New data centers, a closer data center will decrease latency, an important factor in CRM performance.
- Bulk Data Loader - Allows for bulk data import and export to CRM. Still early version, but promising.
There are still things to do in this area though and I Think that some customers may still choose on-prem over on-line.
Making Carina (7.1) features availble for on-prem
This isn't actually in the document, but one of the greatest things of the CRM 2016 release is that all (most anyway) of the awesome stuff from the Carina or 7.1 release will be made available for CRM On-premise. The most noteworthy of these features are (please yell in the comments if you don't agree!)
- The new navigation - The navigation in Carina is so much better than 2015 RTM or 2013. So if you are running any of those versions, this single feature is reason enough to upgrade!
- Turbo forms - Weird name by the way. What will they call it when they make these faster, super ultra forms? :) Anyway, they are great. Especially if you are have many users accessing CRM with high latency (use /tools/diagnostics/diag.aspx to check from their computers). You might need to redesign your js-code in your forms, put all libs in one per form as you cannot Control the sequence it loads, but it is worth it from a user perspective.
- Theming - Colors are nice. Make your users feel at home with some custom colors and their own logo.
That's it. Summary over. Read the document yourself and make up your own mind and leave a comment if you feel something or not. Always nice to have a discussion!
If you are a CRM User, you can drop by CRM UG Sweden Chapter meeting on Wednesday and discuss this and Other stuff as well, 3 pm CET at Microsoft in Kista outside Stockholm.
I'd also like to thank Gus Gonzales, Donna Edwards and Adam Vero for the input for this article, it is based partly on the conversation we had yesterday on the CRM UG Medic Friday Online Event. If you are interested in attending next time we have one of our sessions, it is on dec 18. If you don't know the concept, we sit there and you ask us impossible questions about your CRM systems and we try to answer them as best we can without looking like fools. :) It is usually fun!
Otherwise, I hope to see you at the CRM UG Summit in Reno in October or at Techdays in Stockholm.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
So why is this? Perhaps you have heard or seen "Cloud First, Mobile First", Satya Nadella's new Mantra, it is hence not only the Dynamics CRM mantra, but the entire Microsoft Mantra, with a large and very bold M. What that spells for on-prem is unclear at the moment. Microsoft are still, as we can see developing new versions of On-prem, and there are some very large customers running CRM On-prem which cannot so easily be moved to the cloud for many reasons. I'll get back to that further down. So, I do Think we will see on-prem being kept alive for several more years but the trend that the we are seeing in the CRM 2016 Release Preview Guide and have seen previously as well, that some features will be release first or only for online, is probably going to be even stronger. This will probably be more true in regards to integrations with integrations to aquired Products such as MSE, MDM, Power BI and so on. If you are currently thinking of starting up a CRM Project, the choice of CRM on-prem or Online needs to take this into consideration.
Ok, so there are a lot of cool new features, any of these that I especially like? Yes, of course there are!
Document Generation
One of the most common problems we have with CRM that we cannot fix without huge amounts of development or Mscrm-addons excellent Product Document Core Pack is to simply generate a Word document (Quote document) from a quote wiht a couple of quote lines. It needs to be very Quick, just a few clicks, and also modifying the template needs to be simple enough for a reasonably skilled sales manger to handle. This is something that is coming in CRM 2016, maybe not to the full extent of DCP, but at least to the basic need, and I am one of many who have asked for this since CRM 3.0. I just hope it is all I wish it is!
Guided Help
The help functionality in CRM has previously been rather hidden away and not used that much by most users. This has resulted in poor user adoption and increased cost of support and training. The Guided Help is an overlay help which can help the user along as he or she uses the system which makes it very natural.
Increased support for high demand customers in CRM Online
I Work with several high demand customers and have also trained several others and have discussed the pros and cons of CRM Online. Most of these are very hesitant to move to CRM Online due to some of the following reasons:
- Backup/Restore functionality is not granular or on-demand to their requirements. Cannot be downloaded.
- Performance tuning cannot be done
- They need to make sure/prove that the data cannot be accessed outside their network
- Data warehousing with large data - for instance tables with 10M-100M records - charts break at 50k
There are several parts of the 2016 release that address these high demand Customer needs, like
- First versions of TDE, Transparent Data Encryption - which will allow encryption of CRM data. Do read the details of this, not ful ownership of key by Customer yet.
- Data performance Dashboard - enable admins to understand what is using system Resources to better optimize system.
- New data centers, a closer data center will decrease latency, an important factor in CRM performance.
- Bulk Data Loader - Allows for bulk data import and export to CRM. Still early version, but promising.
There are still things to do in this area though and I Think that some customers may still choose on-prem over on-line.
Making Carina (7.1) features availble for on-prem
This isn't actually in the document, but one of the greatest things of the CRM 2016 release is that all (most anyway) of the awesome stuff from the Carina or 7.1 release will be made available for CRM On-premise. The most noteworthy of these features are (please yell in the comments if you don't agree!)
- The new navigation - The navigation in Carina is so much better than 2015 RTM or 2013. So if you are running any of those versions, this single feature is reason enough to upgrade!
- Turbo forms - Weird name by the way. What will they call it when they make these faster, super ultra forms? :) Anyway, they are great. Especially if you are have many users accessing CRM with high latency (use /tools/diagnostics/diag.aspx to check from their computers). You might need to redesign your js-code in your forms, put all libs in one per form as you cannot Control the sequence it loads, but it is worth it from a user perspective.
- Theming - Colors are nice. Make your users feel at home with some custom colors and their own logo.
That's it. Summary over. Read the document yourself and make up your own mind and leave a comment if you feel something or not. Always nice to have a discussion!
If you are a CRM User, you can drop by CRM UG Sweden Chapter meeting on Wednesday and discuss this and Other stuff as well, 3 pm CET at Microsoft in Kista outside Stockholm.
I'd also like to thank Gus Gonzales, Donna Edwards and Adam Vero for the input for this article, it is based partly on the conversation we had yesterday on the CRM UG Medic Friday Online Event. If you are interested in attending next time we have one of our sessions, it is on dec 18. If you don't know the concept, we sit there and you ask us impossible questions about your CRM systems and we try to answer them as best we can without looking like fools. :) It is usually fun!
Otherwise, I hope to see you at the CRM UG Summit in Reno in October or at Techdays in Stockholm.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Tuesday, August 25, 2015
Federated user unable to configure CRM for Outlook
When using federated users in a CRM Online, we encountered an error where accessing the CRM worked fine, but accessing the system using the Outlook client (configuring it) or accessing it via the tablet client did not work. It seems that some additional settings were required on the AD FS server.
We we working with a customer who had set up a CRM Online with federated users to their AD via their AD FS. When accessing this via the web client, it all worked well, but when trying to configure CRM for Outlook we just got an error "An error has occured. Please contact the system administrator". Our customer's IT manager started a premier support case as I felt this was most probably a AD FS related issue (there were no problems with the non-federated users).
After a couple of screen sharing sessions we got some great help from Pedro R at Microsoft Support and I learned something new which I thought I'd share with you and that is this;
When using federated users in CRM Online and when using IFD CRM with AD FS you have to enable the Outlook and Tablet authentication to pass through the AD FS, otherwise it is blocked.
There is a Technet article on this which can be found here: https://technet.microsoft.com/en-us/library/hh699726.aspx#BKMK_WS2012R2
I think this is often something that might be overlooked why I thought sharing it with you would be a good idea. Maybe you'll find it and save yourself some time!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
We we working with a customer who had set up a CRM Online with federated users to their AD via their AD FS. When accessing this via the web client, it all worked well, but when trying to configure CRM for Outlook we just got an error "An error has occured. Please contact the system administrator". Our customer's IT manager started a premier support case as I felt this was most probably a AD FS related issue (there were no problems with the non-federated users).
After a couple of screen sharing sessions we got some great help from Pedro R at Microsoft Support and I learned something new which I thought I'd share with you and that is this;
When using federated users in CRM Online and when using IFD CRM with AD FS you have to enable the Outlook and Tablet authentication to pass through the AD FS, otherwise it is blocked.
There is a Technet article on this which can be found here: https://technet.microsoft.com/en-us/library/hh699726.aspx#BKMK_WS2012R2
I think this is often something that might be overlooked why I thought sharing it with you would be a good idea. Maybe you'll find it and save yourself some time!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Friday, August 14, 2015
Queue question and the difference between community work and putting food on the table
I received a question per email today and as I Work as a Consultant, Selling my time by the hour, while at the same time sharing my knowledge and experience on this blog and in Other places, I thought I might share my general view on how I separate the Community Work from the Work that puts food on my table.
I am a strong believer in the notion that we need to share knowledge with each other to be able to all grow and be stronger. This is why I started the blog, started CRM User Group Sweden, run Techie After Work (with Allan Varcoe and Peter Björkmarker), present at Conferences where I do not get paid for speaking. If we all do this in the Dynamics CRM Community, it will grow large, new people will quickly learn from the more experienced, and our CRM system, will prosper to all our benefit.
But, I also have to put food on the table, so when people ask me to help them by contacting me by
email or phone, they do actual ask me as a Consultant and I can and will charge for the time I help out. Typically an agreement, including NDA, is signed so that I can help out in a more direct manner, which of course, is different than somebody asking something general in the comment on a blog post.
So, if you have a question to me, regarding a post, I recommend leaving a comment. Sadly, there are a lot of comment spammers out there, looking for some links to their sites, why I need to moderate all comments, as I respect you as readers and I do not want to waste your time with crap comments and irrelevant links to companies trying to sell training or otherwise.
So, on to the question I got, as it was clearly directed as a comment, will answer it in the form of a blog post instead of an email reply, so that others in the Community can also benefit from it.
"I was reading your blog post on sending emails from a queue (http://gustafwesterlund.blogspot.com/2013/02/sending-emails-from-queue-with-email.html) and had a question. I’m using CRM 2015 and trying to set up a queue for sending and I was wondering if the generic address needs to point to a mailbox on the server or if it can be a distribution list or mail-enabled public folder. I’ve tried setting up an existing distribution list address for the email address, but I get errors because it can’t log on to a mailbox, so I didn’t know if it was possible or if there’s something else I need to do instead."
It is a good question. It is not obvious why you cannot use one type of email address or Another, but if you refer to the implementation guide (yes, I know, it is a very large document(s) and hard to navigate, but try to find your way around it) you will see that it says that the email address that you indicate in a queue has to be a user mailbox. It cannot be anything else. There are several different ways of logging in to this, the simplest is to set the credentials in the queue, but this will require you to change the password in the queue every time you change it in the AD. I wrote the Synchronization overview chapter in the CRM Field Guide (http://gustafwesterlund.blogspot.se/2015/04/the-crm-2013-field-guide-is-out.html) and I would strongly recommend that you read this or the similar parts in the implementation guide for more detailed information.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
I am a strong believer in the notion that we need to share knowledge with each other to be able to all grow and be stronger. This is why I started the blog, started CRM User Group Sweden, run Techie After Work (with Allan Varcoe and Peter Björkmarker), present at Conferences where I do not get paid for speaking. If we all do this in the Dynamics CRM Community, it will grow large, new people will quickly learn from the more experienced, and our CRM system, will prosper to all our benefit.
We all have to put food on the table |
email or phone, they do actual ask me as a Consultant and I can and will charge for the time I help out. Typically an agreement, including NDA, is signed so that I can help out in a more direct manner, which of course, is different than somebody asking something general in the comment on a blog post.
So, if you have a question to me, regarding a post, I recommend leaving a comment. Sadly, there are a lot of comment spammers out there, looking for some links to their sites, why I need to moderate all comments, as I respect you as readers and I do not want to waste your time with crap comments and irrelevant links to companies trying to sell training or otherwise.
So, on to the question I got, as it was clearly directed as a comment, will answer it in the form of a blog post instead of an email reply, so that others in the Community can also benefit from it.
"I was reading your blog post on sending emails from a queue (http://gustafwesterlund.blogspot.com/2013/02/sending-emails-from-queue-with-email.html) and had a question. I’m using CRM 2015 and trying to set up a queue for sending and I was wondering if the generic address needs to point to a mailbox on the server or if it can be a distribution list or mail-enabled public folder. I’ve tried setting up an existing distribution list address for the email address, but I get errors because it can’t log on to a mailbox, so I didn’t know if it was possible or if there’s something else I need to do instead."
It is a good question. It is not obvious why you cannot use one type of email address or Another, but if you refer to the implementation guide (yes, I know, it is a very large document(s) and hard to navigate, but try to find your way around it) you will see that it says that the email address that you indicate in a queue has to be a user mailbox. It cannot be anything else. There are several different ways of logging in to this, the simplest is to set the credentials in the queue, but this will require you to change the password in the queue every time you change it in the AD. I wrote the Synchronization overview chapter in the CRM Field Guide (http://gustafwesterlund.blogspot.se/2015/04/the-crm-2013-field-guide-is-out.html) and I would strongly recommend that you read this or the similar parts in the implementation guide for more detailed information.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Wednesday, July 01, 2015
4:th MVP Award!
And again it is the time of the year of waiting...
First of July has for the last three years been horrible. Have I been active enough? Maybe I should have blogged a bit more? Maybe written another book or presented at another seminar... and the clock ticks... and you know that the time in Seattle is a bit later than in Sweden so you just have to be patient, usually the mail doesn't show up until late in the afternoon.
But I have got a trick, look at the MVP site and see if the profile has been updated, so I checked, and it did say that I now was on my forth year. But, the email. You need the email. Some loose it in their junkmail. The email is the final proof, The site might be wrong.
And the clock ticked. Tock.
4 pm. Maybe I'll see more if I logg in to the MVP-site.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
First of July has for the last three years been horrible. Have I been active enough? Maybe I should have blogged a bit more? Maybe written another book or presented at another seminar... and the clock ticks... and you know that the time in Seattle is a bit later than in Sweden so you just have to be patient, usually the mail doesn't show up until late in the afternoon.
But I have got a trick, look at the MVP site and see if the profile has been updated, so I checked, and it did say that I now was on my forth year. But, the email. You need the email. Some loose it in their junkmail. The email is the final proof, The site might be wrong.
And the clock ticked. Tock.
4 pm. Maybe I'll see more if I logg in to the MVP-site.
Aha, Award end date, next year! That looks good. Maybe I did make it after all.
Then. PLING. You have mail.
The feeling is just great every year!
Congrats to all my fellow MVP:s who got renewed and if there are any new CRM MVP:s out there, a hearty Congrats, renewing is great but the first time is best!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Monday, June 29, 2015
Troublesome report troubleshooting
Creating reports in SSRS and uploading to CRM can be a pain sometimes. The report works just fine in SSRS (well, the CRM-Autofilters don't of course, but still), but when trying to upload it you get this fine and informative error message:
If you are not very used to reading this, the important part is:
An error occurred while trying to add the report to Microsoft Dynamics CRM. Try adding the report again. If this problem persists, contact your system administrator.
Not really sure who that guy is. Anybody know him or her please leave a comment.
Ok. So, maybe the SSRS tracelogs have something. Let.s go to there, in my case it was in this path:
C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\LogFiles
Yours is probably something similar.
The last entries in the log were:
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to GetItemTypeAction(/Contoso_MSCRM/CustomReports/{f27fb971-691e-e511-93fe-00155d01ac02}).
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to CreateReportAction({f27fb971-691e-e511-93fe-00155d01ac02}, /Contoso_MSCRM/CustomReports, False).
processing!ReportServer_0-2!1870!06/29/2015-16:28:36:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: , Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: Exception of type 'Microsoft.ReportingServices.ReportProcessing.ReportPublishingException' was thrown.;
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to CreateReportAction({f27fb971-691e-e511-93fe-00155d01ac02}, /Contoso_MSCRM/CustomReports, False).
processing!ReportServer_0-2!1870!06/29/2015-16:28:36:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: , Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: Exception of type 'Microsoft.ReportingServices.ReportProcessing.ReportPublishingException' was thrown.;
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to CreateReportAction({f27fb971-691e-e511-93fe-00155d01ac02}, /Contoso_MSCRM/CustomReports, False).
processing!ReportServer_0-2!1870!06/29/2015-16:28:37:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: , Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: Exception of type 'Microsoft.ReportingServices.ReportProcessing.ReportPublishingException' was thrown.;
Again we are all filled with joy and happiness as it is all too clear what is wrong... Well, if you can see it, please tell me, because I can't. The logg seems to be a dead end as well.
And I am all out of logs to look for, I don't really think the IIS-log will help.
However, all hope is not lost and we must trust the force, and the force says that the problem is probably that we have some UI component that is weird or that there is some reference that is bad. So I went back to my report, and just for the hell of it, not that I use it that much anyway, pressed the "Preview" tab, and behold, I had replaced a datasets query with a new SQL statement and missed that a tablix had a reference to a field.
So, these are some ways to troubleshoot a report. Maybe I should have done it the other way round. :)
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Not very helpful, so maybe the log file is:
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: An error occurred while trying to add the report to Microsoft Dynamics CRM. Try adding the report again. If this problem persists, contact your system administrator.Detail:
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
<ErrorCode>-2147188072</ErrorCode>
<ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic" />
<Message>An error occurred while trying to add the report to Microsoft Dynamics CRM. Try adding the report again. If this problem persists, contact your system administrator.</Message>
<Timestamp>2015-06-29T14:16:35.6330269Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText i:nil="true" />
</OrganizationServiceFault>
If you are not very used to reading this, the important part is:
An error occurred while trying to add the report to Microsoft Dynamics CRM. Try adding the report again. If this problem persists, contact your system administrator.
Not really sure who that guy is. Anybody know him or her please leave a comment.
Ok. So, maybe the SSRS tracelogs have something. Let.s go to there, in my case it was in this path:
C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\LogFiles
Yours is probably something similar.
The last entries in the log were:
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to GetItemTypeAction(/Contoso_MSCRM/CustomReports/{f27fb971-691e-e511-93fe-00155d01ac02}).
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to CreateReportAction({f27fb971-691e-e511-93fe-00155d01ac02}, /Contoso_MSCRM/CustomReports, False).
processing!ReportServer_0-2!1870!06/29/2015-16:28:36:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: , Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: Exception of type 'Microsoft.ReportingServices.ReportProcessing.ReportPublishingException' was thrown.;
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to CreateReportAction({f27fb971-691e-e511-93fe-00155d01ac02}, /Contoso_MSCRM/CustomReports, False).
processing!ReportServer_0-2!1870!06/29/2015-16:28:36:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: , Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: Exception of type 'Microsoft.ReportingServices.ReportProcessing.ReportPublishingException' was thrown.;
library!ReportServer_0-2!1870!06/29/2015-16:28:36:: i INFO: Call to CreateReportAction({f27fb971-691e-e511-93fe-00155d01ac02}, /Contoso_MSCRM/CustomReports, False).
processing!ReportServer_0-2!1870!06/29/2015-16:28:37:: e ERROR: Throwing Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: , Microsoft.ReportingServices.ReportProcessing.ReportPublishingException: Exception of type 'Microsoft.ReportingServices.ReportProcessing.ReportPublishingException' was thrown.;
And I am all out of logs to look for, I don't really think the IIS-log will help.
However, all hope is not lost and we must trust the force, and the force says that the problem is probably that we have some UI component that is weird or that there is some reference that is bad. So I went back to my report, and just for the hell of it, not that I use it that much anyway, pressed the "Preview" tab, and behold, I had replaced a datasets query with a new SQL statement and missed that a tablix had a reference to a field.
So, these are some ways to troubleshoot a report. Maybe I should have done it the other way round. :)
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Friday, June 26, 2015
Non breaking Space in SSRS
Been working with creating classical reports in SSRS for a customer lately and there are some tricks that you sometimes need to employ. Today, I found one, so this article will be short. Non-breaking space in SSRS can be set as an expression with the value "=char(160)",
If using IIF or just adding it to the end of the line is up to you. It is at least good to know.
That was a short post and the tensions is building towards the 1:st. If you don't know why, check back on the 1:st and you'll know why.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
White Sands - a sort of white space - broken by some tracks. |
That was a short post and the tensions is building towards the 1:st. If you don't know why, check back on the 1:st and you'll know why.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Friday, June 05, 2015
CRM 2015 Spring wave excel and browsers
Been working lately with a customer in CRM 2015 Spring wave and I must say I really like it! My number one feature is the lovely menu which I enjoy every time i use it!
If you havn't noticed the excel export/import functionality now supports .xlsx (finally!) which is great. I did have an issue with importing data into CRM from xlsx-file once, which might have been due to the fact that I had added a column by hand (with the correct field name!). The sad thing was that I got an error when uploading this and no option to download a log file. So, I don't really know what was wrong, but I think my new column was it. It was easily solved, anyway, I just saved the document as "XML Excelsheet 2003 format *.xml", which is the format used when exporting excel-templates in CRM 2011 and 2013. Importing that worked great. Some of you might think that csv-files are better, as the overhead is smaller in these, but I would warn against using these as I have had some issues with these. The most obvious being that the csv-format is regions sensitvie. With a en/us locale it will use the comma (,) as the separator but in Sweden (se/sv) it will use semi-colon (;). This will mess up a lot of.
Another messy thing of CRM 2015 Spring wave, that I think most users of it have noticed, if they are not blind, is that form customizations cannot be done in IE11. I cannot understand how this bug could have escaped Microsoft quality control, and it will most certainly be fixed. Hence I use Chrome when customizing CRM. This made me notice another bug, that being that when using Chrome, I cannot save new mappings, which works perfectly well in IE11. Isn't the multi-browser world wonderful! Just imagine the amount of money Microsoft must pour into this.
And on the subject of pouring money, we all want Microsoft to get us a lot of nice shiny features for CRM, and fix all the bugs, so how are we doing on the upgrades ourselves? Maintaining a lot of different code trees costs a lot of resources, which could have been used to other stuff. Think about that when you are requesting fixes for CRM 4.0.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
If you havn't noticed the excel export/import functionality now supports .xlsx (finally!) which is great. I did have an issue with importing data into CRM from xlsx-file once, which might have been due to the fact that I had added a column by hand (with the correct field name!). The sad thing was that I got an error when uploading this and no option to download a log file. So, I don't really know what was wrong, but I think my new column was it. It was easily solved, anyway, I just saved the document as "XML Excelsheet 2003 format *.xml", which is the format used when exporting excel-templates in CRM 2011 and 2013. Importing that worked great. Some of you might think that csv-files are better, as the overhead is smaller in these, but I would warn against using these as I have had some issues with these. The most obvious being that the csv-format is regions sensitvie. With a en/us locale it will use the comma (,) as the separator but in Sweden (se/sv) it will use semi-colon (;). This will mess up a lot of.
Spring has come - when is summer comming? |
Another messy thing of CRM 2015 Spring wave, that I think most users of it have noticed, if they are not blind, is that form customizations cannot be done in IE11. I cannot understand how this bug could have escaped Microsoft quality control, and it will most certainly be fixed. Hence I use Chrome when customizing CRM. This made me notice another bug, that being that when using Chrome, I cannot save new mappings, which works perfectly well in IE11. Isn't the multi-browser world wonderful! Just imagine the amount of money Microsoft must pour into this.
And on the subject of pouring money, we all want Microsoft to get us a lot of nice shiny features for CRM, and fix all the bugs, so how are we doing on the upgrades ourselves? Maintaining a lot of different code trees costs a lot of resources, which could have been used to other stuff. Think about that when you are requesting fixes for CRM 4.0.
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Monday, May 18, 2015
Be aware of Synchronous Workflows on incoming emails and Queue items
How synchronous workflows that fail, make emails disappear.
During the last few Days I have been having the not so pleasant experience of trying to find some really nasty errors in incoming emails to a queue in CRM. We are using CRM 2013 SP1 (on prem) and hence are using the Server Side Sync. Everything had been working great and we had developed some neat workflows that did some magic to convert emails to cases (as those features were not available, and not good enough either) when we develop our stuff.
Well, thing stopped working, I tried sending emails to the CRM server, but none were received in CRM. All I got in CRM was a not so descriptive general alert saying:
"An error occurred while creating incoming email in Microsoft Dynamics CRM for the mailbox XYZ. To view the email that failed, see the alerts in the mailbox record."
and in the mailbox:
"An error occurred while creating the incoming email "Test 1512" in Microsoft Dynamics CRM for the mailbox XYZ."
As I am working on my telepathic abilities, I have not yet reached a level where I can understand what is wrong so I had a look in the trace, and I was very happy I was running an on-prem server. It is a bit long, don't worry if you don't understand it all, nobody (I think) does.
[2015-05-15 15:21:13.459] Process:CrmAsyncService |Organization:673c5996-a1fa-e311-93ed-00155d0a831d |Thread: 4 |Category: Platform.Metadata |User: 00000000-0000-0000-0000-000000000000 |Level: Error |ReqId: | <>c__DisplayClass1.<LoadMetadataContainerFromDatabase>b__0 ilOffset = 0x14
>Multi-org sharable cache loading system and non-system metadata with build number 6.1.0.581 and language 1033
[2015-05-15 15:33:45.132] Process:CrmAsyncService |Organization:00000000-0000-0000-0000-000000000000 |Thread: 26 |Category: Exception |User: 00000000-0000-0000-0000-000000000000 |Level: Error |ReqId: cf367175-12a2-4719-a5af-f53f7f254399 | CrmException..ctor ilOffset = 0x7
at CrmException..ctor(String message, Exception innerException, Int32 errorCode, Boolean isFlowControlException) ilOffset = 0x7
at CrmException..ctor(String message, Exception innerException, Int32 errorCode) ilOffset = 0x5
at Exceptions.ThrowIfGuidEmpty(Guid parameter, String name) ilOffset = 0x18
at OrganizationSdkServiceInternal.Retrieve(String entityName, Guid id, ColumnSet columnSet, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode) ilOffset = 0x16
at InprocessServiceProxy.RetrieveCore(String entityName, Guid id, ColumnSet columnSet) ilOffset = 0x28
at OrganizationServiceProxy.Retrieve(String entityName, Guid id, ColumnSet columnSet) ilOffset = 0x4
at EntityDictionary.TryRetrieveEntity(String key) ilOffset = 0xF8
at EntityDictionary.System.Collections.Generic.IDictionary<System.String,Microsoft.Xrm.Sdk.Entity>.get_Item(String key) ilOffset = 0x1B
at VisualBasicValue`1.Execute(CodeActivityContext context) ilOffset = 0x3A
at ActivityExecutor.ExecuteInResolutionContext(ActivityInstance parentInstance, Activity`1 expressionActivity) ilOffset = 0x35
at InArgument`1.TryPopulateValue(LocationEnvironment targetEnvironment, ActivityInstance activityInstance, ActivityExecutor executor) ilOffset = 0x2F
at ActivityInstance.InternalTryPopulateArgumentValueOrScheduleExpression(RuntimeArgument argument, Int32 nextArgumentIndex, ActivityExecutor executor, IDictionary`2 argumentValueOverrides, Location resultLocation, Boolean isDynamicUpdate) ilOffset = 0x16
at ActivityInstance.ResolveArguments(ActivityExecutor executor, IDictionary`2 argumentValueOverrides, Location resultLocation, Int32 startIndex) ilOffset = 0x9C
at ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation) ilOffset = 0x1C
at ActivityExecutor.OnExecuteWorkItem(WorkItem workItem) ilOffset = 0x53
at Callbacks.ExecuteWorkItem(WorkItem workItem) ilOffset = 0xD
at Scheduler.OnScheduledWork(Object state) ilOffset = 0xC5
at SendOrPostThunk.UnhandledExceptionFrame(Object state) ilOffset = 0x0
at PumpBasedSynchronizationContext.DoPump() ilOffset = 0x2E
at WorkflowApplication.Invoke(Activity activity, IDictionary`2 inputs, WorkflowInstanceExtensionManager extensions, TimeSpan timeout) ilOffset = 0x23
at WorkflowInvoker.Invoke(Activity workflow, IDictionary`2 inputs, TimeSpan timeout, WorkflowInstanceExtensionManager extensions) ilOffset = 0x36
at SynchronousWorkflowActivityHost.ExecuteWorkflowUsingInvoker(Activity workflow, ICommonWorkflowContext context) ilOffset = 0xD0
at SynchronousWorkflowActivityHost.StartWorkflow(WorkflowActivationData activationData, ICommonWorkflowContext context) ilOffset = 0x73
at SynchronousWorkflowActivityHost.StartWorkflow(ICommonWorkflowContext context) ilOffset = 0xBA
at WorkflowProcessServiceInternalHandler`1.ExecuteSyncWorkflow(Guid workflowId, PipelineExecutionContext pipelineContext, IGenericEventData workflowInstanceData, Boolean isTriggered) ilOffset = 0x59
at WorkflowProcessServiceInternalHandler`1.ExecuteTriggeredSyncWorkflow(Guid workflowId, PipelineExecutionContext pipelineContext) ilOffset = 0x21
at SyncWorkflowExecutionPlugin.Execute(IServiceProvider provider) ilOffset = 0x2C
at V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context) ilOffset = 0x2A3
at VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context) ilOffset = 0x65
at Pipeline.Execute(PipelineExecutionContext context) ilOffset = 0x65
at MessageProcessor.Execute(PipelineExecutionContext context) ilOffset = 0x1FB
at InternalMessageDispatcher.Execute(PipelineExecutionContext context) ilOffset = 0xE4
at ExtensiblePlatformMessageDispatcher.Execute(PipelineExecutionContext pluginContext) ilOffset = 0x0
at ExtensiblePlatformMessageDispatcher.CreateWithInvocationSource(BusinessEntity entity, Int32 invocationSource, ExecutionContext context) ilOffset = 0xB4
at BusinessProcessObject.Create(IBusinessEntity entity, ExecutionContext context) ilOffset = 0x54
at GenericActivityServiceBase.Create(IBusinessEntity entity, ExecutionContext context) ilOffset = 0xA1
at CommunicationActivityServiceBase.Create(IBusinessEntity entity, ExecutionContext context) ilOffset = 0x1A
at EmailService.SetRecipientsAddAdditionalAttributeAndCreate(AddressEntry[][] allResolvedAddressEntries, Email email, Entity emailDeltaEntity, String traceSubject, ExecutionContext context) ilOffset = 0x1DA
at EmailService.Deliver(Boolean userPromote, Guid emailId, String messageId, String subject, String from, String to, String cc, String bcc, DateTime receivedOn, String submittedBy, String importance, String body, BusinessEntityCollection attachments, Guid campaignResponseId, Entity emailDeltaEntity, ExecutionContext context, Boolean validateBeforeDeliver) ilOffset = 0x524
at EmailService.DeliverIncoming(String messageId, String subject, String from, String to, String cc, String bcc, DateTime receivedOn, String submittedBy, String importance, String body, BusinessEntityCollection attachments, Entity extraProperties, Boolean validateBeforeCreate, ExecutionContext context) ilOffset = 0xB8
at RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) ilOffset = 0xFFFFFFFF
at RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) ilOffset = 0x25
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) ilOffset = 0xCF
at LogicalMethodInfo.Invoke(Object target, Object[] values) ilOffset = 0x4F
at InternalOperationPlugin.Execute(IServiceProvider serviceProvider) ilOffset = 0x57
at V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context) ilOffset = 0x200
at VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context) ilOffset = 0x65
at Pipeline.Execute(PipelineExecutionContext context) ilOffset = 0x65
at MessageProcessor.Execute(PipelineExecutionContext context) ilOffset = 0x1C5
at InternalMessageDispatcher.Execute(PipelineExecutionContext context) ilOffset = 0xE4
at ExternalMessageDispatcher.ExecuteInternal(IInProcessOrganizationServiceFactory serviceFactory, IPlatformMessageDispatcherFactory dispatcherFactory, String messageName, String requestName, Int32 primaryObjectTypeCode, Int32 secondaryObjectTypeCode, ParameterCollection fields, CorrelationToken correlationToken, CallerOriginToken originToken, UserAuth userAuth, Guid callerId, Guid transactionContextId, Int32 invocationSource, Nullable`1 requestId, Version endpointVersion) ilOffset = 0x16E
at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, OrganizationContext context, Boolean returnResponse, Boolean checkAdminMode) ilOffset = 0x1F1
at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode) ilOffset = 0x2D
at OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode) ilOffset = 0x26
at InprocessServiceProxy.ExecuteCore(OrganizationRequest request) ilOffset = 0x34
at IncomingEmailProviderBase.DeliverMessageInternal(EmailMessage emailMessage, Boolean validateBeforeCreate) ilOffset = 0x1B7
at IncomingEmailProviderBase.DeliverMessage(EmailMessage emailMessage, Boolean validateBeforeCreate) ilOffset = 0x19
at GetItemsStep.ProcessResponse() ilOffset = 0x5AB
at ExchangeIncomingEmailProviderStep.EndOperation() ilOffset = 0xFC
at ExchangeIncomingEmailProvider.ReceiveEmails() ilOffset = 0x92
at IncomingActivityProviderBase.Run() ilOffset = 0x42
at MailboxEmailOperation.PerformOperation() ilOffset = 0x2C
at MailboxOperationBase`1.Execute() ilOffset = 0xAA
at MailboxProcessingOperation.PerformOperation() ilOffset = 0x1A
at MailboxOperationBase`1.Execute() ilOffset = 0xAA
at MailboxOperationCommand.InternalExecute(MailboxAsyncEvent asyncEvent) ilOffset = 0x64
at AsyncCallbackHandler`2.ResumeExecution(IAsyncEvent asyncEvent) ilOffset = 0x56
at AsyncEventExecutionManager`2.ExecuteHandler(IAsyncEventHandlerFactory handlerFactory) ilOffset = 0x8A
at PoolHandler.ProcessAsyncEvent(IAsyncEventExecutionManager asyncEventExecutionManager) ilOffset = 0x144
at AsyncEventOperation.<.ctor>b__2(IServiceOperation operation) ilOffset = 0x0
at FaultToleranceBehavior.Execute(ServiceOperationAction operation, IServiceOperation operationParameter) ilOffset = 0x18
at MonitoredOperation.Execute() ilOffset = 0xD
at ThreadPoolQueueExecutionEngine.InvokeNextOperationInThreadPool(Object state) ilOffset = 0xC
at ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) ilOffset = 0x70
at ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) ilOffset = 0x4
at QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() ilOffset = 0x30
at ThreadPoolWorkQueue.Dispatch() ilOffset = 0xA3
>Crm Exception: Message: Expected non-empty Guid., ErrorCode: -2147220989, InnerException: System.ArgumentException: Expected non-empty Guid.
Parameter name: id
[2015-05-15 15:33:45.304] Process:CrmAsyncService |Organization:00000000-0000-0000-0000-000000000000 |Thread: 26 |Category: Platform |User: 00000000-0000-0000-0000-000000000000 |Level: Error |ReqId: cf367175-12a2-4719-a5af-f53f7f254399 | ExceptionConverter.ConvertToFault ilOffset = 0x69
>UNEXPECTED: no fault?
My first thought was that the stack trace was really long... and then there was some mentioning of User with Guid 00000000-0000-0000-0000-000000000000.
As the Server Side Sync has something of a rep for not being the most reliable guy in Town, I wasn't really sure if this error really was an error that we had caused or if there was something wrong with the server side sync. As my perception was that we hadn't really changed any thing, I started with the recreating the mailbox, recreated the server profile, ran test and enable and that worked, but when I tried sending my own emails, from different email accounts, as you never know if there is something spooking it with a specific email address, I still never got the queue to read any emails, not even the test emails created by CRM. I was starting to get a bit short on hair by this time, so I resorted to my classical troubleshooting method of backing off as far as possible and seeing if things still were broken, and I hence deactivated all workflows and plugins that were associated to email and Queue item, and gave the user full access and I was once again awarded with this method, emails started arriving in the queue in CRM.
I then revoked admin access and started re-enabling each single workflow/plugin until thing started
breaking again. This turned out to be a painstaking process as the only way I found to test this was to send an email to CRM and then wait for about 5 minutes until it was/or was not pulled into the queue.
It took me more or less a days work just to find the two workflows that were causing the problems.
The actual problems in them selves, arn't really that interesting, it turned out that the error message above was actually quite correct, If you try to set a null-user to an owner field, CRM will respond like this.
What I did notice however was that the workflows that we were using on "queue item" in this case were synchronous (yes, yes, we do have good reasons for it, I hope you do to, Otherwise, please choose asynchronous/background workflows) and as they broke, CRM did two interesting facts that are not very desirable and noteworthy:
We also found a related bug in CRM today, if you try to create an asynchronous workflow that triggers on a field which has field based rights activated on it, it will break, with some weird error message about not being able to change domain for the user. The simple fix for that is to make the workflow synchronous and to make it run as the user that activates it, that worked. We didn't try to run it as the user who created the workflow, as that is the same logic that is used in asynchronous workflows, I wasn't too keen on trying something that was more likely to fail. If you have tried it, please leave a comment below.
I hope to see a lot of people tomorrow on the 19:th at the Swedish CRM UG Meeting!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
During the last few Days I have been having the not so pleasant experience of trying to find some really nasty errors in incoming emails to a queue in CRM. We are using CRM 2013 SP1 (on prem) and hence are using the Server Side Sync. Everything had been working great and we had developed some neat workflows that did some magic to convert emails to cases (as those features were not available, and not good enough either) when we develop our stuff.
Well, thing stopped working, I tried sending emails to the CRM server, but none were received in CRM. All I got in CRM was a not so descriptive general alert saying:
"An error occurred while creating incoming email in Microsoft Dynamics CRM for the mailbox XYZ. To view the email that failed, see the alerts in the mailbox record."
and in the mailbox:
"An error occurred while creating the incoming email "Test 1512" in Microsoft Dynamics CRM for the mailbox XYZ."
As I am working on my telepathic abilities, I have not yet reached a level where I can understand what is wrong so I had a look in the trace, and I was very happy I was running an on-prem server. It is a bit long, don't worry if you don't understand it all, nobody (I think) does.
[2015-05-15 15:21:13.459] Process:CrmAsyncService |Organization:673c5996-a1fa-e311-93ed-00155d0a831d |Thread: 4 |Category: Platform.Metadata |User: 00000000-0000-0000-0000-000000000000 |Level: Error |ReqId: | <>c__DisplayClass1.<LoadMetadataContainerFromDatabase>b__0 ilOffset = 0x14
>Multi-org sharable cache loading system and non-system metadata with build number 6.1.0.581 and language 1033
[2015-05-15 15:33:45.132] Process:CrmAsyncService |Organization:00000000-0000-0000-0000-000000000000 |Thread: 26 |Category: Exception |User: 00000000-0000-0000-0000-000000000000 |Level: Error |ReqId: cf367175-12a2-4719-a5af-f53f7f254399 | CrmException..ctor ilOffset = 0x7
at CrmException..ctor(String message, Exception innerException, Int32 errorCode, Boolean isFlowControlException) ilOffset = 0x7
at CrmException..ctor(String message, Exception innerException, Int32 errorCode) ilOffset = 0x5
at Exceptions.ThrowIfGuidEmpty(Guid parameter, String name) ilOffset = 0x18
at OrganizationSdkServiceInternal.Retrieve(String entityName, Guid id, ColumnSet columnSet, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode) ilOffset = 0x16
at InprocessServiceProxy.RetrieveCore(String entityName, Guid id, ColumnSet columnSet) ilOffset = 0x28
at OrganizationServiceProxy.Retrieve(String entityName, Guid id, ColumnSet columnSet) ilOffset = 0x4
at EntityDictionary.TryRetrieveEntity(String key) ilOffset = 0xF8
at EntityDictionary.System.Collections.Generic.IDictionary<System.String,Microsoft.Xrm.Sdk.Entity>.get_Item(String key) ilOffset = 0x1B
at VisualBasicValue`1.Execute(CodeActivityContext context) ilOffset = 0x3A
at ActivityExecutor.ExecuteInResolutionContext(ActivityInstance parentInstance, Activity`1 expressionActivity) ilOffset = 0x35
at InArgument`1.TryPopulateValue(LocationEnvironment targetEnvironment, ActivityInstance activityInstance, ActivityExecutor executor) ilOffset = 0x2F
at ActivityInstance.InternalTryPopulateArgumentValueOrScheduleExpression(RuntimeArgument argument, Int32 nextArgumentIndex, ActivityExecutor executor, IDictionary`2 argumentValueOverrides, Location resultLocation, Boolean isDynamicUpdate) ilOffset = 0x16
at ActivityInstance.ResolveArguments(ActivityExecutor executor, IDictionary`2 argumentValueOverrides, Location resultLocation, Int32 startIndex) ilOffset = 0x9C
at ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation) ilOffset = 0x1C
at ActivityExecutor.OnExecuteWorkItem(WorkItem workItem) ilOffset = 0x53
at Callbacks.ExecuteWorkItem(WorkItem workItem) ilOffset = 0xD
at Scheduler.OnScheduledWork(Object state) ilOffset = 0xC5
at SendOrPostThunk.UnhandledExceptionFrame(Object state) ilOffset = 0x0
at PumpBasedSynchronizationContext.DoPump() ilOffset = 0x2E
at WorkflowApplication.Invoke(Activity activity, IDictionary`2 inputs, WorkflowInstanceExtensionManager extensions, TimeSpan timeout) ilOffset = 0x23
at WorkflowInvoker.Invoke(Activity workflow, IDictionary`2 inputs, TimeSpan timeout, WorkflowInstanceExtensionManager extensions) ilOffset = 0x36
at SynchronousWorkflowActivityHost.ExecuteWorkflowUsingInvoker(Activity workflow, ICommonWorkflowContext context) ilOffset = 0xD0
at SynchronousWorkflowActivityHost.StartWorkflow(WorkflowActivationData activationData, ICommonWorkflowContext context) ilOffset = 0x73
at SynchronousWorkflowActivityHost.StartWorkflow(ICommonWorkflowContext context) ilOffset = 0xBA
at WorkflowProcessServiceInternalHandler`1.ExecuteSyncWorkflow(Guid workflowId, PipelineExecutionContext pipelineContext, IGenericEventData workflowInstanceData, Boolean isTriggered) ilOffset = 0x59
at WorkflowProcessServiceInternalHandler`1.ExecuteTriggeredSyncWorkflow(Guid workflowId, PipelineExecutionContext pipelineContext) ilOffset = 0x21
at SyncWorkflowExecutionPlugin.Execute(IServiceProvider provider) ilOffset = 0x2C
at V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context) ilOffset = 0x2A3
at VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context) ilOffset = 0x65
at Pipeline.Execute(PipelineExecutionContext context) ilOffset = 0x65
at MessageProcessor.Execute(PipelineExecutionContext context) ilOffset = 0x1FB
at InternalMessageDispatcher.Execute(PipelineExecutionContext context) ilOffset = 0xE4
at ExtensiblePlatformMessageDispatcher.Execute(PipelineExecutionContext pluginContext) ilOffset = 0x0
at ExtensiblePlatformMessageDispatcher.CreateWithInvocationSource(BusinessEntity entity, Int32 invocationSource, ExecutionContext context) ilOffset = 0xB4
at BusinessProcessObject.Create(IBusinessEntity entity, ExecutionContext context) ilOffset = 0x54
at GenericActivityServiceBase.Create(IBusinessEntity entity, ExecutionContext context) ilOffset = 0xA1
at CommunicationActivityServiceBase.Create(IBusinessEntity entity, ExecutionContext context) ilOffset = 0x1A
at EmailService.SetRecipientsAddAdditionalAttributeAndCreate(AddressEntry[][] allResolvedAddressEntries, Email email, Entity emailDeltaEntity, String traceSubject, ExecutionContext context) ilOffset = 0x1DA
at EmailService.Deliver(Boolean userPromote, Guid emailId, String messageId, String subject, String from, String to, String cc, String bcc, DateTime receivedOn, String submittedBy, String importance, String body, BusinessEntityCollection attachments, Guid campaignResponseId, Entity emailDeltaEntity, ExecutionContext context, Boolean validateBeforeDeliver) ilOffset = 0x524
at EmailService.DeliverIncoming(String messageId, String subject, String from, String to, String cc, String bcc, DateTime receivedOn, String submittedBy, String importance, String body, BusinessEntityCollection attachments, Entity extraProperties, Boolean validateBeforeCreate, ExecutionContext context) ilOffset = 0xB8
at RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) ilOffset = 0xFFFFFFFF
at RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) ilOffset = 0x25
at RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) ilOffset = 0xCF
at LogicalMethodInfo.Invoke(Object target, Object[] values) ilOffset = 0x4F
at InternalOperationPlugin.Execute(IServiceProvider serviceProvider) ilOffset = 0x57
at V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context) ilOffset = 0x200
at VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context) ilOffset = 0x65
at Pipeline.Execute(PipelineExecutionContext context) ilOffset = 0x65
at MessageProcessor.Execute(PipelineExecutionContext context) ilOffset = 0x1C5
at InternalMessageDispatcher.Execute(PipelineExecutionContext context) ilOffset = 0xE4
at ExternalMessageDispatcher.ExecuteInternal(IInProcessOrganizationServiceFactory serviceFactory, IPlatformMessageDispatcherFactory dispatcherFactory, String messageName, String requestName, Int32 primaryObjectTypeCode, Int32 secondaryObjectTypeCode, ParameterCollection fields, CorrelationToken correlationToken, CallerOriginToken originToken, UserAuth userAuth, Guid callerId, Guid transactionContextId, Int32 invocationSource, Nullable`1 requestId, Version endpointVersion) ilOffset = 0x16E
at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, OrganizationContext context, Boolean returnResponse, Boolean checkAdminMode) ilOffset = 0x1F1
at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode) ilOffset = 0x2D
at OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType, Boolean checkAdminMode) ilOffset = 0x26
at InprocessServiceProxy.ExecuteCore(OrganizationRequest request) ilOffset = 0x34
at IncomingEmailProviderBase.DeliverMessageInternal(EmailMessage emailMessage, Boolean validateBeforeCreate) ilOffset = 0x1B7
at IncomingEmailProviderBase.DeliverMessage(EmailMessage emailMessage, Boolean validateBeforeCreate) ilOffset = 0x19
at GetItemsStep.ProcessResponse() ilOffset = 0x5AB
at ExchangeIncomingEmailProviderStep.EndOperation() ilOffset = 0xFC
at ExchangeIncomingEmailProvider.ReceiveEmails() ilOffset = 0x92
at IncomingActivityProviderBase.Run() ilOffset = 0x42
at MailboxEmailOperation.PerformOperation() ilOffset = 0x2C
at MailboxOperationBase`1.Execute() ilOffset = 0xAA
at MailboxProcessingOperation.PerformOperation() ilOffset = 0x1A
at MailboxOperationBase`1.Execute() ilOffset = 0xAA
at MailboxOperationCommand.InternalExecute(MailboxAsyncEvent asyncEvent) ilOffset = 0x64
at AsyncCallbackHandler`2.ResumeExecution(IAsyncEvent asyncEvent) ilOffset = 0x56
at AsyncEventExecutionManager`2.ExecuteHandler(IAsyncEventHandlerFactory handlerFactory) ilOffset = 0x8A
at PoolHandler.ProcessAsyncEvent(IAsyncEventExecutionManager asyncEventExecutionManager) ilOffset = 0x144
at AsyncEventOperation.<.ctor>b__2(IServiceOperation operation) ilOffset = 0x0
at FaultToleranceBehavior.Execute(ServiceOperationAction operation, IServiceOperation operationParameter) ilOffset = 0x18
at MonitoredOperation.Execute() ilOffset = 0xD
at ThreadPoolQueueExecutionEngine.InvokeNextOperationInThreadPool(Object state) ilOffset = 0xC
at ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) ilOffset = 0x70
at ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) ilOffset = 0x4
at QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() ilOffset = 0x30
at ThreadPoolWorkQueue.Dispatch() ilOffset = 0xA3
>Crm Exception: Message: Expected non-empty Guid., ErrorCode: -2147220989, InnerException: System.ArgumentException: Expected non-empty Guid.
Parameter name: id
[2015-05-15 15:33:45.304] Process:CrmAsyncService |Organization:00000000-0000-0000-0000-000000000000 |Thread: 26 |Category: Platform |User: 00000000-0000-0000-0000-000000000000 |Level: Error |ReqId: cf367175-12a2-4719-a5af-f53f7f254399 | ExceptionConverter.ConvertToFault ilOffset = 0x69
>UNEXPECTED: no fault?
My first thought was that the stack trace was really long... and then there was some mentioning of User with Guid 00000000-0000-0000-0000-000000000000.
Another kind of queue ticket |
I then revoked admin access and started re-enabling each single workflow/plugin until thing started
breaking again. This turned out to be a painstaking process as the only way I found to test this was to send an email to CRM and then wait for about 5 minutes until it was/or was not pulled into the queue.
It took me more or less a days work just to find the two workflows that were causing the problems.
The actual problems in them selves, arn't really that interesting, it turned out that the error message above was actually quite correct, If you try to set a null-user to an owner field, CRM will respond like this.
What I did notice however was that the workflows that we were using on "queue item" in this case were synchronous (yes, yes, we do have good reasons for it, I hope you do to, Otherwise, please choose asynchronous/background workflows) and as they broke, CRM did two interesting facts that are not very desirable and noteworthy:
- The mailbox was shut down for further email processing. It had to be "Test and Enabled" to start receiving emails again. I have yet to see a good way to do this in an automated fashion and to be able to monitor the mailboxes to see if they are working as expected.
- The email that was the cause of the breaking of the workflow, got lost. Even after the mailbox got reactivated, it had marked this email as read and did not read it into CRM despite the fact that it was neither in the queue nor as a lone activity which might have been the case if the Creation of the queue item broke. But obviously the entire process is handled atomically.
- If possible try to avoid an synchronous logic on receiving email or Creation of queue items. Try to move logic to asynchronous as this will cause errors to be non-fatal, like the two types of effects that are hard to handle above.
- If you do need to have synchronous logic on the receiving of emails or Creation of queue items try to add conditions in the beginning that will ensure that the logic only runs in those very specific cases where they are supposed to. Be aware of the fact that queue items can be associated to many different entities, so don't rely on the fact that they should be only connected to something specific. At least take into consideration the fact that they will be connected to emails at some Point in time.
- I read an interesting fact today, that the activation of business rules Controls in which order they will be executed. If you are using CRM 2015 with server side (Entity) scope, this could probably cause similar issues if the activation is done haphazardly and causes the execution to be done in a way that can cause a bug and break processing of the queue item or email. I havn't checked if these are run pre- or poststate but I think that depends on the action.
- If you get errors, especially when using CRM Online, try to replicate the error in the sandbox Environment and then either move backwards to a Point where it starts working again, or deactive Everything related to emails and queue items, make sure it works, and move forward. When you know where the error is, finding what the error is, is so much easier.
We also found a related bug in CRM today, if you try to create an asynchronous workflow that triggers on a field which has field based rights activated on it, it will break, with some weird error message about not being able to change domain for the user. The simple fix for that is to make the workflow synchronous and to make it run as the user that activates it, that worked. We didn't try to run it as the user who created the workflow, as that is the same logic that is used in asynchronous workflows, I wasn't too keen on trying something that was more likely to fail. If you have tried it, please leave a comment below.
I hope to see a lot of people tomorrow on the 19:th at the Swedish CRM UG Meeting!
Gustaf Westerlund
MVP, Founder and CTO at CRM-konsulterna AB
www.crmkonsulterna.se
Subscribe to:
Posts (Atom)