Friday, October 12, 2012
Microsoft Dynamics CRM 2011 Update Rollup 11 released
UR 11: http://www.microsoft.com/en-us/download/details.aspx?id=34969
Highlights of Update Rollup 11
• 102 total fixes.
• 36 customer-escalated issues (see KB for details).
• Improved compatibility with Windows 8, Office 2013 and Touch.
General Information on Update Rollup 11
• The KB is located at http://support.microsoft.com/kb/2739504.
• The UR 11 blog is located at http://blogs.msdn.com/b/crm/archive/2012/10/11/update-rollup-11-for-microsoft-dynamics-crm-2011.aspx.
• UR 11 is scheduled to be published via Microsoft Update on October 23.
Monday, July 4, 2011
Microsoft Dynamics CRM 4.0 Whitepapers
Here is a list of some beautiful whitepapers for CRM developers, it always worked as a good reference to me. so thought of sharing it with others too.
you can use them for a reference point or for knowledge building or to understand the product better.
Whitepaper | Download |
This white paper, details the security model leveraged by Microsoft Dynamics CRM 4.0, including information on the authentication mechanisms that, depending on the deployment model, support Microsoft Dynamics CRM. In addition, the document provides details about how access to Microsoft Dynamics CRM 4.0 system resources by users and external systems can be controlled and restricted. | |
This white paper,provides selected aspects of the conceptual application of the security model in Microsoft Dynamics CRM. While Microsoft Dynamics CRM does not provide for true field-level security, there are a number of options available for using supported custom logic to control of access to data at a more granular level than provided out of the box. This document discusses some of the key options and constraints available for implementing this type of solution. | Field-level Security in Microsoft Dynamics CRM: Options and Constraints |
Many data centers include firewalls between the end-users and the servers and other integrated systems that support an implementation of Microsoft Dynamics CRM 4.0. This document provides guidance on the connectivity requirements between Microsoft Dynamics CRM 4.0 and other systems to assist readers with proper firewall configuration in customer environments. | Connectivity and Firewall Port Requirements in On-Premise Deployments |
Both the online and offline versions of the CRM Outlook Client support synchronizing CRM contacts and CRM activities to Outlook folders, or Outlook synchronization. This document describes the client synchronization process for Microsoft Dynamics CRM 4.0. | |
Using multiple instances of Dynamics CRM may be preferable in a number of scenarios. This release includes two documents, a white paper and a build guide, focused on sharing data across multiple CRM organizations. The white paper provides an overview of the levels of integration available for sharing data across multiple Dynamics CRM organizations, together with details about the techniques that are used for integration at the Application and Data levels, which include Web Services, Web Services-based solutions, Filtered Views, and SQL Server Replication. | |
Microsoft Dynamics CRM supports a wide range of business applications with the essentials required for building, delivering, and maintaining these applications in a multi-tenant SaaS environment. In this white paper we explore how, with Microsoft Dynamics CRM, an ISV can quickly build, deploy, and manage line-of-business applications. | Developing ISV Applications using Microsoft Dynamics CRM 4.0 |
This white paper provides techniques, considerations, and best practices for optimizing and maintaining the performance of Microsoft Dynamics CRM 4.0 implementations. | |
These Microsoft Office Visio diagrams show the logical database structure for Microsoft CRM 4.0. These diagrams were generated using the Metadata Diagram sample code included in the Microsoft Dynamics CRM 4.0 SDK download. |
Tuesday, June 7, 2011
How To Recreate Users in Microsoft Dynamics CRM
Situation:
One of my teammate recently moved a CRM organization from one server to another server (database as well as the application server), don’t know what went wrong but after that one user complains that he can’t login into the system, when inspected we found that there are two records for the same user now exists in the CRM one disabled and one enabled also no entry of this user was there in MSCRM_CONFIG database. Still in dark why and how it happens? but in order to let the user in the CRM we need to recreate the user in the CRM.
Resolution:
Now all we need is to delete this user and recreate it in CRM, BUT BUT BUT…….
There is no supported option of deleting Users from CRM is available , at most you can disable them, but sometimes we found ourselves in a situation when we need to recreate the user in CRM as mentioned above.
we also need to remember that the CRM users are created from AD user accounts so the CRM will not allow you to create a new account even when one account is already disabled.
So what can we do:
The option with us is recreate a User record by changing the credentials of a user record and create a new record for the existing user.
we can do so by following the steps as mentioned below:
Step 1: navigate and open the desired User record in CRM.
Step 2: Change the user credentials in the Domain Logon Name field to and AD use record that is not already a CRM User and save the record.
Step 3: Since this record is not required in CRM at all so disable this record.
Step 4: Create the desired user record.
Step 5: Reassign the records of the disabled user to this newly recreated record.
Thursday, June 2, 2011
Wednesday, April 27, 2011
Pre and Post Entity Images
Very Often I found during code reviews the most common mistakes new programmers commit during plugin development in CRM is usage of images at wrong places. so I thought of writing the same here, may be it helps someone.
first we should understand what are Pre and Post entity images:
PreEntityImages and PostEntityImages contain snapshots of the primary entity's attributes before and after the core platform operation. Microsoft Dynamics CRM populates the pre-entity and post-entity images based on the security privileges of the impersonated system user. You can specify to have the platform populate these properties when you register your plug-in. The entity alias value you specify during plug-in registration is used as the key into the image collection.
before using the images we should know when they are available. For example, only synchronous post-event and asynchronous registered plug-ins have PostEntityImages populated. In addition, the create operation does not support a pre-image and a delete operation does not support a post-image.
Hope it is helpful.
Happy Coding.
Saturday, April 16, 2011
Microsoft Dynamics CRM 2011 – Visual Studio Plugin / Workflow Activity Templates
Just downloaded and checked the great artwork of pogo69. really helpful and saved a lot of time as you don’t have to write everything from scratch now.
checkout the awesome Visual Studio 2010 templates for Plugin and Workflow activity development for CRM 2011 created by him.
check these out at his blog:
http://pogo69.wordpress.com/2011/04/15/crm-2011-visual-studio-plugin-templates
Friday, April 8, 2011
List of changes in plugin development in CRM 4.0 and CRM 2011
There are not much changes in terms of plugins. there are few changes like instead of using DynamicEntity class we have to use the Entity class. the five major changes are :
1. The IPlugin now resides in Microsoft.Xrm.Sdk namespace instead of Microsoft.Crm.Sdk
public class ClassName : Microsoft.Crm.Sdk.IPlugin
public class ClassName : Microsoft.Xrm.Sdk.IPlugin
2. The Execute method signature of the IPlugin interface has changed, it now expects an IServiceProvider instead of the IPluginExecutionContext.
public void Execute(IPluginExecutionContext context)
public void Execute(IServiceProvider serviceProvider)
3. To get a reference to the IPluginExecutionContext you now need to call the GetService method of the IServiceProvider interface.
public void Execute(IPluginExecutionContext context)
Microsoft.Xrm.Sdk.IPluginExecutionContext context =(Microsoft.Xrm.Sdk.IPluginExecutionContext)
serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
4. ICrmService has been changed to IOrganizationService.
ICrmService sdk = context.CreateCrmService(true);
IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService sdk = factory.CreateOrganizationService(context.UserId);
5. DynamicEntity has been changed to Entity.
- Properties property of DynamicEntity no longer exists
- Getting and Setting values no longer use *Property classes,
eg: no more KeyProperty, StringProperty…etc, simply do int value = (int)entity[“schema_name”];
if (context.InputParameters.Properties.Contains("Target") &&
context.InputParameters.Properties["Target"] is DynamicEntity)
if (context.InputParameters.Contains("Target") &&
context.InputParameters["Target"] is Entity)
hats off to the original contribution by Gayan Perera
Happy Coding
List of changes : Type mapping between CRM 4.0 and CRM 2011
In Microsoft Dynamics CRM 2011 and Microsoft Dynamics CRM Online, the programming model has been changed to use native .NET types whenever possible. A beautiful post from Resultondemand explains it all, with all credit to their great job the excerpts of the post is :
Type Mapping Between Versions
The following table shows the mapping between the defined type for an entity attribute, the type that is used in a record, and the type that was used in Microsoft DynamicsCRM4.0.
Attribute Type | Microsoft Dynamics CRM 2011 Type | Microsoft DynamicsCRM4.0 Type |
AttributeTypeCode.Boolean | bool or System.Boolean | CrmBoolean |
AttributeType.CalendarRules | EntityCollection | DynamicEntity[] or calendarrule[] |
AttributeType.Customer | EntityReference | Customer |
AttributeType.DateTime | System.DateTime | CrmDateTime |
AttributeType.Decimal | decimal or System.Decimal | CrmDecimal |
AttributeType.Double | double or System.Double | CrmFloat |
AttributeType.Integer | int or System.Integer | CrmNumber |
AttributeType. Internal | System.Object Not used in records. | Not used in records. |
AttributeType.Lookup | EntityReference | Lookup |
AttributeType.Memo | string or System.String | System.String |
AttributeType.Money | Money | CrmMoney |
AttributeType.Owner | EntityReference | Owner |
AttributeType.PartyList | EntityCollection or ActivityParty[] | activityparty[] or DynamicEntity [] |
AttributeType.Picklist | OptionSetValue | Picklist |
AttributeType.PrimaryKey | System.Guid | Key |
AttributeType.String | System.String | System.String |
AttributeType.State | OptionSetValue or enumeration generated for the entity state | EntityNameStateInfo |
AttributeType.Status | OptionSetValue orint | Status |
AttributeType.Uniqueidentifier | System.Guid | UniqueIdentifier |
AttributeType.Virtual | System.Object Not used in records. | Not used in records. |
List of changes in JavaScript usage in CRM 4.0 and CRM 2011
When working with CRM2011 Java script you will found many difference about syntax/methods between CRM2011 and CRM4.0 Please check some of the comparisons as listed. Please click on the Image below to enlarge view. hats off to the original post contributor.
Happy Coding
List of changes in Custom Workflow Assembly in CRM 4.0 and CRM 2011
here is a a quick list of changes you need to remember while creating workflow assemblies in CRM 4.0 or CRM 2011, as found here.
1. References
CRM 4.0
using System.Workflow.Activities;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Compiler;
using Microsoft.Crm.Sdk;
using Microsoft.Crm.Sdk.Query;
using Microsoft.Crm.SdkTypeProxy;
using Microsoft.Crm.Workflow;
CRM 2011
using System.Activities;
using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
2. Base Class
Base class definition has been changed from SequenceActivity to CodeActivity.
CRM 4.0: In CRM 4.0 we have to specify both Workflow name and Workflowactivitygroupname in the code as written in the following code.
[CrmWorkflowActivity("My Custom Workflow", "CRM Workflow")]
public class MyCustomWF: SequenceActivity
CRM 2011: In CRM 2011 that is done in different way.
public class MyCustomWF: CodeActivity
Both Workflow name and Workflowactivitygroupname can be specified at the time of registering the assembly
3. Execute Method
The overridden Execute method remains the same except parameter and return type.
CRM 4.0
protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
CRM 2011
protected override void Execute(CodeActivityContext executionContext)
4. Create service
CRM 4.0
IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService));
IWorkflowContext context = contextService.Context;
ICrmService crmService = context.CreateCrmService();
CRM 2011
IWorkflowContext context = executionContext.GetExtension<IWorkflowContext>();
IOrganizationServiceFactory serviceFactory = executionContext.GetExtension<IOrganizationServiceFactory>();
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
5. INPUT Parameters
CRM 4.0
Declaration: how to initialize the input parameter
// specified dependency property
public static DependencyProperty CaseIDProperty = DependencyProperty.Register("CaseID", typeof(Lookup), typeof(TotalTaskRetrieval));
// Specified Input property
[CrmInput("Enter Case ")]
// Set the reference Target for Property created
[CrmReferenceTarget("incident")]
// Property Defined for caseId
public Lookup CaseID
{
get
{
return (Lookup)base.GetValue(CaseIDProperty);
}
set
{
base.SetValue(CaseIDProperty, value);
}
}
Use: Access the input parameter declared above as,
Guid caseid=CaseID.Value
CRM 2011
Declaration: how to initialize the input parameter
[Input("Enter Case ")]
[ReferenceTarget("incident ")]
[Default("3B036E3E-94F9-DE11-B508-00155DBA2902", " incident ")]
public InArgument<EntityReference> CaseID { get; set; }
Use: Access the input parameter declared above as,
Guid caseid = CaseID.Get<EntityReference>(executionContext).Id
6. OUTPUT Parameters
CRM 4.0
[CrmOutput("outputSum")]
public CrmMoney Sum
{
get
{
return (CrmMoney)base.GetValue(SumProperty);
}
set
{
base.SetValue(SumProperty , value);
}
}
CRM 2011
[Output("outputSum")]
[Default("23.3")]
public OutArgument<Money> Sum { get; set; }
happy Coding
Thursday, February 3, 2011
The Underlying connection was closed: Unable to connect to the remote server
I was working on a program to import thousands of records in CRM when this issue first appears in front of me.
This is typically seen in scenarios with Microsoft CRM when the server is under high user load or more typically when it is under high load from a Bulk import or a Microsoft CRM SDK application that is importing thousands of records into the application.
what I was doing :The same user and CRM Service was re-used for all calls after successfully working for some time it stops and this error appears “The Underlying connection was closed: Unable to connect to the remote server” this error is a problem due to running out of TCP ports. You can minimize or eliminate this problem by setting the following registry keys on the Microsoft CRM Server(s).
Note that these are both REGDWORD Keys and the values should be set as decimal values.
HKLM\Software\CurrentControlSet\Services\TCPIP\Parameters
Create a new REGDWORD value named MaxUserPort with a value of 65534.
Also create a new REGDWORD value named TcpTimedWaitDelay with a value of 30.
What this means is that we now have a total of 65534 TCP ports available and that they will recycle for use again after 30 seconds. This compares to the default of 5000 ports and a TcpTimedWaitDelay default of 240 (4 min).
enjoy :-)
Tuesday, January 18, 2011
How to change status of the dynamic entity?
to change status of the dynamic entity follow these steps:
1: //Create a request object
2: SetStateDynamicEntityRequest stateRequest = new SetStateDynamicEntityRequest();
3: //Use string and not integer value for state. (For Lead use "Qualified" and not 2)
4: stateRequest.State = newState;
5: stateRequest.Status = newStatus;
6:
7: //Create an instance of the entity
8: Moniker m = new Moniker();
9: m.Id = entityId;
10: m.Name = myDynamicEntity.Name;
11:
12: //Set the state. Well... set the entity.
13: stateRequest.Entity = m;
14:
15: //Send the request
16: SetStateDynamicEntityResponse res = (SetStateDynamicEntityResponse)_crmService.Execute(stateRequest);
How to get rid of the CRM 4.0 “new_” prefix
Today one of my junior colleague asked me “Whenever I'm creating a custom entity in CRM, the type is prefixed with "new_". So are any attributes. How can this be modified/removed?”
although it’s quite simple but I thought many more minds might be thinking the same thing around the globe so I have decided to place it here.
“new_” is the default prefix for custom entities and attributes.
To change it:
- Log into the web interface with an administrator account
- Select: Settings -> Administration -> System Settings
- Select the Customization tab
- Change the Prefix value to your desired one.
Happy Coding :-)
Wednesday, January 5, 2011
Don't upgrade to Rollup12 if you use push email
from Michael Dawson’s linkedin group post we got the info and got the solution too in our environment , so decided to share if someone too facing this issue. thanks Michael for sharing :-)
“We recently upgraded and have been hit with quite a major issue, when an appointment is synchronized from CRM to your Outlook Calendar, Exchange freaks out when trying to send it to your Smartphone device. You get inundated with the following message:
Synchronization with your SmartPhone failed for 1 items.
The following items couldn't be sent to your mobile phone. They haven't been deleted. You should be able to access them using either Outlook or Outlook Web App.
Item Folder: Calendar
Item Type: IPM.Appointment
Item Created: 21/09/2010 16:23:34
Item Subject: 1723 MDTEST
We have called Microsoft Product Support and this is a known issue that is being researched hopefully for inclusion in Rollup13. I have been advised to uninstall Rollup12 if I want to resolve the issue and go back to Rollup11.”
Thursday, October 21, 2010
Mapping MSCRM fields from Opportunity Product to Quote Product
For one of our customer we added some custom attributes in Opportunity product and like to add its mappings to quote product and same with quote product to order product so that Opportunity-Quote-Order process can work as expected and the values of the custom attributes in opportunity product could transfer automatically in Quote product.
Now the Big Question :
MSCRM does not directly list the relationship between a Quote Product and Opportunity Product within the available Customization User Interface.
Answer: a little googling and we got this. A very beautiful and simple Four step process:
STEP 1 –
Run a SQL Query against the MSCRM Database (typically Organization_MSCRM where Organization is the Name for the MSCRM Deployment) to determine the GUID Id of the Relationship between the Quote Product Entity and the Order Product Entity.
SELECT EntityMapId
FROM EntityMapBase
WHERE TargetEntityName='quotedetail' AND SourceEntityName='opportunityproduct'
STEP 2 – Take the output of this SQL Query and insert this into the following URL:
http://[x]/Tools/SystemCustomization/Relationships/Mappings/mappingList.aspx?mappingId=[y]
Where [x] is the URL address of the MSCRM Deployment in question and [y] is the GUID Id output of the SQL Query
STEP 3 – This will present the Relationship Mapping screen for mapping attributes from the Opportunity Product entity to the Quote Product entity.
From here, any number of mappings can be added to define how the Products attached to an Opportunity are mapped across when a Quote is added to the Opportunity. (obviously any changes or additional mappings will need to be published in usual MSCRM fashion)
STEP 4 – Enjoy
The same steps can also be used for controlling how fields are mapped across from Quotes to Orders in a similar fashion.
SELECT EntityMapId
FROM EntityMapBase
WHERE TargetEntityName='salesorderdetail' AND SourceEntityName='quotedetail'
And similarly how fields are mapped from Order Products to Invoice Products.
SELECT EntityMapId
FROM EntityMapBase
WHERE TargetEntityName='invoicedetail' AND SourceEntityName='salesorderdetail'
This is a useful technique when working with any custom fields in a Opportunity-Quote-Order process in MSCRM.
Monday, August 2, 2010
How to add images/HTML to Microsoft CRM E-Mail
The Microsoft CRM e-mail templates are HTML and browser-based. As a result, the following requirements must be met to include a graphic in a template:
- You must be able to display the graphic/Image in a browser. This means that .gif and .jpg graphic formats work best.
- The e-mail template is an HTML file. Graphics/Images are not “embedded” or attached; rather, only a link is placed in the file pointing to where the actual graphic/Image is located.
- The graphic/Image must be on a Web site that the e-mail recipient can access.
To add a graphic to an e-mail template:
- On the Microsoft CRM Home page, click Settings, click Template Manager, and then click E-mail Templates.
- On the Actions bar, click New E-mail Template.
- Select a template type and click OK.
- Complete the details of the e-mail template.
- Open the Web page (using Internet Explorer) or Web site folder (using Windows Explorer) that contains the graphic. Usually all the graphics for a Web site are located in one folder. Links to the graphics in this folder are then placed in the Web files.
- Copy and paste the graphic to your e-mail template. Although the graphic will appear, you have copied and pasted only the link to that graphic.
- Save the e-mail template.
Now you have the desired email template that could be utilized in your Marketing Campaigns.
Hats off to the beautiful post By Marcello Tonarelli
Thursday, July 29, 2010
First Look at Microsoft Dynamics CRM 2011 codenamed Microsoft Dynamics CRM 5
At the Microsoft WPC conference there was a session called “Taking the Covers Off of Microsoft Dynamics CRM 5”. will be publicly available as a beta release in September 2010 for both online and on-premises deployments. Key Things from the session are :
- Microsoft Dynamics CRM 5 is now branded as Microsoft Dynamics CRM 2011.
- The key message for CRM 2011 will be the "Power of Productivity"
- Microsoft is expanding the global availability of CRM Online now it Will include 8 additional markets 40 markets, 41 languages at the end of 2010.
- CRM 2011 will help you manage both customer AND custom relationships.
- You can convert an email to Opportunity directly.
- CRM 2011 now provides native Outlook access to CRM data (it isn't just an Iframe to the web client like CRM 4.0), benefits include:
- You can drag columns to reorder, add/remove, use groups, etc.
- You can toggle the reading pane settings
- Drag/drop form sections on a personal basis
- CRM 2011 allows you to package your customizations into solutions (instead of one giant munged pile of customizations like CRM 4.0):
- Solutions consist of more than entities, also includes security roles, reports, dashboards, plug-in assemblies, etc.
- Developers can work with .NET 4.0 framework
- Can be managed/unmanaged
- "processes" (sometimes referred to as scripts or dialogs). This is a huge new feature that a lot of customers ask for in 4.0.
- You can now create custom activity types in CRM 2011. Big-time benefit!
- CRM 2011 includes field level security! (yeppie… My Favorite)
- CRM 2011 will have multiple forms per entity. Yes!!!!!!!!!!
Have a first look in this hour-long exploration of Microsoft Dynamics CRM 5 and see for yourself what all the excitement is about! We dive deep into the new product, discuss strategies for managing upgrades and explore all the opportunities to make the most of this exciting new release. If you’re a long-time Microsoft Dynamics CRM partner, or a BPOS or SharePoint partner looking to engage in the CRM space, this is a session you won’t want to miss.
Speakers: Andy Bybee, Bryan Nielson, Jason Hunt at digitalwpc
Monday, July 12, 2010
MSCRM 4 - Remove 'Add Existing xxxxx to this record' button
In our CRM implementation where we created several custom entities. It displayed an 'Add Existing xxxxx to this record' button when it was not required and created a lot of confusion among the users. I tried to remove them and like always instead of reinventing the wheel I binged it and then this come to my rescue and within minutes the needful was done. Thanks Dave and 'Dynamic Methods' for this beautiful post. the code that was posted there is :
HideAssociatedViewButtons('new_business_new_surveys', ['Add existing Survey to this record', 'Add a new Survey to this record']);
HideAssociatedViewButtons('new_account_new_eventinvite', ['Add existing Event Invite to this record']);
function HideAssociatedViewButtons(loadAreaId, buttonTitles){
var navElement = document.getElementById('nav_' + loadAreaId);
if (navElement != null) {
navElement.onclick = function LoadAreaOverride() {
// Call the original CRM method to launch the navigation link and create area iFrame
loadArea(loadAreaId);
HideViewButtons(document.getElementById(loadAreaId + 'Frame'), buttonTitles);
}
}
}
function HideViewButtons(Iframe, buttonTitles) {
if (Iframe != null ) {
Iframe.onreadystatechange = function HideTitledButtons() {
if (Iframe.readyState == 'complete') {
var iFrame = frames[window.event.srcElement.id];
var liElements = iFrame.document.getElementsByTagName('li');
for (var j = 0; j < buttonTitles.length; j++) {
for (var i = 0; i < liElements.length; i++) {
if (liElements[i].getAttribute('title') == buttonTitles[j]) {
liElements[i].style.display = 'none';
break;
}
}
}
}
}
}
}
Friday, May 14, 2010
When do asynchronous jobs fail, suspend or retry?
Gonzalo Ruiz wrote an excellent article on When do asynchronous jobs fail, suspend or retry? When the CRM Asynchronous Processing Service gets an error, there are three possible actions it will take depending on the type of error:
- Fail: Job cannot be resumed.
- Retry: Job will be paused and retried after a period of time.
- Suspend: Job will be suspended until it is manually resumed.
The entire error handling mechanism is rather complex but I thought of writing down some general rules that will help understanding what the outcome action will be depending on the error that occurs inside the asynchronous job:
Scenario | Async job result action | Workflow result action | Error code |
An SDK call fails: Infinite loop detected | Fail | 80044182 | |
An SDK call fails: Organization disabled | Retry | 8004A104 / 8004A107 | |
An SDK call fails: Server is busy | Retry | 8004A001 | |
An SDK call fails: Other | Fail | Suspend | |
SQL exception is thrown | Retry | 80040216 | |
Workflow system is paused | N/A | Suspend | 80045017 |
Network error | Retry | 80044306 | |
Record associated with workflow cannot be found | N/A | Suspend | 80045031 |
The HTTP response fails with code HttpStatusCode.Unauthorized | Suspend | 80044306 | |
The HTTP response fails | Retry | 80044306 | |
Plugin or workflow activity throws an InvalidPluginExecutionException | Fail | 80040265 | |
Anything else | Fail | |
Please note that the table above can be used as a general guide but might not cover all scenarios, some exceptions to these actions might apply and it might go outdated in the future.
Why do workflows have a different behavior than other asynchronous jobs when an SDK call fails?
Because the user might be able to fix the problem and resume the workflow. For example, a workflow step sends an email to an account. If the account has no email address, the workflow will suspend with error message "This message cannot be sent to all selected recipients. The e-mail address for one or more recipients is either blank or not a valid e-mail address".
The user can add the email address to the account and resume the workflow. The reason why other asynchronous jobs fail instead is because while workflows are sometimes manipulated by end users, other asynchronous jobs are more oriented towards the system administrator or customizer.
When the result action is Retry, for how long will the job pause before automatically retrying and how much time is there between retries?
The "PostponeUntil" attribute of the asynchronous operation corresponds to the next time it will be retried. The “PostponeUntil” attribute can be retrieved using the SDK. The amount of time to wait until the next retry is calculated considering some deployment settings and grows exponentially on the number of retries. The calculation uses a complex algorithm but these are some default outputs as a function of the RetryCount (the number of times the operation has been retried before):
RetryCount | Time to wait (seconds) |
0 | 36 |
1 | 43 |
2 | 52 |
3 | 62 |
4 | 75 |
>= 5 | Suspend |
Note that by default, any asynchronous operation retrying 5 or more times will be suspended.
When a job has statusreason "Waiting" and statecode "Suspended", how do I know if it will retry or if it is suspended until it is manually resumed?
You can check the "PostponeUntil" attribute of the asynchronous operation to see the time and date in which it will be automatically resumed. If this value is equal to 9999-12-30 23:59:59 (maximum DateTime value) it means that it is waiting to be manually resumed.
How can I retrieve the “PostponeUntil” attribute of the asynchronous operations?
Because the “PostponeUntil” attribute is not available from the entity form or advanced find, you will need to use the SDK to retrieve this value. The following code sample prints the date and time at which each suspended asynchronous job will resume and the number of times it has been retried.
1: static void Main(string[] args)
2: {
3: CrmAuthenticationToken token = new CrmAuthenticationToken();
4: token.AuthenticationType = 0;
5: token.OrganizationName = "AdventureWorksCycle";
6: CrmService service = new CrmService();
7: service.Url = "http://crmserver/mscrmservices/2007/crmservice.asmx";
8: service.CrmAuthenticationTokenValue = token;
9: service.Credentials = System.Net.CredentialCache.DefaultCredentials;
10:
11: QueryByAttribute query = new QueryByAttribute();
12: query.Attributes = new string[] { "statecode" };
13: query.ColumnSet = new ColumnSet(new string[] { "postponeuntil", "retrycount" });
14: query.EntityName = EntityName.asyncoperation.ToString();
15: query.Values = new object[] { (int)AsyncOperationState.Suspended };
16: BusinessEntityCollection bec = svc.RetrieveMultiple(query);
17: foreach (BusinessEntity be in bec.BusinessEntities)
18: {
19: asyncoperation op = (asyncoperation)be;
20: string result = String.Format("Operation id={0} PostponeUntil={1} RetryCount={2}",
21: op.asyncoperationid.Value,
22: op.postponeuntil.UniversalTime,
23: op.retrycount.Value);
24: Console.WriteLine(result);