The new Dynamics CRM 4.0 demo virtual image has been released for download 17-Apr-2009.
https://mbs.microsoft.com/partnersource/deployment/methodology/vpc/MSD_CRM4VPCApril09 (Available to MS partners only)
Similar to previous versions, this in a CRM 4.0 image is on a Window Server 2003 with office, Sharepoint, OCS, Outlook, SQL Server, Reporting Services... Primarily, this is intended to demonstrate the power of CRM to prospective clients. Though many developers use this image as a basis for a development environment.
If you are in sales, then you will be happy to know that the new image is now pre-loaded with some additional accelerators and packed with many demo tools.
As a developer you should probably give a satisfied nod to the fact that there are SDKs and developer tools such as Visual Studio 2008 pre-installed.
My only issue is that due to the accelerators, this is no longer a clean install or a clean base image that I can use for customisaion of a new project. I guess its time to create my own Dev image and stop freeloading.
Sunday, April 19, 2009
Thursday, April 9, 2009
Microsoft Dynamics CRM Developer Toolkit
The Microsoft Dynamics CRM Developer Toolkit has just been release but the CRM E2 team.
this tool is a major step forward to provide developers with the ability to work with CRM customizations from within the Visual Studio development environment.
As release by the Microsoft Dynamics CRM Product Team:
The MS CRM E2 team is pleased to announce the release of the Microsoft Dynamics CRM Developer Toolkit, which is available for download from the MSDN Code Gallery at http://code.msdn.microsoft.com/E2DevTkt
The Toolkit has been designed to make it easier for developers to customize, extend, and maintain an on-premise CRM solution, all from within an integrated Visual Studio environment. Key developer benefits include the ability to:
this tool is a major step forward to provide developers with the ability to work with CRM customizations from within the Visual Studio development environment.
As release by the Microsoft Dynamics CRM Product Team:
The MS CRM E2 team is pleased to announce the release of the Microsoft Dynamics CRM Developer Toolkit, which is available for download from the MSDN Code Gallery at http://code.msdn.microsoft.com/E2DevTkt
The Toolkit has been designed to make it easier for developers to customize, extend, and maintain an on-premise CRM solution, all from within an integrated Visual Studio environment. Key developer benefits include the ability to:
- View All CRM Entities - Displays a listing of CRM entities that are dynamically available from the CRM Explorer within Visual Studio 2008
- Create and Update CRM Entities - Allows for creating new entities and updating existing entities from within the CRM Explorer experience
- Create a Wrapper Class - Provides the ability to auto-generate wrapper classes for entities, which exposes the CRM entities and their corresponding attributes as classes and properties respectively to enable development of code to interact with the entities
- Generate Plug-in Code - Enumerates the available Plug-ins for an entity and generates the code necessary to jumpstart the plug-in development process
- Integrate the Build and Deploy Process - Simplifies the process of building and deploying a CRM solution
- Deploy Across Multiple Servers - Assists in deployment and maintenance of Windows installer packages across multiple environments
Find more information on this toolkit here.
See Jim Wang's technical blog [MVP] for quick installation instructions.
Labels:
Microsoft Dynamics CRM 4.0,
Visual Studio
Thursday, March 19, 2009
LINQ to CRM
LINQ to CRM is one of Microsoft’s latest additions to the .Net 3.5 Framework Library. This library provides a uniform method of access to different types of entities, through a query language very similar to SQL. To learn more, see MSDN’s reference to LINQ to Entities and TechTarget’s LINQ Learning Guide.
I’m very excited to talk about the new LINQ to CRM libraries available recently. Say you need to retrieve an Account Number, given the Account Name…
Using the traditional webservice methods:
Using LINQ to SQL:
The choice seems obvious to me, but I’ll try to contain myself. Though the available LINQ to CRM libraries already address select and update of data, there are still shortfalls. Functionality such as Assign and Set Status are still not available and need to be performed via the traditional methods. But judging by progress so far, I’m sure it won’t be long.
LINQ to CRM on CodePlex is a (Beta) community library available free for download and evaluation. I’m always a supporter of free and community based software, so I highly recommend support of this project. Ofcourse being in Beta, this is work in progress and I would not recommend use of this assembly commercially.
XrmLinq is a commercially available package. This is a much more complete and stable library. Installation and use is remarkably simple and functionally fairly complete. License fee is based on per deployment which makes it a little more costly than I would prefer but is available for free to CRM providers for development purposes. A subset of this library and source code is available on CodePlex for any curioustechies.
I’m very excited to talk about the new LINQ to CRM libraries available recently. Say you need to retrieve an Account Number, given the Account Name…
Using the traditional webservice methods:
ColumnSet cols = new ColumnSet();
cols.AddColumns(new string[] {"accountnumber"});
QueryByAttribute
query = new QueryByAttribute();
query.ColumnSet = cols;
query.EntityName = "account";
query.Attributes = new string[] {"name"};
query.Values = new string[] {"Microsoft Dynamics CRM"};
RetrieveMultipleRequest req = new RetrieveMultipleRequest();
req.Query = query;
req.ReturnDynamicEntities = true;
RetrieveMultipleResponse resp = oService.Execute(req) as RetrieveMultipleResponse;
BusinessEntityCollection becMultipleRecords = resp.BusinessEntityCollection;
if (deSalesOrder.Properties.Contains("accountnumber"))
{
//And So On
//And So Forth
}
Using LINQ to SQL:
var accounts = (from a in context.Accounts
where a.Name.Equals("Microsoft Dynamics CRM")
select a).ToList();
LINQ2CRM.Account acc = (Account)accounts.First();
Response.Write("Account name = " + acc.Name.ToString());
The choice seems obvious to me, but I’ll try to contain myself. Though the available LINQ to CRM libraries already address select and update of data, there are still shortfalls. Functionality such as Assign and Set Status are still not available and need to be performed via the traditional methods. But judging by progress so far, I’m sure it won’t be long.
LINQ to CRM on CodePlex is a (Beta) community library available free for download and evaluation. I’m always a supporter of free and community based software, so I highly recommend support of this project. Ofcourse being in Beta, this is work in progress and I would not recommend use of this assembly commercially.
XrmLinq is a commercially available package. This is a much more complete and stable library. Installation and use is remarkably simple and functionally fairly complete. License fee is based on per deployment which makes it a little more costly than I would prefer but is available for free to CRM providers for development purposes. A subset of this library and source code is available on CodePlex for any curioustechies.
Labels:
LINQtoCRM,
Microsoft Dynamics CRM 4.0,
Webservice
Tuesday, March 17, 2009
Microsoft Dynamics CRM 4.0 Rollup 3
Download Dynamics CRM 4.0 Rollup 3 here: http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=05453fa4-9551-4a88-9852-634a9ad0e140
this rollup was released last week for CRM 4.0. And I would personally highly recommend it. Countless issues have been addressed up until this point. I've found that numerous behavior which I had even believed was by design has been corrected, simplifying plug-in development and customisations.
this rollup was released last week for CRM 4.0. And I would personally highly recommend it. Countless issues have been addressed up until this point. I've found that numerous behavior which I had even believed was by design has been corrected, simplifying plug-in development and customisations.
Friday, March 6, 2009
Dubugging Javascript in CRM Forms is Easy
Its easy to debug custom JavaScript in CRM forms. Save your JS code in the appropriate event and follow the instruction below. Debugging can be performed in IE or Visual Studio.
Scripting Debugging in Internet Explorer
entering the word "debugger" anywhere in your JS code will prompt IE to break at that point and load the script debugger.
Scripting Debugging in Internet Explorer
entering the word "debugger" anywhere in your JS code will prompt IE to break at that point and load the script debugger.
Labels:
Internet Explorer,
Javascript
Internet Explorer 8's New Developer Toolbar
If you've ever played around with Firefox's add-ons "Firebug", "Web Developer" and so on, you'd notice that there are capabilities that would take your CRM development to another level. It would be fantastic to have the ability to break down the DOM, CSS and test changes on the spot . Unfortunately Firefox is not compatible with Microsoft Dynamics CRM.
The latest release of Internet Explorer (IE8 RC1) contains the most useful tool as far as CRM development is concerned. The new Developer Toolbar holds a set of tools primarily targeted for developers in order to break down the DOM and list all elements of a web page.
Read more about the IE8 Developer Tools here.
How often have you tried to change the colour, font, visibility... of a control on the page? After a arduous task of finding the right tag, you then get to the job of making changes on your event code, save, publish, did not work right, try again...
The IE8 Developer Toolbar removes the hassle by displaying all page tags on a tree hierarchy and allowing live modifications to the page. The one shortfall that I've noted is that there is no facility to search a large page for a specific tag. Let's hope this is addressed in the next version.
The latest release of Internet Explorer (IE8 RC1) contains the most useful tool as far as CRM development is concerned. The new Developer Toolbar holds a set of tools primarily targeted for developers in order to break down the DOM and list all elements of a web page.
Read more about the IE8 Developer Tools here.
How often have you tried to change the colour, font, visibility... of a control on the page? After a arduous task of finding the right tag, you then get to the job of making changes on your event code, save, publish, did not work right, try again...
The IE8 Developer Toolbar removes the hassle by displaying all page tags on a tree hierarchy and allowing live modifications to the page. The one shortfall that I've noted is that there is no facility to search a large page for a specific tag. Let's hope this is addressed in the next version.
Sunday, February 8, 2009
Reference External Javascript File in CRM Form Events Asynchronously
A few months ago I posted a method of importing external javascript files into CRM forms. See 'Reference External Javascript File in CRM Form Events'.
Some of you may have noticed an issue with this method when including multiple exeternal files. This is due to the fact that the process runs asynchronously while the rest of the code continues to execute.
A friend of mine Sam Manins managed to come up with a full work around for this. Thanks to Sam, the function below can be pasted into your OnLoad event for a more reliable method to import Javascript files into your CRM forms.
The idea is to invoke the command to add your external file, then wait for confirmation that the file was imported. Only then should we allow the code to continue. See comments within the code.
//Paste this function somewhere into your form "OnLoad" event
function includeExternalJSFiles(sec)
{
var errFound = 0;
// load the Ascentium js file into a Script element - do not do this on recursive calls to this function
if (sec == 1)
{
//Include the CRM js file
var Ascentium_Script = document.createElement("script");
Ascentium_Script.language = "javascript";
Ascentium_Script.src = "MyJSFunctions1.js"
document.getElementsByTagName("head")[0].appendChild(Ascentium_Script);
//Include another js file
var Ascentium_Script = document.createElement("script");
Ascentium_Script.language = "javascript";
Ascentium_Script.src = "MyJSFunctions2.js"
document.getElementsByTagName("head")[0].appendChild(Ascentium_Script);
//Add any more JS files you need
}
try
{
//Each file needs to have a simple function(with a unique name) that does nothing that can be called.
//then you can call this finction to see if the file has been imported yet.
MyJSFunction1_STUB();//this function is contained in the external JS file
MyJSFunction2_STUB();//this function is contained in the external JS file
}
catch(err)
{
//error found(probably could not find the function
errFound = 1;
}
if (sec < 5 && errFound == 1)
{
sec++;
setTimeout("includeExternalJSFiles(" + sec + ")", 100); //waits 0.1 second before trying the stubs again.
}
else
{
if (errFound == 1)
//Did not work after 5 attempts (0.5 seconds)
//Try a longer time period or output an error message for the user
//alert("Did not work: " + sec);
else
//All functions were found (all files imported)
//No need to do anything. Just exit functions and continue code
//alert("Success after " + sec + " attempts. ");
}
}
Remember to have a unique stub function to run in each external file. the function needs no do anything. Just needs to be there(See sample below).
//this function would be found in the file MyJSFunction1.js
function MyJSFunction1_STUB()
{
//stub function (does nothing)
var a;
}
Finally you need to call the function to import your Javascript files:
includeExternalJSFiles(0);
The above example makes the call to add the files to the page header, then continues to try to run a functions in each file every 0.1 seconds until successful or until 5 failed attempts. Different systems under different workloads may perform the job at different speeds. Feel free to modify the code to suit your needs.
And improvement on this function could be to also pass in the name of each Javascript file in an array, making it more generic.
A big thank you goes to Sam Manins for the solution.
Some of you may have noticed an issue with this method when including multiple exeternal files. This is due to the fact that the process runs asynchronously while the rest of the code continues to execute.
A friend of mine Sam Manins managed to come up with a full work around for this. Thanks to Sam, the function below can be pasted into your OnLoad event for a more reliable method to import Javascript files into your CRM forms.
The idea is to invoke the command to add your external file, then wait for confirmation that the file was imported. Only then should we allow the code to continue. See comments within the code.
//Paste this function somewhere into your form "OnLoad" event
function includeExternalJSFiles(sec)
{
var errFound = 0;
// load the Ascentium js file into a Script element - do not do this on recursive calls to this function
if (sec == 1)
{
//Include the CRM js file
var Ascentium_Script = document.createElement("script");
Ascentium_Script.language = "javascript";
Ascentium_Script.src = "MyJSFunctions1.js"
document.getElementsByTagName("head")[0].appendChild(Ascentium_Script);
//Include another js file
var Ascentium_Script = document.createElement("script");
Ascentium_Script.language = "javascript";
Ascentium_Script.src = "MyJSFunctions2.js"
document.getElementsByTagName("head")[0].appendChild(Ascentium_Script);
//Add any more JS files you need
}
try
{
//Each file needs to have a simple function(with a unique name) that does nothing that can be called.
//then you can call this finction to see if the file has been imported yet.
MyJSFunction1_STUB();//this function is contained in the external JS file
MyJSFunction2_STUB();//this function is contained in the external JS file
}
catch(err)
{
//error found(probably could not find the function
errFound = 1;
}
if (sec < 5 && errFound == 1)
{
sec++;
setTimeout("includeExternalJSFiles(" + sec + ")", 100); //waits 0.1 second before trying the stubs again.
}
else
{
if (errFound == 1)
//Did not work after 5 attempts (0.5 seconds)
//Try a longer time period or output an error message for the user
//alert("Did not work: " + sec);
else
//All functions were found (all files imported)
//No need to do anything. Just exit functions and continue code
//alert("Success after " + sec + " attempts. ");
}
}
Remember to have a unique stub function to run in each external file. the function needs no do anything. Just needs to be there(See sample below).
//this function would be found in the file MyJSFunction1.js
function MyJSFunction1_STUB()
{
//stub function (does nothing)
var a;
}
Finally you need to call the function to import your Javascript files:
includeExternalJSFiles(0);
The above example makes the call to add the files to the page header, then continues to try to run a functions in each file every 0.1 seconds until successful or until 5 failed attempts. Different systems under different workloads may perform the job at different speeds. Feel free to modify the code to suit your needs.
And improvement on this function could be to also pass in the name of each Javascript file in an array, making it more generic.
A big thank you goes to Sam Manins for the solution.
Subscribe to:
Posts (Atom)