Using GeoCode service to show addresses as PushPin(s) in Bing Map Silverlight Control.


For this first we need to add service reference to Geocode service to our Silverlight Application

http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc

On how to create Silverlight Application that uses Bing Map Control please refer to

https://nishantrana.wordpress.com/2011/03/05/using-bing-maps-silverlight-control/

Geocode service will return us the results found (locations) based on the address passed to it.

We can use the below sample code that displays the Pushpins on Bing Map based on the query (address) provided. (Here I am providing my permanent address)

public MainPage()
{
    InitializeComponent();    string Address = "759 Jantanagar, Chandkheda, Gandhinagar, Gujarat, 382424";
    GeocodeServiceClient myGeoCodeClient = new GeocodeServiceClient("BasicHttpBinding_IGeocodeService");          
    // create an event hanler for GeocodeCompleted event as the service would be call asynchronously
    myGeoCodeClient.GeocodeCompleted+=new EventHandler<GeocodeCompletedEventArgs>(myGeoCodeClient_GeocodeCompleted);
    // create the request and pass the address to it
    GeocodeRequest myGeoCodeRequest = new GeocodeRequest();
    myGeoCodeRequest.Credentials = new Microsoft.Maps.MapControl.Credentials();
    myGeoCodeRequest.Credentials.ApplicationId=((ApplicationIdCredentialsProvider)myMap.CredentialsProvider).ApplicationId;
    myGeoCodeRequest.Query = Address;

    // Pass the request to GeocodeAsyn method
    myGeoCodeClient.GeocodeAsync(myGeoCodeRequest);

}

void myGeoCodeClient_GeocodeCompleted(object sender, GeocodeCompletedEventArgs e)
{
    // create a map layer
    MapLayer myMapLayer = new MapLayer();
    myMap.Children.Add(myMapLayer);

    // create a location collection class
    LocationCollection myLocationColl=new LocationCollection();

    foreach (GeocodeResult gr in e.Result.Results)
    {
        Pushpin myPushPin = new Pushpin();
        // set it to first found location
        myPushPin.Location = gr.Locations[0];
        // add it to location collection
        // which would be used to set the map's bound
        myLocationColl.Add(myPushPin.Location);
        // Add the drawn point to the route layer.                   
        myMapLayer.Children.Add(myPushPin);
    }
    var bounds = new LocationRect(myLocationColl);
    myMap.SetView(bounds);
}
}

 

This is how it looks 


Bye.

Using Bing Maps Silverlight Control


To use Bing Maps Silverlight Control first we need to have Bing Map key with us, for this we need go to https://www.bingmapsportal.com/ (bing map account center) to create an account and generate a key for us.

Once we have the key, we need to download Bing Map Silverlight Control SDK.

After this is done, we need to create a Silverlight Application Project.

Add References to

  1. Microsoft.Maps.MapControl.dll
  2. Microsoft.Maps.MapControl.Commin.dll

We can found them at C:\Program Files\Bing Maps Silverlight Control\V1\Libraries.

Then make the following changes to MainPage.Xaml.

<UserControl x:Class=”MyBingApplication.MainPage”
xmlns:m=”clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl”

xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;

xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml&#8221;

xmlns:d=”http://schemas.microsoft.com/expression/blend/2008&#8243; xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006&#8243;

mc:Ignorable=”d” d:DesignWidth=”640″ d:DesignHeight=”480″>

<Grid x:Name=”LayoutRoot”>

<m:Map x:Name=”myMap” CredentialsProvider=”OurBingMapKey” Mode=”AerialWithLabels” ></m:Map>

</Grid>
</UserControl>

Build the solution and run the OurApplicationtestpage.aspx.

CRM 2011 Developer Training Kit


Dynamics CRM 2011 Developer Training Kit is available now.

It has got presentations, videos, hands on labs etc. on different topics.

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=78498c29-28ac-440b-9c20-ec5da6ee6e98

Bye.

Call Timer for CRM 4.0


We had a requirement to use Call Timer which would record the duration for the phone call activity.

Already there is a solution for this for CRM 3.0.

http://code.msdn.microsoft.com/MSCRM3/Release/ProjectReleases.aspx?ReleaseId=96

I am posting the screen shot of it and the updated isv.config file for it to be used in CRM 4.0

<Entity
name=phonecall>

<ToolBar
ValidForCreate=1
ValidForUpdate=0>

<Button
Icon=/ISV/CallTimer/timer.gif
Url=/ISV/CallTimer/timer.htm
WinMode=2
WinParams=dialogHeight:240px;dialogWidth:340px;>

<Titles>

<Title
LCID=1033
Text=Time this call />

</Titles>

<ToolTips>

<ToolTip
LCID=1033
Text=Use this to time the duration of this call />

</ToolTips>

</Button>

</ToolBar>

</Entity>

Bye..

Escalate Workflow CRM


Recently we had a requirement to write a workflow which would be sending mail to the manager of the owner if a record is not updated within 5 days of it being created or updated.

So here we created two workflows over here one for create and other for update.

For create it would look like this

First we’ll have wait condition where we will set the timeout duration to 5 days. After 5 days the workflow will come out of its wait condition and will check if the “created on” and “modified on” values are equal or not. If equal it means the record has not been updated. So it will send a mail to owner’s manager.

In case of update, things would be little tricky as we need to store the “modified on” date value. This value would later be used to compare against the “modified on” date of the record after workflow comes out of the wait condition.

So here we need to write a custom workflow activity with one input and one output parameter. It will take current modified on date value as input and would pass the same value to the output parameter.

Code would be something this

[CrmWorkflowActivity(“Save Date Variable Value”)]

public partial class WorkflowVariable: SequenceActivity{

public WorkflowVariable(){

InitializeComponent();

}

protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext){

this.InitialDateOutput = this.InitialDate;
return
ActivityExecutionStatus.Closed;}


public static DependencyProperty InitialDateProperty = DependencyProperty.Register(“InitialDate”, typeof(CrmDateTime), typeof(WorkflowVariable));

[CrmInput(“Initial Date Input”)] //Input Label
public CrmDateTime InitialDate {

get{
return (CrmDateTime)base.GetValue(InitialDateProperty);}

set{
base.SetValue(InitialDateProperty, value);}

}

public static DependencyProperty InitialDateOutputProperty = DependencyProperty.Register(“InitialDateOutput”, typeof(CrmDateTime), typeof(WorkflowVariable));

[CrmOutput(“Initial Date OutPut”)] //Input Label
public CrmDateTime InitialDateOutput {

get {
return (CrmDateTime)base.GetValue(InitialDateOutputProperty);}

set{

base.SetValue(InitialDateOutputProperty, value);}

}}

This is how the final workflow would look for update

Bye.

XmlException: An error occurred while parsing EntityName in CRM Plugin


I had written a pre-update plugin, it was working properly on my environment.

But after sending it across to the client, after he had deployed it we started getting the below mentioned error.

“XmlException: An error occurred while parsing EntityName”

We were actually passing secure configuration information to the plugin in the following format

<Config>

<url>http://CrmServer/MSCRMServices/2007/CrmService.asmx</url>

<orgname>OrgName</orgname>

<username>UserName</username>

<password>Password</password>

<domain>Domain</domain>

</Config>

And the issue was the password that was being used, it had ‘&’ character, which we then replaced with ‘&amp;’ and the error got resolved.

Hope it helps!