Dynamics CRM 2011
February 17, 2012
Provide Five-Star Service and Maximize the Value of Customer Relationships with CRM 2011
Lately, I came across the American Express® Global Customer Service Barometer from 2011, which reports on consumer sentiment concerning the state of customer service in America. Interesting survey findings include the following:
- Consumers will tell 16 people about subpar service encounters. Conversely, they will inform only nine others about positive, memorable customer service experiences.
- Consumers value quality customer service and even will pay more to receive it as 70% indicated they would spend 13% more on average with businesses that deliver stellar service.
- Consumers will rebel with their wallets as 78% have canceled a transaction or taken their business elsewhere upon encountering negative, frustrating customer service.
Though this research study was targeted towards individuals, it is safe to say that the same attitudes and preferences on customer service hold true in the B2B world as well. Companies that differentiate themselves from the competition by providing superior customer service will earn repeat business from clients and begin to receive more referrals. On the other hand, customers that do not consistently deliver positive and meaningful customer experiences will suffer instant client churn and defections and lose drastic revenue.
Similar research from the Aberdeen Group entitled “Customer Experience Management: Using the Power of Analytics to Optimize Customer Delight” emphasizes how the customer experience can profoundly impact client acquisition, engagement, and retention. By continually measuring, monitoring, and improving the customer experience, firms can be more in tune with evolving service preferences and provide better service to their high-value clients and outperform their competition. As seen in the graph below that I created to display some of Aberdeen’s key results, Best-in-Class organizations that are committed to Customer Experience Management (CEM) initiatives constantly outperform their peers. For instance, customer retention rates, response times to customer inquiries, customer lifetime values (LTV), and customer satisfaction rates all improve considerably year over year for Best-in-Class companies compared to the Industry Average and Laggards.
Source: Aberdeen Group “Customer Experience Management: Using the Power of Analytics to Optimize Customer Delight,” Jan. 2012
Additionally, Aberdeen stresses how properly deployed CRM technology combined with a client-centric strategy can enable top-tier firms to achieve significant gains in their CEM programs. In fact, one of the recommended CEM strategies by Aberdeen is to replace highly fragmented views of customers with a single unified and consistent view of the organization’s customers via CRM. A robust, intuitive, and easily configurable CRM system, such as Microsoft Dynamics CRM 2011, can certainly give firms this highly coveted all-encompassing 360-degree view of their customers and allow them to better hear and capture the voice of not just their customers, but also their stakeholders and shareholders.
To read more about how Microsoft Dynamics CRM 2011 can serve as the foundation and enabler for your firm’s CEM and CRM strategic initiatives in route to helping improve your overall business results, please visit www.customereffective.com.
Posted by Kevin Wessels on February 17, 2012 at 08:39 AM in CRM Best Practices, CRM Business Process, Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
February 16, 2012
Customer Effective: FinServ and Microsoft Dynamics CRM – A Growth Platform for Investment Banks
Despite the widespread interest and anticipation of the high-profile Facebook IPO, investment banking revenues have recently been declining. Fees from underwriting, capital raising, trading activity, mergers and acquisitions, corporate reorganizations, and restructurings of equity and debt have all slowed down. Weakness in Europe, lower IPO demand, skyrocketing regulatory costs, declining trading volumes and margins, more restricted liquidity and leverage limits, and excessive write-downs and litigation costs from the U.S. housing crisis are all to blame. With such challenging market conditions, investment banks can no longer focus solely on quick hits and short-term earnings boosts. Instead, many investment banks are choosing to overcome increasing global volatility and the forthcoming regulatory uncertainty by becoming more client-centric than product-focused. Relying less on offering the latest and greatest complex derivative product, investment banks are recommitting themselves to securing lifelong client relationships.
To aid the transformation of their operating model, many investment banks are now investing in the Customer Effective: FinServ solution, which leverages Microsoft Dynamics CRM 2011 to offer a flexible, scalable, and comprehensive client relationship management system that is tailored to the needs of capital markets firms. The Customer Effective: FinServ product suite can be integrated with existing in-house core systems and market data sources to provide investment banking sales, trading, and research divisions with a single, unified view of clients, prospects, strategic partners, and external advisors. Having such a centralized and accurate 360° view of all sell-side and buy-side relationships, target deal profiles, and referral sources gives the firm broad, valuable insight into its business. Additionally, investment bankers value that Customer Effective: FinServ offers pre-built industry specific KPIs, reports, dashboards, and decision support tools to help segment and target more profitable clients and uncover and close more cross-sell and upsell opportunities in the deal pipeline. Furthermore, industry best practice workflows are available to automate cumbersome, manual-intensive processes and save time. Moreover, global dealmakers value that this CRM solution operates directly within their familiar MS Outlook application. In particular, road warriors can always stay connected as it is accessible via mobile devices, too.
Overall, senior management, deal teams, and front office personnel that adopt CRM 2011 experience enhanced productivity, as they find it much easier to collaborate cohesively and locate, monitor, and track critical deal profile data related to capital raising initiatives, book-building efforts, due diligence milestones, client onboarding, and client interaction history. As a result, all of the investment bank’s clients receive more high-quality, targeted advice and services. Thus, private investors, pension funds, endowments, insurance companies, and other institutional investors across the board appreciate the enhanced consistency and service quality that come with a more client-focused approach. By eliminating the firm’s previous product-centric mindset and leveraging CRM, the investment bank is better positioned to strengthen and deepen relationships with its top-tier clients, and ultimately increase its revenues.
To learn more about how Customer Effective: FinServ and Microsoft Dynamics CRM 2011 can serve as the growth engine for your firm’s investment banking business, increase wallet share, and integrate with disparate data to remove product-aligned silos, please visit www.customerffective.com.
Posted by Kevin Wessels on February 16, 2012 at 09:53 AM in Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
February 06, 2012
Big News in Dynamics CRM Q2 2012 Update: Mobile iOS and Android Versions, Cross-browser Support, Social Upgrades
Microsoft announced today that the next service upgrade (due between April and May of this year) will include a number of big enhancements. At the heart of these updates is the concept of ‘CRM Anywhere’, which means you should be able to access Microsoft CRM from your favorite hardware – not just Windows-based form factors. The Release Preview Guide is here and below are some of the highlights.
Microsoft Dynamics CRM Mobile
The next release will include a cloud based mobile CRM service called Microsoft Dynamics CRM Mobile. This will be a hosted (subscription based) mobile solution that is based on CWR Mobility (it actually is CWR Mobility, but it will be available directly from Microsoft as a Marketplace offering). The mobile clients and service will start at $30 per user, per month and supports the use of up to three devices per user. This is considerably less than $65 for the comparable offering from Salesforce. The supported devices are listed below:
For those that want – or need to – run the mobile offering on-premise on their own servers, they will continue to purchase CWR Mobile CRM directly from a CWR partner under a perpetual license model. The mobile client and UI are identical to between the hosed and on-premises solutions.
Browser Flexibility
In addition to mobile flexibility, Microsoft Dynamics CRM Q2 2012 service update provides the ability for end users to access the Microsoft Dynamics CRM Web Client across all modern Internet browsers on various platforms. This includes browsers such as Internet Explorer, Firefox, Chrome, and Safari running on PC, Apple Macintosh or iPad. This is a huge advancement, as the last few years have seen more enterprises becoming client platform agnostic.
Enhanced Social Experiences
This updates adds even more social capabilities to the very popular micro-blogging Activity Feeds feature that was introduced last fall. Activity Feeds feature updates in this release:
- Ability to “Like” and “Unlike” Activity Feed posts.
- Improved filtering capabilities, including the ability to filter @names in a timeline.
- Improved following capabilities. You will now be able to filter based on CRM views; meaning even if you don’t follow a particular opportunity or account, if an activity is triggered that would make it visible in your personalized CRM view, then it will appear on your activity wall.
- Update to the Windows 7.5 Activity Feeds Mobile app.
Posted by Brad Koontz on February 06, 2012 at 02:02 PM in Activity Feeds, Customer Effective News, Dynamics CRM 2011, Social CRM | Permalink | Comments (0) | TrackBack (0)
XRM 2011 JavaScript: Another 101 Lesson in Microsoft Dynamics CRM 2011
When you’re learning JavaScript, you’ll often come across the need to do something to every field on the form. When you do, it’s important to have efficient code to make such widespread changes so the user doesn’t have to wait for the JavaScript to finish. This lesson consists of several parts, some of which you’ll probably already know but hopefully there are some things in here for everyone.
Setting up our Environment
First thing first, open your CRM 2011 development environment and browse to an account form. Once the account form is open, hit F12 on your keyboard. A window should popup that looks like this:
If instead, you see the window in the bottom of your browser page. Click the little “Unpin” button shown here:
This is IE Developer Tools and if you haven’t used this in the past, then I hope you enjoy not having to save/publish/refresh/test nearly as often. To start, we’re going to see how many fields we have on the form. When inside of the CRM form, we’d use something like:
Xrm.Page.data.entity.attributes.getLength()
But when we’re inside Developer Tools, we actually have a different context. So we need to click on the “Console” tab and execute:
frames[0].Xrm.Page.data.entity.attributes.getLength()
Anything we want to execute on the form, we can do by simply prepending “frames[0].” in Developer Tools to get the proper context. This allows us to write and test code instantaneously, which is a huge timesaver.
Iterating Fields
Now that we are playing in our Developer Tools sandbox, let’s iterate through some fields to see which fields are required. To use multiple lines, click the double up arrow in the bottom right corner.
Here’s some slightly modified code from the SDK that we can just copy and paste into our Console:
var message = "The following fields are required:\n";
frames[0].Xrm.Page.data.entity.attributes.forEach(function (attribute, index) {
if (attribute.getRequiredLevel() == "required") {
message += " \u2219 " + attribute.getName() + "\n";
}
});
alert(message);
Note: I can’t stress enough how awesome the SDK is. Everyone I’ve met who partakes in the SDK creation, maintenance, etc. have been top notch people. If you aren’t using the SDK, you are missing out in tons of awesome tips, features and customizations.
You’ll notice that the above code quickly goes through each field and checks to see if the field is required. We could also check if the field is dirty (meaning the user changed the value), if the field is enabled, or whatever. It’s just a simple way to make mass changes quickly.
About “forEach”
For the experienced developers, you may be thinking did IE get ForEach? No, but the CRM developers were gracious enough to add this into the Xrm variable. For those of you unfamiliar, this was an old Mozilla thing that made life a lot easier when dealing with arrays. Expanding further, the Xrm forEach approach is faster than most arrays people would generate using for loops. You can write some JScript that is faster and I’ll get into that one day, but at this point you are better off using the forEach approach.
I’ve said it several times, but I really like the Xrm object due to its attention to performance. In fact the method here is about a hundred times faster than iterating the crmForm.all object. I’ll back that up with some pretty graphs and such in a later post.
Checking for Changed (Dirty) Fields
var message = "The following fields are dirty:\n";
frames[0].Xrm.Page.data.entity.attributes.forEach(function (attribute, index) {
if (attribute.getIsDirty()) {
message += " \u2219 " + attribute.getName() + "\n";
}
});
alert(message);
Notice how easy it is to change what we are checking for. Whether we are looking for a specific value, dirty fields, required fields, or whatever, doing so inside the forEach function makes it fast and easy.
Back to the Web Resource
To go from the Developer Tools back to the Web Resources, we need to replace all of the “frames[0].” references with blanks. IE Developer Tools is a great way to create and test our code without affecting anyone else and there is a lot more to developer tools than the console. I hope you enjoy!
Posted by Paul Way on February 06, 2012 at 08:25 AM in CRM Best Practices, CRM Development, CRM Javascript, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Tricks and Tips, XRM | Permalink | Comments (1) | TrackBack (0)
February 01, 2012
Using a No-Operation Plugin to Examine the IPluginExecutionContext in Microsoft Dynamics CRM
If you have ever had the privilege of developing a plugin for CRM 2011 you know that one of the most important aspects of plugin development is understanding what is available in the context that is passed to the plugin by CRM. After creating a few plugins you generally have a good idea of what is available for the common operations of CRM such as Create, Retrieve, Update, and Delete, but some of the more uncommon request to the OrganizationService may still be cloudy.
One of the methods that I use to understand what is available in the IPluginExecutionContext of a plugin is to use a no-operation plugin registered for the message that I will be handling that will trace the context out to the event log. This is a great way to see a list of all of the data contained in the context’s InputParameters, OutputParameters, SharedVariables, and images. Once you have a trace of what is available in the context of the plugin, the plugin development seems like a much less arduous task.
Since tracing the plugin context is something that I commonly do when developing plugins for messages that I am not familiar with, I thought I would share the no-operation plugin that I use to trace the context for a plugin. The plugin that I use can be registered for any message, entity, or stage and it will trace the output to the event log on the server with a source of MSCRMServices. Simply register the plugin for the desired message, perform an action in CRM that will trigger the plugin, and voila, an event log entry will show up in the event log on the server.
Since the plugin requires access to the event log it cannot be used in a sandboxed environment and therefore it will not work online, but that shouldn’t be a big hurdle as I am sure if you are developing plugins you will have access to a test environment in which you can register the plugin for testing purposes.
You can download the plugin here. Good luck with your plugin and hopefully, the no-op plugin will have you on your way to a speedy plugin development.
Posted by Nick Doriot on February 01, 2012 at 09:48 AM in CRM Development, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Tricks and Tips | Permalink | Comments (0) | TrackBack (0)
January 30, 2012
Removing Query Data Cached by the OrganizationServiceContext in Microsoft Dynamics CRM
One of the great set of tools provided by the CRM 2011 SDK are the SDK Extensions which provide the OrganizationServiceContext for accessing data in CRM. The OrganizationServiceContext provides a way to access CRM and provides features such as change management, exposing an IQueryable interface, implementing a LINQ query provider, and providing caching services. It is the caching services that I would like to take a look at today.
Most of the time, the caching provided by the OrganizationServiceContext is exactly what you are looking for as a developer. It provides faster access to the data exposed by the OrganizationService and reduces the load on the network. However, there are times, when the retrieving data that you would like to have a current set of data rather than a set of cached data. There are a couple of methods that can be employed if you would like to retrieve a set of current data using the OrganizationServiceContext. One of these is to modify the configuration in the web.config or app.config file that is used to specify how the client context is initialized. Another is to instantiate the OrganizationServiceContext yourself and pass an instance of a non-caching OrganizationService when constructing the context.
While these methods will work and have their purposes, most of the time I would like to use a caching instance of the OrganizationService but still be able to control the caching so that I can retrieve a current set of data if necessary (I like to have my cake and eat it too). The great news is that it is possible to control the data caching of the OrganizationServiceContext to some extent if you understand the structure of the context class that is being used.
If you are using early binding and the CrmSvcUtil.exe to generate an OrganizationServiceContext to be used when accessing data in CRM, the class that gets generated derives from the CrmOrganizationServiceContext. If you are using late binding you will more than likely be using the CrmOrganizationServiceContext directly. The CrmOrganizationServiceContext implements the IOrganizationServiceContainer interface that exposes a Service property. If you have not specified a type for the service to be used by the context, this object will be an instance of the CachedOrganizationService. In addition, the CachedOrganizationService class exposes a Cache property that is an IOrganizationServiceCache instance. It is this instance of the IOrganizationServiceCache that exposes the methods that allow items to be removed from the cached used by the context.
Now that we have an understanding of the structure of the context it is simple to write an extension method that will remove cached data items. The following snippet of code can be used to remove entity data from the set of data cached by the context.
1: public void RemoveCachedData(OrganizationServiceContext context, string entityLogicalName, Guid? id) {
2:
3: var serviceContainer = context as IOrganizationServiceContainer;
4: if (serviceContainer == null) {
5: return;
6: }
7:
8: var cachedOrgService = serviceContainer.Service as CachedOrganizationService;
9: if (cachedOrgService == null) {
10: return;
11: }
12:
13: var orgServiceCache = cachedOrgService.Cache as IOrganizationServiceCache;
14: if (orgServiceCache == null) {
15: return;
16: }
17:
18: orgServiceCache.Remove(entityLogicalName, id);
19: }
As you can see, we simply need to cast the context to an IOrganizationServiceContainer and drill down through the object until we get at the actual OrganizationServiceCache. Once we have an instance of the OrganizationServiceCache we can use one of the Remove methods to remove the cached data. There are several other overloaded Remove methods that allow data to be removed and I have only shown one of them that will allow data to be removed for a specific entity. In the snippet I have shown, if the id argument is not supplied, any cached data for the specified entity will be removed.
Now all that needs to be done is call the method to remove the cached data before executing your query to retrieve data. If you would like to remove other pieces of cached data you can browse the CRM 2011 SDK and have a look at the Remove methods exposed by the OrganizationServiceCache class.
Posted by Nick Doriot on January 30, 2012 at 09:46 AM in CRM Development, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Tricks and Tips | Permalink | Comments (0) | TrackBack (0)
January 25, 2012
Transform your Business with Microsoft CRM and Cloud Computing on your Terms
Over the past few years, the financial services sector has experienced extraordinary change due to shrinking margins, mounting global competition, and increasing regulatory scrutiny. Even prior to these challenges, many firms were hindered by an unmanageable and inefficient legacy infrastructure consisting of disjointed business processes and multiple non-integrated applications. In such an evolving marketplace, financial institutions must focus on core competencies and waste-cutting without sacrificing the need to innovate and adapt. As they desperately seek out cost-effective technology solutions that can streamline their operations and offer them greater agility, flexibility, scalability, and real-time data, many firms are now turning to cloud computing.
Firms drawn to virtualization and cloud services are looking to trim capital expenditures, achieve economies of scale, and reduce time to market. IT departments that have undergone a cloud-based transformation are investing less on optimizing servers and additional hardware and capacity because they now selectively purchase additional services and scale only when needed as demand dictates. Furthermore, IT departments that have embraced the cloud are spending less time on running, patching, maintaining, and reactively supporting large data storage centers, hardware, and software. As a result, they can focus more on strategic initiatives and developing better products and applications to better support the business side’s growth and straight-through processing automation objectives. Finextra further affirms the increasing momentum of cloud computing by citing research from Gartner, which shows that 39 percent of surveyed CIOs at financial services firms “expect that more than half of all their transactions will be supported via cloud infrastructure and software as a service (SaaS) by 2015.”
With over 15 years of experience in cloud computing, “Microsoft invests over US$2 billion a year alone into the development of its Microsoft Dynamics products.” Included in its industry leading portfolio of cloud assets is Microsoft Dynamics CRM Online. Delivered over the Internet, CRM Online can be up and running quickly and cost-effectively. Also, it is easy to learn and use and it supports widespread adoption because it provides a familiar Microsoft Office user interface and experience and it even operates within the friendly confines of Outlook. Additionally, its powerful suite of marketing, sales, and customer service functionality gives organizations valuable visibility into customer, prospect, and partner information.
As a reminder, though, CRM Online is not the only deployment option for Microsoft Dynamics CRM 2011. Besides, the on-demand online cloud hosted model, firms can still opt for an on-premise software installation or a hybrid solution of both the on- and off-premise models. Unlike its competitors, Microsoft provides its customers with the power of choice and recognizes that a firm’s business needs can change. Despite offering a superior CRM cloud solution, Microsoft understands that some firms may still want to extend investments in existing infrastructure, and thus they might have a more long-term timeline for transitioning CRM and other in-house applications to the cloud. Therefore, Microsoft grants firms the freedom to switch at any time from one deployment model to the other, regardless of what option was initially selected. Overall, firms are able to use their technology on their own terms and take advantage of the cloud when they are ready.
To better navigate the Cloud with Microsoft technology and explore your CRM options, please visit www.customereffective.com.
Posted by Kevin Wessels on January 25, 2012 at 07:36 AM in Dynamics CRM 2011, Web/Tech | Permalink | Comments (1) | TrackBack (0)
January 24, 2012
Improve Customer Relations and Reshape the Customer Experience with Microsoft Dynamics CRM 2011
In today’s turbulent economy, corporate decision-makers are reexamining how they can consistently deliver a more memorable and differentiated customer experience that is more aligned with customers’ needs and ultimately generates profitable top-line growth. Striving to meet and exceed the expectations of the new, digitally savvy and often fickle consumer in a cost-effective manner is not easy, though. More empowered than ever before, many of today’s capricious customers want everything personalized, provided at a discounted rate, and done as quickly as possible, regardless of the channel. Up to the challenge, many top-tier companies across the globe recognize that they must refocus on the end-customer and engage in more consultative and meaningful dialogues with their clients and interested buyers across all touchpoints.
With such a growing imperative to maximize customer value and reshape the customer experience, many top-tier firms are turning to Microsoft Dynamics CRM 2011. As a fully centralized and interactive business management tool, CRM 2011 provides a complete, reliable, and integrated 360 degree view of client-related information so that companies can better identify, segment, service, and retain their customers and create a more positive customer experience in the following ways:
- Cultivate and deepen relationships to earn client loyalty, retention, and pave the way for repeat business via upsell and cross-sell opportunities.
- Dissect the critical information found in the client profile to develop more targeted marketing campaigns, more effective sales call plans, and more seamless, cost-efficient service delivery strategies that are relevant and tailored to the unique customer purchasing preferences and habits.
- Glean insights on a customer’s interaction, ad response, and transaction history across various channels and touchpoints to grow company-wide awareness and knowledge of each customer’s unique needs and be better positioned to offer value-added products and services.
- Facilitate employee and department collaboration, sharing, and communication of critical information to improve and automate front-office sales and service processes, minimize response times to client inquiries, and reduce customer frustration by not having to ask the same questions repeatedly.
The good news here is that all of the above benefits of improving the customer experience and overall client satisfaction will eventually grow customer spend, provide an incremental sales lift, and maximize the lifetime value of your more profitable clients and prospects.
To learn more about how the vast experience and expertise of Customer Effective combined with our industry specific accelerators and pre-built configuration templates can help lower your total cost of ownership, shorten your implementation timeline, and increase the return on investment of your new robust Microsoft Dynamics CRM 2011 system, please visit www.customereffective.com.
Posted by Kevin Wessels on January 24, 2012 at 02:15 PM in CRM Best Practices, CRM Business Process, Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
January 23, 2012
Wealth Management Firms turn to Microsoft Dynamics CRM 2011 to Amplify their Sales and Service Results
Customer Effective is poised and ready to empower wealth management firms with flexible, scalable, and security-enhanced CRM tools and integrated solutions to grow their business. Customer Effective: FinServ for Wealth Management is our pre-configured Microsoft Dynamics CRM 2011 offering consisting of a full-featured Marketing, Sales, and Service suite tailored to wealth management industry needs. Below I have highlighted some common business and operational challenges faced by investment advisory firms and how these can be overcome with the help of the Customer Effective: FinServ for Wealth Management platform:
Advisor needs more insights on Household Relationship Management and Client Acquisition Tracking
- Link Clients to multi-generational affluent family Households and obtain consolidated 360-degree views of all Household Members, Accounts, Assets/Liabilities, Transactions, Market Values and be able to see their complete financial picture in one central location.
- Track related 3rd Party Advisors, Qualified Plans, Employers, and Client Interests and receive the extra knowledge and background to become the go-to trusted advisor and “quarterback” for any financial situation.
- Track Client Acquisition Prospecting efforts, RFP requests and responses, and lead conversion success rates to identify the most effective and efficient ways to win new business.
Advisor needs better recordkeeping for Compliance
- Uphold data integrity and maintain accurate Client, Prospect, and Partner records for individuals and companies.
- Track system and field data changes via historical Audit trail logs to meet tightening compliance requirements.
- Track and store all Client communication and correspondence to adhere to SEC and FINRA guidelines – emails, phone calls, portfolio review meetings and notes, service inquiries, client newsletters, buy/sell recommendations, Client Monthly Statements, Financial Plans, Investment Proposals, Monte Carlo Hypos, Investor Suitability Due Diligence questionnaires, KYC/AML compliance docs, proxies, research reports, and prospectuses.
Advisor needs more timely and robust Sales Pipeline Management reporting
- Sales, Marketing, Client Service, and Compliance Dashboards and Reports capture KPI’s and production results for each individual Advisor, Branch, Region, or the entire firm.
- Real-Time Sales Opportunity Pipeline Management and Forecasting help focus time and resources on more profitable relationships and shorten sales cycles.
- Target vs. Actual Goal Tracking of Closed Deals and Prospecting Activity promotes competition, instills accountability, motivates reps, and helps identify areas for improvement.
Advisor needs to automate New Client Onboarding Processes
- CRM can be tightly integrated with Portfolio Management/Trading/Rebalancing/Custody platforms to eliminate dual entry, save time, and further streamline and automate the Client Onboarding, Account Setup, and Ongoing Service Processes.
- Once the Onboarding Process is complete, ongoing monthly, quarterly, semi-annual, or annual Review Meetings can automatically be set up to consistently and frequently stay in touch with Clients, earn their trust, and provide superior levels of service to the competition.
- Track and rate Referral Sources based on lead generation profitability.
Advisor needs an easier way to plan, execute, and follow up on Seminars
- Devise quick campaigns to plan, execute, and track the success of converted leads from attendees of Retirement Planning, College Savings, Tax Minimization, and Estate Planning Seminars.
Advisor needs to reduce the time involved on Client Allocation Change and Distribution Request Processes
- Create automatic follow-up tasks and deadlines for review of Account activity and maintenance to increase client retention and ensure consistent behavior amongst Client Service Teams.
- Identify At-Risk Clients based on recent, frequent high-dollar withdrawals; develop and execute client outreach and retention plans.
Please visit www.customereffective.com to learn more about Customer Effective: FinServ for Wealth Management and how its pre-designed wealth management tools and templates can vastly improve your practice’s customer-centric approach and widen your competitive advantage.
Posted by Kevin Wessels on January 23, 2012 at 08:37 AM in CRM Best Practices, CRM Business Process, Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
January 20, 2012
Retrieving Activity Feed Post with the OrganizationService
One of the new features introduced with Update Rollup 5 for CRM 2011 was the introduction of activity feeds to CRM. Activity Feeds give users the ability to monitor what is happening to various business entities. The out of the box functionality includes auto posts that include activities such as status changes in business entities, and manual posts that are created by users. Users also have the ability to post comments to posts that are created in an activity feed. Recently, I had the need to retrieve activity feeds for various business entities in order to display a summary of interactions that had recently taken place for a set of accounts and its related entities. While the out of the box functionality allows a user to see the record wall for an individual record, it does not give the user the ability to see activity posts for multiple records on a single wall, hence the need to retrieve the posts using the OrganizationService.
The OrganizationService provides two messages for retrieving activity posts. These are the RetrieveRecordWallRequest and RetrievePersonalWallRequest. These messages do exactly what you would think. The RetrieveRecordWallRequest retrieves all of the posts that involve the specified record in CRM, while the RetrievePersonalWallRequest retrieves all of the posts for a user that they are following or in which the user is mentioned. Let’s explore these two messages in a little more detail so that we can use the data that they expose.
In order to retrieve post to a record wall we will use the RetrieveRecordWallRequest. The following shows an example of the service call.
1: RetrieveRecordWallResponse recordWallResponse = null;
2: RetrieveRecordWallRequest recordWallRequest = new RetrieveRecordWallRequest();
3: recordWallRequest.CommentsPerPost = 50;
4: recordWallRequest.Entity = new EntityReference("account", accountGuid);
5: recordWallRequest.PageNumber = 1;
6: recordWallRequest.PageSize = 100;
7: recordWallResponse = _serviceProxy.Execute(recordWallRequest) as RetrieveRecordWallResponse;
As you can see, in this request to the service we created an instance of the RetrieveRecordWallRequest and passed it to the Execute method of the OrganizationService. Notice in line 3 that we specified 50 for the number of CommentsPerPost and in line 6 we also specified the PageSize as 100. Both of these are the maximum allowed values when making a request for wall posts. This will return up to 100 posts for the record and up to 50 comments for each post. If more posts are desired, another request can be made with the PageNumber property of the request changed to specify a different page. Also, notice that for the record wall request that we had to specify an entity reference to the record for which we wanted posts as done in line 4.
The other request for posts that can be made is for personal wall posts. This is done using the RetrievePersonalWallRequest message. The following shows an example of the service call.
1: RetrievePersonalWallResponse personalWallResponse = null;
2: RetrievePersonalWallRequest personalWallRequest = new RetrievePersonalWallRequest();
3: personalWallRequest.CommentsPerPost = 50;
4: personalWallRequest.PageNumber = 1;
5: personalWallRequest.PageSize = 100;
6: personalWallResponse = _serviceProxy.Execute(personalWallRequest) as RetrievePersonalWallResponse;
As you can see in this example, the request is a little simpler. In this case we still specified the CommentsPerPost, PageNumber, and PageSize, but we did not have to specify an entity reference. This is because the RetrievePersonalWallRequest will retrieve the post corresponding to the user in context that is making the service request. If we wanted to retrieve the wall for a different user we would have to impersonate the user for which we wanted posts when getting a reference to the OrganizationService used.
So now that we have the data, what does it look like? Well, both of the request return a result that contains an EntityCollection property that is a collection of Post entities. Each of the post entities will also contain data for the comments if they exist in the RelatedEntities collection of the individual entities. The relationship to reference is the “Post_Comments” relationship. The following diagram gives more detail as to what data is exposed.
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
Probably the most important piece of data in the entities is the [text] attribute. This is the attribute that actually contains the text for the post of comment. The text in this field is already localized for the current user, but it does contain placeholders for other records that are referenced by the post. The format of the placeholder is [ObjectTypeCode,ID,”Display String”] for example, [1,00000000-0000-0000-0000-000000000000,”An example post or comment.”]. This placeholder will have to be replaced with the desired text if the post is going to be displayed for the end user.
Hopefully, this example will help you get the activity post data for your business requirements. If you need more information concerning activity feeds you can check out the activity feed section of the CRM SDK here.
Posted by Nick Doriot on January 20, 2012 at 08:00 AM in Activity Feeds, CRM Development, Dynamics CRM 2011, Microsoft CRM Tricks and Tips | Permalink | Comments (0) | TrackBack (0)
January 19, 2012
Customer Effective and AssureSign to present Webinar on February 15 at 2:00pm Eastern
Customer Effective and AssureSign Present: Increase Efficiency. Decrease Cost. With AssureSign for Microsoft Dynamics CRM
We are excited to announce a FREE webinar on February 15, 2012 at 2:00pm Eastern Time
The webinar will cover topics including:
- How companies have integrated AssureSign Electronic Signature Technology into Microsoft Dynamics CRM
- How to merge your documents with Microsoft Dynamics CRM data fields and send them out to one or many recipients for signature using a single interface.
- How to track the progress of documents out for signature, send executed copies to all required recipients, and bring completed documents back into Microsoft Dynamics CRM.
- How to streamline your business processes by integrating electronic signatures, keeping all documents electronic, and eliminating overnight charges or delays associated with faxing
Visit the Events Page on our website to Register for this great Webinar
Posted by Hannah Mayer on January 19, 2012 at 10:47 AM in Customer Effective News, Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
Customer Effective Announces Microsoft CRM for Health Plans Webinar Series
Customer Effective is excited to announce a Winter Webinar Series for Health Plan Providers. You will see how other Health Plan Organizations are using Microsoft Dynamics CRM to better manage their business. We will show you that CRM is not just a Sales Force Automation tool. Join us for our webinar series and learn how our team can help you leverage Microsoft CRM 2011 in your organization.
Sales & Marketing (Group and Individual) - February 2, 2012
Time: 2:00pm to 3:00pm EDT
This webinar will touch on topics including:
> Managing Quote Activity
> Outbound Marketing Campaigns
> New/Renewal Opportunity Management
> Agency Performance Management
> Reporting and Dashboards
Operations (Group Plan Administration) - February 23, 3012
Time: 2:00pm to 3:00pm EDT
In this webinar, the following topics will be covered:
> Policy Holder 360 Degree View
> Group 360 Degree View
> Underwriting
> Reporting and Dashboards
Call Center (Sales and Customer Service) - March 13, 2012
Time: 2:00pm to 3:00pm EDT
The highlights of this webinar will include:
> Group and Individual Agent Case Management
> Telephony Integration with CRM
> Knowledge Base
> Reporting and Dashboards
Please visit our website for more information on how to register for this educational webinar series!
Posted by Hannah Mayer on January 19, 2012 at 09:55 AM in Customer Effective News, Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
Use Goal Management in Microsoft Dynamics CRM 2011 to Track and Improve Sales Team Performance
With the Holidays behind us, many Sales teams are in the process of receiving new comp plans for the New Year. Sales management is faced with the dilemma of devising compensation structures that not only reward top performers, but also motivate them to continue producing at a high level going forward. Besides possibly changing compensation, Sales Goals for reps and territory assignments may be altered as well. In many cases, the new Sales Goals may seem extremely challenging at first glance. Regardless of how well management clearly defines and articulates the changes based on their analysis of last year’s company results, current and future market environments, and projected growth rates, some Sales reps may wonder why the changes were necessary, and thus they may have some reservations about hitting their new lofty numbers until they start closing some deals again. Without Goals, though, businesses, Sales teams, and Sales reps have no real measure for success in place.
Microsoft Dynamics CRM 2011 recognizes how important it is for Sales executives and top producers to track and achieve Goals. For instance, CRM 2011 offers Goal tracking and management functionality that Sales reps can use to view their individual performance results and see how they stack up against their respective Revenue or Sales Volume Goals. Plus, Sales management can use Goals in CRM to chart and analyze the progress of the teams or territories they oversee and really target areas for improvement based on how much time is left in the current sales period. The Sales Goals can be for a custom time period, such as monthly, quarterly, or annually or even set to a particular Fiscal period. Moreover, tracking and managing Goals within CRM will make the overall Sales Goal maintenance, roll-up, reporting, and review process far less cumbersome and error-prone, especially compared to the extremely time-consuming and manual-intensive approach of doing the same in spreadsheets.
Furthermore, the built-in robust Goal charts are great visualization mechanisms for Sales reps to see where they stand at a given point in time against their peers and their individual Goal(s). For instance, the chart below displays a comparison of Actual and In-Progress Sales Opportunity Revenue figures versus a Quarterly Sales Goal for three individuals. It is taken from “Tracking status against goals with built-in predictability” on the Microsoft Dynamics CRM Blog, which I encourage you to reference if you want to get more insight on the use of Sales Goals in CRM 2011 and see more sample Goal charts. Being able to always refer to these instant individual Goal results via a Dashboard or an in-line visualization chart helps maintain Sales focus and momentum, instills accountability, and fuels competition amongst reps, managers, teams, and regions.
Additionally, I recommend watching this brief Goals tutorial video from the Microsoft Dynamics CRM Resource Center to learn more on how to create and assign parent/child roll-up Goals and Goal metrics. It actually focuses on an example of Service Case Goals, but the steps are a great primer on how to create Goals in CRM, particularly Goals with a Goal Metric based on a “Count” as opposed to a Revenue $ Amount metric. The video really can serve as a guide if you have the need to create a Sales “Count” Goal, such as number of Opportunities or Products sold per month, number of outbound dials per week, or number of leads generated from a Marketing campaign.
Lastly, if you would like to discuss further and see first-hand how Customer Effective can leverage and tailor the Goal Management functionality in CRM 2011 to optimize your Sales Department’s processes, productivity, and performance, please e-mail us at info@customereffective.com.
Posted by Kevin Wessels on January 19, 2012 at 08:45 AM in CRM Best Practices, CRM Business Process, Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
January 18, 2012
Microsoft Dynamics CRM 2011 Standalone Sandbox Using VirtualBox Part 2
Back to Part 1... Microsoft Dynamics CRM 2011 Standalone on VirtualBox Part 1
2: Add the ASP.NET role service:
Install CRM 2011
Great! We are ready to finish and fulfill our goal. From the host machine unmount the SQL Server 2008 R2 and mount the Microsoft Dynamics CRM Server 2011. When you mount Microsoft Dynamics CRM Server 2011 from the host machine go to CRMDEMO2011 and run the splash.exe from the ‘D:’ drive.
1: Select: Install Microsoft Dynamics CRM Server
2: Toggle: Get update for Microsoft Dynamics (recommended)
3: Specify the SQL Server, in this guide we are saying it is CRMDEMO2011, the local machine:
4: Specify the Organizational Unit, the Active Directory root we prompted the server to:
5: Specify what CRM services will run as, use the CRM2011NET\CRMDEMOADMIN account:
6: Specify the database name:
7: Get Excited! Here’s your first glimpse of the URL for your new CRM environment:
8: Blast off! Click install and wait with your http://crmdemo2011 url in the clipboard to paste that sucker into IE. But wait…make sure you allow the Microsoft Dynamices CRM Reporting Extensions Setup to run.
Login to http://crmdemo2011 with the CRMDEMOADMIN user and gloat with pride:
All-in-all, this installation should only take 3 hours or less once you have all the components downloaded and in place. The first time can take up to 6-8 hours because you have to download all the ISOs and get familiar with VirtualBox. But, once you make a copy of the CRMDEMO2011.VDI at a point that you consider a starting point then you can start from there to cut out more time. Which by the way…now is a good time to back up that CRMDEMO2011.VDI file. Looking forward, another idea from here is using the VM created to install the SharePoint and Outlook components.
Good Luck…
Back to Part 1... Microsoft Dynamics CRM 2011 Standalone on VirtualBox Part 1
Posted by Manny Ed on January 18, 2012 at 08:03 AM in CRM Development, Dynamics CRM 2011, Microsoft CRM Implementation, Web/Tech | Permalink | Comments (1) | TrackBack (0)
Microsoft Dynamics CRM 2011 Standalone Sandbox Using VirtualBox Part 1
One of the best approaches to learn CRM is to have a sandbox. A lot of recommendations out there suggest having your IT administrator provide you with a CRM sandbox to play in. That is fine and is surely a good idea, but personally creating a sandbox will certainly give you the satisfaction of getting your hands dirty and will give you a little respect with your colleagues. So here we are going to look at getting a basic MS CRM 2011 up and running with Oracle’s VirtualBox.
So why VirtualBox?
- It is free
- Microsoft Dynamics CRM 2011 requires a 64-bit operating system to install
- Microsoft does not provide a desktop virtual platform that supports 64-bit guest OS. Microsoft's 64-bit virtual platform, Hyper-V, only runs on Windows server. Even the 64-bit version of Windows Virtual PC will not support 64-bit guest operating systems.
- VirtualBox can mount and run Hyper-V images, including the Microsoft provided demo VPC. (PartnerSource or Customersource login required).
So unless you have access to a server with Windows 2008 installed, VirtualBox is your best option for setting up a standalon virtual sandbox on your PC. Note that when Windows 8 is released, Microsoft will support Hyper-V on the desktop, so our recommendation may change at that time.
The steps included in this post should be applicable to setting up a standalone sandbox in "virtually" any other virtualization platform.
Performing the steps in order is very important to keep things easy. Here are the brief steps we are going to perform:
- Create a VirtualBox Instance
- Install Windows Server 2008 R2 Standard 64-bit
- Promote server to Active Directory domain controller
- Install SQL Server 2008 R2
- Install IIS and ASP.NET
- Install CRM 2011
This guide will enable us to create a brand new CRM environment within less than 3 hours, but there are a few prerequisites that you will want to have downloaded:
- Windows Server 2008 - Standard or Enterprise
- CRM 2011 Server Edition
- SQL Server 2008 R2 (x86, x64, ia64) - Standard or Enterprise
- Product Key for CRM 2011 Sever. *IMPORTANT: A valid key is a must to finish the install.
Other tools needed:
- ISO mounting tool, this guide is using MagicDisc. Use your own ISO mounting tool if you have one more familiar to you
- VirtualBox, which can be found at www.virtualbox.org
I am only going point out the installation steps necessary to get a very basic CRM 2011 environment up and running. This means that if a step is not mentioned I used the default. If you are interested in adding features please do so, as the scope here is just the bare bones.
Create a VirtualBox Instance
*IMPORTANT: Hardware virtualization must be enabled in the BIOS. This is an easy toggle and will not cause any issues to your system, but you will receive an error about VT-x/AMD-V and will not be able to boot Windows Server 2008 until this change is made. The setting lingo varies from Bios to Bios but a common word in all will be ‘virtualization’, so look for that.
Create a new VM host; in this case CRMDEMO2011 is the name. The defaults are fine for this example, but you may want to bump up the RAM if you are going to do some presenting or adding SharePoint, Outlook or Visual Studio. I also strongly recommend that you bump up the disk space to a minimum of 40gigs if you are going to use SharePoint, Outlook or VisualStudio. In any case, make sure you set the version of Windows to 8 (64 bit) or 2008 (64 bit). Both work, but the ‘8’ version automatically sets the RAM higher which is probably better.
1: Create VM Host
2: Mount Windows Server 2008 R2 ISO
We are going to use our mounting software from our host machine and mount the Windows Server 2008 R2 there. Make note of the drive that the mount is using, in this case ‘I:’.
3: Attach Drive with ISO to VM
The Windows Server 2008 R2 ISO is mapped on drive ‘I:’ from your host machine. Attach the ISO by going to Settings -> Storage -> IDE Controller -> select Empty or create a new controller and map it to Host Drive ‘I:’ or the drive you used for the Windows Server 2008 R2 ISO. When the VM starts the drive will be ‘D:’.
Summary: On host mount Windows Server 2008 R2 ISO on drive ‘I:’, on VM (CRMDEMO2011) the drive will be ‘D:’.
4: Start VM
Starting the VM with the Windows Server 2008 ISO attached to the ‘I:’ will start the install with ease because it is now a part of the boot sequence.
Install Windows Server 2008 R2 Standard 64-bit
Installing a new Windows Server 2008 R2 is pretty straight forward. Go through all the defaults. You will want to add your product key here if you have one. You may want to allow all the updates to happen if you have a nice network connection. Once that is all done, it is not a bad idea to back up your CRMDEMO2011.VDI file. That way you have a nice blank server ready to go for future use.
Two things for VirtualBox:
1: After you are done with the server install, go ahead and install the guest additions, so you can get a nice full screen:
2: A very important VirtualBox command: [RIGHT CTRL] +Delete = CTRL+ALT+DELETE for the VM…probably the only one you really need to know. This will drive you nuts if you don’t know it…you will hate VitualBox if you don’t remember!
Promote Windows Server 2008 to Active Directory Domain Controller
This step is in my opinion the most daunting. For many years I have be conditioned that installing a domain server is a one and done deal. That two domain server on the same network is really bad. Yes, having two or more domain controllers can be bad, but here we are going to set it up so we do not compromise our host network. Unless you really know what you are doing, DO NOT mess around with the AD settings or the VM network settings, especially while on your corporate network without the guidance from your local neighborhood IT guru. CRM requires a domain, and since we are going for a standalone installation, we have to promote the CRM server itself to the domain controller role. Additionally, promoting the server before we install SQL helps avoid additional configuration steps as a result of the server’s name and user accounts changing.
Promoting a domain controller is done from the commandline by running:
c:\>dcpromo
Seven tweaks are necessary:
1: Toggle: Create a new domain in a new forest
2: Name our network: CRM2011NET.local
3: Change forest function level to: Windows Server 2008 R2
You may get:
Selecting “Yes, the computer will use an IP…” is fine and keeps you from having to look at network settings.
You may also get:
Select ‘Yes’
Put in a password and you are done creating an Active Directory Domain Server…Congratulations! You will have to reboot after dcpromo has done its thing. The Domain we created is CRM2011NET, we will want to log back into the server using that domain.
4: Rename computer back to original name
Making the server a domain controller renames the computer to something weird, rename computer back to CRMDEMO2011 and reboot.
5: Create domain users
Create a few domain users is done from the commandline by running:
c:\>dsac
Create at least these users:
1: CRM2011NET\CRMDEMOADMIN
2: CRM2011NET\CRMSQLADMIN
3: CRM2011NET\Sal.Salesman
4: CRM2011NET\Mark.Marketing
Put the users in the ‘Users’ CN:
Make the password the same for all users and make it so it never expires to make things easier:
6: Make CRMDEMOADMIN and CRMSQLADMIN the administrators of CRMDEMO2011
7: Logout/Login
*IMPORTANT: Logout out as CRM2011NET/Administrator and log back in as CRM2011NET/CRMDEMOADMIN. Installing SQL and CRM as the domain administrator will cause strange installation errors.
Install SQL Server 2008 R2
1: Login to CRMDEMO2011 as CRM2011NET\CRMDEMOADMIN.
2: From the host machine unmount the Windows Server 2008 R2 and mount the SQL Server 2008 R2. When you mount SQL Server R2 from the host machine go to CRMDEMO2011 and run the SETUP.EXE from the ‘D:’ drive.
3: Install a new instance of SQL with a minimum of the following components selected:
4: Set the service accounts to the CRMSQLADMIN user:
5: Add CRMSQLADMIN as an administrator:
Install IIS and ASP.NET
Installing IIS is accomplished by adding the Web server role to the server using the server management console. In addition to the IIS role we’ll need ASP.NET, which must be selected separately. Once these two things are selected, the installer will install them both simultaneously. Starting the Server Manager can be started from the commandline:
C:\>ServerManager
1: Select Web Server (IIS) by selecting Roles -> Add Roles:
Continue... Microsoft Dynamics CRM 2011 Standalone on VirtualBox Part 2
Posted by Manny Ed on January 18, 2012 at 08:00 AM in CRM Development, Dynamics CRM 2011, Microsoft CRM Implementation, Microsoft CRM Tricks and Tips, Microsoft SQL Server, Web/Tech | Permalink | Comments (0) | TrackBack (0)
January 17, 2012
Rely on Microsoft Dynamics CRM to Satisfy Increasing Regulator Compliance Burdens and Investor Due Diligence Requests
As a result of the severe market volatility of 2011, the recent downgrade of the US debt rating, the massive shortfall and bankruptcy of MF Global, and the deepening of the Eurozone debt crisis, today’s Institutional investors are much more risk averse. Investors are clamoring for far greater transparency from their money managers, and thus are conducting more rigorous due diligence on a firm’s portfolio holdings, investment selection and allocation processes, and internal operational controls. Besides dealing with more demanding investors, Asset Managers must also be more prepared to withstand and overcome more regulatory oversight and scrutiny as a result of the landmark reform legislation of Dodd-Frank. In both cases, Asset Managers need to have in place sophisticated integrated systems and tools that can demonstrate compliance, promote transparency, and earn the confidence of investors and regulators. To provide timely, accurate, and increasingly on-demand reporting, many Asset Management firms are turning to a centralized CRM hub, such as Microsoft Dynamics CRM 2011, which can integrate with other core portfolio management systems, performance reporting engines, trading platforms, and investor portals.
With its advanced data recordkeeping, management, and business intelligence reporting capabilities, CRM 2011 enables Asset Management firms to quickly and accurately respond to the influx of inquiries from prospects, clients, partners, institutional consultants, and regulators. These Asset Managers are better equipped to reply to mounting requests for data collection and analysis because their client and portfolio data is more organized and easily searchable in one centralized location within CRM. Since Microsoft CRM 2011 offers a consolidated, comprehensive 360 degree view of client information, employees can easily filter, locate, sort, aggregate and report on data in real-time to promptly collaborate and correctly respond to all of the incoming audit, compliance, and investor due diligence requests. Additionally, Asset Management personnel can access and leverage CRM 2011 directly within their Outlook to refer to interaction history with key relationships and stakeholders, monitor capital raising pipelines, automate new fund launch marketing campaigns, track lead and referral sources, and streamline client on-boarding processes. The ensuing combination of increased employee productivity and more informed strategic business decision-making results in enhanced service levels to the firm’s client base. Therefore, the ever-increasing demanding clientele will be more satisfied with their overall investing experience with the firm, and thus be less likely to move their money down the block to a competitor. Furthermore, the firm is more agile and better positioned to adapt promptly to the more stringent regulatory environment to remain in compliance.
On the other hand, Investment Managers lacking a single core CRM system, and instead using siloed legacy applications and spreadsheets will inevitably severely lose assets and market share. Moreover, their widespread operational inefficiencies could potentially place the firm at a higher risk of being out of compliance and ultimately shut down.
Customer Effective is ready to partner with your firm to establish and successfully execute an industry-tailored CRM deployment, which can either be hosted in the cloud or installed on premise. To learn more about the operational simplicity and flexibility of Customer Effective: FinServ for Capital Markets and how we can accelerate your CRM ROI, lower your total cost of ownership, and grow your business, please visit www.customereffective.com.
Posted by Kevin Wessels on January 17, 2012 at 08:47 AM in Dynamics CRM 2011 | Permalink | Comments (0) | TrackBack (0)
January 16, 2012
Manually Setting Up Activity Feeds on Forms in Microsoft Dynamics CRM 2011
Microsoft Dynamics 2011 Activity Feeds provide real time notifications and quick sharing of information via quick, short updates. The solution is available on the Dynamics Marketplace here. If you are an online user, and you do not use multiple forms on the entities you want to highlight, simply download, import and publish the solution. You would then go to configure your post entities (step 1 below) and then you are good to go.
If you are using Microsoft Dynamics CRM and you have multiple forms configured for an entity on which you wish to display the Activity Feed wall, you will need to download, import and publish the solution, and then you will need to follow the steps below to ensure the activity feeds are visible on the forms you want to display the wall.
1. Once you have imported and published the Activity Feed Solution, you need to enable your selected entities and enable wall posting. Settings > System > Activity Feeds Configuration. Note that this form uses a text field for entering the entity name (not the more common lookup) and you will need to be careful to use the logical name. Also check the “Enable walls” box. You will need to go then to the entity you enabled and publish it individually.
2. Open an entity form for the entity you want to enable for activity feeds. In this example, we are using accounts. Open the Form Editor.
-
- Insert > Tab > One Column
- Open the Tab to edit the Tab Properties > Display
- Name= tab_recordwall
- Label = Record Wall
- Uncheck “Expand this tab by default”
- Tab Properties > Events
- Form Libraries, add msdyn_/ActivityFeeds.Form.js
- In event handlers, Add
- Library: msdyn_/ActivityFeeds.Form.js
- Function: ActivityFeeds.Form.CustomizationUtils.updateRecordWallRenderingState
- Check “Enabled.
- Check “Pass execution context as first parameter.
3. Save your changes to the tab and return to the form editor. Select the section inside of the Record Wall Tab. Set to ‘One Column’.
4. Back in the Form Editor, click Insert > Web Resource
- General Tab
- Web resource = msdyn_/RecordWall.htm
- Name = RecordWall
- Visible by Defualt = checked
- Pass record object…= checked
- Formatting Tab
- One column
- 15 rows (this is flexible, but 15 is standard the standard look).
- Display border = yes
- Scrolling = as necessary
5. Save, publish and go!
Posted by Brad Koontz on January 16, 2012 at 08:18 AM in Dynamics CRM 2011, Microsoft CRM Tricks and Tips | Permalink | Comments (0) | TrackBack (0)
January 13, 2012
XRM 2011 - Microsoft Dynamics CRM 2011 Style Buttons
Adding a button to a Form is a great way to add additional functionality right where the user is already focused. Today we are looking at a few different approaches to adding a button. First, we’re looking at handling the upgrade for those of you who have already used the 4.0 button inside of 2011 or if you had a 4.0 environment and are upgrading. If you have a clean 2011 environment, then feel free to skip down to the “From Scratch” section.
There is already some code floating around to create a 4.0 style button inside of CRM 2011. The button we’re creating will instead create a CRM 2011 style button (i.e. “Example Button”).
The CRM 2011 button starts gray and then when the user hovers over it, the button will look like:
Creating our Web Resource
First,name your Web Resource whatever you’d like. In my case, I’m planning to re-use it in various ways, so I’m throwing it in our JS root directory.
1: // CRM 2011 Style Button
2: // Creates a button from a form field
3: // Paul Way - 1/3/2012
4: function ConvertToButton(fldName, btnLabel, btnWidth, evt){
5: var btn = '<button id="btn_' + fldName + '" ' +
6: ' style="width:' + btnWidth + '" ' +
7: ' class="ms-crm-Button" ' +
8: ' onmouseover="Mscrm.ButtonUtils.hoverOn(this);" ' +
9: ' onmouseout="Mscrm.ButtonUtils.hoverOff(this);" ' +
10: '>' + btnLabel + '</button>';
11:
12: var ctrl = Xrm.Page.ui.controls.get(fldName)._control;
13:
14: // Add the new button
15: ctrl.get_element().innerHTML += btn;
16:
17: // Hide the textbox
18: ctrl.get_element().firstChild.style.display = 'none';
19:
20: // Hide the label (optional)
21: Xrm.Page.ui.controls.get('pager').setLabel('');
22:
23: // Add Event to the newly created button
24: ctrl.get_element().childNodes[1].attachEvent('onclick', evt);
25:
26: }
Modifying our Form
To use this new function, you’ll first need to add the newly created web resource to the form. You’ll also want to have a separate JS web resource to call the ConvertToButton function. In my case, I already have a web resource for contact specific JavaScript. If I didn’t, I would need to create a new web resource and then place my contact specific code there. Here’s an example screenshot:
By having two web resources for this, you’ll have only one version of your ConvertToButton function throughout your CRM 2011 environment. Let’s say down the road you’ll need to update the function to change the label to “Button”, then you only need to modify one file. In CRM 4.0, you probably had a lot of duplicate code. With CRM 2011, your browser can cache the JavaScript for better performance and it is easier to maintain when organized appropriately.
In our other web resource, the one we setup with the OnLoad, we need the following code.
1: function contactsOnLoad(){
2: convertToButton('pager', 'Example Button', '150px', function(){alert("test")});
3: }
Why is this so different then the 4.0 code?
If you’ve used the CRM 4.0 code, you’ll notice the code here is a lot shorter. It’s actually pretty different as well.
- For one, instead of modifying the input element we are actually creating a button HTML element. This just means that we can now use about any kind of field instead of just pure textboxes. Not a huge deal, but opens up the email address 3 and other attributes.
- Both are really unsupported but the other uses the deprecated crmForm.all.
- Finally, the button style was meant for 4.0 whereas now we have the 2011 look-n-feel.
From Scratch
So far we’ve mainly focused on if you already were using the 4.0 code and were upgrading. But what if you don’t have the existing code structure? I’d argue against creating a new attribute just to have a button. When adding a new attribute, you are also adding the attribute to the underlying SQL tables and views. Using an existing field isn’t really a great option either because there is always the chance you will need the field or it will overlap with an application from the MS marketplace.
Instead, I’d recommend creating a button place holder web resource and then embedding the web resource on the page. The web resource is just a JPG image like this:
We then place the image wherever we want on the form. Make sure to set the formatting to one column and one row.
Finally, we need a little bit of code added to the /js/formButton.js web resource:
1: // CRM 2011 Style Button
2: // Creates a button from a form field
3: // Paul Way - 1/3/2012
4:
5: function convertWebResourceToButton(fldName, btnLabel, btnWidth, leftMargin, evt){
6: var btn = '<button id="btn_' + fldName + '" ' +
7: ' style="margin-left:' + leftMargin + ';width:' + btnWidth + ';" ' +
8: ' class="ms-crm-Button" ' +
9: ' onmouseover="Mscrm.ButtonUtils.hoverOn(this);" ' +
10: ' onmouseout="Mscrm.ButtonUtils.hoverOff(this);" ' +
11: '>' + btnLabel + '</button>';
12:
13: var ctrl = Xrm.Page.ui.controls.get(fldName)._control.get_element().childNodes[1];
14:
15: // Replace image with buttom
16: ctrl.innerHTML = btn;
17:
18: // Add Event to the newly created button
19: ctrl.firstChild.attachEvent('onclick', evt);
20:
21: }
And as for our OnLoad function, we’ll need to use this instead:
1: function contactsOnLoad(){
2: convertWebResourceToButton('WebResource_btnProfInfo', 'Another Approach', '150px', '119px', function(){alert("test2")});
3: }
Notice that this will require an additional parameter for the left margin.
Summary
As you can see, there are several different approaches to adding a button onto the CRM form for 2011. With 2011, I’d opt for using the button place holder image method. No matter which approach you take, the end goal is enhancing the user’s experience. I hope you enjoy!
Posted by Paul Way on January 13, 2012 at 08:53 AM in CRM Best Practices, CRM Development, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Tricks and Tips, XRM | Permalink | Comments (0) | TrackBack (0)
January 12, 2012
CRM 2011 - iFrames & Saving
After spending time on several of the CRM forums, I noticed a few people having trouble with iFrames and saving data inside of the iFrame. While a forum post is a little difficult to write a full response, I wanted to share some insight on capturing the form save event to then trigger a save event inside of your iFrame.
From a business case, this is a fantastic way to tie multiple systems together. If all you are doing is syncing data, then look first at a plugin or scribe. However, if you are looking for the user to interact with multiple systems simultaneously, then an iFrame is a wonderful way to integrated with an existing system. A good example might be where CRM is only storing the summary information and the iFrame contains the details. The user may update the details which should save both the CRM record and the details of the web site.
Prerequisites
First, let’s assume you have an iFrame inside an entity.
Secondly, we need to uncheck the “Restrict cross-frame scripting” check box on the iFrame properties.
Lastly, it’s a good idea to make sure our iFrame is using HTTPS to prevent mixed mode security warnings.
Talking Directly
If you try to talk directly to the iFrame via something like:
Xrm.Page.ui.controls.get('IFRAME_opp').getObject().contentWindow.document
Unless you are On-Premise, you may encounter the “Access is Denied” warning. This will show itself when dealing with URLs on a different domain (or subdomain). Cross domain scripting is a security feature within the browser. Now an easy fix is to disable the browser settings, but this isn’t a good solution.
Messaging
Instead of talking directly, we need send a messages to our iFrame. To send a message, we’d do something like:
Xrm.Page.ui.controls.get('IFRAME_opp').getObject().contentWindow.postMessage('test', "*")
To receive the message on the iFrame, you need to listen for the message event. Let’s take a look at the JavaScript on our example iFrame page:
1: function receiveMessage(e) {2:3: if (e.origin == 'https://way.crm.dynamics.com'){4:5: if (e.data == 'test'){6: document.getElementById('msgBox').innerHTML = 'testing...<br />' + e.origin + '<br />' + e.data;7: }8:9: if (e.data == 'save'){10: saveForm();11: }12: }13:14: }15:16: saveForm = function() {17: document.getElementById('msgBox').innerHTML = 'saving...';18: }19:20: window.attachEvent("onmessage", receiveMessage);
It is very important to check the origin and the message if you are dealing with publicly facing sites.
If the idea of messaging is new to you, here are some additional resources:
- http://msdn.microsoft.com/en-us/library/cc197015(VS.85).aspx
- http://msdn.microsoft.com/en-us/library/cc511311(v=vs.85).aspx
The OnSave
To initiate the message from the CRM 2011 form, you need to register an OnSave event from within the “Form Properties”.
How about .NET Pages?
If your iFrame is an ASPX page, all of this still applies. The only difference is that you want to have an ASP.Net button on your page to call the server side code. Instead of the saveForm event, simply call the click event of the button.
When dealing with server side saves though, you can either post a message back to say “I’m done” which will then complete the CRM save or you can put a set timeout in the onSave on the CRM side.
Conclusion
Hopefully you have seen how easy it is to integrate with another web site while inside of CRM 2011. If you have had problems with iFrames in the past, I really encourage you to use iFrames for your integration needs as they can really enhance your users experience and can allow for improved data across systems. I hope you enjoy!
Posted by Paul Way on January 12, 2012 at 01:22 PM in CRM Javascript, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Online, Microsoft CRM Tricks and Tips, XRM | Permalink | Comments (2) | TrackBack (0)
January 04, 2012
Auto-Creating Contacts and Duplicate Detection in Microsoft Dynamics CRM 2011
As we have mentioned in previous posts, one of the new features in CRM 2011 for Outlook is the ability to automatically create new contact records if you track an e-mail with an address that does not exist in CRM.
This feature is turned on by default, and is located toward the bottom of the “E-mail” tab of user settings in CRM for Outlook.
As you plan your roll-out of Microsoft Dynamics CRM, you should be aware of the default options and how they may interact with other application features.
One example that I’ve seen with this new feature, is that when you track an e-mail and the system creates a new contact, if duplicate detection is enabled, and the contact being created matches another contact in the system, the duplicate detection process will prevent the contact from being created, and also prevent the e-mail from being tracked.
If you find that periodically you are getting errors when tracking e-mails, I recommend testing with the automatic contact creation feature disabled.
Posted by Joel Lindstrom on January 04, 2012 at 01:00 PM in Dynamics CRM 2011, Microsoft CRM for Outlook | Permalink | Comments (0) | TrackBack (0)
Entity Relationship Diagrams in Microsoft Dynamics CRM 2011
Visual representation of entity relationships and metadata can be very useful in a CRM project. Thankfully, Microsoft has provided pre-built Entity Relationship Diagrams (ERD) for the eleven of the most important out of the box entities in CRM2011. They are available here in Visio format.
You can also create ERDs for custom entities. The generator is buried deep inside of the SDK (…\sdk\samplecode\cs\metadata\diagram ). You will need Visual Studio and Visio 2010 to run the document generator.
1. First, open the above file path and open the file MetadataDiagram.csproj in Visual Studio.
2. Next, from the toolbar, click the Build Solution icon.
3. You could run the program now. However, it will map all of the entities, their attributes and their relationship to each other. This will take a very long time, but more importantly, it's complexity may render it useless to most people. What I have found useful it to map one entity at a time, or at the most two or three.
4. In order to draw one or more specific entities, click the debug tab, then enter the logical name in the Command line argument box. You can enter as many entities as you would like to map here. For instance, if you would like to map accounts, then simply enter "account". If you would like to map an custom entity then enter "new_entityname". If you would like to map the relationships between you custom entity and accounts, then enter "account new_entityname". Remember, that will map your new entity, accounts, and the relationships between them. If you want a map for accounts and another map for your custom entity, you will need to run the program twice.
5. To run the program, hit the Start Debugging button in the toolbar.
6. This will bring up a command prompt. It will ask for a CRM server and a port. It is very simply orgname.domainname.net (no https:, etc.) Then you enter your username and password just as you would if you were logging into CRM as a user.
7. The program will run (usually a few minutes) and create a Visio document in the path: (..sdk\samplecode\cs\metadata\diagram\bin\Debug ). The name of the file will be simply "account.vsd". It is important to note that if you use the program to create another account diagram, and there is already a file called "account.vsd" in the Debug file, the command prompt will issue an error and the document will not be created. It is a good best practice to move your finished files from the Debug folder as you finish them.
A sample of the output is below. This is for the entity 'sharepointsite' in ootb CRM.
Posted by Brad Koontz on January 04, 2012 at 08:57 AM in CRM Project Management, Dynamics CRM 2011, Microsoft CRM Implementation | Permalink | Comments (0) | TrackBack (0)
January 03, 2012
Microsoft Dynamics CRM 2011 – Pre-Populated Emails (Alternative Approach)
Recently, we came across the need for a single-click email feature on the ribbon of a custom entity. The idea was to be able to share CRM data as quickly and easily as possible. Another interesting caveat was the client wanted to have the email come directly from Outlook.
For those of you old enough to have used the internet before the iPad, you may recall that fancy-dancy “mailto” feature. (Granted I’m only 29 but my Omron body age says I’m 50 ).
Back to the point at hand though, CRM already has a few built in email features. Our situation calls for something a little different.
What’s Installed By Default
CRM already has the feature of sending a link to the CRM entity you’re working with.
CRM also has a really nice Email Template feature.
Which can automatically mail-merge information pertaining to the entity to eliminate any of that “automated” feel.
What We Need
Our situation is somewhat unique, but really we want both features combined. We want to open a new message like the link feature: inside outlook and with one click. However, we need more than just the link. We want to have a brief summary of the call report with a link to it.
Here’s an example email of what we’d like to send:
Adding the Button
The first thing we need to do is add the button to the ribbon like so:
If you are unfamiliar with the ribbon, Microsoft offers some really nice walkthroughs. I’d start with http://msdn.microsoft.com/en-us/library/gg334341.aspx.
For our situation, the XML that matters is our Action
<Actions> <JavaScriptFunction Library="$webresource:cei_example.js" FunctionName="emailContact" /></Actions>
Adding our JavaScript
At this point, the button should be on the form. From here, we need to add the JavaScript to open our populated email message.
To do this, add to the Form OnLoad events the following function:
emailContact = function() {
if (Xrm.Page.data.entity.getId() != null) {
var sRptID = Xrm.Page.data.entity.getId().replace('{', '').replace('}', '');
var sLink = "http://paul.customereffective.com/userdefined/edit.aspx?id=" + sRptID + "&etc=10011";var sSubject = 'Contact - ' + Xrm.Page.getAttribute("firstname").getValue() + ' ' + Xrm.Page.getAttribute("lastname").getValue();
var sCustomer = '';
if (Xrm.Page.getAttribute("parentcustomerid").getValue().length > 0){
sCustomer = Xrm.Page.getAttribute("parentcustomerid").getValue()[0].name;
}
var sBody = '---\n\nCustomer:\t' + sCustomer + '\n\n' + sLink + '\n\n---';
var sMailTo = 'mailto:?subject=' + escape(sSubject) +
'&body=' + escape(sBody);parent.location=sMailTo;
} else {
alert('You must save the contact before emailing.');
}
}
Note: If you change the name of the function, make sure it matches the name inside your Ribbon XML.
What about Window.Open
If you use Window.Open to trigger the email (or OpenStdWin), the user will get a blank IE page inside of Outlook. By using the parent.location for your mailto, you’ll have a consistent user experience across IE and Outlook.
Seeing the Final Results
Now whenever a user wants to share a call report, they can easily hit the “Email Call Report” button. Add any of the fields you want.
For our needs I ended up with the following; however, this technique can add whatever field you’d like.
Well this isn’t a tool in the toolbox I’d use daily, it can be valuable when the situation calls for it. I hope you enjoy!
Posted by Paul Way on January 03, 2012 at 01:58 PM in CRM Development, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM for Outlook, Microsoft CRM Tricks and Tips, XRM | Permalink | Comments (0) | TrackBack (0)
December 30, 2011
Best Practices for Activity Reporting In Microsoft Dynamics CRM 2011
So you want to report on your activities in CRM—and that is a great idea. Activities such as appointments, phone calls, tasks, and e-mails are core CRM functionality and a great indicator of how your users are interacting with your customers, and how actively your users are adopting CRM.
For basic activity reporting, such as activity lists or viewing a count of activities by type by user, consider using the out of the box views and charts.
For example, if I want to see the number of activities by type and priority, I can just go to the Activity view in CRM and select the “Activities by Type and Priority” chart.
If you are not familiar with creating charts in CRM 2011, check out Kevin Wessels’ Introduction to charts in CRM 2011.
I recommend using the views and charts whenever possible, because it is fast, it is dynamic, and it can easily be added to your CRM 2011 dashboard.
However, if you find you want a report that requires more advanced formatting or that can be published to additional formats, such as Word or PDF documents, another option is to create a SQL Server Reporting Services (SSRS) report.
The point of this post is not to introduce you to SSRS. If you don’t have experience creating SSRS reporting, I recommend checking out resources like the report development section of the CRM 2011 SDK.
The point of this post is to discuss the unique challenges of working with activity data in reports. To understand how to work with activities in SQL queries, you need to first understand how activity data is stored.
Activitypointer – The “Anchor”
In the Microsoft CRM SQL databases, activity records are stored in an anchor entity view called filteredactivitypointer. This view contains the fields that are common to all activity types. This includes fields such as activityid, scheduled start, scheduled end, actual end, actualduration, subject, and description (the “body”). This entity also includes a field called Activitytypecode. This indicates what type of activity the record is.
Activityparty – The people
Any people, leads, or accounts linked to an activity will be stored in the filteredactivityparty view. This is a related entity that enables you to add multiple recipients/attendees/customers to activities. When you create an appointment, for example, and have 3 required attendees, 2 optional attendees, a regarding company, an owner, and a organizer, a total of 8 activity party records are created. Activity party includes fields like partyid (the GUID of the record related to the actity), partyobjecttypecode (the entity type code of the related record), and activity id. The filteredactivityparty view also includes some of the fields from the filteredactivitypointer view, such as scheduledstart, scheduledend.
One important thing to understand about activities and activity parties is that some activity parties are stored in both filteredactivitypointer and filteredactivityparty. The ownerid and the regarding objectid are fields in filteredactivitypointer, but they also are stored as activity parties related to the activity.
This is important to understand, because many people over-complicate their activity reports and views because they misunderstand this—if you want to see any activities where you are the owner, the regarding object, or a recipient/attendee, don’t do something like this:
select distinct a .activityid from filteredactivitypointer a inner join filteredactivityparty p on a.activityid = p.activityid where a.ownerid = @user or a.regardingobjectid = @user or p.partyid = @user
instead, do this:
select distinct activityid from filteredactivityparty where partyid = @user.
Since all people or accounts related to an activity are stored in the filteredactivityparty view, you can limit your query person filter to the activityparty entity, and make your query more efficient. This is why the default “My Activity” views in CRM filter the activity list by the related activity parties, and they get not only the records owned by the selected user, but also the records where that user is an attendee or recipient or regarding object.
The specific activity type views
As we discussed earlier, the fields that are common to all activity types are stored in the FilteredActivityPointer Anchor entity view. These fields are also available from the specific entity type views, such as FilteredEmail, Filtered PhoneCall, Filtered Task, Filtered Appointment (and the poor lonely FilteredFax entity view).
These views also contain the fields that are unique to a specific activity type, such as custom fields you might have added to the appointment entity, and status reasons that are unique to the activity type (for example, there is a “sent” status on e-mails, but not appointments).
Planning your report
So as you begin to design your report, there are a couple of questions you should ask:
1. What records do I want to return? Is this a report covering all activity types, just one type of activity? Should this show all activity statuses, just open/scheduled, just closed, or both?
2. How should this data be filtered? Do I want to see it for a single user, a group of users, a set date range, or a date range selectable by user?
3. How will this data be consumed? Is somebody going to look at it on the screen, in a dashboard, export to a spreadsheet, or print out a PDF?
Common Mistakes
1. Over complicating the query. If you just want to have a count of activities by person, there is no reason to join activity party to activity pointer and union together the filteredemail, filteredtask, filteredphonecall, and filteredappointment views. Overcomplicated queries are the main reason why activity reports are frequently slow or time out.
2. Misunderstanding how dates in activities work. There are a number of date fields in filteredactivitypointer—scheduledstart, scheduledend, actualstart, and actualend. No one of these date fields are consistently populated on all activity types. For example, tracked emails will typically just have an actualend date, and not a scheduledend or scheduledstart, and only closed appointments have an actualend date. This is one of the main reasons why dates in activity reports and views do not work as expected.
To account for this, I recommend using a case in your SQL query to accommodate various date fields being null. For example:
(case when actualend is not null then actualend
when actualend is null and scheduledend is not null then scheduledend
else scheduledstart
end) as date
This approach puts priority on the actual close date, so if the activity is closed, it will count that as the date of the activity, but if not, will use one of the scheduled dates.
It is also very important to understand what your audience expects to see as the date of an activity—if they expect the date of an activity to be what it was scheduled as on their calendar, but they close the activity two weeks after the appointment, if you select actualend as the date of the activity in the report, the results won’t match their expectation.
3. Misunderstanding how dates in SSRS report parameters in CRM work
Consider this common scenario—the user wants to enter a start date and an end date and show all activities that fall between @start and @end. So, at first glance, you assume that the report query should say something like this:
“where date between @start and @end”
Not so fast. You first need to understand that when you populate a date parameter in an SSRS report in CRM, it assumes the time of day when you are running the report. So, for example, if you run the report at 3:30 PM on January 5, 2011 and say start date is January 2 and end date is January 4, you are really saying between January 2 at 3:30 PM and January 4 at 3:30 PM. Any activities earlier in the day on the second and the end of the day on the fourth will not be returned.
The right way to do it is to adjust your parameter values so the start date is the beginning of the day and your end date is the end of the day. For example:
“Where date BETWEEN DATEADD(dd, DATEDIFF(dd, 0, @start), 0) AND DATEADD(minute, 1438, DATEADD(dd, DATEDIFF(dd, 0, @end), 0)))”
In this example I am using dateadd to set the @start parameter to the beginning of the day specified, and using dateadd to add 1,438 minutes to the start time of the @end parameter. All activities between these dates will be returned.
4. Lacking a clear focus
Once you start building your report, it can sometimes grow beyond the original scope and purpose of the report. Users will want to add additional fields and be able to group or sort by different fields to use the report to answer different questions. This is fine, but be careful that in doing that you don’t over-complicate the report.
The best reports serve a specific purpose and are consumed in a specific way. Reports that are exported to PDF should not have more fields than will fit in one page width. If you keep adding fields to the report, your query will run more slowly, and you may exceed the number of rows that will fit on one page.
Formatting of reports is driven by the way the report will be used. Column layouts that look good in PDF don’t often look good when exported to Excel, and Excel optimized layouts may not look good when exported to Word. If you try to make the report exportable in all formats, you frequently will wind up with a report that doesn’t look very good in any format
Also, many times the users want the report to handle every niche scenario, so, for example, if there is a custom field that just exists on appointment records, they will want to include it in an activity report. This small change can make a big difference in report execution performance, as it means having to join or union in the filteredappointment view in your query. If you have additional custom fields on other specific entities, that makes it even slower.
Best practice is to limit your fields in the report to just the minimum necessary for the main use case for the report, and if there are any entity specific fields needed for other scenarios, you may want to build additional reports that just focus on those activity types.
Best Practices
- Whenever possible use views and charts for activity reports
- Whenever possible, report from the filtered views
- Whenever possible, use the FilteredActivityPointer entity view for activity reports rather than unioning the specific entity views.
- Build report people filters from the FilteredActivityParty entity view
- Create your report with a clear focus, not an open-ended “all things to all people” activity report
Posted by Joel Lindstrom on December 30, 2011 at 08:00 AM in Dynamics CRM 2011, Microsoft CRM Reporting | Permalink | Comments (0) | TrackBack (0)
December 28, 2011
Creating Cross-Tab Data Inputs in Microsoft Dynamics CRM 2011
I recently was asked if there was a way to put inputs that are of similar manor on a form in a cross-tab grid format. Similar to this:
|
Col 1 |
Col 2 |
Col 3 |
|
|
Row 1 |
|||
|
Row 2 |
Let’s see how this can be done. Start by creating your attributes. For simplicity sake I created 6 attributes:
- row1col1
- row1col2
- row1col3
- row2col1
- row2col2
- row2col3
From there I added them to a section of my form. Making sure the new section is formatted for 4 columns. I then add the attributes to the section but leave the first column empty. Also make sure to turn the labels off for each attribute. Here is what the form looks like in the designer.
From there you will need to add jquery to your webresouces and add it to the form properties. If you do not have jquery you can download it at www.jquery.com. It is a very powerful javascript library that makes working with the DOM much cleaner and more precise. Once you have jquery you will need to create an onload function to be called. Here is what the code would look like:
Form_OnLoad = function () {
$("#jm1_row1col1_d").prev('td').html("<br><span style='font-weight:bold; float:right;'>Row #1</span>");
$("#jm1_row2col1_d").prev('td').html("<span style='font-weight:bold; float:right;'>Row #2</span>");
$("#jm1_row1col1_d").prepend("Column #1").css("color","#333").css("text-align","center").css("font-weight","bold");
$("#jm1_row1col2_d").prepend("Column #2").css("color","#333").css("text-align","center").css("font-weight","bold");
$("#jm1_row1col3_d").prepend("Column #3").css("color","#333").css("text-align","center").css("font-weight","bold");
$("#jm1_row1col1_d").parent().css("height","40px");
};
What you will notice here is that I use the jquery selector function to select the label and textbox td’s that CRM uses to layout the form. At first I select the empty td cell using the prev() function in jquery to put in some html text. Notice I put a <br> tag before the text for row 1. This is used to move the first row header down a little to accommodate the height difference when we put in a column header. For row 2 I do not add the <br> tag as it will line up fine. After that I get each row 1 textbox and prepend text with some css styles. This text will be the headers for your columns. After I add all the header text I will set the height of the <tr> for row 1 to 40px to allow for the textbox to show properly. Here is what the resulting form looks like after the onload function fires.
Posted by Jeff Macfie on December 28, 2011 at 02:05 PM in Dynamics CRM 2011, Jquery | Permalink | Comments (3) | TrackBack (0)
December 23, 2011
Dynamically Generating URLs for Cached Web Resources for Microsoft Dynamics CRM
CRM 2011 supports several methods for accessing web resources. These includes using the $webresource: directive when referencing web resources from the site map or ribbon, a relative URL, or an absolute URL. While this allows a web resource to be accessed in virtually any situation, if a scenario arises in which an absolute URL must be used, the benefit and speed of retrieving the cached web resource is lost. The reason for this has to do with the caching mechanism used by CRM for web resources. Take the following URL that could be generated by CRM when using the $webresource: directive or when a web resource is included on a CRM form as an example.
https://yourorgname.crm.dynamics.com/%7B634594655730000000%7D/WebResources/cei_/test.htm
Notice the magic number that is highlighted in the example URL. CRM automatically inserts this token into the URL and the CRM 2011 SDK indicates that this magic number is a GUID value that ensures the latest cached version of the requested web resource is used. If you use a tool like Fiddler to examine the response returned by the GET request for the web resource, you will notice that it has caching headers that set it to be cached for one year. If the magic GUID value is removed from the URL so that the URL would resemble an absolute URL to the web resource, the response returned by the GET request for the web resource, depending upon your version of CRM, will be a non cached version or a version that is cached for a short amount time such as 24 hours.
This caching functionality provided by CRM is great, but what if you need to dynamically generate the URL for a large web resource? It would be preferable to access the cached version, but in order to do that you need the magic GUID value. Fortunately, the magic GUID value is not magic at all, and not actually a GUID. The caching token inserted into the URL for the web resource by CRM is merely a timestamp that represents the modified time of the last web resource to be modified. The timestamp is represented as ticks in UTC time as generated by the .NET Framework.
Now in order to get the URL for a web resource, it is merely necessary to generate this timestamp. The example function below shows exactly how to generate the timestamp for the caching token using a quick call to the REST service in CRM and a simple conversion from the JavaScript Date object to the timestamp value.
1: function getWebResourceUrl(webResourceName) {
2:
3: var dotNetMillisecondsAt_1970_01_01 = 62135596800000,
4: ticksPerMillisecond = 10000,
5: lastWebResourceModifiedOn = null,
6: webResourceCachingToken = null,
7: webResourceUrl = "/WebResources/" + webResourceName;
8:
9: // Retrieve the modified date of the last web resource to be modified
10: $.ajax({
11: async: false,
12: beforeSend: function (xhr, settings) {
13: xhr.setRequestHeader("Accept", "application/json");
14: },
15: contentType: "application/json; charset=utf-8",
16: datatype: "json",
17: global: false,
18: success: function (data, textStatus, xhr) {
19:
20: // Extract the modified date from the results
21: lastWebResourceModifiedOn = +(/\/Date\((\d*)\)\//.exec(data.d.results[0].ModifiedOn)[1]);
22:
23: // Convert the JavaScript Date value to the caching token value
24: webResourceCachingToken = (lastWebResourceModifiedOn + dotNetMillisecondsAt_1970_01_01) * ticksPerMillisecond;
25: },
26: type: "GET",
27: url: Xrm.Page.context.prependOrgName("/XRMServices/2011/OrganizationData.svc/WebResourceSet()?$select=ModifiedOn&$orderby=ModifiedOn%20desc&$top=1")
28: });
29:
30: // If we have a caching token value then prepend it to the current URL.
31: if (webResourceCachingToken !== null) {
32: webResourceUrl = "/%7B" + webResourceCachingToken + "%7D" + webResourceUrl;
33: }
34:
35: // Return the URL to the web resource prepended with the organization name if necessary
36: return Xrm.Page.context.getServerUrl().replace(/\/$/,"") + Xrm.Page.context.prependOrgName(webResourceUrl);
37: }
Notice the function takes the name of a web resource, e.g. cei_/mypage.htm, and prepends it with the caching token, organization name if necessary, and the server URL. Now this function can be used to dynamically generate the URL for a web resource and still retrieve the cached web resource. Of course, there could be some improvements made, such as wrapping the call to retrieve the caching token in a closure so that it is only retrieved the first time a URL is generated, but I will leave that up to you.
**Note, that generating a URL in this manner is not supported by Microsoft and the caching mechanism used by CRM for web resources could be changed in the future.
Posted by Nick Doriot on December 23, 2011 at 09:28 AM in CRM Development, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Tricks and Tips, XRM | Permalink | Comments (0) | TrackBack (0)
December 16, 2011
Setting Lookup Field Values on Microsoft Dynamics CRM Forms with Silverlight
Recently, I have found myself developing a lot of Silverlight customizations for CRM 2011. If you happen to find yourself in the realm of Silverlight and CRM you will more than likely have the need to interact with the CRM form in context. The tool that Silverlight provides for interacting with the hosting web page is the HTML Bridge. The types and methods exposed by the HTML Bridge allow access to the hosting pages DOM and JavaScript objects. By utilizing the types and methods of the HTML Bridge it is possible to access the Xrm JavaScript object of the CRM SDK to set field values so let’s take a look at how the HTML Bridge can be leverages to do so.
There are a couple of different methods that can be used when accessing the Xrm object of CRM. One is to create an object model around the Xrm object that mirrors the Xrm object in JavaScript and the other is to use a dynamic object in Silverlight. I am going to use a dynamic object in this instance as it requires much less code, however, the downside is that there is not any compile-time type checking and errors may not be discovered until runtime.
1: // Get a reference to the Xrm object
2: dynamic Xrm = HtmlPage.Window.GetProperty("Xrm");
3:
4: // Set a string field value
5: Xrm.Page.getAttribute("cei_stringfield").setValue("Hello World!");
6:
7: // Set a floating point field value
8: Xrm.Page.getAttribute("cei_floatfield").setValue(3.14159);
Notice in the previous example I simply use the HtmlPage.Window object to get a reference to the Xrm property on the hosting page. Also, notice that the local Xrm object is declared as a dynamic variable. Declaring the local Xrm object as a dynamic object allows the object to bypass static type checking. At this point, it is simply a matter of using the Xrm object just as if it were being used from JavaScript. In line 5 of the previous code snippet I have done just that. A reference to the cei_stringfield attribute is obtained and the value is set to a “Hello World!”. In line 8, the same approach is used to set a numeric field.
After seeing how the previous snippet of code works, you may think, as I did, that setting a lookup field’s value could be done using the same technique with an anonymous array object that mimics a lookup fields value as the argument to the setValue function. However, calling the setValue function for a lookup field will not work from within Silverlight due to the way the HTML Bridge marshals managed objects to JavaScript. Fortunately, there is another method that can be used, although it is not quite as elegant. The following snippet shows how a lookup field can be set from within Silverlight.
1: private void SilverlightSetLookupValue(string fieldName, Guid? id, string entityLogicalName, string name)
2: {
3: // Define eval statements for setting lookup to a value and null
4: string setLookupJscript = @"Xrm.Page.getAttribute(""{0}"").setValue([ {{ id: ""{1:B}"", typename: ""{2}"", name: ""{3}"" }}])";
5: string setLookupToNullJscript = @"Xrm.Page.getAttribute(""{0}"").setValue(null)";
6: string evalStatement = null;
7:
8: // Set the statement to be evaluated based upon the value of the id argument
9: if (id.GetValueOrDefault().Equals(Guid.Empty))
10: {
11: // Setting the lookup to null
12: evalStatement = string.Format(setLookupToNullJscript, fieldName);
13: }
14: else
15: {
16: // Setting the lookup to a value
17: evalStatement = string.Format(setLookupJscript, fieldName, id, entityLogicalName, name);
18: }
19:
20: // Set the lookup
21: HtmlPage.Window.Eval(evalStatement);
22: }
That’s right, I broke out the big dog, the EVIL EVAL function. As I said previously, it is not the most elegant solution, however, sometimes the heavy hitters like the eval function need to be dusted off and it works beautifully. As you can see, the method in the snippet builds the JavaScript necessary to set a lookup field dynamically as a string and then evaluates the string on the hosting page using the HtmlPage.Window.Eval method within Silverlight.
Posted by Nick Doriot on December 16, 2011 at 09:55 AM in CRM Development, Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Tricks and Tips, XRM | Permalink | Comments (0) | TrackBack (0)
December 08, 2011
“Cannot authenticate your credentials” error when configuring Microsoft CRM 2011 for Outlook
A user recently reported that when she was trying to configure Microsoft CRM for Outlook to her CRM Online environment, she would get the following error:
I’ve seen the “Cannot connect to server” error before, but this one was a little bit different because it said it “cannot authenticate credentials.” She could log on to the web client without issue, so we knew that her credentials were ok.
With the help of Microsoft support, we were able to resolve this error using the following steps:
1. Log on to Microsoft CRM in a web browser
2. Copy the full URL from your browser window
3. Run the CRM configuration wizard (start—>all programs—>Microsoft Dynamics CRM 2011)
4. instead of changing the Server URL to “CRM Online,” just paste the full url to your CRM Online environment to the “Server URL” field, then click “Test Connection” and enter your CRM Online credentials.
Using this approach we were able to configure the client to CRM Online.
Posted by Joel Lindstrom on December 08, 2011 at 08:55 AM in Dynamics CRM 2011, Microsoft CRM for Outlook | Permalink | Comments (3) | TrackBack (0)
Using the CRM 2011 REST Services and Deep Insert to Create Activities
One of the nice features of CRM 2011 is the REST based OrganizationData service. Lately, I have found myself using the REST service more often as it provides a simpler and cleaner method of accessing data from client side JScript. The REST service also provides the ability to do deep inserts of entity and related records. This capability can be leveraged to provide an elegant solution to creating activity records using client side JScript.
In my particular use case, I needed to create a new email activity from the currently logged in user with the regarding record set to a new custom entity record. It would have been possible to issue a couple of calls to the REST service that created the regarding record and then the email, but it is just as easy to create the email and related records in one call avoiding the need to clean up any records should one of the calls fail.
The first thing that needs to be done is to create the activity party record for the from field on the email. The activity party is a separate entity that stores all of the parties related to an activity, i.e. sender, recipient, etc. The activity party data needs to be specified as an array of activity party entities. The following snippet creates an activity party record for the from field on the email.
1: // Create the activity party records
2: var emailPartyEntities [{
3: PartyId: { LogicalName: "systemuser", Id: Xrm.Page.context.getUserId() },
4: ParticipationTypeMask: { Value: 1 }
5: }];
As I mentioned earlier, I also needed to create a custom entity record that will be set as the regarding on the created email. In my case, this custom entity is used to track an email thread. Since this is a N:1 relationship for the email entity, the record created does not need to be stored in an array and is merely an object with properties specifying the fields of my custom entity.
1: // Build the activity thread entity
2: var activityThreadEntity = {
3: cei_Department: { Value: 29669000 },
4: cei_Subject: "Activity Thread for Account",
5: };
Finally, I need to build the email entity that will be passed to the REST service during the create request. In order for the deep insert to work, the activity party array and the activity thread object created earlier will need to be set to properties on the created object that specify the relationships to the related entities as shown below.
1: // Build the email record
2: var emailEntity = {
3: Subject: "Test Email",
4: cei_activitythread_Emails: activityThreadEntity,
5: email_activity_parties: emailPartyEntities,
6: };
In the previous snippet, notice that the activityThreadEntity object and the emailPartyEntities array are set to their corresponding relationships, i.e. cei_activitythread_Emails is the name of the N:1 relationship for my custom entity to the regarding field on the email entity, and email_activity_parties is the name of the 1:N relationship from the email entity to the activity party entity.
Now that all of the required objects have been created we can issue the call to the REST service to create the email and related records. The following snippet utilizes a jQuery plugin from our custom JScript library. It is merely doing a POST request to the REST service with the data for the POST being the JSON serialized emailEntity object that was created.
1: // Create the email by POSTing the data to the REST service
2: var createResult = $.xrm.orgData.buildRequest().
3: async(false).
4: dataset("Email").
5: data(emailEntity).
6: create();
7: if (createResult.errorExists) {
8: alert("There was an error creating the email.");
9: } else {
10: alert("Success!");
11: }
That’s it! It really is that simple. The email, activity party, and regarding records were all created in a single call.
In this example, I utilized the deep insert capabilities of the REST services to create an email, but the deep insert feature can be used on any entity in order to create multiple records in a single call. The biggest hurdle that you will probably run into is determining whether to create the related records as JScript objects or arrays of objects. Just remember that 1:N relationships require and array of objects and that N:1 relationships require a single object.
Posted by Nick Doriot on December 08, 2011 at 08:05 AM in Dynamics CRM 2011, Microsoft CRM Customizations, Microsoft CRM Tricks and Tips, XRM | Permalink | Comments (1) | TrackBack (0)
December 07, 2011
Microsoft Dynamics CRM 2011 Reporting Extension (SRS Data Connector) Installation Service Account Warning
The Microsoft Dynamics CRM 2011 Reporting Extensions, previously known as the SRS Data Connector, will sometimes return an error message during installation that is intended to be a warning, not an error. The message that you see is ‘A Microsoft Dynamics CRM Server component is using the same account as the instance of SQL Server Reporting Services.’
There are several conditions which will provoke this message
· A Microsoft Dynamics CRM Server 2011 component is installed on the computer where Microsoft Dynamics CRM Connector for SQL Server Reporting Services Setup is being run.
· The SQL Server Reporting Services account is a member of the Active Directory SQLAccessGroup security group. This can occur when the Reporting Services is running under the same account as another Microsoft Dynamics CRM component.
· All Microsoft Dynamics CRM Server 2011 components, SQL Server, and Reporting Services are installed on a computer that is running Microsoft Windows Server Small Business Edition where Microsoft Dynamics CRM Connector for SQL Server Reporting Services Setup is being run.
· The SQL Server Reporting Services account is set as "Local Service."
To get around this error, follow the steps below. Once this is completed, you will still see the error message however the ‘Next’ button will be available and you can continue with the installation. This does require a registry setting change, so it is recommended that the registry be backed up PRIOR to making any changes. One thing to note before using this, if you change this key on your CRM server, any checks that are supposed to take place during the CRM installation will also be ignored. This should only be used with great care and turned off after the Reporting Extensions installation is completed. Failure to do so may result in checks being ignored during other installations and could have negative consequences.
1. Close the installer window
2. Find the MSCRM key in the HKLM\SOFTWARE\MICROSOFT directory
3. If the MSCRM key does not exist, create it in the HKLM\SOFTWARE\MICROSOFT directory
4. Once you have the key, create a new DWORD value named IgnoreChecks and set the value to 1
5. Launch the installer and follow its instructions. When you get to the environment checks the ‘Next’ button will be available.
Posted by Heather Reynolds on December 07, 2011 at 08:50 AM in Dynamics CRM 2011, Microsoft CRM Implementation, Microsoft CRM Troubleshooting | Permalink | Comments (0) | TrackBack (0)
December 02, 2011
Microsoft Dynamics CRM 2011 Email Router Throws 5.7.1 Client Could Not be Authenticated When Sending Emails
I was working on a 2011 upgrade and came across an issue when running the Email Router on a Windows Server 2008 R2 machine. I installed the router with no issues, but when someone sent an email it failed. The following message was in the event viewer of the machine the router was installed on:
‘5.7.1 – Client could not be authenticated.’
During our troubleshooting, we found that the Email Router worked on a Windows Server 2008 machine with no Exchange authentication challenges. A Network Monitor trace confirmed the authentication challenge on the Windows Server 2008 R2 machine as an Exchange challenge. Research confirmed that Exchange 2007 was setup to accept anonymous users.
The solution to this was to set the authentication method to ‘Anonymous’ in the email router configuration manager. On the Windows Server 2008 machine, the authentication method was set to ‘Windows Authentication,’ however there is a conflict when sending authentication from a Windows Server 2008 R2 machine to an Exchange Server 2007 environment which is configured to accept anonymous users. It is also important to note that in this particular environment the Exchange server as well as the server with the Email Router are on the same network.
Posted by Heather Reynolds on December 02, 2011 at 08:54 AM in Dynamics CRM 2011, Microsoft CRM Implementation, Microsoft CRM Troubleshooting | Permalink | Comments (0) | TrackBack (0)




Recent Comments