Thursday, June 25, 2015

CRM CONSULTANT VS CRM DEVELOPER

One of the thing which needs to be clear to clients, companies when we work on projects is the role of a consultant and role of the developer in the projects. This becomes more important when we have larger implementations and multi-geography teams and deployments to handle.
clip_image002
CRM consultant’s is an expert who will visit clients (or be a semi-permanent contractor in an organisation) and advise them on their CRM systems, train employees in
the use of the CRM systems, configure/set up/customise their CRM systems and possibly design/develop software for that organisation (or at least provide a design
spec/requirements for the software and manage the project with software developers).
CRM Developer’s will work on a broad spectrum of work, however, it’s likely to be designing/developing software for a specific purpose or design brief with little or no involvement with the end client.
Or it could be in-house software development for the IT systems of the company that you are working for.
CRM consultant’s is primarily a customer facing function and lot of it involved not only techno-functional skills but also communication skills, presentation skills alongside.
A Technical consultant will also need to possess great CRM and .net technical experience set as well.
CRM developer’s on the other hand is very hands-on job, primarily focused on technical delivery and to develop and package new services and/or offerings in line your organisation and client expectations.
CRM Consultant’s job is also to contribute to the participation in scoping, estimating and risk management efforts.
Also, to participate in building knowledge capital, improving the aptitude of your team by sharing your technical knowledge and experience.
CRM developer’s primary focus is to deliver code maintaining code quality, unit testing and fix bugs with least number of bugs introduced to the project.
CRM Consultant job is to suggest the best possible solution to problem and making it an easy job for the customer to select the best option.
It might be his/her job to complete technical delivery as well.
CRM developer’s need to have not only sound background of CRM but also of Unit testing frameworks.

Referred from Deepesh Somani blog.

Friday, June 19, 2015

Common reasons for slow form loading in MS CRM

The main reason of slow loading forms are
Busy Javascript onload functions
Too many subgrids
Lots of oData/fetchXML queries
Tabs, sections and fields not needed on the form
bad/slow coding
We had our list of worst performing forms and we had a quick look at them and made some quick notes
How many unfiltered OData retrieves
How many OData calls, where they retrieving the same set
Number of ribbon buttons
potential fields/functionality which could be removed by change of business process
size of Javascript onload function

Finding the Slow Forms
Fiddler
One of the tools I used to analyize the slow loading CRM forms was fiddler.  I wrote a blog post about Getting Started with Fiddler and CRM.  It’s a great tool to see what calls are being made from the page, how long they took and how much data they were bringing back.
Looking at the fiddler logs I was able to investigate the OData queries and find
Which OData calls took the longest
Find OData calls which were not filtered
Find OData calls which were retrieving the same data multiple times
general loading times of sections of code
F12 Debugger
The F12 debugger is such an awesome tool for debugging Javascript.  I put in a break point in the onload Javascript and walked through the code.
We are using two main methods to find slow loading code
Looking at the code
Stepping through the code

How to speed up form loading
In some of the forms we were retrieving fields from related entities but to speed up the form the customer was happy to use lookups and click those for more information if it was needed.   This saved OData queries
These changes can remove some of the code triggered on the Javascript onload.
Improvements can come from moving fields and subgrids into unexpanded tabs where the loading can be delayed until the tab is expanded
Remove unwanted/unused fields
CRM Developers have to refactor their code then I think CRM Forms and entities should be refactored to remove the noise of unused fields.
There is a great tool to help you with this called CRM Data Detective it will show you what fields are being used/not used by seeing if any values were written to those fields.  The CRM Data Detective is a free tool which works with CRM 2011 and CRM 2013.

Monday, June 1, 2015

SECURE VS UNSECURE CONNECTION STRING IN MS CRM

Then in the Constructor of your plugin class you will get the configuration value which you can use later in the Execute method:
public abstract class BasePlugin : IPlugin
{
    
private string _secureConfig = null;
    
private string _unsecureConfig = null;

    
public BasePlugin(string unsecureConfig, string secureConfig)
    {
        _secureConfig = secureConfig;
        _unsecureConfig = unsecureConfig;
    }

    
public void Execute()
    {
        
// Use the configuration here
    }
}


PROS:

·                     The step configuration is solution-aware so it will be automatically transported with the plugin step.
CONS:

·                     You need to use the plugin registration tool or another application to update the step configuration.
·                     The configuration is step-specific so you have to provide it and/or update it for every step even if the value is the same for all the steps (the configuration is on each step instead of the assembly or plugin type).
·                     the configuration is just an attribute of the plugin step so you cannot control privileges on the configuration independently from privileges on plugin step entity.


Sharing and Unsharing Records in CRM 2011/2013

Hi All, Here I am going to share Account record with a user and then unsharing the account from the user in CRM 2011. Here is the logic to share and unshare records

sharing
 // Create the request object and set the target and principal access
GrantAccessRequest grantRequest = new GrantAccessRequest()
            {
                Target = new EntityReference(Account.EntityLogicalName, accountId),
                PrincipalAccess = new PrincipalAccess()
                {
                    Principal = new EntityReference(SystemUser.EntityLogicalName, userId),
                    AccessMask = actionRights
                }
            };

 // Execute the request.
GrantAccessResponse granted = (GrantAccessResponse)service.Execute(grantRequest);

Unsharing 
 // Create the request object and set the target and revokee.
            RevokeAccessRequest revokeRequest = new RevokeAccessRequest()
            {
                Target = new EntityReference(Account.EntityLogicalName, accountId),
                Revokee = new EntityReference(SystemUser.EntityLogicalName, accountuserId)
            };

// Execute the request.

 RevokeAccessResponse revoked = (RevokeAccessResponse)service.Execute(revokeRequest);

Actions that can be automated in MS CRM

Normally, progressing along the business process depends on user input. As a developer, you can perform the same actions programmatically in form scripts.

Change the process when there are more than one process available for the entity.
Use Xrm.Page.data.process.getEnabledProcesses to retrieve information about enabled processes that the user can choose for the entity. Then useXrm.Page.data.process.setActiveProcess to make one of the enabled processes the active one.

Move to the next stage when all required steps are completed to make it the current active stage.
Use Xrm.Page.data.process.moveNext.

Move to the previous stage and make it the current active stage.
Use Xrm.Page.data.process.movePrevious.

Select a stage to view the status of the steps in the stage.
Use Xrm.Page.data.process.getActivePath to retrieve information about the stages that have been completed, the current active stage, and valid stages available from the current active stage. Examine the steps included in that stage and compare the corresponding form attribute values to determine whether they are completed.

Complete a step
Steps are completed when the corresponding data in the form is entered. You can determine the attribute using the step getAttribute method. This will return the logical name of the attribute. Then use Xrm.Page.getAttribute to retrieve attribute from the Xrm.Page.data.entity.attributes collection and then use the attribute setValue method to set the value.

Detect whether a step is required
Use the step isRequired method to determine if a step is required by the business process flow.

Expand or collapse the business process flow control
Use Xrm.Page.ui.process.setDisplayState.
There are also some things you can do as a developer that a user cannot perform.

Hide the process control
Use Xrm.Page.ui.process.setVisible, you can control whether to display the business process flow control.

Skip to a valid completed stage.
Use Xrm.Page.data.process.setActiveStage to set one of the valid completed stages for the current entity.

Query the process definition including stages not currently visible

Use Xrm.Page.data.process.getActiveProcess to query the definition of the business process flow, including stages that might not be visible because of branching logic in the process.

Events for business process flows
You can interact any event provided by the form with business process flows, but two new events allow you to execute code based on events just for the business process flow control. You can execute code when the active stage of a business process flow changes (OnStageChange event) or when a stage is selected (OnStageSelected event).

Neither of these new events provide a user interface to register your event handlers. You must use methods provided to add or remove handlers for these events in the form OnLoad event.. More information: Business Process Flow control events