Dynamics CRM 2015 Hierarchical Security

Posted by on October 1, 2014  |  commentsComments (0)

Microsoft recently announced new features coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega).  Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015. 

Next up for our review are the changes being made to the security model.  Note that the functionality below are simply additions to the security model.  The previous security of business units, access teams, ownership teams, security roles, etc. will remain in place.

Field Level Security Improvements:

First off we’ll briefly discuss some changes being made for Field Level Security (FLS).  FLS will now be available to work off of System Fields.  Previously this only was available for Custom Fields

FLS also has extended for additional attribute types such as address fields (out of the box only) and email address fields (custom or out of the box fields).

Now lets review the the new major change to security that’s coming in CRM 2015, the Hierarchical Security Modeling.

Hierarchical Security Modeling

With CRM 2015, Microsoft introduces a new version of security they label Hierarchical Security Modeling.  With this security modeling, granular record level access can be granted for an organization without having to create and manage business units.

With the introduction of hierarchical security modeling, Microsoft has moved the Security functionality to its own area of CRM.  You can now get to everything security related by going to Settings –> Security (previously this was in the Administration section).

image

You’ll notice a new Hierarchy Security link on this page as well as a Positions link.  If you click on it you’ll notice the following options:

  • Enable Hierarchy Modeling:  Let’s you turn this on or off globally in your organization
  • Select Hierarchy Modeling:  You can set this to either Manager or Position (more on these options below)
  • Hierarchy Depth:  This indicates how many levels up the hierarchy chain does the read permissions get granted to.  More on this below especially regarding performance.
  • Selected Entities:  This is where you’d select entities that you want the hierarchy security modeling to apply to.

image

Manager Hierarchy uses the existing Manager field on the System User record.  However, with this hierarchical model, you’re required to be in the same Business Unit hierarchy for it to apply successfully.  This is why the Position Hierarchy Model was built which we’ll describe below.  A good Use Case for the manager model is if a manager needs to take actions upon records their reports have access (for example the report goes on vacation)

Position Hierarchy on the other hand allows you to go across business units.  CRM Administrators can and add users to any given position to be included in that position.  A good Use Case for the position model is organizations that have a “Sales Team” and “Sales Management” team that span across business units yet these positions should have access to subordinate records.

As stated earlier, Position Hierarchy can be configured where an Administrator can define Positions, define the Parent Positions, and also add users to Positions so that the Position Hierarchy security method is executed to your specific business needs.

image

It is strongly recommended that Hierarchical Security be used with the other security tools (e.g., security roles, teams, business units, etc.).  The Hierarchical Security model does grant additional permissions based on users, managers, and positions:

  • Read Access:  Propagates up the chain to a specific configurable level (as shown above in the Settings screenshot
  • Write, Update, Append, Append To: This is granted just to the direct parent of the user/positions

There are also some performance considerations to keep in mind when enabling hierarchy security:

  • Use with other security methods (e.g., security roles, business units, teams, etc.) for more complex scenarios
  • Target 4 levels of hierarchy (1 manager with 3 reports, and 100-200 potential users underneath)
  • Performance is tied to the # of users (not the depth) in the parent’s chain:
    • 1 manager with 4 reports and 1 level in the chain, is the same as
    • 1 manager with 1 report and 5 levels in the chain

With all the security methods provided out of the box by Dynamics CRM now with 2015, I can see some organizations with very complex security requirements being easily achievable using native security methods.

Salesforce1 and iOS 8 don’t mix

Posted by on September 26, 2014  |  commentsComments (0)

Apple recently released iOS 8, which while providing many enhancements to these devices also breaks custom Visualforce pages in the Salesforce1 mobile app. Recently Salesforce posted this as a Known Issue on their success site, with the recommended work around of using the mobile Safari browser to access Salesforce1. Until this issue is resolved we recommend not upgrading your iOS version if at all possible. If you are experiencing issues with your custom pages not working after the upgrade to iOS 8, please take a moment to log in and click the ‘This Issue Affects me’ button on the page so that you receive any updates from Salesforce on this issue.

Dynamics CRM 2015 Calculated and Rollup Fields

Posted by on September 26, 2014  |  commentsComments (2)

Microsoft recently announced new features coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega).  Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015. 

Prior to Dynamics CRM 2015, in order to perform calculations / rollups, you had to write code in order to do so which meant you had to invest in a developer which isn’t always possible for our customers.  However, with Dynamics CRM 2015, Microsoft has provided the ability for power users / administrators to create and update calculated fields and rollup fields using the CRM web client and customizations area within Settings.  Below we’ll discuss both Calculated Fields and Rollup Fields in more detail, their uses, and current limitations.

When you’re defining your custom fields, at that time you can indicate if the field will be Simple (pre 2015 calculated fields that we’re all used to) Calculated (new for 2015), or Rollup (new for 2015).  Based on the Data Type of the field will determine what values you can select in the Field Type drop down.  This value can only be set upon field creation.  Once the field is created the Simple/Calculated/Rollup flag may not be updated.

Calculated Fields:

You can create a calculated field for any data type, except Multiple Line of Text, Image, or Lookup fields.  When you create the field, an “Edit” link will appear next to the Field Type.

 image

When you click the Edit button, you’ll be taken into the editor where you can edit your calculations.  When you’re editing the calculation, you can use any field from the current entity, or any N:1 entity in your calculation or conditions.  You can also use AND and OR in your conditions to make more complex conditions.  However there is a limitation to this functionality (see limitations section below).

The UI of the edit page is similar to the modern UI when modifying Business Rules or Business Processes.  So your admins will have a consistent look and feel amongst all of these customization tools.

image

The calculation designer also supports intellisense so when you’re editing the calculation, you’ll see hints of what you can select from and what you need to enter as you type.

image

These fields are actually virtual fields that are NOT stored in the database.  However, they can be used and displayed like any other physical field in views / reports / charts / forms / Field Level Security.

When modifying fields that affect the calculation, the calculated field is calculated synchronously after a Save is performed.  The the end user will get immediate feedback that data has changed after the form is refreshed.

Rollup Fields:

Rollup fields are used to perform record level aggregation from related records.  For example, if you wanted to have a field on the Account that rolled up the Estimated Revenue for all Open Opportunities related to the Account, you could easily identify at the Account level what the Total Open Revenue was and then know what Accounts you should focus most of your time and energy on.

Similar to Calculated Fields, Rollup Fields do not support all data types.  Rollup fields are only available for Whole Number, Decimal Number, Date & Time, and Currency fields.  The table below shows how you can rollup child data using the rollup fields for the different data types.

Data Type

COUNT

MAX

MIN

SUM

Whole Number

x

 

 

 

Decimal

x

x

x

x

Currency

 

x

x

x

Date & Time

 

x

x

 

Similar to Calculated Fields, when you’re creating your field, you’ll see an Edit button appear if you choose Rollup for Field Type.

image

When you click on the Edit button you’ll see a similar modern UI as when you edited your Calculated Fields, Business Rules, or Business Processes.

When editing the Rollup Field, you can select to use a hierarchy or not.  If you select to use the hierarchy, then what will happen is that all related records that are related to any record in the hierarchy will be used in the rollup (you can optionally filter records in the hierarchy as well).  An example here would be if you want to find the Total Open Revenue for Opportunities that are related to any Account in a hierarchy (versus those Opportunities that are just related to the current Account).

image

The calculation of a Rollup Field is different than a Calculated Field.  Whereas the Calculated Field was performed synchronously immediately after clicking Save on a record, a Rollup Field is calculated using asynchronous jobs.  This is performed automatically but if you wanted to, a user could manually kick off the rollup calculation job on demand.  You can also use the API to recalculate rollup fields on demand using code.

Similar to Calculated Fields, Rollup Fields are actually virtual fields that are NOT stored in the database.  However, they can be used and displayed like any other physical field in views / reports / charts / forms / Field Level Security.

You can solve some pretty complex business use cases using both Calculated Fields and Rollup Fields.  Rollup Fields can be a part of a Calculated Field, and a Calculated Field can be a part of a Rollup Field.l

When modifying fields that affect the calculation, the calculated field is calculated synchronously after a Save is performed.  The the end user will get immediate feedback that data has changed after the form is refreshed.

Limitations:

Like all new features, it’s important to note the limitations and areas that hopefully Microsoft will improve upon with future releases:

  • General:
    • Workflows aren’t trigger by field updates
    • Latest values not available in plugin create/update pipeline
  • Calculated Fields:
    • Can only go 1 level up in N:1 relationships
    • Can only have all ANDs or all ORs in Conditions
    • Not available for offline
    • Have to save the record first before calculated field is updated when form refreshes
    • Only Calculated fields using all simple fields can be sorted
  • Rollup Fields
    • Only available using a single directly related 1:N entity
    • Complex calculated fields cannot be used in rollups
    • Rollup using other rollup fields is not supported

Server Side Synchronicity 2

Posted by on September 25, 2014  |  commentsComments (0)

Today's guest blogger is Ross Talbot, a Development Principal at Sonoma Partners

In the continuing discussion regarding Server Side Synchronization in Dynamics CRM 2013, we previously detailed some of the gotchas we had encountered with upgraded orgs and some added fixes with communication between Exchange web services and CRM. We also expanded on a few permission issues we noticed after an upgrade from CRM 2011. The focus of today’s episode revolves around an addition in CRM 2013 SP1 involving communication between CRM and Exchange.

When you set up Server Side Sync and create your Email Server Profile, you are detailing the connection between CRM and Exchange so that when CRM Emails, Appointments, Contacts, and Tasks need to be updated, each server knows where to go find the other. What happens, though, when you have an Active Directory user who is a member of more than one CRM organization? Well from the CRM side, we are identifying the Exchange server web service address in the Email Server Profile record, as shown below.

image

What about the reverse direction though, from the Exchange side? When you set up the architecture for your CRM environment, do you only have just one CRM org or do you develop and test in separate organizations/servers for these environments? The Exchange mailbox identified for the user can only synchronize appointments, contacts, and tasks with one CRM organization, so how can the Exchange Server tell which CRM org is correct? It is pretty easy to see how a user can be tied to multiple CRM orgs, but it is much rarer to have multiple Exchange server environments (unless you are an IT Administrator, but the overlap in this case is pretty small). Prior to Service Pack 1, it was unclear how this worked. It was unclear which CRM org the Exchange server was synchronizing to (the first one that was configured, or the last). This makes it difficult to tell if the setting that tells Exchange to send everything to a specific org was ignored or overwritten.

In CRM 2013 SP1, a new option is available when setting up the user’s mailbox to force sync on a specific user account for a specific org and Exchange mailbox pairing. From the Email Server Profile record in CRM for the Exchange server, click the Ribbon button Test & Enable Mailboxes.

image

This opens a dialog to test your configuration for email, and the key here is the checkbox to Sync items with Exchange from this CRM Organization only, even if Exchange was set to sync with a different Organization. This helps clarify the expectation of which CRM Organization is tied to the Exchange Server for records to sync and cleared up the issue we had encountered.

image

Clicking What’s this? opens a detail page explaining cases where you may need to select the option. Similar options are also available on individual Mailbox records in CRM, where you can test an individual mailbox as opposed to modifying all mailboxes connected to an Email Server Profile.

image

image

Having trouble getting server side synchronicity wrapped around your finger? Contact us before you are driven to tears…

Dynamics CRM 2015 Enhanced Business Processes

Posted by on September 24, 2014  |  commentsComments (0)

Microsoft recently announced new features coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega).  Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015.

Next up for our review is reviewing the enhancements that are being made to Business Processes (the new feature added in Dynamics CRM 2013).  This amazing feature add from 2013 is being improved to be even more amazing.  Also, all of the enhancements below will work on MoCA!

With 2015, the following enhancements have been made to close the gap on those limitations:

  • Support for multiple entity loops to return to a previous entity in the process
  • Support to add entities to your BPF that don’t have a relationship to the entity you’re coming from.  If your rule requires it, you can choose the relationship on the Stage tile using the “Select relationships” link, although this is now optional with 2015 and can be left blank.

image

image

  • Client API Programmability
    • Access to available processes, active process, active stage, and active path
    • Move stages, change active process
    • Hook into stage selection, or changing active stage
    • Hide the Process Control completely from the form, or toggle whether or not the Process Control is expanded or collapsed on the form
  • Rule Based Branching Support (If / Else)
    • Decisions made to branch to different stages
    • Defined in a single UI for rules, stages, steps, & branches
    • Evaluated Real Time
    • Branches on a single entity, cross entity, merge branches back to the main flow
    • Branching rules must be based on steps in the stage immediately preceding it
    • Can combine multiple conditions in a rule using AND/OR

In order to use Rule Based Branching, when you’re editing your Business Process flow, you can click on the “Add Branch” from any stage to indent the flow to add your conditions and additional stages.  If you want to have an “If” “Else If” branch, then simply click “Add Branch” to the parent stage and the new stage will be added under the other stages in that branch (e.g., if creating an Opportunity for a New Customer, then we should capture information about that new customer.  Otherwise, if it’s an Existing Customer, we should select the customer from our existing Account list).  You can also have a default “Else” stage by clicking “Add Branch” and not adding any conditions to the branch.  The example below shows the configuration of an “If” “Else If” Business Process.

image 

Now when I’m on my Opportunity in CRM, if I indicate that Existing Customer = No, then I get the New Customer stage where I can enter some quick details about the Customer that can be used later to create an Account record (or could be coupled with Workflow to automatically create the Account and associate it to the Opportunity).

image

image 

And when I indicate that Existing Customer = Yes, I get the Existing Customer stage where I can select the account I want to associate to this Opportunity.

image

image

With all these enhancements that were made in Dynamics CRM 2015, there are still some limitations to Business Processes that you should be aware of:

  • Processes can only span across a maximum of 5 unique entities
  • Maximum of 30 stages per process, and 30 steps per stage
  • Each branch can be no more than 5 levels deep
  • Only one active process per record
  • Can only leverage 1:N entity relationships (even though this is optional)

If you have any questions regarding any of this functionality, contact us and we’ll be happy to assist.

Dynamics CRM 2015 Hierarchy Visualizations

Posted by on September 23, 2014  |  commentsComments (1)

Microsoft recently announced new features coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega).  Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015. 

With Dynamics CRM 2015, Microsoft has added a new way to look at records, and their relationships to records of the same entity type.  This new functionality is called Hierarchy Visualizations.  In this post we’ll show you what the hierarchy visualizations look like, but first, let’s show you how to set them up.

First off, you’ll need to go to the Customizations area of CRM, and open up the entity you want to enable hierarchy visualizations for.  Note, after installing 2015, some entities are already enabled and setup for hierarchy visualizations, and you won’t be able to change the out of the box setting (accounts, positions, products, and users).  Other entities are setup to allow hierarchy visualizations but not setup by default.  This includes all custom entities.

A new “Hierarchical” field has been added to the 1:N relationship definition.  Note that setting this to “Yes” will automatically set the hierarchy flag to No for on any other relationship on this entity that was previously setup as hierarchical.  CRM 2015 only allows you to setup 1 hierarchy visualization per entity, and the Parent Entity and Related Entity have to be the same (see limitations below).

image

After configuring your 1:N relationship, you need to navigate to Hierarchy Settings within the entity definition.

image

Once there, you can create your new Hierarchy Setting.  The Hierarchy Setting is used to define what 1:N relationship to use, and what Quick View Form for to use for the tiles that appear in the hierarchy visualization.  You can use one of the out of the box Quick View Forms, or create a new one specifically for the hierarchy visualization. 

There are a few important notes to make about Hierarchy Settings:

  • Only the first 4 fields from the Quick View Form will currently display on the tile. 
  • You can only have have one Hierarchy Setting per entity even though the solution explorer makes it look like you can have multiple.
  • Hierarchy Settings are Solution Aware and will be exported / imported across organizations

image 

Once you have your relationship and your Hierarchy Setting setup correctly, when you navigate to a grid for this entity, if there is a value populated in the field for the relationship you setup for specific records, you’ll see an icon in the grid indicating that record is part of a hierarchy.

image

Clicking on that icon will open up the Hierarchy Visualization for the record you selected, and show any siblings of that record, the parent of that record, and any children related to that record.

image

One you have the Hierarchy Visualization open, there are a few things you’ll notice.  First off, there’s a list on the left as well as the larger tiles on the right that are showing the 3 levels of the hierarchy based on what record you selected (current layer, parent, and children)

You can also click on the check mark at the bottom right corner of the tile that will select that record so you can take actions on similarly as if you selected it in a grid (such as assign, edit, share, etc.).

Clicking on the main area of the tile (and not the check mark in the bottom right corner), or selecting a record in the list on the left, will color that tile orange and make it the focal point of the hierarchy and redraw the hierarchy tree.

Finally, on each tile (and also on the list on the left), there’s a “pop-out” icon that when clicked, will open up the form for that particular record in a separate tab/window.  If you’re on the form for a record that’s part of a hierarchy, you’ll be able to quickly display the hierarchy view by clicking an icon in the top right corner of the form.

image

With these changes above, Microsoft also added a couple new operators to Advanced Find.  Note, these can only be used in Advanced Find queries (don’t show up on sub-grids of specific records)

  • Under:  Finds all records that are UNDER a specific node (e.g. all Accounts under North America)
  • Not Under:  Inverse of Under

image

Also important to note is that all of the functionality discussed above will work on the Mobile Client Application (MoCA) as well.  So this powerful new feature will NOT be only available on the web client, making it even more powerful!

With Hierarchy Visualizations, there are still some limitations to be aware of:

  • Maximum of 4 fields are displayed on a tile
  • Visualization is based on a single entity (not multiple hierarchy) – A relationship between 1 entity and itself
  • At most 1 hierarchical relationship allowed for an entity
  • Only 1:N relationships can be enabled to be hierarchical

As the product matures and Hierarchy Visualizations get more real world exposure, I’m sure Microsoft will invest time into resolving the limitations above (e.g., allowing hierarchy  visualizations between different entities, displaying the visualization somewhere other than the entity form like a chart or dashboard, etc.).  However, this is a great start and something many of our customers will be excited to get their hands on.

Dynamics CRM 2015: Social Insights & On Prem

Posted by on September 22, 2014  |  commentsComments (0)

Microsoft recently announced new features coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega).  Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015.  Over the course of the next few weeks we’ll slowly reveal this functionality one by one and show some of the key highlights of these features.

Next up for our review is reviewing the changes with Social Insights from Microsoft Social Listening.  Previously only CRM Online orgs had access to embed components of Microsoft Social Listening within Dynamics CRM, but now with Dynamics CRM 2015, CRM On Prem customs will also be able to enjoy the benefits of the social data without having to leave Dynamics CRM.

Using a simple wizard based approach, Social Insights can be added to the following:

  • System Dashboards
  • User Dashboards
  • Entity Forms

In order to have both your Dynamics CRM On Premise organization and your Social Insights environment talking to one another, you need to:

  • In CRM, navigate to Settings -> Administration -> Microsoft Social Listening Configuration
  • Copy the Domain URL
  • In Social Listening, navigate to Settings -> Allowed Domains
  • Add the Domain URL copied above to the Allowed Domains
  • Copy the Social Listening URL
  • Paste the Social Listening URL back into CRM

image

image

As stated above, Social Insights can bee added to System or User Dashboards by selecting the Insert Social Insights components when on a dashboard section.

image

When you click this icon, you’ll be presented with a 3 step wizard.  You can select the specific data you want to display from Microsoft Social Listening including what search terms you want to display, what summary information you want to display (e.g., sentiment, volume, etc.), and more.

Note:  You can have one or multiple visualizations on one of the sections of the dashboard so you can see multiple pieces of social information in each section.

image

image

image

Now when you navigate to your Social Dashboard, you’ll see the social data from Microsoft Social Listening displayed to you in a summary dashboard directly from within Dynamics CRM.

image 

Similarly to adding Social Insights to a dashboard, you can add it to a CRM entity form.  From here you’ll be able to see the same social component information that you saw within a dashboard.

image

Note:  You’ll need to have a Microsoft Social Listening account and be logged into MSL or you’ll get an error when trying to view the Social Insights within Dynamics CRM.

image

A few additional pieces of information to be aware of:

  • Does not require IFD to be enabled for CRM On Prem
  • Will work with Outlook
  • Multiple CRM instances can point to the same MSL instance
  • This is not available on MoCA (as Social Insights is surfaced in CRM through an iFrame, and there is no support for iFrames in MoCA)
  • Users in CRM need a MSL license (these credentials are used to authenticate to MSL)

Server Side Synchronicity

Posted by on September 19, 2014  |  commentsComments (0)

Today's guest blogger is Ross Talbot, a Development Principal at Sonoma Partners

If you have been following our adventures with Server Side Synchronization in Dynamics CRM 2013, we previously detailed some of the gotchas we had encountered with upgraded orgs and some added fixes with communication between Exchange web services and CRM. Recently we found another issue related to an upgraded org, this time revolving around permissions.

After we had resolved the previous issue with the web services on the servers having some issues sending data back and forth, we found that tests for the sync were working for all but 20 users when looking at the sync for Appointments and Tasks. Of course, this was now less than 10% of the users but not all so we went looking for more information. We started by checking the sync filters, trying to determine what set these 20 users apart from the others. The error we were seeing this time around was that the mailbox user doesn't have sufficient permissions on this mailbox. We checked impersonation settings, security roles, and client information to rule out differences. That is where we found the difference, and it pointed to the security roles associated to the affected users. The difference between the affected users and those that were working involved native security roles that had been assigned prior to the production environment going live during the initial user import. With no custom roles defined at that time, all users were given a native security role. Users with higher level security needs were given one of the custom roles and the native role was removed. So why were the users with more privileges having issues?

When creating custom security roles, a good habit or best practice is to make a copy of a native CRM security role and modify only the permissions you need to. That is the approach we take on Sonoma projects, to ensure you don’t have to change every single privilege as you might need to if you started from scratch. When you upgrade your CRM org, whether it is a product version update, a service pack, or a UR being applied, the native security roles are updated with security access to new entities and features. Not the custom roles though.

Here is a custom security role, highlighting a section of the Business Management tab in CRM 2011.

image

Now, here is a similar look at a role in CRM 2013

image 

There are now a few new entries, and in fact there is a new Privacy Related Privileges section just below these privileges. With all the new features in CRM, including Server Side Sync, Mobile Client Apps (MoCA), Business Process Flows, not to mention adding more with every release, it is becoming more and more important to review the privileges in your custom security roles when testing a new release and especially the features that come with it.

For the sake of future me and all the others that need to search for the privilege names related to these new to 2013 entries shown above, they are listed below.

Mailbox privileges: prvReadMailbox, prvShareMailbox, prvAssignMailbox, prvWriteMailbox, prvDeleteMailbox, prvCreateMailbox, prvAppendToMailbox, prvAppendMailbox

Email Server Profile privileges: prvWriteEmailServerProfile, prvAppendToEmailServerProfile, prvDeleteEmailServerProfile, prvCreateEmailServerProfile, prvReadEmailServerProfile, prvShareEmailServerProfile, prvAppendEmailServerProfile, prvAssignEmailServerProfile

Got your own issue involving server side synchronicity? Don’t rely on a message in a bottle. Contact us instead.

Dynamics CRM 2015 Enhanced Business Rules

Posted by on September 18, 2014  |  commentsComments (0)

Microsoft has just announced a slew of new features that are coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega).  Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015.  Over the course of the next few weeks we’ll slowly reveal this functionality one by one and show some of the key highlights of these features.

Next up for our review is reviewing the changes and enhancements that Microsoft has made with Business Rules (new for CRM 2013).  The following high level enhancements have been made for this next major release of Dynamics CRM:

  • Business Rules can now be executed on the server (previously client side only)
    • Business Rule Scope should be set to Entity when building the rule
    • Ensures your rule will fire when no matter how records are updated and not only via the form
    • Synchronous and would be visible real time
  • Set default values on record creation (e.g., all your Leads are generated in the United States so you can default the country on the Lead record when records are created)
  • Added If.. Else If.. Else support
  • Ability to combine expressions using And/Or

Here’s an example where you can see:

  • The new option “Entity” in the top right corner for the Scope which would make this a server side business rule. 
  • An example of If/Then/Else support. 
  • How you can use “and” or “or” in conditions to make more complex conditions. 
  • The new “Set Default Value” action that’s been introduced.

image

With these enhancements, there are a set of limitations that everyone should be aware of:

  • Cannot support nested if.. else
  • No grouping of expressions in a condition
  • Expressions can be combined either using And, or using Or, but not both
  • Still single entity only (no ability to reach out to related records)

We’re excited to see the continued investment to make Dynamics CRM a more configurable application putting more power in the hands of System Administrators, and decreasing the requirement to hire application developers to extend the application.

Dynamics CRM 2015 Multi Entity Search

Posted by on September 17, 2014  |  commentsComments (0)

Microsoft has just announced a slew of new features that are coming out with their next version of Microsoft Dynamics CRM 2015 (previously code named Vega).  Check out the Dynamics CRM 2015 Release Preview Guide to see what features are coming with 2015.  Over the course of the next few weeks we’ll slowly reveal this functionality one by one and show some of the key highlights of these features.

First up for our review is functionality that Microsoft added to their MoCA product when it was released which is multi-entity search.  This feature has been something our customers have been requesting for some time now and to bridge the gap in the previous product, Sonoma Partners built their own Universal Search solution that we make available on our community site for both 2011 and 2013.  If you look at the Sonoma Universal Search, you’ll see some similarities to the one now available in CRM 2015.

In order to setup multi entity search, navigate to Settings –> Administration –> System Settings.  In the General tab, you’ll see the section “Set up Quick Find”.

image

This section has two settings:

  • Enable Quick Find record limits:  This setting was introduced in CRM 2011 and it uses an organizational database setting to limit quick find search results to 10,000 records to improve performance.
  • Select entities for search:  If you click on the Select button, you’ll be presented the window below where you’re able to select up to 10 entities at a time to enable for multi-entity search.

image

Entities that are selected here will be used in the multi-entity search results and be displayed in the order that you see them in this list. 

Users will be able to use the multi-entity search using the magnifying glass in the global navigation bar.

image

Clicking on that magnifying glass will bring you to a page where you can enter any search criteria (no minimum number of characters needed meaning you can type in a single letter), and click search do see your results.

image

On this search results page, one could:

  • Filter the results to a particular entity using the “Filter with:” drop down on the top right.
  • Create a new record using the + icon next to the entity name
  • Navigate to the record by clicking on the tile

A few things to note about multi-entity search:

  • Uses quick find views to determine the fields to search across
  • Can search activities and notes as well
  • First 3 fields in the Quick Find View are what are displayed in the tiles that are displayed
  • Search from anywhere in CRM using the search icon on the global navigation bar
  • The search results are displayed in the Modern UI

There are currently a few limitations of multi-entity search:

  • Doesn’t work with USD
  • Maximum of 10 entities can be configured for search
  • No hit highlighting and MRU (most recently used) suggestions
  • Only action available on each search result is the ability to open the record

Even though there are a few limitations to multi-entity search, as we expected once the MoCA app was introduced with this functionality, it’s nice to see this much requested feature make its way into the web app. As it stands currently, this is a very powerful tool and key addition to Dynamics CRM.

Editing records in Salesforce1

Posted by on September 15, 2014  |  commentsComments (0)

I recently was working on a project where we needed to override the new and edit pages for Accounts so that we could do some custom duplicate checking before the user saved the record. In standard override fashion, I created a Visualforce page with a controller which looked something like (edited for brevity):

Full Site

I first tested it in the full site to make sure it would work there:

Desktop1

Desktop2

Desktop3

So far, everything works as expected.

Salesforce1

Next, I tested it in Salesforce1 to make sure it would also work there (this particular client is a heavy user of Salesforce1).

1

2

3

As you can see, although the birthdate saved successfully the billing address did not. Doing some digging, I was able to see that the address was indeed correct in the database, so just pulling down on the screen to refresh the record, I saw:

4

Now the Billing Address is correct. It looks like the problem isn’t with the saving, it’s with the form refreshing correctly.

The bug

At this point, I opened a case with Salesforce support. After some back and forth, they eventually escalated it to R&D where a bug was submitted: https://success.salesforce.com/issues_view?id=a1p30000000T5awAAC. If you are affected by this issue, please click the button – it will help prioritize this bug fix above others.

Are you seeing something strange in your organization? Need some help figuring out what’s going wrong? Contact us and we can help.

Why we are excited about Winter ‘15

Posted by on September 11, 2014  |  commentsComments (0)

The Winter ’15 release window is upon us, and with it another round of exciting upgrades and updates geared at making our lives easier and the software we rely upon more stable. As always, Salesforce is delivering a sizeable number of updates to the platform, which generates quite a large release notes document. To save you the time of having to read the entire thing, we’ve handpicked our top updates that we think are most important based on the amount of impact we think they will have on us and our clients’ lives.

While reading this, you may notice this post is lighter on graphics than normal and this is intentional – Salesforce has done a great job of providing screenshots and examples in their documentation as appropriate, so we encourage you to go read the official documentation for any feature that interests you.

Data.com Duplicate Alerts and Blocking (Beta)

Synopsis

This beta feature uses Data.com to help prevent duplicates from being inserted into the system. The rules for detecting duplicates and choosing whether to allow them are customizable and reportable, so you still have full control over your data.

Our thoughts

This is a big deal to us. Arguably the single most requested enhancement we do on the platform is duplicate detection and prevention, with nearly every client having this in some form or another. Using this feature, some of the work is done for us. Although it does appear to require Data.com licenses, this is still a valuable addition for our clients who already license Data.com, and may make the added cost now worth it for anyone on the fence.

Platform Connect

Synopsis

This feature allows you to view data in an external system as though it were data in Salesforce. You can add this external data as related lists to normal Salesforce objects, form relationships to it and treat it almost like it actually lived in the platform itself.

Our thoughts

This has a lot of potential to redefine how we approach some integrations. A common reason for integrating in the first place is to allow the user to view all appropriate data in one place. Generally, these integrations are not real time, so the user could potentially be viewing stale data when making decisions. This feature would be querying the other data source directly, reducing the effects of stale data.

This feature does require an OData endpoint to work, however, so custom code may still need to be written if the external data source does not support OData natively.

Salesforce1 – Lead Conversion

Synopsis

This feature allows users to now convert leads to Contacts and Opportunities from within Salesforce1.

Our thoughts

While this feature seems small, it is something we are glad to see Salesforce has added. It is something we have had clients ask us for in the past, and lead conversion is surprisingly complex so it’s nice to have it already handled for us.

$Permission Global Variable

Synopsis

This feature exposes a new global variable for use in formula fields, validation rules, and Visualforce pages. It makes checking the user’s permissions easier and moves it out of the realm of custom code.

Our thoughts

Another relatively small feature that can have large implications. Before this feature, we had to write trigger or controller code to check the user’s permissions if we wanted to do this kind of logic. With this feature, we can now put those checks in validation rules or formulas, reducing the amount of code we need to write, saving the client money and reducing the delivery time.

Deploy with Active Jobs

Synopsis

This feature allows us to deploy updates to environments that may have scheduled/running Apex jobs without having to first cancel those jobs, making deployments quicker and less painful than before.

Our My thoughts

Ok, I admit that I may be the only person here who is excited about this feature (not many people get excited about deployments) but it is a good one (and since I write the post, I’m including it). I’m excited that I can deploy updates to (usually scheduled batch) jobs without having to cancel and reschedule them. While this does come with some amount of risk (the job failing if it’s currently running) I think the reward outweighs the risk in most cases. As always, it is important to understand the details of what you are doing to minimize unexpected outcomes.

Remote Objects

Synopsis

This feature provides developers with a new way of access their data from JavaScript. It provides a mechanism to declare what data you want accessible in JavaScript instead of having to write controller code.

Our Thoughts

This feature actually is not delivering any new functionality, technically. Anything you could do with this we already had the capability to do through Visualforce Remoting, or through the SOAP or REST APIs using JavaScript.  This new feature provides us a way to do these kinds of tasks more quickly, and with less custom code.

Queueable Interface

Synopsis

This feature changes enhances how asynchronous jobs are written and executed on the platform. It adds additional flexibility for queuing up multiple jobs.

Our Thoughts

This is a very developer-centric update, but it is one that has deep implications in some of our designs. A common scenario we face during integrations is needing to make callouts to external systems, which can only happen asynchronously. This enhancement provides us with a new, very flexible way of approaching these requirements and the chaining helps us navigate around some of the governor limits that have been painful in the past.

Summary

Obviously, with a release this large there are far more changes than what we covered here, so we encourage you to go read the release notes if you are looking for something specific. If you have any questions or are curious about anything in the release notes, feel free to contact us and we will do our best to assist.

Dynamics CRM and AngularJS: OData Endpoint and $resource

Posted by on September 8, 2014  |  commentsComments (0)

Today's guest blogger is Ian Moore, a Developer at Sonoma Partners.

Writing Javascript code can be tedious and verbose without the help of libraries and frameworks. While Knockout is popular among the .NET community – and deservedly so – it doesn’t offer much to developers beyond UI data-binding. A more powerful framework such as AngularJS can be a great tool for Dynamics CRM development. With Angular, we can easily write reusable and maintainable code for our CRM projects. In this post I will show how easy it is to use Angular to interact with the CRM 2013 OData endpoint by making a simple app that does a contact lookup based on user input.

To accomplish this, we will need the core Angular module and the ngResource module – which helps your code interact with RESTful APIs like the OData endpoint. You can download the two modules yourself from code.angularjs.org, or you can include them from a CDN like so:

<script src="https:// ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.19/angular.min.js"></script>

<script src="https:// ajax.googleapis.com/ajax/libs/angularjs/angular-resource.min.js"></script>

Now let’s create a new Angular module for code we would like to share between projects. We can call the module “angularMscrm” and, using the .factory() method, define a new Angular service called “CrmService” which will interact with the OData endpoint. Within the service definintion, we will use the $resource function to describe the REST service and define a custom “lookup” action.

The $resource function provides some built-in functionality to REST APIs for the standard HTTP methods. You can view the standard actions in the documentation. However with our CrmService, we are going to ignore those so that we can parameterize our custom lookup action by entity. Angular will automatically parse the route arguments in our lookup URL (entitySet, field, and search) as function parameters. Now we have a lookup service we can use in web resources.

Next we need to write the code to control our UI. This will be a small Angular app that has a controller to interact with the HTML. The controller will be responsible for calling our CrmService.

Here you can see we are just making a simple controller that will pass inputText to our lookup action. The request will be made asynchronously, so after Angular deserializes the response data for us, we can assign it to our controller’s $scope.

At this point you can see how easy it would be to change the entity or fields we want to perform the lookup on, or how to duplicate this call in other functions.

The last step is just a little bit of HTML to display our lookup results. The Angular directives (attributes that start with “ng-“) will take care of binding to our controller.

Adding “ng-app” to our <html> tag tells Angular to use our crmApp module in this file. The “ng-controller” directive on the <body> element scopes all child HTML elements to our AppController. By using “ng-change” and “ng-model”, we can bind the text value of the <input> tag to the inputText variable on our controller $scope, and react to the change event with our inputChanged function. Lastly, the “ng-repeat” directive will create a list item for every matched contact returned from our service, and a template expression will print out the contact’s name.

lookup

While the look and feel will need some additional work, you can hopefully see the benefits of using Angular with your CRM projects.

Note: AngularJS requires some special attention when working with Internet Explorer. There are a variety of syntax options for most features to help you avoid any issues with older versions of IE.

CRM 2013 - Refresh Web Resources on Activate and Deactivate

Posted by on August 18, 2014  |  commentsComments (0)

If you are building an editable custom Web Resource in CRM that will be embedded into a record form, typically you would want to make the Web Resource read-only when the record is deactivated.  To do this, you would have your Web Resource check the form type and toggle between editable and read-only mode appropriately.  In CRM 2011 this works great but in CRM 2013 you will notice that the form does not refresh after “Activate” or “Deactivate” in the Command Bar is used.  Therefore your Web Resource doesn’t refresh and is still in the same mode that it was before.

Luckily with only a handful of JavaScript, we can trigger our Web Resources to refresh on Activate or Deactivate.  First, in the OnLoad of the form, register an OnChange event for the statecode attribute.  Whenever the record is Activated or Deactivated from the form, this event will trigger.  Then you can refresh any Web Resources from your OnChange event.

Enjoy!

Adventures with PersonAccounts

Posted by on August 13, 2014  |  commentsComments (0)

Recently I had a chance to play with PersonAccounts while working on a project. If you’re unfamiliar with them, PersonAccounts are account records in Salesforce that act like Contacts, and even have the Contact custom fields available to them. They allow you to use the record almost anywhere you could use a Contact record or an Account record. This is especially useful for businesses that don’t really distinguish between Accounts and Contacts (like consumer facing retail stores), and would like to have the full functionality of native Accounts in Salesforce while retaining the common fields of Contacts like mobile phone numbers and home addresses.

In the particular scenario I was working in, the requirement was that whenever certain criteria happened on an Opportunity related to the PersonAccount, I needed to relate specific other PersonAccounts to the Opportunity based on some data in custom fields we had created. We planned on using the OpportunityContactRole native object to capture both which PersonAccounts should be related to the Opportunity and why (via the Role column).

Whenever I get a requirement like this, if I’m not sure about something I just attempt it through the UI first. I navigated to the Contact Roles related list on a test Opportunity and clicked the new button, which brought me to a screen where I could search for and select the test PersonAccount to relate to it:

0

After clicking save, I was returned to the Opportunity with the PersonAccount added:

1

No problems so far, so I started writing the code I thought I would need:

Seemed simple enough. Save and test:

2

So that definitely wasn’t what we wanted. Reading the error message closely we can see that the root cause is “Contact ID: id value of incorrect type”. What?! Why doesn’t this work when I just did the same thing through the UI?

After some head scratching and unsuccessful web searching, I decided to take a closer look at the records Salesforce was actually creating. There’s a neat trick in Firefox where if you hover over a link, it will tell you where the link will take you in the lower left. Hovering over the link in the related list on the opportunity gave me:

3

Notice the ID (highlighted) which starts with 003. I know from experience that the Account prefix is 001, so this seemed a little strange to me.

At this point, I decided to go back and review the documentation more carefully to see what I could dig up. Eventually, I found it: on the Account object’s page there’s a snippet towards the bottom detailing a field called PersonContactId, which is the ID of the ‘Contact’ that the PersonContact is ‘related to’. Firing up the developer console, I ran a query against this record to see what was in the database:

4

And there we have it, both IDs in one place. So what’s happening in the background is that Salesforce is using the PersonContactId to relate the PersonAccount record to the Opportunity instead of the ID field. Once I updated the code to use the Account.PersonContactId field instead of Account.Id all was well with the world again.

Need someone who knows the ins and outs of the Salesforce platform? Need a partner who can guide your project to success, and offer advice on best practices and change management? Just want someone to bounce ideas off of? Contact us and we can help.

Think there’s something we should cover but haven’t? Curious about some specific piece of the platform? Let us know in the comments below!

An Introduction to Change Management and CRM

Posted by on July 31, 2014  |  commentsComments (1)

Definitions for change management in relationship to CRM vary widely from person to person. Every vendor has a different explanation of what change management is, and each client has a different expectation of what change management can do for them.

First things first. Sonoma Partners defines change management as the moving of processes, teams, and organizations to an alternative state. It’s a shake-up of your company’s current structure and way of doing things. It impacts many aspects of your organization including training, user adoption, and incentives for better employee performance. When done properly it can yield great results and improve your team’s organizational knowledge.

At Sonoma Partners, the term "change management" best describes the state of an organization before and after they have adopted a CRM.

A common (and dangerous) approach to change management is implementing a plan after the CRM system development comes to an end. This method may not give you the results, or user adoption rates, that you are hoping for. Disrupting the way your employees are used to working without their feedback or input up front may lead to you building a system that no-one will use.

A better approach to change management and CRM is to incorporate it into the conversation from the beginning of the project. Remember: if you’re giving real value to your end user, you are less likely to have issues with change management, because people will be motivated to use the new system.

4pillarblogimage

Here are a few tips to help you build your change management plan:

1. Identify

Who in your organization is going to be affected? Outline and define value propositions for each party to motivate them to use the system after it’s built.

2. Engage

Engage all parties involved from the beginning. This includes executives, stakeholders, end users, and management.

3. Educate

Communicate how the new system works in relation to how each team member will use it. Create a communication plan that outlines the benefits, functionality and status of the project.

4. Incent
Formulate an answer to the following question: “What’s in it for us?” Your CRM project lives and dies by user adoption rates. Develop an incentive plan to encourage system use.

Change management is a lot like user adoption. It’s a term that is defined differently by every person implementing it, and every party looking for it. The best way to guarantee a successful rollout of change management is to build a CRM system for your end users that best suits their needs from the start.

 

XRM Tooling – Web Resource Utility

Posted by on July 28, 2014  |  commentsComments (0)

A couple weeks ago I posted a video on the new Login Control that comes with the XRM Tooling library in the latest CRM 2013 SDK.  Today I will show off another handy feature in the XRM Tooling library, the Web Resource Utility.  The Web Resource Utility provides an easy way to retrieve an Image or XML web resource. 

First you will need to download the latest SDK here.  Then you can add the following namespaces:

using Microsoft.Xrm.Tooling.Connector;
using Microsoft.Xrm.Tooling.WebResourceUtility;

 

Next you can either use the new Login control to get an instance of a CrmServiceClient or manually set it up yourself.

var crmSvc = new CrmServiceClient(
                CredentialCache.DefaultNetworkCredentials, 
                AuthenticationType.AD, 
                "server", 
                "port", 
                "org");
 

Then use the following code to retrieve an XML resource which will return a string of the XML content:

var xmlResources = new XmlResources(crmSvc);
xmlResources.GetXmlFromCRMWebResource("myxmlresource.xml");
 
 

Or use the following code to retrieve an Image resource which will return a BitmapImage object:

var resources = new ImageResources(crmSvc);
var bitmap = resources.GetImageFromCRMWebResource("myimageresource.png");

 

Now with the BitmapImage object, you could set an Image control directly within your WPF app and dynamically display images based off your web resources in CRM.

The Salesforce1 sforce.one.createRecord problem

Posted by on July 21, 2014  |  commentsComments (0)

Recently I was working on a Salesforce1 mobile page and I ran in to an issue when attempting to use the sforce.one.createRecord API call. The code I started with was (condensed for brevity):

The idea here was to show the create record screen so that users could create a new Account when they clicked a button. 

1

This worked fine on a desktop, but the createRecord call was a bit slow over cellular networks (on the order of 5 – 6 seconds to load sometimes). During this loading time, it looked like the page wasn’t doing anything so the users would click the button that fired this code multiple times, resulting in multiple new forms being shown. To prevent that, we added a loading layover that shows the first time the button is clicked, preventing the user from clicking it again. 

2

So far this all worked fine, until we started really testing the create form. One of the things a user can do on the create form is click a cancel button which takes them to the previous form, where we got a nasty surprise: the loading screen is still there!

After some investigating, I found that the new Account form isn’t actually a new page, but is instead a layover on the current page, and the cancel button is just hiding the layover. Therefore, the custom page the user came from never gets reloaded.

We tried the onload event (which is only called when the page is loaded, not when cancel is clicked) and the onfocus event (which is only called if the user taps the screen again after clicking cancel). Neither were sufficient for us.

At this point, I opened a support case with Salesforce where they confirmed this is by design, and there is not a fix forthcoming.

We decided to take advantage of the fact that this is a layover and put in a timeout for the loading screen so the user isn’t permanently trapped. We added an idea to the Salesforce idea boards that you can upvote here if you think this is important to fix like we do.

EventWhoRelation – A gotcha

Posted by on July 16, 2014  |  commentsComments (0)

I recently had a requirement on one of my projects to build a Visualforce page that summarized an event, including all of the attendees of the event. After doing some digging through the documentation, I found the EventRelation and EventWhoRelation standard objects provided by Salesforce. Reading through them, it sounded like the EventWhoRelation object best suited my needs, so I wrote the appropriate controller code to retrieve the attendees as follows:

This all worked fine, and when I tested the code through the UI I got back the results I was expecting. After I was satisfied with how it worked, I turned my attention to the unit tests to finish up. I started with the following code:

When I ran the unit tests, I saw the following logs:

Looking at the last line, there’s no Event Who Relations! Double checking the unit tests, I wasn’t running it as a particular user so I shouldn’t be getting any profile-related issues, and Shared Activities was enabled (otherwise EventWhoRelation wouldn’t be available at all), and I was using the latest API version available to the organization (31 as of this writing). The documentation says that EventWhoRelation is a filtered view of EventRelation, so I would expect that a record meeting the criteria listed (IsParent = true, IsWhat = false) to show up in the EventWhoRelation table.

I opened a support case with Salesforce to see what was going on here. After doing some digging on their end, they confirmed that the EventWhoRelation records are not created in test cases unless you add the @isTest(SeeAllData=true) attribute. Their explanation: since the EventWhoRelation is a derived table, we need to be able to see all data in the org to read from it (otherwise it’s just always empty).

We don’t typically condone using the SeeAllData setting unless absolutely necessary as it makes the tests more brittle and harder to maintain. The workaround I came up with is to not use the EventWhoRelation and instead use the EventRelation in my controller:

XRM Tooling – New Login Control

Posted by on July 14, 2014  |  commentsComments (0)

With the latest CRM 2013 SDK, Microsoft has provided a new XRM Tooling library to connect to CRM.  Along with the new Tooling library comes a brand new Login control that is styled with the 2013 look and feel and can be used for custom WPF apps. 

In our new video below, I demonstrate how to easily setup the new Login control so you can be on your way with your custom CRM WPF app.

Prerequisites:

 


Contact Us for a Quote, or Personalized Demonstrationof Salesforce.com or Microsoft Dynamics CRM for Your Business.

Contact Us