A new version of SnapShot! for Dynamics CRM is now available.  See the product page for more information.

 

Enhancements

The following enhancements have been made:

 

Security Privilege Raw Data Report

The Raw Security report now includes the entity name which should better allow you to filter the data to examine the data that is being report back from Dynamics CRM.

 

Empty JavaScript Event Handlers

This may be an edge-case for most people, but for some it might be fairly useful.  Here is the scenario:

You are upgrading your Dynamics CRM system from CRM 2011 to CRM 2013 or 2015 and you have a lot of JavaScript still in the Dynamics CRM 4.0 object model.  That means that you cannot upgrade to CRM 2013 because it will not pass the pre-upgrade checks.

You need to verify the physical upgrade process in your test environment to make sure that everything will work in production, but you have not fully completed the JavaScript upgrade. ( Something that Transformer! is really go at.)

This new feature will create empty JavaScript functions for each Event Handler found on a form.  This allows you to temporarily replace the actual web resources with a web resource consisting of these empty functions, commonly called “stubs.”

This will allow you to verify the upgrade process because you have removed all of the CRM 4.0 JavaScript, and since the functions actually exist within the web resources, your forms will function as they always have and you will not receive “object not found” messages as you would see had you just removed the contents of the web resource entirely. (which is the other option).

 

 

Issues Corrected

The user-security report was not always reporting the correct information in the Custom Entities section, so I spent some type to track down the issue and correct the report. While I was in that area, I also enhanced the report to make it better resemble the Security Role display. The entities are now sorted alphabetically and when no security privilege is found, the white circle is displayed.

image

Here is the detail of that error:

Some plug-ins or custom workflow activities in your system appear to be using the Microsoft CRM 4.0 SDK. Use of the Microsoft CRM 4.0 SDK is not supported in this release. For information about how to upgrade custom code, refer to the Microsoft Dynamics CRM 2011 SDK topic "Upgrade Your Code from Microsoft Dynamics CRM 4.0 to Microsoft Dynamics CRM".
We have detected the presence of legacy component(s) during upgrade, these components are not supported in Dynamics CRM 2013. Please refer to upgrade log file C:\Users\crmadmin\AppData\Roaming\Microsoft\MSCRM\Logs\LegacyFeatureCheck.xml for more information.

When you look at that XML file you will see the following:

<DeploymentVerificationResults xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Result>
    <OrganizationName>***Deployment***</OrganizationName>
    <OrganizationId>00000000-0000-0000-0000-000000000000</OrganizationId>
    <Issues>0</Issues>
    <Results>
      <VerificationResult>
        <Severity>Info</Severity>
        <Component>General</Component>
        <ComponentId>00000000-0000-0000-0000-000000000000</ComponentId>
        <Message>Checking for the ISV folder when running on the web server.</Message>
      </VerificationResult>
    </Results>
  </Result>
  <Result>
    <OrganizationName>TestOrg</OrganizationName>
    <OrganizationUniqueName>TestOrg</OrganizationUniqueName>
    <OrganizationId>00000000-0000-0000-0000-000000000000</OrganizationId>
    <Issues>4</Issues>
    <Results>
      <VerificationResult>
        <Severity>Info</Severity>
        <Component>General</Component>
        <ComponentId>00000000-0000-0000-0000-000000000000</ComponentId>
        <Message>Checking for Microsoft Dynamics CRM 4.0 plug-ins</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Info</Severity>
        <Component>PluginAssembly</Component>
        <ComponentId>6674346c-b91b-4083-9867-47ca9b0b0dd7</ComponentId>
        <Message>Name: MainPlugin, Version: 1.0.0.0, Length: 21164, Location: 
                 Database, Is V4: True.</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Warning</Severity>
        <Component>PluginAssembly</Component>
        <ComponentId>6674346c-b91b-4083-9867-47ca9b0b0dd7</ComponentId>
        <Message>Assembly "MainPlugin" with version '1.0.0.0' 
                 references the CRM 4.0 SDK.</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Info</Severity>
        <Component>PluginAssembly</Component>
        <ComponentId>28c70061-56d3-4ec3-a62d-8fb83743a1b3</ComponentId>
        <Message>Name: ISV.MSCrm.Tools.Plugin.Crm40, Version: 7.0.0.0, Length: 98304, 
                 Location: Database, Is V4: True.</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Warning</Severity>
        <Component>PluginAssembly</Component>
        <ComponentId>28c70061-56d3-4ec3-a62d-8fb83743a1b3</ComponentId>
        <Message>Assembly "ISV.MSCrm.Tools.Plugin.Crm40" with version '7.0.0.0' 
                 references the CRM 4.0 SDK.</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Error</Severity>
        <Component>Plugin</Component>
        <ComponentId>41d526ec-0be1-4b46-84a9-695cc10ff248</ComponentId>
        <Message>'ISV.MSCrm.Tools.Plugin.Crm40.EntityConversionMonitor' 
                  registered for 'Create' of 'quote' appears to be using CRM 4.0 SDK.</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Error</Severity>
        <Component>Plugin</Component>
        <ComponentId>41d526ec-0be1-4b46-84a9-695cc10ff248</ComponentId>
        <Message>'ISV.MSCrm.Tools.Plugin.Crm40.EntityConversionMonitor' 
                  registered for 'Create' of 'salesorder' appears to be using CRM 4.0 SDK.</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Info</Severity>
        <Component>General</Component>
        <ComponentId>00000000-0000-0000-0000-000000000000</ComponentId>
        <Message>Checking for web resources accessing the 2007 web service endpoint</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Info</Severity>
        <Component>WebResource</Component>
        <ComponentId>00000000-0000-0000-0000-000000000000</ComponentId>
        <Message>Checking 55 web resources</Message>
      </VerificationResult>
      <VerificationResult>
        <Severity>Info</Severity>
        <Component>WebResource</Component>
        <ComponentId>00000000-0000-0000-0000-000000000000</ComponentId>
        <Message>Did not find any web resources that contain calls to 
                 the 2007 web service endpoint</Message>
      </VerificationResult>
    </Results>
  </Result>
</DeploymentVerificationResults>

 

What you have in this list is the results of a series of tests performed by the validation process.  These tests check various components, such as plugins and web resources, for code that would cause a problem with a function Dynamics CRM 2013 system.

The Severity of the result will dictate if it passes or fails.  Here are the options:

Info is just an FYI message.

Warning contains warning information about a potential problem.  It is not enough to stop the upgrade, but it is something that needs to be reviewed and addressed.

Error conditions will actually cause the validation process to fail and keep you from performing the upgrade.

 

As you can see within the XML, the Error condition exists because one of the plugins is using the Dynamics CRM 4.0 endpoint (what they refer to as the 2007 endpoint).

The solution, in this case, was to remove the plugin assembly and associated steps from the database before proceeding with the upgrade.  That was fine in this case since it was a third-party plugin that we are upgrading anyway.  But, had it been a plugin that was actually used in production, it would have to be written.

The Dynamics CRM team has added YouTube and a Facebook app to their growing list of social and community sites.

You can access the YouTube page here:

https://www.youtube.com/user/msdyncomm/DynamicsCRM

The Facebook App can be accessed directly at:

https://apps.facebook.com/microsoftdynamics/

 

Twenty-One Lessons in Twenty-One Days

xRM Coaches

 

I have conducted a lot of training over the past two years but found that I was always missing connections to new students, mostly due to scheduling conflicts or just by them having too busy a schedule to take off work for a couple of days.

Even after I moved most of my training to the half-day model, I still had people who had interest, but no time.

That led me to explorations of other training solutions, one of which is a series of self-study courses I call Twenty-One Squared.

 

The Twenty-One Squared Concept

I wanted to break things into bite-sized chunks of content that anyone could consume in their own time, at their own pace, while also enabling them to get fairly immersed in a topic.

Each lesson is designed to take between 15 and 60 minutes to complete, depending on the subject matter.

These will be hands-on exercises where you not just read about what to do, you actually do it.  Much like the design of my instructor-led courses.

 

Topic Areas

I am working through the final processes of the following topic areas:

  • Dynamics CRM Administration
  • Introduction to Dynamics CRM JavaScript
  • Advanced Dynamics CRM JavaScript
  • Introduction to Dynamics CRM .NET Development

 

Training Format

Each course consists of a training and exercise guide and each lesson is mostly self-contained, though some lessons build on previous topic areas and concepts.

Additional supporting materials are provided as is needed by the course.

 

Need Additional Information?

If you would like to sign up to be notified as the courses become available, the please complete the following survey:

http://www.xrmcoaches.com/21-squared-training-survey

My goal is to make these available in the next few weeks, depending on availability and interest.

 

Please let me know if you have any other comments or thoughts on the concept or the materials.

I have been working on several upgrade scenarios lately and have decided to offer a new license for my documentation utility, SnapShot! for Dynamics CRM.

SnapShot! is designed to give you a complete snapshot of your Dynamics CRM organization.  Since things change over time, it is normally licensed on an annual basic

But what if you only need to run it once?  That is the question I have always asked myself.  So…

 

Announcing the 7-Day SnapShot! License

This is mainly geared toward situations where you just need to run SnapShot! one time and will not need to use it again for that organization.  This can happen in an upgrade situation, or maybe when you are trying to get a feel for the current state of an organization, etc.

Regardless of the requirements, I hope you find the new license type useful.

 

Visit the SnapShot! product page for more information.

If you are looking to get started with Dynamics CRM 2013 development, and are looking for an instructor-led, hands-on workshop, then let me introduce you to: Extending Dynamics CRM 2013.

 

When:

Monday, December 8th through Friday, December 12th.

Class will run between 4 and 6 hours per day, depending on the content for that day.

Where:

This is a Internet-based workshop with each student having their own virtual environment for the duration of the course.

How Much:

$1,695 per student with a discount available for multiple students.

Eventbrite - Extending Dynamics CRM 2013 (December)

 
What:

Day 1: Introduction to Dynamics CRM Development

The first day we will cover the basics of Dynamics CRM development including:

  • Dynamics CRM Architecture
  • Extensibility points
  • Working with the CRM SDK including:
    • Creating, retrieving, Deleting and Updating data
    • Executing requests
    • Generating early-bound classes using the CrmSvcUtil application

Day 2: CRM Query Strategies

On day two we will be working with the various data retrieval technologies built into the Dynamics CRM SDK.

  • QueryExpression
  • QueryByAttribute
  • FetchXml

Day 3: Plugins and Custom Workflow Activities

Day three will be filled by developing plugins and custom workflow activities.

Day 4: JavaScript

Day four will shift to the client where we will work with:

  • The Dynamics CRM 2013 JavaScript object model
  • The XrmSvcToolkit

Day 5: User Experience Customizations

The final day will be focused on:

  • Editing the SiteMap
  • Editing the Ribbon
  • Working with Solutions          

 

Requirements:

1. It is assumed that you already know and have used Dynamics CRM 2011 or 2013.  ( this is not an introduction to Dynamics CRM class so you will need to understand how the product works. ).

2, This is a class for developers, which means you need to know how to use Visual Studio, .NET and JavaScript.

3. You must be prepared to learn. This is a hands-on class and you need to be prepared and willing to do a lot of development work.

4. You need to be willing to have fun.  Having fun makes the class better for everyone.

 

If you have any questions, then please let me know.

Most of the Dynamics CRM developers I know use C# as their programming language of choice but VB.NET is an alternative.

If you have a few minutes, please vote in the poll (located on the right-side of my main blog page).

A pre-release of the Dynamics CRM 2015 SDK is now available. This SDK has a version number of 7.0.a and you may download it here:

http://www.microsoft.com/en-us/download/details.aspx?id=44567

 

What’s New

After you download and install the SDK, open the help file and navigate to this topic:

What's new for developers

Developers will be able to leverage the following enhancements and new capabilities in this release:

  • Product catalog enhancements
  • Use hierarchical data
  • Apply hierarchical security models
  • Use calculated and rollup attributes created in Dynamics CRM
  • Write form scripts that interact with business process flows
  • Use field-level security with system entities
  • Create business rules instead of writing code
  • Add custom help content
  • Use two-factor authentication
  • New messages in the Organization web service
  • New messages in the Deployment web service
  • New entities
  • New privileges
  • New NuGet packages

As you can see, lots and lots of information for us to dig through.

As always, the Dynamics CRM SDK and Documentation team is producing great content and keeping us all in the loop on the new stuff.

So one of my customers ran into this issue while opening an Opportunity.  As you can see, a custom plugin was throwing an exception because it could not find a Account with a specified ID.

SNAGHTML5c035ae

That part is 100% correct.  The Account with that ID indeed does not exist in the database.

The problem is, this plugin should never have been fired. As I mentioned, this was happening on a Retrieve operation and there are no plugins registered against the Retrieve Message.

So I waited until tonight so I could turn on Tracing (on-premise, of course), and this is what I found:

[2014-10-16 20:12:57.600] Process: w3wp |Organization:d98bbf24-8eed-4cb4-a379-6aa848499cb0 |
    Thread:   25 |Category: Exception |User: fb9a439c-b578-4a4b-83e0-39ea0059ad2a |
    Level: Error |ReqId: eb0bc9e4-e6e6-4552-b322-1c2fa0bdbc10 | 
    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 RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig,
       Boolean constructor)  ilOffset = 0xFFFFFFFF

    at RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Binder binder,
       Object[] parameters, CultureInfo culture)  ilOffset = 0xF7

    at RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args,
       CultureInfo culture, Object[] activationAttributes, StackCrawlMark& stackMark)  ilOffset = 0x1E8

    at Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args,
       CultureInfo culture, Object[] activationAttributes)  ilOffset = 0xBB

    at Activator.CreateInstance(Type type, Object[] args)  ilOffset = 0xA
    at VersionedPluginProxyStepBase.WrapExceptionToThrow(CrmException exception)  ilOffset = 0xD3
    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 = 0x156

    at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken,
       CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, 
       Boolean traceRequest, OrganizationContext context, Boolean returnResponse)  ilOffset = 0x145

    at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken,
       CallerOriginToken callerOriginToken, WebServiceType serviceType)  ilOffset = 0x3D

    at OrganizationSdkServiceInternal.Retrieve(String entityName, Guid id, ColumnSet columnSet,
       CorrelationToken correlationToken, CallerOriginToken callerOriginToken, WebServiceType serviceType)  ilOffset = 0x66

    at InprocessServiceProxy.RetrieveCore(String entityName, Guid id, ColumnSet columnSet)  ilOffset = 0x28
    at OrganizationServiceProxy.Retrieve(String entityName, Guid id, ColumnSet columnSet)  ilOffset = 0x4
    at Utility.UpdateAccountKeyword(IOrganizationService service, Guid accountId)  ilOffset = 0xE8 
        C:\Plugins\SupportingClasses\Utility.cs(205)

    at InvoiceCancelOpportunityCloseKeywords.Execute(IServiceProvider serviceProvider)  ilOffset = 0x164 
        C:\Plugins\InvoiceCancelOpportunityCloseKeywords.cs(70)

    at V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context)  ilOffset = 0xD0
    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.UpdateWithInvocationSource(BusinessEntity entity, FilterExpression filter,
       Int32 invocationSource, ExecutionContext context)  ilOffset = 0xCE

    at ExtensiblePlatformMessageDispatcher.Update(BusinessEntity entity, FilterExpression filter, ExecutionContext context) 
       ilOffset = 0x5

    at BusinessProcessObject.UpdateWithPipelineAndExtensions(IBusinessEntity entity, ExecutionContext context)  ilOffset = 0x78
    at QOIPriceService.UpdateEntity(BusinessEntity newQoi, BusinessEntity oldQoi, ExecutionContext context)  ilOffset = 0x87
    at PriceService.CalculatePrice(BusinessEntity entity, Guid lineItemId, Boolean skipQOIDetailPricing,
       Boolean overridePricePerUnitLock, Boolean overrideDiscountLock, ExecutionContext context)  ilOffset = 0x6E1

    at OpportunityPriceService.CalculatePrice(BusinessEntity entity, Guid lineItemId, Boolean skipQOIDetailPricing,
       Boolean overridePricePerUnitLock, Boolean overrideDiscountLock, ExecutionContext context)  ilOffset = 0x70

    at QOIPriceService.CalculatePrice(Guid qoiId, Guid lineItemId, Boolean skipLineItemPricing, Boolean overridePricePerUnitLock,
       Boolean overrideDiscountLock, Boolean isModifiedBySystem, ExecutionContext context)  ilOffset = 0x2E

    at OpportunityService.CalculatePrice(Guid opportunityId, Guid opportunityProductId, Boolean skipOpportunityProductPricing,
       Boolean overridePricePerUnitLock, Boolean overrideDiscountLock, Boolean isModifiedBySystem, ExecutionContext context) 
       ilOffset = 0x12

    at QOIService.Retrieve(BusinessEntityMoniker moniker, EntityExpression entityExpression, ExecutionContext context,
       Boolean isModifiedBySystem, Boolean calculatePrice, Int32 state)  ilOffset = 0x2D

    at OpportunityService.Retrieve(BusinessEntityMoniker moniker, EntityExpression entityExpression,
       ExecutionContext context)  ilOffset = 0x14

    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 = 0x89

    at LogicalMethodInfo.Invoke(Object target, Object[] values)  ilOffset = 0x4F
    at InternalOperationPlugin.Execute(IServiceProvider serviceProvider)  ilOffset = 0x57
    at V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context)  ilOffset = 0x58
    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 = 0x156

    at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken,
        CallerOriginToken callerOriginToken, WebServiceType serviceType, UserAuth userAuth, Guid targetUserId, 
        Boolean traceRequest, OrganizationContext context, Boolean returnResponse)  ilOffset = 0x145

    at OrganizationSdkServiceInternal.ExecuteRequest(OrganizationRequest request, CorrelationToken correlationToken,
       CallerOriginToken callerOriginToken, WebServiceType serviceType)  ilOffset = 0x3D

    at OrganizationSdkServiceInternal.Execute(OrganizationRequest request, CorrelationToken correlationToken,
       CallerOriginToken callerOriginToken, WebServiceType serviceType)  ilOffset = 0x24

    at InprocessServiceProxy.ExecuteCore(OrganizationRequest request)  ilOffset = 0x34
    at PlatformCommand.XrmExecuteInternal()  ilOffset = 0xF6
    at RetrieveCommand.Execute()  ilOffset = 0x2
    at EntityProxy.Retrieve(String[] columns, Guid auditingTransactionId, Boolean addRequiredColumns)  ilOffset = 0x69
    at EntityProxy.Retrieve(String[] columns, Guid auditingTransactionId)  ilOffset = 0x4
    at EntityProxy.Retrieve(String columnSet, Guid auditingTransactionId)  ilOffset = 0xB
    at EntityProxy.Retrieve(String columnSet)  ilOffset = 0x7
    at AppForm.FormLoadEvent()  ilOffset = 0x11
    at AppForm.RaiseDataEvent(FormEventId eventId)  ilOffset = 0xC7
    at EndUserForm.Initialize(Entity entity)  ilOffset = 0x1F
    at CustomizableForm.Execute(Entity entity, FormDescriptor fd)  ilOffset = 0x62
    at RecordPageHandler.ConfigureFormWrapper()  ilOffset = 0xC
    at GenericEventProcessor.RaiseEvent(String eventName)  ilOffset = 0x2D
    at PageManager.OnPreRender(EventArgs e)  ilOffset = 0x47
    at Control.PreRenderRecursiveInternal()  ilOffset = 0x54
    at Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  ilOffset = 0x6D3
    at Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)  ilOffset = 0x3C
    at Page.ProcessRequest()  ilOffset = 0x14
    at Page.ProcessRequest(HttpContext context)  ilOffset = 0x33
    at CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  ilOffset = 0x18D
    at HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)  ilOffset = 0x15
    at ApplicationStepManager.ResumeSteps(Exception error)  ilOffset = 0x10A
    at HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)  ilOffset = 0x5C
    at HttpRuntime.ProcessRequestInternal(HttpWorkerRequest wr)  ilOffset = 0x16A
    at ISAPIRuntime.ProcessRequest(IntPtr ecb, Int32 iWRType)  ilOffset = 0x4B

That is 75 calls, if you didn’t feel like counting, and in the middle of all of that was the failing call to my plugin.

The nearest thing I can figure is that this Opportunity is set to be System Calculated and when it was opened, a update to the revenue numbers. This ended up firing my plugin which failed because data that was passed to it turned out to be invalid.

I temporarily disabled the plugin and was able to save the Opportunity and correct the invalid data issue.

I could not have done this troubleshooting without the following tools:

If you do not have these tools in your toolbox, you need to fix that today.

The XRM Toolbox for Dynamics CRM is a collection of utilities for Dynamics CRM developers and administrators, written by fellow MVP Tanguy TOUZARD.

The Toolbox received an update today that includes two new tools:

 

User Settings Utility

Update user settings in bulk.

image

Metadata Browser

Browse metadata without installing solution in your organization.

image

 

Other Tools Updates

  • ViewLayoutReplicator : Fixed source view display layout
  • ViewLayoutReplicator : Fixed tool layout
  • ViewLayoutReplicator: Fixed removal of criteria in target view link-entity nodes
  • ImportNN : Fixed import of NN relationships between the same entity
  • EasyTranslator: Added SiteMap custom labels translation
  • FormAttributeManager : Adding sorting and selection capabilities
  • SynchronousEventOrderEditor: Fixed missing close button

 

More information may be found in this post.

Sign up for our new KnowledgeBits service and get news, tips and tricks and more, delivered straight to your inbox.