Photos of xRM at the NAB Show

View a few photos we took while we were away at the NAB Show, we attended the NAB Show as a Microsoft Partner in the Microsoft Booth showing our new Demo that integrates Microsoft adCenter and Microsoft Dynamics CRM using the xRM Framework.

Click here to view the gallery.

Leave a Comment

xRM at NAB

We’re back at NAB for our annual presence as a Microsoft Partner in the Microsoft Booth at the National Association of Broadcasters Show (NAB). There is heavy foot traffic this year and the Microsoft Demos are looking great. We are here with a few other Microsoft Partners along with the Silverlight and Mediaroom Teams. Behind us sits an 80 inch touch screen that I must say seems like something out of Minority Report.

We have an exciting new demo we have put together which demonstrates the integration of Microsoft adCenter and Microsoft Dynamics CRM using the xRM Framework. This is a great way for us to show of the underlying xRM framework and its capabilities. With this demo it is easy to see how powerful this framework is and how it can be used to create any variety of line of business applications easily through the point and click interface.

If you would like to see a demo of xRM in action you can check it out at Hosted Microsoft CRM

This is great opportunity to push the xRM Platform and get to network with our partners as well as meet all the industry professionals who have taken the time to come out and see our new solutions and what we have to offer.

If you want to check us out, the Microsoft Booth is located at the entrance of the Lower South Hall. We are on the corner of the Microsoft Booth.

Leave a Comment

xRM Development Kit Alpha Release

This project provides classes to simplify Microsoft CRM 4.0 development. It provides functionality, developed in C#, to allow you to use custom .NET objects and properties and map them to CRM entities and attributes. It also includes helpful extension methods to assist day-to-day development with CRM. 

It’s free and open source, and available to download here:

xRM CodePlex



 CodePlex is hosted by Microsoft. Microsoft does not control, review, revise, endorse or distribute the third party projects on this site. Microsoft is hosting the CodePlex site solely as a web storage site as a service to the developer community.

Leave a Comment

What’s in a Name: xRM

Ever wondered what exactly makes up a name? We are all familiar with the quote from Shakespeare’s Romeo and Juliet “A Rose by any other name would smell as sweet”. I do have great respect for Shakespeare and his writings but I disagree with him on this. Names are not just meanings they have identities. In general we have an association to certain names for certain things or even people. As an individual we all have different names associated to different things eg: daughter, wife, mother, aunt. A name eventually develops meaning, character and history. So getting a dozen “odorsnouts” does not give you the same feeling as getting a dozen “Roses”.

What am I getting at you might ask? xRM.com has been around for a bit and has its own identity and we would like to share that with you so you know the meaning and the history behind it.

The box really goes well with the software/hardware industry and with the addition of the Brightness in the middle adds the “light going on” and “thinking” concept in a very subtle way. The flexibility added to the sides of the square give the notion of thinking outside the box in a sense that it’s expanding and going to explode. The idea of “flexibility” is enforced and the concept of “expanding boundaries” and “growth” are conveyed. There are a lot of logos that use a square framing, but the angle of this one gives it a unique twist along with the added notion of movement. The logo is serious, but friendly at the same time. It gives the impression that xRM is not out of reach and too intimidating to approach!

This logo is much more abstract in terms of the ideas behind it, but I think that’s a good thing. People can make their own interpretations and it’s safe enough that no negative association can be connected to it.

Leave a Comment

In the News

Microsoft Dynamics CRM 5.0 will be released next year with such enhanced functionality as improved user interface and data visualization features, better sales and marketing capabilities, and closer integration with SharePoint.   Several next-generation accelerators are already available, including a partnership relationship plug-in that lets businesses adapt CRM for sales leads and opportunity management for channel partners. Microsoft Dynamics will also expand its reach into social networking through the use of accelerators—specifically one for Twitter.  Companies will be able to not only monitor customer feedback on products and services, but also analyze those comments and develop marketing responses to the “tweets.” Read more.

Leave a Comment

Crm Sdk: Extension Methods for the CrmService

I often find it tedious writing something like the following:

//Instantiate our ColumnSet with desired columns.
ColumnSet cols = new ColumnSet() { Attributes = new string[] { "firstname", "lastname" } };
//Call the Retrieve method on crmService for our desired contact
contact c = (contact)_crmService.Retrieve(EntityName.contact.ToString(), new Guid("7C0F232E-7F72-DE11-8397-0015C5E3FA2"), cols);

Although we know the type we are fetching, in this case ‘contact’, we still have to make an explicit cast from a BusinessEntity. This is where generics can help. Another thing I find annoying is the type name is always the same, yet again I end up providing it. Here is my proposed solution:

//Using a custom extension method we now have a nice single line approach and no casting needs to be done.
contact c = _crmService.Retrieve<contact>(new Guid("7C0F232E-7F72-DE11-8397-0015C5E3FA2"), new string[] { "firstname", "lastname" });

Here I have created a generic extension method that accepts a BusinessEntity Type and simply uses the name of that type in the Retrieve. It also performs our explicit cast for us! =) I really do love the power of extension methods.

public static TEntity Retrieve<TEntity>(this CrmService _service, Guid entityId, string[] columns) where TEntity : BusinessEntity, new() {
return (TEntity)_service.Retrieve(typeof(TEntity).Name, entityId, new ColumnSet() { Attributes = columns });
}

Of course you can provide some extra functionality, for example a TryRetrieve method that catches the raised exception that notifies you that the entity does not exist.

Here is some more examples:

namespace CrmHelpers
{
    /// <summary>
    /// A few examples of extension methods, specifically for the CrmSdk.
    /// </summary>
    public static class CrmHelpers
    {
        /// <summary>
        /// Retrieves a BusinessEntity from the CrmService.
        /// </summary>
        /// <typeparam name="TEntity">The entity type</typeparam>
        /// <param name="_service"></param>
        /// <param name="entityId">The Guid of the entity you wish to receive</param>
        /// <returns>A BusinessEntity</returns>
        public static TEntity Retrieve<TEntity>(this CrmService _service, Guid entityId) where TEntity : BusinessEntity, new()
        {
            return (TEntity)_service.Retrieve(typeof(TEntity).Name, entityId, new AllColumns());
        }

        /// <summary>
        /// Retrieves a BusinessEntity from the CrmService.
        /// </summary>
        /// <typeparam name="TEntity">The entity type</typeparam>
        /// <param name="_service"></param>
        /// <param name="entityId">The Guid of the entity you wish to receive</param>
        /// <param name="columns">A string array of columns to retrieve</param>
        /// <returns>A BusinessEntity</returns>
        public static TEntity Retrieve<TEntity>(this CrmService _service, Guid entityId, string[] columns) where TEntity : BusinessEntity, new()
        {
            return (TEntity)_service.Retrieve(typeof(TEntity).Name, entityId, new ColumnSet() { Attributes = columns });
        }

        /// <summary>
        /// Tries to retrieve a BusinessEntity from the CrmService, if not found it will return null.
        /// </summary>
        /// <typeparam name="TEntity">The entity type</typeparam>
        /// <param name="_service"></param>
        /// <param name="entityId">The Guid of the entity you wish to receive</param>
        /// <returns>A BusinessEntity</returns>
        public static TEntity TryRetrieve<TEntity>(this CrmService _service, Guid entityId) where TEntity : BusinessEntity, new()
        {
            string entityName = typeof(TEntity).Name;
            try
            {
                TEntity entity = (TEntity)_service.Retrieve(entityName, entityId, new AllColumns());
                return entity;
            }
            catch (SoapException sex)
            {
                XmlNode n = sex.Detail.SelectSingleNode("//error//code");
                if (n.InnerText == "0x80040217")
                    return null;
                else throw new ApplicationException(sex.Detail.InnerText, sex);
            }
        }

        /// <summary>
        /// Not a practical method. Just an example.
        /// </summary>
        /// <typeparam name="TEntity">The entity type</typeparam>
        /// <param name="_service"></param>
        /// <returns>An IEnumerable collection of BusinessEntity objects</returns>
        public static IEnumerable<TEntity> RetrieveAllActive<TEntity>(this CrmService _service) where TEntity : BusinessEntity, new()
        {
            try
            {
                QueryExpression qe = new QueryExpression()
                {
                    ColumnSet = new AllColumns(),
                    EntityName = typeof(TEntity).Name,
                    Criteria = new FilterExpression()
                    {
                        Conditions = new ConditionExpression[] {
                         new ConditionExpression(){ AttributeName = "statecode",
                             Operator = ConditionOperator.Equal,
                             Values = new object[] { 0 } }
                     },
                        FilterOperator = LogicalOperator.And
                    }
                };

                return _service.RetrieveMultiple(qe).BusinessEntities.Cast<TEntity>();
            }
            catch (SoapException sex)
            {
                throw new ApplicationException(sex.Detail.InnerText, sex);
            }
        }

        /// <summary>
        /// Creates and Retrieves a BusinessEntity
        /// </summary>
        /// <typeparam name="TEntity">The type of BusinessEntity</typeparam>
        /// <param name="_service"></param>
        /// <param name="entity">The entity</param>
        /// <returns>The Entity created</returns>
        public static TEntity CreateAndRetrieve<TEntity>(this CrmService _service, TEntity entity) where TEntity : BusinessEntity, new()
        {
            return (TEntity)_service.Retrieve(typeof(TEntity).Name, _service.Create(entity), new AllColumns());
        }

        public static DynamicEntity RetrieveDynamic(this CrmService _service, string entityName, Guid entityId)
        {
            RetrieveRequest req = new RetrieveRequest()
            {
                ColumnSet = new AllColumns(),
                ReturnDynamicEntities = true,
                Target = new TargetRetrieveDynamic()
                {
                    EntityId = entityId,
                    EntityName = entityName
                }
            };

            return (DynamicEntity)((RetrieveResponse)_service.Execute(req)).BusinessEntity;
        }

        public static DynamicEntity RetrieveDynamic(this CrmService _service, string entityName, Guid entityId, string[] columns)
        {
            RetrieveRequest req = new RetrieveRequest()
            {
                ColumnSet = new ColumnSet() { Attributes = columns },
                ReturnDynamicEntities = true,
                Target = new TargetRetrieveDynamic()
                {
                    EntityId = entityId,
                    EntityName = entityName
                }
            };

            return (DynamicEntity)((RetrieveResponse)_service.Execute(req)).BusinessEntity;
        }
    }
}

Leave a Comment

xRM: Strategies in Action

By harnessing the power of Microsoft Dynamics CRM, xRM can deliver a new and more flexible way to manage relationships.   Here are just a few examples: 
  • A large, state government-based organization uses Microsoft Dynamics CRM to manage its teacher certification program.   In the system, contacts are educators.   Each educator has areas in the system for tracking their schooling, work history, and certifications. The system also contains a portal so that educators can, for example, update their personal information and pay certification fees online. 
  • A major financial institution wanted a system to better manage the process by which they review and interview potential hires.  Using Microsoft Dynamics CRM, a solution was built to track candidate documents (resumes and cover letters) and schedule all activities held during the process of recruitment, like the initial screening, resume review and finally, interview. 
  •  A U.S. Air Force command utilizes Microsoft Dynamics CRM to receive, disseminate, and track the chain of organizational tasks and resulting sub-tasks within their organization and from Air Force Headquarters at the Pentagon.   In this system, accounts are organizations and contacts are users and action officers charged with the coordination and response to policies and procedures.
  •  Our most recent xRM implementation involved a national sports governing body.  The organization needed a system which would consolidate operations between it and its many associations—up to 110 of them.  We created a CRM template solution which leveraged our hosted infrastructure.  This template is fully customizable and can be developed to suit the individual requirements of each association.  The system now provides a centralized entry point for disparate data sources, something which improves workflow and communications between associations. 

 

 

 

 

 

 

Leave a Comment

xRM Vision: Microsoft Dynamics CRM and LOB Applications

Take the ―C out of ―CRM and you‘re left with Microsoft Dynamics Relationship Management.  Microsoft Dynamics CRM is not just about sales and marketing.  It‘s a platform for developing line of business applications—applications that manage and track information and processes around real-world objects.  In this case, the object could be a customer, a grant, building, or a potential new vendor.  The point is that core relationships can be managed and extended.  And that’s xRM.  Capitalizing on a shared platform and resources, xRM can provide the following LOB applications:

Leave a Comment

CRM’s Role in a Challenging Economy

In today’s economic climate, customer loyalty can separate who will stay in business and who will go under. In fact, improving customer loyalty and experience are listed in Forrester’s Trends 2009 report as the top two concerns of business executives.

 

That’s why companies should demand more from their CRM solution.   To help you navigate through these times, we are offering this informative Microsoft Whitepaper, “Customer Relationship Management: The Winning Strategy in a Challenging Economy,” which covers such topics as the role of CRM, maximizing customer profitability, evaluating your marketing mix, criteria for technology adoption and more.  To get additional details, download it here.

Leave a Comment

What is Unified Communications?

With the current global business environment, people need to find, communicate, and collaborate with each other as quickly and easily as possible. Businesses want a product that maintains the competitive edge yet is user friendly, cost effective, streamlined and increases efficiency. Microsoft Unified Communications is the solution. It helps businesses reduce operating costs of travel, telecom and IT, while enabling them to improve business outcomes in more sustainable ways.

Unified Communications unites messaging, voice, video, IM and calenders. It is fully intergrated with all Microsoft products. When phone services become software, are managed by a server, and are delivered to desktop applications, interesting things happen:

  • The computer starts to work like a phone.
  • The phone starts to work like a computer.
  • Voice mail becomes email

Leave a Comment