Infosys Microsoft Alliance and Solutions blog

« June 2010 | Main | August 2010 »

July 29, 2010

The need for a business applications framework

What do companies in diverse industries such as manufacturing, real estate, recruitment and asset management have in common?

All of them have Line of Business (LoB) applications to help them achieve strategic competitive advantage. However, several of these disparate legacy applications have evolved over the years and they do not leverage latest technological advancements, while being increasingly difficult and expensive to maintain.

Five compelling reasons for a company to migrate onto a new platform: 

  • Disparate / diverse legacy applications, sometimes performing the same functions
  • Core processes executed in a variety of ways across units, not leveraging best practices
  • Data redundancy across applications, leading to low data integrity
  • High development, infrastructure and maintenance costs
  • Long implementation cycles, thus affecting go-to-market strategy

To overcome these shortcomings, companies need to implement a flexible business application framework that enables them leverage packaged software for custom-developed solutions thereby utilizing the flexibility of a ground-up solution in addition to the pre-built features of a packaged software.

Microsoft Dynamics CRM (MSCRM) provides a business application development framework that is both broad and deep as apart of its xRM strategy, where x means "any relationship" (Customer, Partner, Vendor, Employee etc.). The product has features such as pre-built functionality, point-and-click customizations and dynamic services to help accelerate development.

Business / Strategic IT Benefits

Technology Benefits

·         Harmonization of processes and reduction in data redundancy

·         Scalable to thousands of users with growing business needs

·         High on usability and adaptability

·         Quicker  implementation of new applications and enhancements

·         Usage of IT infrastructure for additional projects

·         Ease of integration with external applications

·         Usage of standardized technology platform provided by Microsoft

·         Lower TCO

·         xRM development platform providing flexibility to onboard different processes

·         Tight integration with Microsoft technology stack such as MS SharePoint, MS Exchange and MS Office

·         Strong integration capabilities to non Microsoft systems through Web Services

·         Multi-Tenancy, Multi-language and Multi-currency features

·         Pre-built capabilities such as data management, workflow, user experience, access and security, analytics and reporting etc are included

Examples of LoB applications that can be built on the CRM platform:

  • Financial Asset Management Firm
    The client on boarding process in an asset management firm may consist of creating and tracking an opportunity followed by Due diligence, Regulatory Compliance, Approvals and Financial Data Management for its clients. Of these, only the Opportunity functionality is a fit to the opportunity management process within MSCRM, whereas the other processes can be modeled by extending the data model through the point-and-click customization tool and through the .NET framework to implement business rules and alter look and feel. Prebuilt functionality such as data management, access and security etc. and web services apply to these extended entities automatically.
  • Recruitment Firm
    A recruitment firm may perform Business Development activities, Client Engagement Management activities (such as planning, execution, billing and management of companies and candidates), Post Engagement closure activities (such as lessons learned, team appraisal), Project and Talent Management. The business development activities are mapped to the lead->opportunity->client process in CRM whereas the others can be extended using the xRM framework using customization tools and .NET framework. 

In summary, whenever there is a relationship to be established, maintained and nurtured, Microsoft Dynamics CRM provides a business applications framework that creates a scalable, extensible and flexible underlying system to maximize business benefits.

July 20, 2010

WPF - Disabled look for Button

If you check online forums, one of the issues that has caused possibly most grievances is the styling of the WPF button control. You set some property values for things like foreground color and background color and when you run the application things don't always work out. Either the button will show some default animation when having focus or will not use the specified background when is in disabled state.

Recently a colleague was styling a Button control and had a need for custom disabled look and we landed in the same problem. We had set a background color, but when disabled the button will default to the light gray color. Trying various options didn't work out. Interestingly the properties like Foreground or Opacity worked fine. The designer in us said that we can always create a custom style, but the developer in us wanted to know why this doesn't work.

The basic style of create a button template will be to drop a button on the designer surface (in Blend), then right click on it and select "Edit Template / Edit a copy...". This copies the current style along with control template as part of the window's resources. The following is what we get.

<Style x:Key="ButtonFocusVisual">
    <Setter Property="Control.Template">
        <Setter.Value>
            <ControlTemplate>
                <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="Black" 
                    StrokeThickness="1" StrokeDashArray="1 2"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<LinearGradientBrush x:Key="ButtonNormalBackground" EndPoint="0,1" StartPoint="0,0">
    <GradientStop Color="#F3F3F3" Offset="0"/>
    <GradientStop Color="#EBEBEB" Offset="0.5"/>
    <GradientStop Color="#DDDDDD" Offset="0.5"/>
    <GradientStop Color="#CDCDCD" Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="ButtonNormalBorder" Color="#FF707070"/>
<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
    <Setter Property="Background" Value="{StaticResource ButtonNormalBackground}"/>
    <Setter Property="BorderBrush" Value="{StaticResource ButtonNormalBorder}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="Padding" Value="1"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    Background="{TemplateBinding Background}" 
                    RenderMouseOver="{TemplateBinding IsMouseOver}" 
                    RenderPressed="{TemplateBinding IsPressed}" 
                    RenderDefaulted="{TemplateBinding IsDefaulted}" 
                    SnapsToDevicePixels="true">
                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                Margin="{TemplateBinding Padding}" 
                                RecognizesAccessKey="True" 
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                </Microsoft_Windows_Themes:ButtonChrome>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsKeyboardFocused" Value="true">
                        <Setter Property="RenderDefaulted" TargetName="Chrome" Value="true"/>
                    </Trigger>
                    <Trigger Property="ToggleButton.IsChecked" Value="true">
                        <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Foreground" Value="#ADADAD"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
 

Where comes Microsoft_Windows_Themes from

xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"

.The point of interest to us was the Trigger IsEnabled. We tried two options based on different forum suggestions.

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Foreground" Value="#ADADAD"/>
    <Setter Property="Background" Value="Green" />
</Trigger>
 

and

<Trigger Property="IsEnabled" Value="false">
    <Setter Property="Foreground" Value="#ADADAD"/>
    <Setter TargetName="Chrome" Property="Background" Value="Green" />
</Trigger>
 

but both didn't work. We then decided to look at the ButtonChrome in PresentationFramework.Aero.dll. The default path for .net 3.0 based assembly is C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0. Loading this in Reflector, we found the following.

ButtonChromeProps.jpg

We can see that the ButtonChrome exposes Background and BorderBrush properties that are template bound in the control template that we created earlier. However there is this other property BackgroundOverlay, which is private and this is where lies the issue. Digging further into this property, we saw that if the control is not enabled, it returns a SolidColorBrush from another private property called CommonDisabledBackgroundOverlay and if digging further into its code, we saw the following

ButtonChromeMethod.jpg

The SolidColorBrush is hard coded and returns RGB of 244,244,244,which is a shade of gray and that's what we see in the button's background when disabled. Since these various properties are private, there is no way we can change it and thus can't override the default behavior. Additionally ButtonChrome itself is sealed class and hence cannot be inherited from, to write a custom class. Hope Microsoft will fix this someday and make BackgroundOverlay as also a public property.

However fortunately all is not lost and there is an easy way to get around this. In Blend, you can use the simple styles for WPF controls controls that are available in Assets > Styles > Simple Styles and you can pick up the SimpleButton from here. Following the same steps as mentioned earlier to create the template, we get the following

<Style x:Key="ButtonStyle2" TargetType="{x:Type Button}" BasedOn="{x:Null}">

    <Setter Property="FocusVisualStyle" Value="{DynamicResource SimpleButtonFocusVisual}"/>

    <Setter Property="Background" Value="{DynamicResource NormalBrush}"/>

    <Setter Property="BorderBrush" Value="{DynamicResource NormalBorderBrush}"/>

    <Setter Property="Template">

        <Setter.Value>

            <ControlTemplate TargetType="{x:Type Button}">

 

                <!-- We use Grid as a root because it is easy to add more elements to customize the button -->

                <Grid x:Name="Grid">

                    <Border x:Name="Border" Background="{TemplateBinding Background}"

                           BorderBrush="{TemplateBinding BorderBrush}"

                           BorderThickness="{TemplateBinding BorderThickness}"

                           Padding="{TemplateBinding Padding}"/>

 

                    <!-- Content Presenter is where the text content etc is placed by the control -->

                    <!-- The bindings are useful so that the control can be parameterized without editing the template -->

                    <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"

                                    Margin="{TemplateBinding Padding}"

                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"

                                    RecognizesAccessKey="True"/>

                </Grid>

 

                <!--Each state sets a brush on the Border in the template -->

                <ControlTemplate.Triggers>

                    <Trigger Property="IsKeyboardFocused" Value="true">

                        <Setter Property="BorderBrush" Value="{DynamicResource DefaultedBorderBrush}" TargetName="Border"/>

                    </Trigger>

                    <Trigger Property="IsMouseOver" Value="true">

                        <Setter Property="Background" Value="{DynamicResource MouseOverBrush}" TargetName="Border"/>

                    </Trigger>

                    <Trigger Property="IsPressed" Value="true">

                        <Setter Property="Background" Value="{DynamicResource PressedBrush}" TargetName="Border"/>

                        <Setter Property="BorderBrush" Value="{DynamicResource PressedBorderBrush}" TargetName="Border"/>

                    </Trigger>

                    <Trigger Property="IsEnabled" Value="true"/>

                    <Trigger Property="IsEnabled" Value="false">

                        <Setter Property="Background" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border"/>

                        <Setter Property="BorderBrush" Value="{DynamicResource DisabledBorderBrush}" TargetName="Border"/>

                        <Setter Property="Foreground" Value="{DynamicResource DisabledForegroundBrush}"/>

                    </Trigger>

                </ControlTemplate.Triggers>

            </ControlTemplate>

        </Setter.Value>

    </Setter>

</Style>

 

Notice that the Background is set to a DisabledBackgroundBrush that is actually defined in SimpleStyles.xaml. This file gets added to the project when a control from this Simple Styles assets is added to the designer. We can now change the value in SimpleStyles.xaml and get the necessary behavior. Like for example, we can set this as

<SolidColorBrush x:Key="DisabledBackgroundBrush" Color="Green"/>

 

and the button will look green when disabled. Hope this helps.

July 19, 2010

Business Insights Webcast: SharePoint 2010 Adoption Made Quicker and Easier with Infosys Solutions (Level 100)

Business Insights Webcast: SharePoint 2010 Adoption Made Quicker and Easier with Infosys Solutions (Level 100)

Please join the Webinar planned on 22nd July 2010,10:00 AM Pacific Time (US & Canada)

Attendee Registration URL:

https://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032455833&Culture=en-US

July 6, 2010

Small but effective points to notice during implementation in Cloud- Part 3 (Cloud drive)

This is the continuation of the thread "Small but effective points to notice during implementation in Cloud". The last entry of this thread could be found here.

 

Here are a few points to be noticed while using azure cloud drive and subsequently save your precious time. While using cloud drive for one of our projects I consumed a lot of time in figuring out a few error-causes. These would have been very simple to comprehend had the complete message been thrown instead of just the error codes.

Continue reading "Defining the Application Portfolio using the "EXIST" framework" »

July 1, 2010

Defining the Application Portfolio using the "EXIST" framework

As the wise-men saying goes - "Do not put all your eggs in one basket" - it is prudent to diversify the application portfolio like the investment portfolio to reduce the risk arising due to dependence on one technology, vendor, consultants and architecture model. The reason why investments are diversified is the element of uncertainty and the risk of assuming that everything will go well with the investment I choose. Besides that there is an element of individual financial goal and the outcome (duration, amount, and criticality) which drive the instrument (along with its associated risk or lack of it).

 

 

It's a high risk high return scenario even in the case of application portfolio. However, since the entry barriers are large and the level of involvement is much greater (with multiple business teams and CXO level leadership involved), it may not be that simple a comparison.
 

What got me thinking?
In one of the recent discussion with a client, I realized that they had limited themselves to one application over the last 8 years. They kept on extending the application (read customize as per whims and fancies of business users) without a proper control or need to get answers to few basic questions -
·  Does this business process need to be build into the application?
·  Is there a business need to invest on existing application for meeting this need?
·  Is this a temporary business need or process would be used on an ongoing basis?
·  Who will own this new development for future?
·  What will be the impact on the product - its stability, performance, upgrade path?
·  Does it impact any other aspect - overall governance, reporting, BI, integration, and backup?
 
Now, they were at cross-roads when the vendor company put this product out of support and newer technology and business trends along with environmental challenges were forcing them to move away from this investment but the burning question is where?

But isn't this approach against the common belief - Centralize & Reap Profits?
It has been a common recommendation over years from several 'big' vendors that there need to be  a single, robust, scalable, integrated application that can be managed with a common roadmap, support staff and technology leading to a simple IT environment. Needless to say that these were primarily due to -

  • Vendors acquiring niche companies and trying to incorporate these solutions in form of some loosely coupled solution architecture under a common brand name
  • Vendor applications having a lot of investments over time which led to product being bulky and integrated in such a manner that the nimbleness to adapt to business was lost (this is also called - "My Way or Highway")
  • License revenues are something that no vendor would like to lose. This has led to ERP spreading their footprint from simple applications to extending in all directions to cover niche processes, collaboration, optimization and intelligence.

Many of the clients who approach us come with problems because of this mindset. This is very much responsible for the mess that several companies are in! The reason is simple - any changes to the system need a tremendous amount of resources (time, effort, investment) with longer RoI durations. Sometimes by the time the business gets to use the application - either the requirements have changed or the environment in which the business operates has changed.

 

Is there a way out?
Several service companies today focus on application portfolio services and advise the clients on the way forward around defining, implementing and maintaining the right-mix of solutions/products that need the meet of business without leading them to a situation where they are bound by the choice they made and these choices defining the business strategy rather than the other way around.

I am not proposing a breaking new model or a revolutionary framework.  The idea in this blog is to share and invite feedback from esteemed peers around this topic. We do use it to sensitize our clients on this aspect and help them achieve the end goals by focusing on the application portfolio and its balancing as per their business needs.
 

The "EXIST" Framework
The 'EXIST' framework simply classifies the application needs on the basis of 'purpose' of the application. This helps in laying down some standard decision making criteria while choosing on the application types. This does not mean that there are solutions or packages that do not cut across this segmentation.

 

What this simply says is that recognition of these needs leads to a more informed decision with a solid business case backing the decision making process. Some of the factors that can vary across this classification are sponsorship, business needs, goals, benefits envisaged, duration of use of application, legal & regulatory constraints, Local/Country level regulations, Language needs, extent of change in process, uniqueness of the business need and the impacted line of business & user base. This also decides the mode of delivery of these applications - On Premise, On Cloud, Hybrid.
 
The framework, essentially, breaks the applications into 5 categories based on the "purpose" for which they will be used.
 

 

Application Purpose

Details

Typical Business Need

RoI horizon

Mode of Delivery

Sponsorship

Essential (E)

They are the 'core' of transactional processing and manage the day to day operations for internal processes

Finance, Asset Management, Reporting, Sales and Purchase Order Processing

Long Term

On Premise

CXO

External (X)

Needed to respond and connect with Government/Regulatory bodies, compliance,

Imports/ Exports, Government Reporting, Taxation, Bank Reconciliation

Mid-Long Term

On Cloud

CXO

Initiatives (I)

The processes may not be defined for such business needs and actually this may be to meet an emerging market need (new business line, new geography)

Campaigns, Event Management,

Short Term

On Cloud

Business Heads / Line Managers

Set-Apart (S)

These are the USP of business and the uniqueness of the process is what sets them apart from competition. Any improvement or optimization can lead to great business value to the organization

Planning, Scheduling, Workflows, Cost Accounting

Long Term

On Premise

CXO / Business Heads

Trade (T)

To collaborate in the 'new' economy where real time connection is needed with Vendors, Partners and Customers

Extend on 'core' system to help in real time availability of data like VMI, Real time order status updates

Mid Term

On Premise / On Cloud

CXO / Business Heads

 

Is this the solution?
No...this is the beginning of an exciting journey of facilitating a decision making process that looks at business case, external needs, what is available on hand, what is the optimal way ahead and where do we finally put all our eggs. Are you strengthening the basket that somebody else made or rather choosing the right set of baskets to put the eggs....???

 

 

Subscribe to this blog's feed

Follow us on

Blogger Profiles

Infosys on Twitter