In the first post of this 2 part series, we looked at a class named Syntax
designed to be a pattern allowing for the easy creation and maintenance of a Fluent API. In the second post, we’ll explore what it takes to extend and implement that pattern. [More]
I’ve been a fan of Fluent APIs for a considerably long time now, and given their rise in popularity over the past few years I’m clearly not alone. There are several approaches one can take to creating their own fluent API, each with their own pitfalls and merits. In this 2 part series, we’ll take a look at an approach that I’ve been using that attempts to simplify the creation of Fluent APIs.
[More]
Do you suffer from VSSS (Visual Studio Suckiness Syndrome)? There’s help. If you’ve noticed your devenv.exe process swelling up to around 2gb and then getting really slow, buggy and freezing up, try a few things: Disable extensions or 3rd party addons that don’t manage their memory well. VS doesn’t use any process isolation for hosting these addons which means if your vendor’s product doesn’t behave well, VS won’t. Telerik’s JustCode turned out to be a big offender for me. Enable more user mode memory for VS using instructions detailed here. Hopefully this will help you keep the sanity -- happy coding!
I had the special opportunity today to speak to around 90 developers from Bank of America about building connected applications with Silverlight 4 today. I’ve done this demo a few times before in front of different groups (code camps, etc.) and it always seems to get a positive response. As a matter of fact, I’ll be presenting it again next Thursday night at Microsoft’s office in Tampa for IASA (register here if you’re interested).
In case you dialed in, and you’d like the PowerPoint deck, here it is:
PowerPoint slide deck: Networking in Silverlight 4
Also, somebody asked about my Chalkboard theme for Visual Studio, and I thought it’d be a good time to post an update for Visual Studio 2010.
Chalkboard theme for Visual Studio 2010.
Last week a co-worker and I had a disagreement on the implications of using .GetType() -- is it reflection or not?
Turns out I was both right and wrong about this...
[More]
I’ve been trying to get the SharePoint 2010 beta 1 server setup so that it can be queried using WCF Data Services (formerly ADO.Net Data services). Whatever I try, I continue getting the following error:
WebHost failed to process a request.
[More]
I’m doing a webinar today for my company, Tribridge, entitled “Behind the Scenes of SalesForce.com and Microsoft Dynamics CRM 4.0: The Developer’s Story”. Long titles aside, I’m super excited about delivering this content to a technical audience.
This is actually a follow-up presentation from a webinar that my colleague Seth Kircher did a few months back. If you didn’t see the first part, you may want to watch it before attending today’s webinar.
Register for today’s webinar.
So I’ve been a very, very busy bee with a bunch of projects, and there’s been no lack of well-deserved teasing for not posting to this blog in 8 months. I guess the best way to silence the critics would be a good-old-fashioned link-off. Here’s my list of high quality Silverlight 3 content that you’ve got to check out.
[More]
Many people around the office have taken notice of my Visual Studio 2008 theme, which I’ve affectionately called “Chalkboard”. I put together this theme and then tweaked it over the past few months to make hours in front of Visual Studio 2008 easier on my eyes. Here’s a screen grab. The high-contrast colors (dark background, light foreground) take some getting used to, but they’re much easier on the eyes after you do. For those who are interested, I’ve exported my Font and Color settings as a Visual Studio 2008 theme. Download my Visual Studio 2008 “Chaklboard” theme. Technorati Tags: Visual Studio,VS2008 Theme
Last night I was at the Tampa SQL Server User’s Group attending a good intro on VSTS Database Edition GDR presented by Catapult Systems. After the session, one of the attendees asked me if there was any way to get rid of the SQL Server Compact Edition help from his Visual Studio help collection. One way to do this is to use the provided help filters, which allow users to set preferences on what content they would like to see in help. Here’s the link to MSDN that explains the filters: Using Help Filters in Visual Studio (MSDN) Another way to do this is to uninstall the specific content that you want removed from the collection. Simply run the MSDN uninstaller from the Control Panel and modify your installation. Technorati Tags: Visual Studio 2008,VSTS,VSTS Database Edition
I've been trying to re-deploy a CRM 4.0 installation from a client's site into our development domain so that I can work with some of the data in the system. Using the provided CRM 4.0 Deployment Manager is pretty easy (instructions found here), but wasn't working. The deployment manager would run for a good 30+ minutes and eventually come back to me with a SQL Server Timeout error. The details of this error follow: Import Organization (Name={Name}, Id={ID} failed. The changes made during Import Organization could not be rolled back. Please manually delete the Organization database from the 'SBCRM01' SQL Server if it was not successfully deleted. System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) … at Microsoft.Crm.Tools.Admin.ImportOrganizationInstaller.Import(Guid organizationId, String organizationUniqueName, String organizationFriendlyName, String sqlServerName, String databaseName, Uri reportServerUrl, String privilegedUserGroupName, String sqlAccessGroupName, String userGroupName, String reportingGroupName, String privilegedReportingGroupName, ICollection`1 users, MultipleTenancy multipleTenancy) I Googled, hooked up SQL Server Profiler and searched Microsoft’s knowledge base – desperate for some sort of answer to this problem. I finally found a forum post online that described a similar scenario being resolved by installing Microsoft Dynamics CRM 4.0 Update Rollup 1. It wasn’t until I looked at the deployment log file that I realized that the timeout expired error was really just a symptom of another problem. Turns out that below the Timeout exception I found another exception message that describes what’s really going on. Import Organization (Name={Name}, Id={ID}) failed with Exception: Microsoft.Crm.CrmException: Unable to find metadata information for attribute {attribute_name} at Microsoft.Crm.Workflow.ObjectModel.MetadataProvider.GetAttributeMetadata(EntityMetadata entityMetadata, String attributeName) … at Microsoft.Crm.Tools.Admin.ImportOrganizationInstaller.Import(Guid organizationId, String organizationUniqueName, String organizationFriendlyName, String sqlServerName, String databaseName, Uri reportServerUrl, String privilegedUserGroupName, String sqlAccessGroupName, String userGroupName, String reportingGroupName, String privilegedReportingGroupName, ICollection`1 users, MultipleTenancy multipleTenancy) What the heck is this? Turns out, the issue is caused by having workflow in CRM that references an attribute that is subsequently deleted. Per Joel CustomerEffective (forum post), here’s some things you can do to resolve the issue: 1. Recreate the missing attribute (you can delete after import). 2. Delete any rows that reference that attribute from the workflowdependencybase table 3. Import the organization into an environment that is pre-rollup 1 4. Wait for KB958571 to be released--they are testing it now. If you search for it, you will find the KB article for it, but the hotfix has been redacted pending further testing. Of course, KB958571 talks about a hotfix that isn’t publically available. Sad – really sad, but have no fear! After wasting 6 hours today working on this problem, I’m still waiting on getting an answer from Microsoft about the availability of the patch. I’ve attempted solution #2 (removing the dependencies from the source database before performing the import) without success. Options #1 and #3 aren’t available to me at the moment. If you know of a better solution, please post a comment to this blog! Technorati Tags: CRM 4.0,Troubleshooting,Tips and Tricks
Looks like the good folks in Redmond got some time to write up a much-needed troubleshooting guide for TFS server installations. You can find the guide on MSDN using the following link: Troubleshooting installation of Team Foundation The guide goes over how to interpret the installer log files, as well as diagnosis for many common TFS errors. Here's a list: Error 32000. The Commandline ‘[1]’ returned non-zero value: [2] Error 29112. Team Foundation Report Server Configuration: Either SQL Reporting Services is not properly configured, or the Reporting Services Web site could not be reached. Use the Reporting Services Configuration tool to confirm that SQL Reporting Services is configured properly and that the Reporting Service Web site can be reached, and then run the installation again. For more information, see the Team Foundation Installation Guide. Error 29109. Team Foundation Report Server Configuration: SQL Reporting Services configuration encountered an unknown error. Verify that you have sufficient permissions to configure SQL Reporting Services, and try again. Error 28806. An unexpected error occurred. Verify that SQL Server Reporting Services is installed and running on the Team Foundation app tier and that you have sufficient privileges to access it. For more information, see the setup log. Error 29000. An unexpected error occurred. Verify that SQL Server Reporting Services is installed and running on the Team Foundation app tier and that you have sufficient privileges to access it. For more information, see the setup log. Error 28805. The setup program cannot complete the request to the server that is running SQL Server Reporting Services. Verify that SQL Server Reporting Services is installed and running on the Team Foundation app tier and that you have sufficient permissions to access it. For more information, see the setup log. There is an error with the collation settings for SQL Server. The collation settings are not compatible with Team Foundation Server. There are also sections for troubleshooting the installation of Team Build or Team Explorer in Visual Studio, as well as some helpful hints for post-installation pains. This article has now taken the place of a dozen of my favorites -- thanks Microsoft! Technorati Tags: TFS,VSTS,Troubleshooting
I'm not a big fan of New Year's Resolutions, but I've got some bad habits (like many of us) that I'd like to break, and some new good habits that I'd like to get into. Here's my short list of changes for 2009.
[More]
One of the best features and biggest drawbacks to CRM 4.0's entity model is the ability to modify forms in CRM using Javascript. While this level of customization is something any sizable implementation will need, it's been reduced to pasting a bunch of Javascript code into a text box in CRM. Not that I've got anything against pasting code in a textbox in CRM, but this isn't exactly an integrated development experience. In this post, I'll demonstrate how to have the onLoad() script in a CRM entity dynamically load one or more Javascript files (externally) and then run a load script once all the files have completely loaded. First, let's talk about a little housekeeping. The image to your left (click to enlarge) represents the solution explorer view of a web project I've created that contains an ISV solution for CRM. There's some important things to note here. First, I've got a folder called "Javascript". This folder houses my site-wide Javascript, and the basis for the OnLoad() handler that I'll bind to each entity. Let's take a look at some of the files in this folder. CrmFormHelper.js Houses functions that help handle form events easily. After loaded by our dynamic scripting engine, the form helper is available to any form in CRM via the document.FormHelper object. CrmFormIFrame.js Houses functions that allow CRM to manipulate the IFRAME instance where a page appears CrmWebService.js Houses functions that easily allow CRM web services to be consumed through Javascript. DiagnosticsWindow.js When enabled, provides a trace window that shows events as they fire in CRM using the Javascript scaffolding in this article OnLoad.js Provides a stock OnLoad() implementation for your entities OnSave.js Provides a stock OnSave() implementation for your entities. For the purposes of this post, I'm going to focus on CrmFormHelper and OnLoad.js. What's in these fancy scripts, anyhow? Let's take a look:CrmFormHelper.js 1: CrmFormHelper = function() {
2:
3: //Trace - Start
4: var TraceWindowHandle = null; var TraceLastTrace = new Date(); function TraceClear() { if (TraceWindowHandle == null) return; alert(TraceWindowHandle.document.body.innerHTML); TraceWindowHandle.document.body.innerHTML = '<body>'; TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } function Trace(cat, message) { if (typeof TraceWindowEnabled == 'undefined') return; message = message.split('<').join('<'); message = message.split('>').join('>'); if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { date_now = new Date(); elapsedMS = date_now.getTime() - TraceLastTrace.getTime(); TraceLastTrace = date_now; TraceWindowHandle.document.writeln('<br>' + date_now + '(' + elapsedMS + ') ' + ':' + cat + ':' + message); TraceWindowHandle.window.scroll(0, TraceWindowHandle.document.body.scrollHeight + 10); } catch (err) { TraceWindowHandle = null; } } function TraceWriteRaw(markup) { if (typeof TraceWindowEnabled == 'undefined') return; if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { TraceWindowHandle.document.writeln(markup); } catch (err) { TraceWindowHandle = null; } }
5: //Trace - End
6:
7: CrmFormHelper.prototype.IsEditForm = function() {
8: var CRM_Form_TYPE_EDIT = 2;
9:
10: if (crmForm.FormType == CRM_Form_TYPE_EDIT)
11: return true;
12: else
13: return false;
14: }
15:
16: CrmFormHelper.prototype.HandleFormOnLoad = function() {
17: Trace('HandleFormOnLoad', 'Starting');
18:
19: var CRM_Form_TYPE_CREATE = 1;
20: var CRM_Form_TYPE_EDIT = 2;
21:
22: switch (crmForm.FormType) {
23: case CRM_Form_TYPE_CREATE:
24: if (this.OnFormLoadCreate != null) {
25: Trace('HandleFormOnLoad', 'Calling OnFormLoadCreate');
26:
27: try {
28: this.OnFormLoadCreate();
29: }
30: catch (e) {
31: Trace("HandleFormOnLoad", "Error while calling OnFormLoadCreate: " + e.Description);
32:
33: debugger;
34: }
35:
36: Trace('HandleFormOnLoad', 'Done Calling OnFormLoadCreate');
37: }
38:
39: break;
40: case CRM_Form_TYPE_EDIT:
41: if (this.OnFormLoadEdit != null) {
42: Trace('HandleFormOnLoad', 'Calling OnFormLoadEdit');
43:
44: try {
45: this.OnFormLoadEdit();
46: }
47: catch (e) {
48: Trace("HandleFormOnLoad", "Error while calling OnFormLoadEdit: " + e.Description);
49:
50: debugger;
51: }
52:
53: Trace('HandleFormOnLoad', 'Done Calling OnFormLoadEdit');
54: }
55:
56: break;
57: }
58:
59: Trace('HandleFormOnLoad', 'Ending');
60: }
61:
62: CrmFormHelper.prototype.OnFormLoadCreate = function() {
63: Trace('OnFormLoadCreate', 'Default implementation called - no action taken');
64: }
65:
66: CrmFormHelper.prototype.OnFormLoadEdit = function() {
67: Trace('OnFormLoadEdit', 'Default implementation called - no action taken');
68: }
69:
70:
71: CrmFormHelper.prototype.HandleFormOnSave = function() {
72: Trace('HandleFormOnSave', 'Starting');
73: if (crmForm.IsDirty) {
74: Trace('HandleFormOnSave', 'Calling OnFormSaveDirty');
75: if (!this.OnFormSaveDirty()) {
76: Trace('HandleFormOnSave', 'OnFormSaveDirty setting return value to false, since onsavedirty returned false');
77: // Cancel the save operation.
78: event.returnValue = false;
79: }
80: Trace('HandleFormOnSave', 'Done Calling OnFormSaveDirty');
81: }
82: else {
83: Trace('HandleFormOnSave', 'Calling OnFormSaveClean');
84: this.OnFormSaveClean();
85: Trace('HandleFormOnSave', 'Done Calling OnFormSaveClean');
86: }
87: Trace('HandleFormOnSave', 'Ending');
88: }
89:
90: CrmFormHelper.prototype.OnFormSaveDirty = function() {
91: Trace('OnFormSaveDirty', 'Default implementation called - no action taken');
92: }
93:
94: CrmFormHelper.prototype.OnFormSaveClean = function() {
95: Trace('OnFormSaveClean', 'Default implementation called - no action taken');
96: }
97:
98: CrmFormHelper.prototype.GetDefaultLookupValue = function(guid, type, label) {
99: var lookupItem = new Array();
100: lookupItem[0] = new LookupControlItem(guid, type, label);
101: return lookupItem;
102: }
103: }
104:
105: document.FormHelper = new CrmFormHelper();
What does all this code do, anyhow? Well, basically, we're creating a Javascript class that can responsibly handle form events (load and save). This means that a different function can be called on Create or Edit mode for a form, and a different function can be called based on the form's state (clean or dirty) upon save. You'll also notice a bit of error handling code on each call, where we'll dump failures to the Trace window and launch the debugger. In our setup, all of the code above lives in an external Javascript file. This means, using Visual Studio 2008, you can set a breakpoint in any portion of this code and get full debugging support.
But how do I get this external code to load when my entity's form is displayed? Basically, you can copy and paste the following 40 lines of code in your entity's onLoad handler. Let's take a closer look. 1: function onLoad() {
2: window.DynamicScripts = new Array();
3: window.DynamicScriptsLoaded = 0;
4:
5: // *** BEGIN EDITS HERE *** Add any scripts you want to be loaded when the page begins, CrmFormHelper.js is required.
6: window.DynamicScripts[0] = "/ISV/Custom/Javascript/CrmFormHelper.js";
7: window.DynamicScripts[1] = "/ISV/Custom/Javascript/CrmWebService.js";
8: window.DynamicScripts[2] = "/ISV/Custom/Price List/Javascript/PriceListForm.js";
9: // *** END EDITS HERE ***
10:
11: //Trace - Start
12: var TraceWindowHandle = null; var TraceLastTrace = new Date(); function TraceClear() { if (TraceWindowHandle == null) return; alert(TraceWindowHandle.document.body.innerHTML); TraceWindowHandle.document.body.innerHTML = '<body>'; TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } function Trace(cat, message) { if (typeof TraceWindowEnabled == 'undefined') return; message = message.split('<').join('<'); message = message.split('>').join('>'); if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { date_now = new Date(); elapsedMS = date_now.getTime() - TraceLastTrace.getTime(); TraceLastTrace = date_now; TraceWindowHandle.document.writeln('<br>' + date_now + '(' + elapsedMS + ') ' + ':' + cat + ':' + message); TraceWindowHandle.window.scroll(0, TraceWindowHandle.document.body.scrollHeight + 10); } catch (err) { TraceWindowHandle = null; } } function TraceWriteRaw(markup) { if (typeof TraceWindowEnabled == 'undefined') return; if (TraceWindowHandle == null) { TraceWindowHandle = open('', 'TraceWindow', 'width=500,height=500,location=no,menubar=no,resizable=yes,left=200,top=20,directories=no,status=no,scrollbars=yes'); TraceWindowHandle.document.writeln('<a href="javascript:opener.TraceClear();">Clear Window</a>'); } try { TraceWindowHandle.document.writeln(markup); } catch (err) { TraceWindowHandle = null; } }
13: //Trace - End
14:
15: TraceWindowEnabled = true;
16: Trace("Dynamic Scripts", "Script loading started");
17:
18: for (i = 0; i < window.DynamicScripts.length; i++) {
19: var script = document.createElement("SCRIPT");
20:
21: script.language = "javascript";
22: script.src = window.DynamicScripts[i] + "?nocache=" + Math.random();
23: script.onreadystatechange = function() {
24: if (this.readyState == "loaded" || this.readyState == "complete") {
25: window.DynamicScriptsLoaded += 1;
26:
27: Trace("Dynamic Scripts", this.src + " " + this.readyState);
28:
29: if (window.DynamicScriptsLoaded == window.DynamicScripts.length) {
30: Trace("Dynamic Scripts", "Script loading complete");
31:
32: if (document.FormHelper != null)
33: document.FormHelper.HandleFormOnLoad();
34: }
35: }
36: }
37:
38: document.getElementsByTagName("HEAD")[0].appendChild(script);
39: }
40: }
41:
Basically, lines 5-9 of the above snippet specify which external script files should be loaded before the page's CrmFormHelper's load methods are called. You can add any number of Javascript files here. Lines 18-36 dynamically build <SCRIPT> tags and add them to the header. At this point when all the scripts are loaded, then (and only then) is the FormLoad() fired (line 33). This guarantees that all of your script libraries are available to your OnLoad script.
So, what happens when the page loads? Looking at line 9 of the above code snippet, we see that one of the external javascript files is "/ISV/Custom/Price List/Javascript/PriceListForm.js". This external Javascript file is real small and houses 2 different functions that fire when my page loads (one for edit mode, one for creation). 1: /// <reference path="../../Javascript/CrmFormHelper.js" />
2: /// <reference path="../../Javascript/CrmWebService.js" />
3: /// <reference path="../../Javascript/Intellisense/new_custompricelist.js" />
4:
5: document.FormHelper.OnFormLoadCreate = function() {
6: alert("Form create was called");
7: }
8:
9: document.FormHelper.OnFormLoadEdit = function() {
10: alert("Form edit was called");
11: }
What's most important about this file is the first 3 lines. Those comments actually tell Visual Studio 2008 to load the specified Javascript files (which are loaded using our DynamicScript above) for interpretation in Intellisense. Yes, you got the right -- by referencing those external scripts in the first 3 lines of this file, you'll get full Intellisense support.
That concludes this post. In summary, using external Javascript files gets us a first class debugging experience in Visual Studio. Try it!
Technorati Tags: VSTS,CRM 4.0,Javascript
Can't wait until VSTS and TFS 2010 to have hierarchical work items? There's a way around this, provided you're ready to use either Microsoft Excel or Microsoft Project to do work item tracking. Introducing Area Paths Area Paths allow architects to clearly define portions of an application as independent subsystems. You do this through a tree-view interface. How do you access Area Paths in TFS? Using the Team Explorer Client Right click on your project in Team Explorer and select "Team Project Settings", then "Areas and Iterations". You can organize Area Paths and Iteration Paths in an unlimited hierarchical view using the provided TreeView. Using Team System Web Access You may also modify Area Paths and Iteration Paths using Team System Web Access. To do so, use the Settings menu on the right side of your screen. Select "Team Project" and then "Areas" or "Iterations". Adding Tasks to TFSWhen adding tasks to TFS, be sure to choose the area path and iteration path that you wish each task to follow. I find it best if you number the paths (1, 1.1, 1.1.1, etc.) so that you can sort by area path easily. After you do so, you'll have a query of work items in your development cycle that looks something like this: I've removed a client name here for privacy purposes, and hopefully your screen won't have a big white blob all over it. This certainly makes things easier to organize inside TFS, but what about viewing this data in a hierarchy? Enter Microsoft ProjectSome great functionality in TFS is it's ability to link data automatically with Excel and Project. The publish/refresh model is extremely light, fast and easy to use. First, you'll need to import work items in to your project plan. It's easy, just click the "Get Work Items" button from the toolbar in project. Next, you'll need to add the headers/hierarchy back in from your area path in Microsoft Project. You can do so by: Pressing Ins in the task list (a new row appears). Type the name of your new task Highlight the sub-tasks below it, and use the indent arrow button (or Tab) to make them subordinate to the header above Repeat this process for multiple levels Make sure to take your new header tasks aren't published to TFS (since the subordinate tasks already are). How do you do this? Add the Publish and Refresh column to your view in project (if it's not already there). Simply set the option to "No" for your header rows. When you're all done, you should have a view in Microsoft project that looks something like this (I've collapsed some of the headers for effect): Technorati Tags: VSTS,TFS,Microsoft Project,Area Paths
Microsoft made a formal announcement about BizSPpark today. From their web site: Microsoft® BizSpark™ is a global program designed to help accelerate the success of early stage startups by providing key resources when they need it the most: Basically, Microsoft is doing a solid for startups by providing them with a bunch of full-featured, licensed development tools (including VSTS and TFS Standard Edition to say the least), the MSDN library and a whole lot more. What do you need to do to qualify? Actively be engaged in development of a software-based product or service that will form a core piece of its current or intended business[1], Be privately held, Be in business for less than 3 years[2], and Generate less than USD $1 million in annual revenue[3].Since that pretty well represents the little guy (including my own business in it's first three years) - I imagine a lot of people are really going to benefit from this program. Kudos to Microsoft for recognizing their social responsibility in growing new businesses. Technorati Tags: BizSpark,VSTS,TFS
Presented by Andrew Bybee (Principal Program Manager, Microsoft) and Nirav Shah (Senior Development Lead, Microsoft) This presentation is all about code. Objectives in the session include: Demonstration of the rapid development of business applications with Dynamics CRM. Introduce new capabilities for extending business logic in Dynamics CRM "v.Next" Think "XRM" instead of CRM -- building on CRM as an application platform instead of just customer relationship management. What's the value of CRM? Well, it's really about simplifying the buy vs. build decision-making process. Specifically, CRM's value is that it can: Quickly build prototype solutions to help approve the project Meet customer requirements with foundation for future releases Build credibility and trust with predictable delivery Today, writing enterprise line of business applications requires interaction with many different components, including considerations for: Workflow Security Reporting Outlook /; Office Communications Configuration Configuration Deployment Scalability Manageability Extensibility Upgrade If you're building your applications in .NET, all the aspects mentioned above will take away from the budget you may have to deliver a solution to your customer. So, what's new in CRM 5?Before PDC, Microsoft has been really tight-lipped on what's new in CRM 5 (or v.Next). Nirav Shah previously worked on the CRM Online team, and now he's a Lead Developer on the CRM 5 product team. Here's the short list of future items for CRM 5. Partial-trust code in hosted environments (a.k.a. "The Sandbox") - Basically, this functionality offers developers the capability to have a fully baked business layer in their CRM solutions. Transaction support Integration with Internet Service Bus and Cloud services (Azure) Single-sign-on support, impersonation and delegation via Geneva STS The SandboxHow does this work anyway? Well, basically, the CRM SDK will keep the Pipeline Processing model from CRM 4, but will have a special partial-trust calling mode on the Sandbox server (a new server role in CRM). The Sandbox host service (reached through a WCF channel) receives information from the CRM SDK about what code needs to be executed, what it needs to be executed for and what inputs are required. Next, the Sandbox server will check the assembly cache for the code to be executed. If a new execution is run, it's done in a separate application domain, locked down to only allow code execution by the hosted code from the Sandbox server. The result? A highly scalable, flexible extensibility model which allows for richer and richer application support inside CRM. SolutionsSolutions allow a way to package a number of customizations in CRM together to provide a single solution (e.g. "Product Management Solution"). Solutions can be combinations of customizations from ISV.config changes, entity definitions, custom CRM configuration options and more. Ribbon SupportCRM 5.0 will feature a new Ribbon-based UI in many places. Customizable Roles and LevelsAn enhanced security subsystem now allows for new types of role definitions (not just permission definitions for user accounts). Isolated ExecutionNew hosted plug-ins are managed through a new IIsolatedPlugin interface, which is identical to the CRM 4.0 plug-in interface. In addition, plug-ins can now be registered for execution inside or outside a transaction context. In the event that a medium-trust plug-in fails, TransactionsInitiated by the server, managed by the server but completely administratable by the Plug-in through it's execution context. DiagnosticsNew tracing service lets developers track what's going on in a plug-in's execution and report on it later. In addition, CRM itself monitors for plug-in and code health when hosing code in the CRM environment. Want to find out more about CRM 5? I'm sure more will be released over the next few weeks, but for now, I'd check out this great page on Channel 9. Technorati Tags: Dynamics CRM 5.0
Image via Wikipedia Had a really fun lunch session from the creators of the ASP.NET Ajax Control Toolkit. Looks like Microsoft released a Silverlight Control Toolkit yesterday, which will be followed later with a WPF Control Toolkit out of band from Visual Studio/.NET Framework releases. And, like the AJAX Control Toolkit, we'll be getting full source code, unit tests and project harnesses. Good stuff, indeed. About the Delivery Model A core runtime will be created and maintained by Microsoft, and coupled with an SDK/Tools release. This out of band release will be the first we'll see as developers (no timeframe mentioned). In addition, CodePlex projects will be created and maintained to keep control builds in 4 quality bands. Those bands are: Experimental - Controls may or may not be included in a future release Preview - Useful for most folks, but final version may have changes Stable - Controls are good for 90%+ of scenarios, this is considered close to final beta quality Mature - Full RTM quality, no breaking changes unless there's a security issue. What's included? In addition to getting source code, you get a bunch of other really cool stuff. Here's what's included: WPF Parity Controls - DockPanel, WrapPanel, TreeView, Expander, Label, ViewBox, HeaderedContentControl, HeaderedItemsControl Silverlight UI Components - Autocomplete textbox, NumericUpDown, Charting (supports Line, Pie, Column, Scatter charts, courtesy of Dundas). These controls will later be made available on WPF Unit Tests - Automated unit test framework for Silverlight Sample Sites - Sample web site projects that demonstrate appropriate usage of all the new controls in the Silverlight control toolkit. Themes - Expression Dark, Expression Light, Shiny Blue, Shiny Red, Rainier Orange, Rainier Purple. Themes are managed through the ISM (Implicit Style Manager) -- a new component in the Silverlight control toolkit. What's Coming?Some additional controls are coming (Accordion, ListView). Also, some major issues will be fixed in an upcoming release, as well as charting improvements, etc. These will be in a minor release later this year. Sometime around Mix '09, they'll add a MediaPlayer, TimePicker, Carousel, Rating, MaskedTextBox and more themes! Even further down the road -- InPlaceEditing, AppointmentCalendar, ImageMap, FileUpload, Menu, SlideShow Technorati Tags: Silverlight
Presented by Jamie Cool, Microsoft Corporation Yes -- his name really is Jamie Cool. I think Jamie did the best presentation of the day (so far) on developing business applications with Silverlight, and then a good taste of Silverlight futures. It's hard to say how much of the futures we saw were really Silverlight futures and how much was ADO.NET Entity Framework futures. All the same, this is what he demonstrated. Right in front of our eyes, Jamie put together a slick Silverlight 2 HR application that featured: 2-way data binding with XAML binding expressions Custom business logic extensions for ADO.NET entity framework that would make framework designers cry. New "DetailsView" control for Silverlight. Security trimming and authentication using something like a LoginView. Easy to use and easy to deploy service model courtesy of ADO.NET Entity Framework. On-the-fly validation in the business layer implemented with ease (through decoration or your own declarative programming) I know this post is really short, mostly because I was too busy lifting my jaw off the ground to keep blogging. I can't believe we're seeing Silverlight futures so close after version 2 final release (2 weeks ago). Really amazing stuff. No commitment on delivery yet, but I wouldn't think we'd hear that so soon after v2 release. Look for more posts on this blog. Technorati Tags: Silverlight
Presented by: Stella Chan, Lead Program Manager, Microsoft Why BI? Developers can build applications to track the ever-changing business BI solutions create a holistic view, allowing developers to build solutions that unlock data from silos of line of business applications (consolidation) Build information worker friendly tools that require minimal training and provide insight at the Information Worker's fingertips. An end-to-end BI offering contains the following components: Business Intelligence Platform - the BI platform stack consists of the SQL Server 2008 SKU components (database engine, SSIS, SQL Server REporting Services and SQL Server Analysis Services). These products are at the bottom of the stack. End User Tools and Performance Management Tools - Excel, or PerformancePoint Server Client Tier (Delivery) - Reports, Dashboards, Excel Workbooks, Analytic Views, Scorecards, Plans -- all put together through SharePoint as a collaboration platform. The easiest way to BI bliss? Recently announced are the Microsoft Chart Controls for the .NET Framework 3.5. Looks like Microsoft either purchased some part of the Dundas Charting solution or completely ripped it off. What's in this release? ASP.Net and Windows Forms charting components. Bar and Column Charts, Line Charts, Point Charts, Pie and Doughnut Charts, Area Charts, Range Charts, Circular Charts, Combinational Charts, Data Distribution Charts and Accumulation Charts. I wish I could share more about the new charting and BI capabilities in SQL Server 2008, but it seems to be a complete lift of the Dundas visualization package -- which is good software, but hardly cutting edge. Please post your comments on this as I'd love to hear thoughts from the blogosphere. Technorati Tags: SQL Server 2008,Business Intelligence,Data Visualization
Microsoft has now made the Visual Studio 2010 bits available for download at PDC. The following link has the download, feedback forms, FAQ and help. I'd love to hear what you're doing with VSTS 2010 -- feel free to contact me and let me know. Technorati Tags: VSTS,Visual Studio 2010
"Rosario" is the name of Microsoft's next release of Team Foundation Server. Got a great look at new features in Brian Harry's 3:30 session. TFS "Rosario" at a high level Protect the quality of your code - Making sure the quality of the code that makes it into the tree is of the highest quality; issues that are found early are rejected and fixed. Understanding parallel development - how does the development team handle lots of branches, releases and builds Managing your project - A number of enhancements have been made to make PM tasks easier Reporting on your entire portfolio - New enhancements help managers and team members understand what's going on across multiple projects Coordinate across development platforms - New support for Eclipse, Mac development tools, etc. Administer TFS in your environment - New improvements in flexibility and scalability for large enterprises Protecting the quality of your code Gated check-in and buddy builds - an evolution of continuous integration; build server can automatically build, test and deploy interactively with proofing upon check-in; Buddy builds allow user to package up changes, ship it off to build server and run tests on isolated server without deployment Workflow based builds - In TFS 2005, 2008, build engine is based on MSBuild. New enhancements in TFS 2010 allow builds to be triggered as Windows Workflow events. Brian demonstrated this during his presentation - trust me when I tell you it kicks ass. Build queuing - manage large groups of many people doing many builds Build agent pooling - setup farms of build machines; kickoff builds and TFS finds available build machines and builds Symbol server and source server support - making it easier to debug builds that come out of the automated build (since there's no symbols on the build server) Understanding Parallel Builds First class branches Visualize branch relationships Track changes across branches (History, Timeline, Annotate) Conflict resolution Rollback Managing your Projects Agile project management workbooks Work item linking and hierarchy Work item usability (Rich text, Links control, HTML link control, drag and drop support) Traceability queries Query folders (with independent permissions) Excel and Project improvements (excel workbooks no longer lose their custom stuff upon TFS refresh; new styles and report workbooks) Reporting on your entire portfolio Customizable dashboards SharePoint web parts Excel reports using MOSS Relational warehouse Excel reporting At the end of the session Brian had time to take some Q&A. I asked if the Team System Web Access for 2010 would be as functional as the Visual Studio integrated Team Explorer, which he responded with a resounding "Yes". I also asked if there were improvements in customizing process guidance or work item templates -- unfortunately not for this release -- let's hope for some service pack improvements! Truthfully, I think Brian had even more amazing content to go over in his demo but got cut short on time. TFS Rosario literally has hundreds of new features and enhancements. I'll blog more about the product as I have bits and more information is made available! Technorati Tags: TFS 2010,Rosario
Presented at PDC by Scott Hunter (Program Manager, Microsoft) Where are we?July 2007 introduced an "ASP.Net Futures" release, which included early beta copies of MVC, Dynamic Data and a bunch of other goodies. December 2007 included an enhancement to that release. March, 2008 brought that process online -- putting beta code in CodePlex. That trend will continue through the end of the year in 2008. August, 2008 yielded the Visual Studio 2008 SP1 (and ..Net Framework 3.5 SP1) with final releases of ASP.NET MVC. Starting today, source code is available on CodePlex for a number of the large ASP.NET bits. ASP.NET 4.0There are a number of new features in ASP.Net 4.0 (available on CodePlex over the next few months). Product Roadmaps - Roadmaps are now published online CodePlex that clearly show the incremental improvements in ASP.Net. This is different from the traditional update model where a new version of the .Net Framework signifies enhancements in ASP.Net. VS10 supports multi-targeting against .Net 4.0 all the way down to .Net 2.0. FX 4.0 maintains a high compatibility with FX 3.5 New releases of ASP.Net will continue to include a roll-up of a number of "out of band" features (ASP.Net MVC, Dynamic Data, AJAX, etc.) New "themes" in ASP.NET 4.0 will provide the best platform for standards support (HTML, CSS, AJAX). ASP.NET 4.0 will create the "Best in breed" practices for web-based Line of Business software platforms. This includes easy ways to develop and extend data-driven Web applications. Support "pattern based" web development (MVC, TDD, etc.) Specific ASP.NET Enhancements Client ID's - Developers can now manage control ID's that affect rendered client ID's. This will remove ID bloat and "mangling". CSS Enhancements - Defer to CSS styles and bypass existing style properties; Support non-table-based HTML layouts. URL routing for web-forms - Configuration model for URL routing that will be first-class in the ASP.Net pipeline. View-state - Disable on page, enable on specific controls; disable on control, enable on child control; GridView/ListView will work better without viewstate. ASP.Net Dynamic Data - Scaffolding, templates and data validation improvements; support for many-to-many relationships; advanced data controls ASP.NET AJAX - new support for jQuery (including intellisense), provide support for both Page Developers and Javascript Developers; client-side templates and data-binding support, including binding from REST or Web Service calls; DOM manipulation and advanced selectors (on the server or client); AJAX control toolkit (including new controls) is now part of the ASP.Net release ASP.NET MVC - Enforces separation of concerns and provides full control of markup. TDD is enabled; added support for ASP.NET Profile, Membership and Role Localization; JSON support Technorati Tags: ASP.NET
I'm in breezy, smoggy Los Angeles, CA for Microsoft's Professional Developer Conference (PDC) 2008. Just got done listening to the Ray Ozzie's Keynote address, which focused largely around Windows Azure -- Microsoft's new Windows OS for "the cloud". I hear a lot about cloud computing these days, and Ozzie even gave big credence to Jeff Bezos and Amazon for popularizing cloud computing with Amazon EC2. What makes Windows Azure different? It's simple really -- Microsoft. With Azure, Microsoft is defining cloud computing as highly available clusters of network computers connected via the Internet and available to consumers or business (at a price still to be named by Microsoft). Azure is different from EC2 or GData (in the cloud data services) because it combines a technology stack with an established base (the .Net Framework, Visual Studio, SQL Server) with a Windows OS that understands how to scale and distribute computational payload across the Internet. This still sounds too 50,000 foot-ish to be blogging about, so I'll re-cap one of the ways Azure was demonstrated at this morning's keynote. Internal company (Contoso) has an AD-infrastructure in place, but wants to leverage software that lives "in the cloud" on Microsoft's server. Azure provides simple identity federation through an Active Directory connector. The setup is basically 2 steps and took a Microsoft VP about 5 minutes to complete. Contoso buys Microsoft Dynamics CRM (as a Microsoft Online service) and as a result of the federated identity provided by .Net Services, Contoso's local Active Directory infrastructure is leveraged for login and security. Joe Developer can now deploy additions to CRM, albiet data model or workflow in the cloud courtesy of Azure and CRM Online. It's still entirely too early to know if cloud computing will revolutionize software the way Ozzie says it will, but it's safe to say that Microsoft is pioneering the first completely integrated cloud computing development experience with Visual Studio 2010. Technorati Tags: Azure,cloud computing,Windows
Nikita and I got to spend some time with some folks in Orlando this week talking about Team Foundation Server 2008. A few questions came up that we weren't prepared to answer on the spot, and I promised an online follow-up. Here it is! Is TFS integration supported in the Expression line of products? The unfortunate short answer is "Not yet". I installed Expression Studio2 (and applied SP1 for Blend) and there's no source control support. I found a few posts asking Microsoft to remedy this problem, and apparently they are in fact taking steams to remedy the situation. What are the differences between the various Visual Studio SKUs? Good question. First, here's an update on nomenclature since we're all undoubtedly confused by a certain marketing department's notorious change of heart regarding product names: Visual Studio 2005 Visual Studio 2008 Visual Studio Team System Visual Studio Team System 2008 Visual Studio 2005 Team Suite Visual Studio Team System 2008 Team Suite Visual Studio 2005 Team Edition for Software Architects Visual Studio Team System 2008 Architecture Edition Visual Studio 2005 Team Edition for Software Developers Visual Studio Team System 2008 Development Edition Visual Studio 2005 Team Edition for Software Testers Visual Studio Team System 2008 Test Edition Visual Studio 2005 Team Edition for Database Professionals Visual Studio Team System 2008 Database Edition Visual Studio 2005 Team Foundation Server Visual Studio Team System 2008 Team Foundation Server Visual Studio 2005 Team Test Load Agent Visual Studio Team System 2008 Test Load Agent What about Standard and Professional builds of Visual Studio? Visual Studio Express SKU's are free "lite" versions of Visual Studio designed to get new developers on board with the Microsoft development platform. There's no add-in support or extensibility, and the language/project features are limited. Visual Studio 2008 Standard is the baseline SKU and includes the Visual Studio shell, add-in and extensibility (VSX) support, project upgrade wizard, etc. Visual Studio 2008 Professional is the first version that adds "full setup" for Visual Studio, the full MSDN library, advanced debugging (remote processes, clustered debugging), the object test bench, Office development support, mobile device development support, and more goodies. No TFS CAL is included with Visual Studio 2008 Standard or Professional. Beyond the inclusion of a TFS 2008 CAL, VSTS provides a few additional benefits over Visual Studio Professional (namely 64-bit debugging support). Each VSTS SKU has it's own benefits, highlighted below: SKU Features Architect Edition Application Design project template; Application designer; Bind application; Configure connections to external databases; Conform .NET Web Service Endpoints to WSDL Files; Custom Prototypes; Define Deployment; Deployment Designer; Generate Deployment Report; Implement Application; Logical Datacenter Design; Reverse Engineer Projects in Existing Solutions; Settings and Constraints Editor; Synchronize with Datacenter; System Designer; Validate Diagram; Versioning; Web Service Details Database Edition Add Database Reference; Custom Data Generators; Data Compare; Data Generation; Database Refactoring; Database Schema Build & Deployment Tools; Database Unit Testing; Offline Database Schema; Project Version; Schema Compare; T-SQL Editor Developer Edition Auto-Suppress Generated Code Option; C/C++ Code Analysis tool; Code Analysis Check-In Policy; Code Metrics; Managed Code Analysis tool; Spelling Checker with Custom Dictionary Support; Application Verifier; Compare Reports; Compressed Report Files; Copy Report View Data to HTML; Filtered Analysis; Hot Path; Line-Level Sampling; Portable CPU Counters; Profiler Runtime Control; Profiling Tools; Profiling Tools Report; Report Noise Reduction; Runtime Profiling Control window; Stand-Alone Profiler; Windows Communications Foundation Profiler Support; Windows Counter Support Test Edition Call a Web Test from a Web Test; Code Coverage; Custom Host Adapters; Easier Load Test Analysis; Generic Tests; Load Modeling; Load Test Results Repository Management; Load Tests; Manual Tests; Web Test Data Binding; Web Test Validation Rules; Web Tests; XML File Converter Utility Team Suite All of the above are available in one edition. If these short one-liner feature names aren't enough, a full side-by-side comparison of Visual Studio SKU's is available. If you're looking for a great deal, Microsoft runs promotions on Visual Studio flavors from time to time. What does the TFS 2008 Upgrade Process look like? Many of you read my install guide from a few weeks back and wanted to know about the pitfalls of a TFS 2008 upgrade. What's most important to know is that the TFS upgrade is really a 4 product install comprising of the following tasks: WSS 2.0 to WSS 3.0 Upgrade SQL Server 2000 to SQL Server 2005/2008 Upgrade (you may already have this) TFS application tier 2005 to 2008 Upgrade TFS database tier 2005 to 2008 Upgrade Team Build 2008 install/setup (optional) WSS 2.0 to WSS 3.0 upgradeThe first component that needs to be completed is the upgrade from WSS 2.0 to WSS 3.0. During my last upgrade process, we were actually doing the upgrade, but we wanted to migrate the content database from an existing WSS 2.0 server to a new WSS 3.0 installation on Windows Server 2008. This is probably the more complex of upgrade scenarios. Before you start, I strongly recommend reading Upgrade Toolkit for Windows SharePoint Services Sites and Templates guide published by Microsoft.We were able to simplify our upgrade process by performing the following simple steps: Backup the existing WSS 2.0 Content Database Upgrade the WSS 2.0 content database to WSS 3.0 Upgrade the WSS 2.0 site templates to WSS 3.0 Take special consideration when upgrading WSS 3.0 to WS2008/Vista on IIS 7 SQL Server 2000 to SQL Server 2005 UpgradeYou'll be needing at least SQL Server 2005 and Reporting Services to run TFS 2008 against. Running this on Windows Server 2008? I recommend a full fledged SQL 2008 upgrade, but if you want, you can get SQL Server 2005 Reporting Services running on Win 2k8/IIS 7 with some work. Running into permissions issues? Check here. TFS giving you error 29112 when installing TFS 2008 and Reporting Services as part of a scale-out installation? Check here. Once again, Reporting Services will give you all sorts of hell on IIS 7. Check here for fixes. TFS Application tier 2005 to 2008 UpgradeThe recommended way to upgrade TFS is using in-place upgrade mode. Basically, you pop the TFS 2008 install DVD in the drive of your existing TFS Server, and follow some simple steps. 1) Make a backup of your TFS and WSS databases, 2) go through the install process. When you go through the install process, TFS will pick up the Application tier's installed location and perform a database and application tier upgrade in-place. This process has drastically been improved in the TFS 2008 installer, however, there's one caveat that you should know about. If you want to upgrade your TFS installation *and* move it to a new server, you will need to uninstall your existing TFS installation, upgrade your database manually and then re-install the new TFS installation. Failure to do so will cause TFS to be configured as a failover node instead of a new TFS installation (whoops). If you're having problems, here's some likely fixes: A better upgrade guide than mine accounts for TF220064, Error 29109, 32000 and 32000. This guide goes through all the steps necessary to manually update an Internet-facing TFS 2005 installation to a new server with TFS 2008. Here's another small gem which describes an error in a number of SQL Server reports in the TFS installation that can cause 32000 errors to occur. Lastly, the best idea I've heard so far is to slipstream the SP1 install into your TFS 2008 install. TFS Database Tier UpgradeThere's a way to do an upgrade on just the TFS database and not the application tier in preparation of a TFS 2008 upgrade or addition of a failover cluster. Don't do it. I won't even post the instructions in this blog post because it's just a bad, bad idea. Let the TFS installer do this job for you -- it's better that way. You're one collation setting away from disaster if you try it on your own :) Team Build 2008Team Build 2008 is words better than it's predecessor, and is a very easy install. Simply insert the TFS 2008 DVD and click install. A new Windows Service and TfsBuild database will be created to hold build definitions. Technorati Tags: TFS 2008