<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.netindonesia.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Incoherent Rambling</title><link>http://geeks.netindonesia.net/blogs/jimmy/default.aspx</link><description>.Net, coding, architecture and life in general</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Operation could destabilize the runtime</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/28/operation-could-destabilize-the-runtime.aspx</link><pubDate>Thu, 28 Aug 2008 11:09:49 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:64746</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=64746</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/28/operation-could-destabilize-the-runtime.aspx#comments</comments><description>&lt;p&gt;I was trying to reproduce Repository pattern that Rob Conery was using in his MVC Store Front project in my own project.&lt;/p&gt; &lt;p&gt;&lt;br /&gt;Continuing with the interface programming style hype, I decided to make everything implement some sort of an interface.&amp;nbsp; So my domain object (say Person), will implement IPerson interface and so on.&lt;/p&gt; &lt;p&gt;So I have an IPersonRepository that will have a couple of implementations.&amp;nbsp; One for testing (TestPersonRepository : IPersonRepository) and a real Linq To Sql implmentation (SqlPersonRepository : IPersonRepository).&lt;/p&gt; &lt;p&gt;The repository has one method, which is IQueryable&amp;lt;IPerson&amp;gt; GetPersons() that will return all the available persons.&lt;/p&gt; &lt;p&gt;My test which was using the TestPersonRepository implementation works well.&amp;nbsp; But when I tried integrating my code using the real Linq to Sql implementation, it blew up. &lt;/p&gt; &lt;p&gt;The code for the SqlPersonRepository implementation is as follow:&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;IPerson&amp;gt; GetPersons() &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    var db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Data.Linq.SampleDbContext();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    var query = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Persons&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                    select (IPerson) &lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Person {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;                      FirstName = p.FirstName, LastName = p.LastName&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                    };&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; query;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As you can see, I was trying to cast Person to IPerson in the Linq query.&amp;nbsp; This apparently didn&amp;#39;t work. Hehehe.&amp;nbsp; Changing all my interface to IQueryable&amp;lt;Person&amp;gt; and removing the casting will make it work.&lt;/p&gt;
&lt;p&gt;Another work around that I found to work is using the following code:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;IPerson&amp;gt; GetPerson()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    var db = &lt;span class="kwrd"&gt;new&lt;/span&gt; Data.Linq.SampleDbContext();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    var query = from p &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Persons&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                        select p;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    IList&amp;lt;IPerson&amp;gt; results = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;IPerson&amp;gt;();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt;(var p &lt;span class="kwrd"&gt;in&lt;/span&gt; query)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        results.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; Domain.Person { FirstName = p.FirstName, LastName = p.LastName });&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; results.AsQueryable();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sucks :)&lt;/p&gt;
&lt;p&gt;Anyone want to take a stab at what&amp;#39;s going on here?&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/28/operation-could-destabilize-the-runtime.aspx&amp;amp;subject=Operation could destabilize the runtime" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/28/operation-could-destabilize-the-runtime.aspx&amp;amp;t=Operation+could+destabilize+the+runtime" target="_blank" title="Submit Operation could destabilize the runtime to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/28/operation-could-destabilize-the-runtime.aspx&amp;amp;title=Operation+could+destabilize+the+runtime" target="_blank" title="Submit Operation could destabilize the runtime to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/28/operation-could-destabilize-the-runtime.aspx&amp;amp;phase=2" target="_blank" title="Submit Operation could destabilize the runtime to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/28/operation-could-destabilize-the-runtime.aspx&amp;amp;title=Operation+could+destabilize+the+runtime" target="_blank" title="Add Operation could destabilize the runtime to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64746" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/SQL/default.aspx">SQL</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Generic/default.aspx">Generic</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Anonymous+Type/default.aspx">Anonymous Type</category></item><item><title>How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/26/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx</link><pubDate>Tue, 26 Aug 2008 00:18:00 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:64406</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=64406</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/26/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx#comments</comments><description>&lt;p&gt;In a recent project that I was handling, there was a requirement to have a forum on top of an existing &lt;a title="Graffiti CMS" href="http://graffiticms.com/" target="_blank"&gt;Graffiti CMS&lt;/a&gt;.&amp;nbsp; Instead of building one from scratch I decided to look for an open source .NET forum engine alternative.&amp;nbsp; That&amp;#39;s when I ran into &lt;a title="Yet Another Forum .NET" href="http://www.yetanotherforum.net/" target="_blank"&gt;Yet Another Forum.Net&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The task is simple enough.&amp;nbsp; add a forum virtual directory and when someone click a link to http://blah/forum, YAF.NET should work.&lt;/p&gt;
&lt;p&gt;After downloading the forum distributable and adding it as a Graffiti CMS virtual directory, some problems start showing up.&lt;/p&gt;
&lt;p&gt;You can follow &lt;a title="How to embed YAF.NET in an existing ASP.NET application" href="http://wiki.yetanotherforum.net/embeddedYaf.ashx" target="_blank"&gt;some steps&lt;/a&gt; described in the YAF.NET Installation Steps&amp;nbsp; section in their Wiki to mitigate the problem but it doesn&amp;#39;t get you 100% there.&lt;/p&gt;
&lt;p&gt;Playing around with it, I managed to get it to work with the following steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;- Get YAF.NET to work as a standalone application (setup db, etc.).&amp;nbsp; If you can get it to work, you are about 90% there. 
&lt;li&gt;- Remove YAF.NET application from IIS Manager 
&lt;li&gt;- Add YAF.NET directory as a virtual directory of Graffiti or copy the entire YAF.NET directory to Graffiti root folder/forum. I.e. if you Graffiti CMS is installed in D:\Graffiti\Web, then copy YAF.NET content to D:\Graffiti\Web\Forum 
&lt;li&gt;- Copy all bin folder contents from YAF.NET directory to Graffiti bin folder 
&lt;li&gt;- Copy yafnet.config and urlrewriter.config to root directory of Graffiti 
&lt;li&gt;- Make sure to rename the web.config in YAF.NET directory back to default.config so it does not run 
&lt;li&gt;- In Graffiti CMS web.config, you need to make some modifications like: 
&lt;li&gt;- copy the configSection from default.config in YAF.NET directory across 
&lt;li&gt;- copy &amp;lt;yafnet ...&amp;gt; and &amp;lt;rewriter ...&amp;gt; from default.config across 
&lt;li&gt;- create a &amp;lt;location path=&amp;quot;forum&amp;quot;&amp;gt; in Graffiti CMS web.config and copy the &amp;lt;system.web&amp;gt;...&amp;lt;/system.web&amp;gt; from default.config into the &amp;lt;location...&amp;gt; tag. 
&lt;li&gt;- Make modification to &amp;lt;pages ...&amp;gt; tag in the newly copied part in the previous step.&amp;nbsp; You need to copy &amp;lt;namespaces&amp;gt; and its content from Graffiti web.config and change &amp;lt;add namespace...&amp;gt; to &amp;lt;remove namespace...&amp;gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;That&amp;#39;s it.&amp;nbsp; Test both Graffiti CMS and the newly integrated YAF.NET to make sure they work.&lt;/p&gt;
&lt;p&gt;Attached is a sample of the modified Graffiti CMS web.config&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/26/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;subject=How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/26/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;t=How+to+Make+Yet+Another+Forum.Net+to+Work+with+Telligent+Graffiti+CMS" target="_blank" title="Submit How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/26/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;title=How+to+Make+Yet+Another+Forum.Net+to+Work+with+Telligent+Graffiti+CMS" target="_blank" title="Submit How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/26/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;phase=2" target="_blank" title="Submit How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/26/how-to-make-yet-another-forum-net-to-work-with-telligent-graffiti-cms.aspx&amp;amp;title=How+to+Make+Yet+Another+Forum.Net+to+Work+with+Telligent+Graffiti+CMS" target="_blank" title="Add How to Make Yet Another Forum.Net to Work with Telligent Graffiti CMS to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64406" width="1" height="1"&gt;</description><enclosure url="http://geeks.netindonesia.net/blogs/jimmy/attachment/64406.ashx" length="11262" type="text/plain" /><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Tips/default.aspx">Tips</category></item><item><title>Interesting MVC Sample Project</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/25/interesting-mvc-sample-project.aspx</link><pubDate>Mon, 25 Aug 2008 06:36:11 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:64364</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=64364</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/25/interesting-mvc-sample-project.aspx#comments</comments><description>&lt;p&gt;I was listening to some podcasts or other, I think it was one of the &lt;a title="Herding Code Podcast" href="http://herdingcode.com/" target="_blank"&gt;Herding Code&lt;/a&gt; podcasts, where they interview Rob Conery and his sample MVC project.&amp;nbsp; In which he walked you through the process of creating this MVC Storefront using ASP.NET MVC, TDD, LINQ, Dependency Injections, etc.&amp;nbsp; The format of it is a webcast that you can download and playback at your own leisure.&lt;/p&gt; &lt;p&gt;Along the way he consulted other experts in the .NET world such as Ayende Rahien (Oren Eini) of NHibernate and RhinoMock fame, Jon Galloway, etc.&lt;/p&gt; &lt;p&gt;If you are interested in doing MVC and this type of stuffs, I strongly suggest you take a look at his webcasts.&lt;/p&gt; &lt;p&gt;You can find the stuff &lt;a title="MVC Storefront" href="http://blog.wekeroad.com/mvc-storefront/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Rob is also the creator of &lt;a title="Subsonic Project" href="http://subsonicproject.com/" target="_blank"&gt;Subsonic&lt;/a&gt; (data access layer scaffolder / mapper or something for lack of better term).&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/25/interesting-mvc-sample-project.aspx&amp;amp;subject=Interesting MVC Sample Project" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/25/interesting-mvc-sample-project.aspx&amp;amp;t=Interesting+MVC+Sample+Project" target="_blank" title="Submit Interesting MVC Sample Project to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/25/interesting-mvc-sample-project.aspx&amp;amp;title=Interesting+MVC+Sample+Project" target="_blank" title="Submit Interesting MVC Sample Project to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/25/interesting-mvc-sample-project.aspx&amp;amp;phase=2" target="_blank" title="Submit Interesting MVC Sample Project to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/25/interesting-mvc-sample-project.aspx&amp;amp;title=Interesting+MVC+Sample+Project" target="_blank" title="Add Interesting MVC Sample Project to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64364" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Video/default.aspx">Video</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/ASP.NET/default.aspx">ASP.NET</category></item><item><title>100% Customized Development Effort vs Customization of Available Solutions</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/23/100-customized-development-effort-vs-customization-of-available-solutions.aspx</link><pubDate>Sat, 23 Aug 2008 03:57:43 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:64136</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=64136</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/23/100-customized-development-effort-vs-customization-of-available-solutions.aspx#comments</comments><description>&lt;p&gt;Sometimes, and I am also guilty at this as well, we tend to want to develop a fully 100% customized solution from the very beginning, may it be an ASP.NET website or otherwise.&amp;nbsp; After all, what fun is it in trying to customize someone else&amp;#39;s code, right?&amp;nbsp; Sometimes, it&amp;#39;s just because we are not familiar with or don&amp;#39;t have the time to look around / research what&amp;#39;s out there that someone else has already built that might suit our project requirements.&lt;/p&gt; &lt;p&gt;Nowadays, I am of the opinion that spending your time looking around and trying to find out if there is such solution is really worthwhile and could really help you deliver the solution faster.&lt;/p&gt; &lt;p&gt;Of course, even if you do find the solution, you will still need to analyze if you need to further customize it or not.&amp;nbsp; Perhaps the current solution will only cover 80% of your current requirements and you will need to spend time to fill in the 20% gap doing further customizations.&lt;/p&gt; &lt;p&gt;Sometimes such solution package is not too extensible, then you will need to consider what to do about the rest 20%.&amp;nbsp; Do you build an &amp;#39;out-of-bound&amp;#39; customized solution to fill in the gap?&amp;nbsp; Can you hook it up to the lower level implementation of the current solution? i.e. go straight to the database and mess around with it?&amp;nbsp; Those are risks that you will need to spend your time thinking about.&lt;/p&gt; &lt;p&gt;Another consideration that you need to take is how long will it take you and your team to figure out all the extensibility points of the current solution?&amp;nbsp; Will it be longer than if you actually build up your own solution from scratch?&amp;nbsp; In most cases, the answer will be no (time to customize an existing solution will not take longer than building one from scratch).&amp;nbsp; But reflect on this point as well since you might find the answer is contrary to common thinking.&lt;/p&gt; &lt;p&gt;Just rambling on a thought that came into my mind during one of the projects that I&amp;#39;m doing.&amp;nbsp; I hope this can be of use to you.&lt;/p&gt; &lt;p&gt;Happy analyzing :)&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/23/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;subject=100% Customized Development Effort vs Customization of Available Solutions" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/23/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;t=100%25+Customized+Development+Effort+vs+Customization+of+Available+Solutions" target="_blank" title="Submit 100% Customized Development Effort vs Customization of Available Solutions to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/23/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;title=100%25+Customized+Development+Effort+vs+Customization+of+Available+Solutions" target="_blank" title="Submit 100% Customized Development Effort vs Customization of Available Solutions to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/23/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;phase=2" target="_blank" title="Submit 100% Customized Development Effort vs Customization of Available Solutions to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/23/100-customized-development-effort-vs-customization-of-available-solutions.aspx&amp;amp;title=100%25+Customized+Development+Effort+vs+Customization+of+Available+Solutions" target="_blank" title="Add 100% Customized Development Effort vs Customization of Available Solutions to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64136" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Tips/default.aspx">Tips</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Sharing/default.aspx">Sharing</category></item><item><title>Reflecting over Software Usability</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/22/reflecting-over-software-usability.aspx</link><pubDate>Fri, 22 Aug 2008 07:19:51 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:64065</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=64065</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/22/reflecting-over-software-usability.aspx#comments</comments><description>&lt;p&gt;I was entertaining my two and a half year old boy a couple days back.&amp;nbsp; I&amp;#39;m just amazed on how quick kids nowadays can adapt to technology.&amp;nbsp; At that age, he already mastered how to use the mouse to navigate, click and drag and drop stuffs.&lt;/p&gt; &lt;p&gt;Lately he&amp;#39;s been hooked on &lt;a title="Scott Hanselman&amp;#39;s Blog" href="http://www.hanselman.com" target="_blank"&gt;Scott Hanselman&lt;/a&gt;&amp;#39;s &lt;a title="Baby Smash" href="http://www.babysmash.com" target="_blank"&gt;Baby Smash&lt;/a&gt;, &lt;a title="YouTube" href="http://www.youtube.com" target="_blank"&gt;YouTube&lt;/a&gt; kids videos like the &lt;a title="Alphabet song" href="http://www.youtube.com/watch?v=0fw3l1z9CUQ" target="_blank"&gt;Alphabet Song&lt;/a&gt;, etc. and &lt;a title="Sesame Street" href="http://www.sesamestreet.org" target="_blank"&gt;Sesame Street&lt;/a&gt; website which is full of games and activities for kids his age.&lt;/p&gt; &lt;p&gt;I can give him instruction already on how to use most of the stuffs that are on the screen (i.e. go click that red button there, or just drag the lemon to the jug, etc.)&amp;nbsp; and he could execute the instruction just fine.&amp;nbsp; Recently, I don&amp;#39;t even have to tell him how to switch between YouTube videos, etc.&amp;nbsp; He&amp;#39;ll do it by himself.&amp;nbsp; As a matter of fact, he&amp;#39;d push me aside so not to disturb him having fun.&lt;/p&gt; &lt;p&gt;One thing that amazed me recently is that he seems to understand on how to use the environment like Vista without me telling him the stuffs up front.&amp;nbsp; For example, one time we had FireFox running YouTube, Internet Explorer running a JavaScript HTML application that I built for him (bouncing box with numbers that keep changing color and a bunch of stuffs that you can do to the boxes) and a media player running one of his favorite videos.&amp;nbsp; By accident, he discovered that if he hovered near the taskbar, Vista will give you a preview of the application in a thumbnail.&amp;nbsp; As I watched him playing around with the mouse, I simply post a question to him asking if he could find out how to bring up the Sesame Street session (it was minimized at that time) and he instinctly knew that if he did the hover action, he could figure out which application is running Sesame Street and by clicking on it he was able to bring up IE to the front.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:e061a750-6059-47d9-9655-a1ef8f53261e" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/ReflectingoverSoftwareUsability_C94F/AppPreview-8x6.png" title="Example of Application Previewing in Vista" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/ReflectingoverSoftwareUsability_C94F/AppPreview_15.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Now, I don&amp;#39;t know if this is a testament of the UX brilliance of the Vista team or my kid is just plain smart, lol.&lt;/p&gt; &lt;p&gt;Just thought I share that with you all.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/22/reflecting-over-software-usability.aspx&amp;amp;subject=Reflecting over Software Usability" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/22/reflecting-over-software-usability.aspx&amp;amp;t=Reflecting+over+Software+Usability" target="_blank" title="Submit Reflecting over Software Usability to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/22/reflecting-over-software-usability.aspx&amp;amp;title=Reflecting+over+Software+Usability" target="_blank" title="Submit Reflecting over Software Usability to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/22/reflecting-over-software-usability.aspx&amp;amp;phase=2" target="_blank" title="Submit Reflecting over Software Usability to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/22/reflecting-over-software-usability.aspx&amp;amp;title=Reflecting+over+Software+Usability" target="_blank" title="Add Reflecting over Software Usability to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=64065" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Design/default.aspx">Design</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Vista/default.aspx">Vista</category></item><item><title>Debugging Adventure Fun Episode eerr... Whatever</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/16/debugging-adventure-fun-episode-eerr-whatever.aspx</link><pubDate>Sat, 16 Aug 2008 02:06:12 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:63244</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=63244</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/16/debugging-adventure-fun-episode-eerr-whatever.aspx#comments</comments><description>&lt;p&gt;I was recently asked to debug a legacy Access 97 (YES, Access 97, lol) database frontend application that is connecting to a SQL Server 7 (Yes, SQL Server 7, lol) backend (Like I said... it&amp;#39;s legacy, what do you expect ^_^).&amp;nbsp; To make things worse, I had to debug this through a remote VNC session since the problem is occuring somewhere in Kalimantan and I am in Jakarta.&amp;nbsp; What fun :), ... &lt;strong&gt;NOT&lt;/strong&gt;! Tried debugging it on a local copy that I have (in VM of course, heck, I am not going to install Office 97 stuffs on my main machine, hehehe, although I did this once before when I didn&amp;#39;t know better, hehehe.&amp;nbsp; It did work however - side by side Office 97 and Office 2003 installation, haven&amp;#39;t tried to do it with Office 2007, nor do I want to - btw, you have to do some tweaking here and there, but it worked.&amp;nbsp; Uhm... Sorry for digressing... Back to laptop, as they said it...), but couldn&amp;#39;t reproduce the error no matter what I do.&amp;nbsp; The application ran just fine on the VM.&amp;nbsp; So, the next logical step is to debug it where the problem is actually happening.&lt;/p&gt; &lt;p&gt;Anyhow, the problem presented to me was an error that kept showing up recently that stumped some unknown code module in the system (The error message provided is very generic like &amp;#39;Unable to fullfil your request&amp;#39;, apparently the person who created the application was well versed in security issue, you know... not exposing the internal system error to the client / user, but he forgot to log the real freaking error somewhere else for easy debugging...ARRGH. Oh, btw, if your Access application is hooked up to run some code automatically on load, you can launch it by holding down Shift key and double-clicking the .mdb file to stop the code from running.&amp;nbsp; Sometimes this is necessary to allow you access to the object viewer, etc.&amp;nbsp; Uhm... Back to laptop... (who the heck invented that phrase anyway...)&lt;/p&gt; &lt;p&gt;After setting numerous breakpoints and tracing the code from the startup form up to the point of failure (what a chore... stupid VNC won&amp;#39;t allow me to press F8, argh, so I have to click on the VBA debug menu item one click at the time to step into / through some code).&amp;nbsp; Oh, did I mentioned the sucky connection between Jakarta and our site in Kalimantan (in the middle of nowhere, literally in jungle, mining site)?&amp;nbsp; Yeah, the VNC connection broke down on multiple occassions!! OMG.&amp;nbsp; Speaking of hellish debugging session... Sigh. Ok, enough digressing... Back to laptop...&lt;/p&gt; &lt;p&gt;Erhmm... Where were we... oh yeah, after blah blah blah breakpoint, blah, and so on and what not... sigh... it turned out that the error was caused by a SQL Query that is constructed using string concatenation like:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;pre class="csharpcode"&gt;&lt;span class="str"&gt;&amp;quot;SELECT Field1, Field2 FROM SomeTable &amp;quot;&lt;/span&gt; + _
&lt;span class="str"&gt;&amp;quot;WHERE Timestamp = &amp;#39;&amp;quot;&lt;/span&gt; + FormatMySillyDate(Now()) +&lt;span class="str"&gt;&amp;quot;&amp;#39; &amp;quot;&lt;/span&gt; + _
&lt;span class="str"&gt;&amp;quot;AND some other criteria here (not important)...&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And when the query got shoved to SQL Server through DAO, SQL just said huh? what date are you talking about... that&amp;#39;s not a date!! and gave up.&lt;/p&gt;
&lt;p&gt;Aside from the abysmal lacking of clear exception information available from the error handling routine that made debugging this application a hellish experience (oh and the VNC, and the network, etc. etc.), my gut instinct pointed me that this could be a localization issue.&amp;nbsp; Since it worked perfectly on my VM (couldn&amp;#39;t reproduce the error, remember?), it&amp;#39;s clearly local to this one workstation (and it was confirmed by the operator that the one installed on the other computer is working just fine.)&amp;nbsp; So... after confirming that the formatted date being passed is something like &amp;#39;18-&lt;strong&gt;&lt;font color="#ff0000"&gt;Agust&lt;/font&gt;&lt;/strong&gt;-2008&amp;#39;, next step that I took is take a look at the Regional Settings of the computer and sure enough, it was set to Indonesian localization :).&amp;nbsp; Changing this back to English (United States), fixed the problem.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After strongly warning the user about the &amp;quot;danger&amp;quot; of switching Regional Settings unilaterally and forwarded the issue and resolution to the support (help) desk team (just in case, in the future...), I finally could rest in peace, phew... (or if the boss is watching, rest in peace == back to working hard on the gazillions of other projects, simulteneously, and maintenance issues)&amp;nbsp; There goes 2 hours of my life that I&amp;#39;ll never get back.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Moral of the story is... you figure it out. I am beat (mentally) from debugging this... (^_^).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I apologize for rambling too much, but didn&amp;#39;t you read my blog title? Hehehe.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;p.s. Any exaggeration is purely for comical effect and not to be taken seriously.&amp;nbsp; Funnier to read that way... Bah, why am I explaining this... Sigh.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/16/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;subject=Debugging Adventure Fun Episode eerr... Whatever" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/16/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;t=Debugging+Adventure+Fun+Episode+eerr...+Whatever" target="_blank" title="Submit Debugging Adventure Fun Episode eerr... Whatever to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/16/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;title=Debugging+Adventure+Fun+Episode+eerr...+Whatever" target="_blank" title="Submit Debugging Adventure Fun Episode eerr... Whatever to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/16/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;phase=2" target="_blank" title="Submit Debugging Adventure Fun Episode eerr... Whatever to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/16/debugging-adventure-fun-episode-eerr-whatever.aspx&amp;amp;title=Debugging+Adventure+Fun+Episode+eerr...+Whatever" target="_blank" title="Add Debugging Adventure Fun Episode eerr... Whatever to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63244" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Fun/default.aspx">Fun</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Rant/default.aspx">Rant</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Tips/default.aspx">Tips</category></item><item><title>New Cool Stuffs in Team Foundation Server 2008</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/new-cool-stuffs-in-team-foundation-server-2008.aspx</link><pubDate>Thu, 14 Aug 2008 02:03:44 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:63123</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=63123</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/new-cool-stuffs-in-team-foundation-server-2008.aspx#comments</comments><description>&lt;p&gt;Installed Team Foundation Server 2008 Workgroup Edition a couple of days back and been playing around with it.&lt;/p&gt; &lt;p&gt;One thing that I like about TFS 2008 is that they revamped the build process so now you can do Continuous Integration (build when you check-in) / Nightly, and other build settings right from inside VSTS / Team Explorer.&amp;nbsp; Awesome!! :)&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;subject=New Cool Stuffs in Team Foundation Server 2008" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;t=New+Cool+Stuffs+in+Team+Foundation+Server+2008" target="_blank" title="Submit New Cool Stuffs in Team Foundation Server 2008 to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;title=New+Cool+Stuffs+in+Team+Foundation+Server+2008" target="_blank" title="Submit New Cool Stuffs in Team Foundation Server 2008 to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;phase=2" target="_blank" title="Submit New Cool Stuffs in Team Foundation Server 2008 to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/new-cool-stuffs-in-team-foundation-server-2008.aspx&amp;amp;title=New+Cool+Stuffs+in+Team+Foundation+Server+2008" target="_blank" title="Add New Cool Stuffs in Team Foundation Server 2008 to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63123" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/TFS/default.aspx">TFS</category></item><item><title>Apparently VS 2008 SP 1...</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/apparently-vs-2008-sp-1.aspx</link><pubDate>Thu, 14 Aug 2008 01:28:44 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:63118</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=63118</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/apparently-vs-2008-sp-1.aspx#comments</comments><description>&lt;p&gt;Apparently, if you install Visual Studio 2008 Service Pack 1, you don&amp;#39;t need to install .Net Framework 3.5 SP 1 anymore (already included).&amp;nbsp; It also installed .Net Framework 2.0 SP 2 and .Net Framework 30. SP 2... Apparently.&lt;/p&gt; &lt;p&gt;Btw.&amp;nbsp; What&amp;#39;s in the SP2s?&amp;nbsp; Can&amp;#39;t find those online to download separately.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/apparently-vs-2008-sp-1.aspx&amp;amp;subject=Apparently VS 2008 SP 1..." target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/apparently-vs-2008-sp-1.aspx&amp;amp;t=Apparently+VS+2008+SP+1..." target="_blank" title="Submit Apparently VS 2008 SP 1... to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/apparently-vs-2008-sp-1.aspx&amp;amp;title=Apparently+VS+2008+SP+1..." target="_blank" title="Submit Apparently VS 2008 SP 1... to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/apparently-vs-2008-sp-1.aspx&amp;amp;phase=2" target="_blank" title="Submit Apparently VS 2008 SP 1... to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/apparently-vs-2008-sp-1.aspx&amp;amp;title=Apparently+VS+2008+SP+1..." target="_blank" title="Add Apparently VS 2008 SP 1... to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63118" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Tabular XML Data to Hierachical XML Data Translation with XSLT</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx</link><pubDate>Thu, 14 Aug 2008 01:26:19 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:63117</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=63117</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx#comments</comments><description>&lt;p&gt;On &lt;a title="Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server 2005" href="http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx" target="_blank"&gt;previous post&lt;/a&gt;, we discussed creating a hierarchical XML from tabular data using only T-SQL.&amp;nbsp;&amp;nbsp; &lt;/p&gt; &lt;p&gt;On this post, we&amp;#39;ll explore transforming tabular data in XML format to a hierarchical XML format using purely XSLT.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s say that we have an XML that is pretty tabular like the one below.&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml-stylesheet&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/xsl&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;[replace with the real stylesheet filename here].xsl&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Science&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Spock&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Command&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Kirk&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Engineering&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Scotty&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Medical&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Bones&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Science&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Ensign Disposable&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Medical&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Nurse Hatchet&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mapping&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 1. &lt;strong&gt;Tabular Star Trek Crew to Station Mapping xml&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="kwrd"&gt;And we want to transform it into something like:&lt;/span&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Command&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Kirk&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Engineering&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Scotty&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Medical&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Bones&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Nurse Hatchet&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Science&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Ensign Disposable&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Spock&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 2. &lt;strong&gt;Hierachical Star Trek Crew to Station Mapping xml&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You can use the following XSLT to do it:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;utf-8&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt; &lt;span class="attr"&gt;xmlns:xsl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="attr"&gt;xmlns:ms&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:xslt&amp;quot;&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;                &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:output&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xml&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;indent&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;yes&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="rem"&gt;&amp;lt;!-- Store unique station names in variable --&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:variable&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;uniqueStations&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;//Mapping[not(Station=preceding-sibling::Mapping/Station)]/Station&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;match&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;        &lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:call-template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;processStations&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Mappings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;processStations&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$uniqueStations&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:sort&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;data-type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Name&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:variable&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;currentStationCrews&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;//Mapping[Station=current()]/Crew&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;                &lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;$currentStationCrews&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:sort&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;current()&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crew&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Crews&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Station&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:for-each&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 3. &lt;strong&gt;XSLT Needed for the Transformation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Frankly, I don&amp;#39;t quite like this particular XSLT format since it is quite imperative in style (for each looping), but I couldn&amp;#39;t find a more declarative template matching solution for this.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If anyone know a better solution, let me know.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;One part that I like from this particular sample is by adding&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml-stylesheet&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;text/xsl&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;href&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;[filename].xsl&amp;quot;&lt;/span&gt; ?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;to the xml file like in Fig. 1, you can test the transformation quickly just by invoking the xml file from a browser (Internet Explorer / FireFox will do this nicely).&amp;nbsp; The only thing is that you can&amp;#39;t really see the actual tag on screen.&amp;nbsp; To quickly verify the resulting transformed XML, you can enter the following JavaScript code into the URL bar of your browser:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;BLOCKED SCRIPTalert(document.documentElement.innerHTML)&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Giving credit where credit is due... I used &lt;a title="Simple XSLT &amp;amp; XPath grouping" href="http://aspalliance.com/34" target="_blank"&gt;this ASP Alliance article&lt;/a&gt; by &lt;strong&gt;Teemu Keiski&lt;/strong&gt; as base for this solution.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;subject=Tabular XML Data to Hierachical XML Data Translation with XSLT" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;t=Tabular+XML+Data+to+Hierachical+XML+Data+Translation+with+XSLT" target="_blank" title="Submit Tabular XML Data to Hierachical XML Data Translation with XSLT to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;title=Tabular+XML+Data+to+Hierachical+XML+Data+Translation+with+XSLT" target="_blank" title="Submit Tabular XML Data to Hierachical XML Data Translation with XSLT to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;phase=2" target="_blank" title="Submit Tabular XML Data to Hierachical XML Data Translation with XSLT to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/14/tabular-xml-data-to-hierachical-xml-data-translation-with-xslt.aspx&amp;amp;title=Tabular+XML+Data+to+Hierachical+XML+Data+Translation+with+XSLT" target="_blank" title="Add Tabular XML Data to Hierachical XML Data Translation with XSLT to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63117" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/xml/default.aspx">xml</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/XSLT/default.aspx">XSLT</category></item><item><title>Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005)</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx</link><pubDate>Tue, 12 Aug 2008 09:53:14 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:63046</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=63046</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx#comments</comments><description>&lt;p&gt;A friend of mine asked me today if there is any easy way to transform a table / query result that is quite tabular like the one in the table below to a hierarchical XML format just by using T-SQL query.&lt;/p&gt; &lt;table cellspacing="0" cellpadding="5"&gt;  &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Id&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Product&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Activity&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;1&lt;/td&gt; &lt;td&gt;Product A&lt;/td&gt; &lt;td&gt;Activity A&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2&lt;/td&gt; &lt;td&gt;Product A&lt;/td&gt; &lt;td&gt;Activity B&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;Product B&lt;/td&gt; &lt;td&gt;Activity C&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;4&lt;/td&gt; &lt;td&gt;Product C&lt;/td&gt; &lt;td&gt;Activity D&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;p style="font-size:0.7em;"&gt;Fig 1.&lt;strong&gt; ProductMapping Table&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product A&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity A&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity B&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product B&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity C&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product C&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Activity D&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;activity&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;activities&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 2.&lt;strong&gt; Expected XML Result&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Although I dabble in XML, XPATH, XSLT and the like from .NET / JavaScript; I&amp;#39;ve never really touched SQL Server XML features that much so I decided to play around a little with it.&lt;/p&gt;
&lt;p&gt;The only thing I remember about T-SQL and XML is that they have this &lt;strong&gt;FOR XML&lt;/strong&gt; keyword that will allow you to transform table data to XML ... somehow.&lt;/p&gt;
&lt;p&gt;After a bit of researching and trial and error, I came up with the following T-SQL Query:&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;DISTINCT&lt;/span&gt; product &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;&lt;span class="kwrd"&gt;desc&lt;/span&gt;&amp;quot;,&lt;/pre&gt;&lt;pre class="alt"&gt;    (&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;            activity &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;*&amp;quot;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;            ProductMapping m2&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;            m2.product = m1.product&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;activity&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;activities&amp;#39;&lt;/span&gt;)&lt;/pre&gt;&lt;pre class="alt"&gt;    ) &lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    ProductMapping m1 &lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;product&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;products&amp;#39;&lt;/span&gt;)&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 3.&lt;strong&gt; First T-SQL attempt for transforming tabular data to XML&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This gets me pretty close to what I want, but for some reasons the subquery result is HTML encoded.&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product A&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity A&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity B&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product B&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity C&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Product C&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;desc&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;Activity D&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activity&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/activities&lt;span class="attr"&gt;&amp;amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;product&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;products&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 4.&lt;strong&gt; Bad XML!!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After researching a little bit more and could not find a satisfactory and clean answer to do this, I finally just gave up and wrapped the above T-SQL in another SELECT statement with a bunch of replace functions surrounding it to transform all the &lt;strong&gt;&amp;amp;lt;&lt;/strong&gt; and &lt;strong&gt;&amp;amp;gt;&lt;/strong&gt; to actual &lt;strong&gt;&amp;lt;&lt;/strong&gt; and &lt;strong&gt;&amp;gt;&lt;/strong&gt;. &lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; &lt;/pre&gt;&lt;pre&gt;    replace(&lt;/pre&gt;&lt;pre class="alt"&gt;    replace(&lt;/pre&gt;&lt;pre&gt;    (&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;DISTINCT&lt;/span&gt; product &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;&lt;span class="kwrd"&gt;desc&lt;/span&gt;&amp;quot;,&lt;/pre&gt;&lt;pre class="alt"&gt;            (&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;SELECT&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    activity &lt;span class="kwrd"&gt;AS&lt;/span&gt; &amp;quot;*&amp;quot;&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;                    ProductMapping m2&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; &lt;/pre&gt;&lt;pre class="alt"&gt;                    m2.product = m1.product&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;activity&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;activities&amp;#39;&lt;/span&gt;)) &lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;FROM&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            ProductMapping m1 &lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;FOR&lt;/span&gt; XML &lt;span class="kwrd"&gt;PATH&lt;/span&gt;(&lt;span class="str"&gt;&amp;#39;product&amp;#39;&lt;/span&gt;), ROOT(&lt;span class="str"&gt;&amp;#39;products&amp;#39;&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;    ),&lt;/pre&gt;&lt;pre class="alt"&gt;    N&lt;span class="str"&gt;&amp;#39;&amp;amp;lt;&amp;#39;&lt;/span&gt;, N&lt;span class="str"&gt;&amp;#39;&amp;lt;&amp;#39;&lt;/span&gt;),&lt;/pre&gt;&lt;pre&gt;    N&lt;span class="str"&gt;&amp;#39;&amp;amp;gt;&amp;#39;&lt;/span&gt;, N&lt;span class="str"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Products XML]&lt;/pre&gt;&lt;/div&gt;
&lt;p style="font-size:0.7em;"&gt;Fig 5.&lt;strong&gt; This T-SQL gets me what I want but it&amp;#39;s not really elegant.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Anyone know a better T-SQL only way to do this?&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;subject=Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005)" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;t=Transforming+Denormalized+Tabular+Data+to+Hierarchical+XML+Using+SQL+Server+(2005)" target="_blank" title="Submit Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;title=Transforming+Denormalized+Tabular+Data+to+Hierarchical+XML+Using+SQL+Server+(2005)" target="_blank" title="Submit Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;phase=2" target="_blank" title="Submit Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/08/12/transforming-denormalized-tabular-data-to-hierarchical-xml-using-sql-server-2005.aspx&amp;amp;title=Transforming+Denormalized+Tabular+Data+to+Hierarchical+XML+Using+SQL+Server+(2005)" target="_blank" title="Add Transforming Denormalized Tabular Data to Hierarchical XML Using SQL Server (2005) to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=63046" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/SQL/default.aspx">SQL</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/xml/default.aspx">xml</category></item><item><title>What Version of K2 [blackpearl] am I Running?</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/21/what-version-of-k2-blackpearl-am-i-running.aspx</link><pubDate>Mon, 21 Jul 2008 07:35:40 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:57249</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=57249</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/21/what-version-of-k2-blackpearl-am-i-running.aspx#comments</comments><description>&lt;p&gt;Note to self:&amp;nbsp; To quickly see what version of K2 [blackpearl] you are currently running, just go to Control Panel, Add Remove Program and it should be there as part of the product name.&lt;/p&gt; &lt;p&gt;Needed this information when submitting a ticket to K2 Customer portal and I didn&amp;#39;t quite recall what latest version was running on our production server.&amp;nbsp; Took a guess and it turned out to be wrong.&amp;nbsp; Chatted with K2 support and they told me how to quickly get that info. &lt;/p&gt; &lt;p&gt;Now, why didn&amp;#39;t I think of doing that before?&amp;nbsp; Hehehe.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8DA3F9A4-C663-4e21-8FB6-77A6D04DD161:b643d610-308b-4763-8d70-fc5cf5b57489" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;img src="http://i237.photobucket.com/albums/ff133/onionethan/onion_Emoticons//024_.gif" border="0" alt="emoticon" /&gt;&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/21/what-version-of-k2-blackpearl-am-i-running.aspx&amp;amp;subject=What Version of K2 [blackpearl] am I Running?" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/21/what-version-of-k2-blackpearl-am-i-running.aspx&amp;amp;t=What+Version+of+K2+%5bblackpearl%5d+am+I+Running%3f" target="_blank" title="Submit What Version of K2 [blackpearl] am I Running? to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/21/what-version-of-k2-blackpearl-am-i-running.aspx&amp;amp;title=What+Version+of+K2+%5bblackpearl%5d+am+I+Running%3f" target="_blank" title="Submit What Version of K2 [blackpearl] am I Running? to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/21/what-version-of-k2-blackpearl-am-i-running.aspx&amp;amp;phase=2" target="_blank" title="Submit What Version of K2 [blackpearl] am I Running? to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/21/what-version-of-k2-blackpearl-am-i-running.aspx&amp;amp;title=What+Version+of+K2+%5bblackpearl%5d+am+I+Running%3f" target="_blank" title="Add What Version of K2 [blackpearl] am I Running? to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=57249" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/K2+Blackpearl/default.aspx">K2 Blackpearl</category></item><item><title>Setting Destination Users as Mail Event Recipient in K2 BlackPearl</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/10/setting-destination-users-as-mail-event-recipient-in-k2-blackpearl.aspx</link><pubDate>Thu, 10 Jul 2008 10:07:13 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:55981</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=55981</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/10/setting-destination-users-as-mail-event-recipient-in-k2-blackpearl.aspx#comments</comments><description>&lt;p&gt;So, I was working on a K2 BP workflow project.&amp;nbsp; One of the requirement for the project is to email a bunch of users (ideally those belonging to a role of some sort) when something happen.&amp;nbsp; So far, so good.&amp;nbsp; It seems simple enough.&amp;nbsp; &lt;/p&gt; &lt;p&gt;With that in mind, I created the role in K2 BlackPearl Management Console, launch Visual Studio and created a K2 Workflow project, drag a Default Activity from my toolbox, quickly configured my Destination Users to the role that I created previously and finally, I drag a Mail Event to the Activity.&amp;nbsp; The configuration dialog for the mail event came up and I started filling in details of the email.&amp;nbsp; &lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:f754d43b-9413-4f7c-8b5b-eabff95b7587" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers-8x6.png" title="Setting up Activity&amp;#39;s Destination Users to Role" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers_49.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;When I want to specify the current Activity&amp;#39;s Destination User as my mail recipient I got a little surprised.&amp;nbsp; It&amp;#39;s not checkable!&amp;nbsp; Oh my...&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:7b02a4ed-a2db-43f6-8ef4-34fa3fc24750" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/MailEvent-8x6.png" title="Aargh! Can&amp;#39;t choose Destination User!" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/MailEvent_1510.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;I cancelled out from the screen since I couldn&amp;#39;t really do anything else except Cancel at this point.&amp;nbsp; Went back to the Activity Property dialog and made sure that I have Destination Users for it properly selected (which they are).&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8DA3F9A4-C663-4e21-8FB6-77A6D04DD161:fd3108b0-20cc-4b70-ac63-804559c2336d" style="padding-right:0px;display:inline;padding-left:0px;float:left;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;img src="http://i237.photobucket.com/albums/ff133/onionethan/onion_Emoticons//076_.gif" border="0" alt="emoticon" /&gt;&lt;/div&gt; &lt;p&gt;What&amp;#39;s going on here??? I did this before on another project and I was able to do &lt;strong&gt;just that&lt;/strong&gt; (check the Destination User as the recipient in my mail event, albeit I did encounter something similar to this situation but somehow managed to get it to work).&amp;nbsp; How come it wouldn&amp;#39;t let me do it this time?&lt;/p&gt; &lt;p&gt;After trying a couple more times and feeling frustrated, I decided to throw the towel and asked for help.&amp;nbsp; After chatting with a resource at SourceCode APAC (DC), he informed me to do the following:&lt;/p&gt; &lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; you need to change the dests to use &amp;quot;Plan per slot&amp;quot;&lt;/em&gt;  &lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; by default it uses &amp;quot;Plan once&amp;quot; option and the mail code isnt clever enough to get the list of users at run time&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Armed with the knowledge, I recalled doing something like this on the previous project.&amp;nbsp; Something involving &lt;strong&gt;running the Activity Destination Users Wizard in Advanced Mode&lt;/strong&gt;.&amp;nbsp; So I went back to my Activity property dialog and choose Destination Users icon from the left side and clicked the Back button to get the Welcome screen (that has this option).&amp;nbsp; Ticked the checkbox and clicked next again.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:97bb5b86-c183-4012-87aa-2ac322b93a93" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers1-8x6.png" title="Click Back button to go to the Welcome Screen" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers1_9.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:ebfa7975-b10a-41e8-b779-90ae6972f132" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers0-8x6.png" title="Check the Run this wizard in Advanced Mode" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers0_618.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:e9c4a261-0c37-4572-89af-c48502e2687c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers2-8x6.png" title="Destination Rule Options Dialog 1" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers2_569.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Once I clicked next, I arrived at the Destination Rule Options Dialog page.&amp;nbsp; From here I can choose other Options instead of the default &lt;strong&gt;Plan just once&lt;/strong&gt; option.&amp;nbsp; DC suggested &lt;strong&gt;Plan per slot&lt;/strong&gt;, but actually &lt;strong&gt;Plan per destination&lt;/strong&gt; will also work and in this case, I think is the more appropriate choice for me.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:f8ef63bf-1946-4e1a-acc3-f177f5c3329d" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers3-8x6.png" title="Destination Rule Options Dialog 2" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers3_18.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;I continued setting up my Destination Rule to fit my requirement (send notification and let anyone in my destination users (role) complete&amp;nbsp; the task and move on to the next step).&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:42e6b8cf-990d-4bef-9471-31f38d72438c" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers4-8x6.png" title="Setting up the Destination Set to a Role" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/DestinationUsers4_260.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Once I&amp;#39;m done with the activity&amp;#39;s Destination Users setup, I went back and insert a Mail Event into the activity and look what I can do now...&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:743f948e-7a33-4354-9424-e0f1ef2bb828" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/MailEvent2-8x6.png" title="TADA!! Destination User is checkable now" rel="thumbnail"&gt;&lt;img border="0" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SettingDestinationUsersasMailEventRecipi_F087/MailEvent2_712.png" alt="" /&gt;&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Thanks, DC.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:8DA3F9A4-C663-4e21-8FB6-77A6D04DD161:fe4b8a7f-5121-482d-bd2c-c5865fd32c24" style="padding-right:0px;display:inline;padding-left:0px;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;&lt;img src="http://i237.photobucket.com/albums/ff133/onionethan/onion_Emoticons//070_goodjob.gif" border="0" alt="emoticon" /&gt;&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/10/setting-destination-users-as-mail-event-recipient-in-k2-blackpearl.aspx&amp;amp;subject=Setting Destination Users as Mail Event Recipient in K2 BlackPearl" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/10/setting-destination-users-as-mail-event-recipient-in-k2-blackpearl.aspx&amp;amp;t=Setting+Destination+Users+as+Mail+Event+Recipient+in+K2+BlackPearl" target="_blank" title="Submit Setting Destination Users as Mail Event Recipient in K2 BlackPearl to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/10/setting-destination-users-as-mail-event-recipient-in-k2-blackpearl.aspx&amp;amp;title=Setting+Destination+Users+as+Mail+Event+Recipient+in+K2+BlackPearl" target="_blank" title="Submit Setting Destination Users as Mail Event Recipient in K2 BlackPearl to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/10/setting-destination-users-as-mail-event-recipient-in-k2-blackpearl.aspx&amp;amp;phase=2" target="_blank" title="Submit Setting Destination Users as Mail Event Recipient in K2 BlackPearl to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/10/setting-destination-users-as-mail-event-recipient-in-k2-blackpearl.aspx&amp;amp;title=Setting+Destination+Users+as+Mail+Event+Recipient+in+K2+BlackPearl" target="_blank" title="Add Setting Destination Users as Mail Event Recipient in K2 BlackPearl to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=55981" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/K2+Blackpearl/default.aspx">K2 Blackpearl</category></item><item><title>DataSet Xml Deserialization Data / Schema Load Order</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/08/dataset-xml-deserialization-data-schema-load-order.aspx</link><pubDate>Tue, 08 Jul 2008 07:53:05 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:55596</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=55596</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/08/dataset-xml-deserialization-data-schema-load-order.aspx#comments</comments><description>&lt;p&gt;Note to self:&lt;/p&gt; &lt;p&gt;When deserializing a dataset from xml, &lt;strong&gt;make sure to execute ReadXmlSchema before executing ReadXml,&lt;/strong&gt; otherwise you&amp;#39;ll have problem when you try casting your data into the correct data type.&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.IO;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ConsoleApplication1&lt;/pre&gt;&lt;pre&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;    &lt;span class="kwrd"&gt;class&lt;/span&gt; Program&lt;/pre&gt;&lt;pre&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Serialize the sample data&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            var ds          = InitDataSource();&lt;/pre&gt;&lt;pre class="alt"&gt;            var dataXml     = SerializeData(ds).ToString();&lt;/pre&gt;&lt;pre&gt;            var schemaXml   = SerializeSchema(ds).ToString();&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//Example of bad order&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            var dsBad = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataSet();&lt;/pre&gt;&lt;pre&gt;            dsBad.ReadXml(&lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(dataXml));&lt;/pre&gt;&lt;pre class="alt"&gt;            dsBad.ReadXmlSchema(&lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(schemaXml));&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Bad Example Result:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                Console.WriteLine(&lt;/pre&gt;&lt;pre&gt;                    &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0}:{1} {2:N2}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre class="alt"&gt;                        (&lt;span class="kwrd"&gt;int&lt;/span&gt;)dsBad.Tables[0].Rows[0][0],        &lt;span class="rem"&gt;//Will throw exception here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;                        dsBad.Tables[0].Rows[0][1],&lt;/pre&gt;&lt;pre class="alt"&gt;                        (&lt;span class="kwrd"&gt;decimal&lt;/span&gt;)dsBad.Tables[0].Rows[0][2]));&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                Console.WriteLine(ex.Message);&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            Console.WriteLine();&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            &lt;span class="rem"&gt;//Example of good order&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;            var dsGood = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataSet();&lt;/pre&gt;&lt;pre&gt;            dsGood.ReadXmlSchema(&lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(schemaXml));&lt;/pre&gt;&lt;pre class="alt"&gt;            dsGood.ReadXml(&lt;span class="kwrd"&gt;new&lt;/span&gt; StringReader(dataXml));&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Good Example Result:&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            Console.WriteLine(&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;{0}:{1} {2:N2}&amp;quot;&lt;/span&gt;,&lt;/pre&gt;&lt;pre&gt;                    (&lt;span class="kwrd"&gt;int&lt;/span&gt;)dsGood.Tables[0].Rows[0][0],&lt;/pre&gt;&lt;pre class="alt"&gt;                    dsGood.Tables[0].Rows[0][1],&lt;/pre&gt;&lt;pre&gt;                    (&lt;span class="kwrd"&gt;decimal&lt;/span&gt;)dsGood.Tables[0].Rows[0][2]));&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            Console.WriteLine();&lt;/pre&gt;&lt;pre class="alt"&gt;            Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Press any key...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;            Console.ReadLine();&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; StringWriter SerializeSchema(DataSet ds)&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var sw = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringWriter())&lt;/pre&gt;&lt;pre&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;                ds.WriteXmlSchema(sw);&lt;/pre&gt;&lt;pre&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; sw;&lt;/pre&gt;&lt;pre class="alt"&gt;            }&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; StringWriter SerializeData(DataSet ds)&lt;/pre&gt;&lt;pre class="alt"&gt;        {&lt;/pre&gt;&lt;pre&gt;            &lt;span class="kwrd"&gt;using&lt;/span&gt; (var sw = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringWriter())&lt;/pre&gt;&lt;pre class="alt"&gt;            {&lt;/pre&gt;&lt;pre&gt;                ds.WriteXml(sw);&lt;/pre&gt;&lt;pre class="alt"&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; sw;&lt;/pre&gt;&lt;pre&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;        }&lt;/pre&gt;&lt;pre&gt;    &lt;/pre&gt;&lt;pre class="alt"&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DataSet InitDataSource()&lt;/pre&gt;&lt;pre&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;            var ds = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataSet(&lt;span class="str"&gt;&amp;quot;Foo&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Setup Sample DataTable&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            var dt = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable(&lt;span class="str"&gt;&amp;quot;Bar&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre class="alt"&gt;            dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt;));&lt;/pre&gt;&lt;pre&gt;            dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;Description&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;));&lt;/pre&gt;&lt;pre class="alt"&gt;            dt.Columns.Add(&lt;span class="str"&gt;&amp;quot;Price&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;typeof&lt;/span&gt; (&lt;span class="kwrd"&gt;decimal&lt;/span&gt;));&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="rem"&gt;//Populate with Sample Data&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;            dt.Rows.Add(1, &lt;span class="str"&gt;&amp;quot;Banana&amp;quot;&lt;/span&gt;, 6.05m);&lt;/pre&gt;&lt;pre class="alt"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;            ds.Tables.Add(dt);&lt;/pre&gt;&lt;pre class="alt"&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; ds;&lt;/pre&gt;&lt;pre&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;    }&lt;/pre&gt;&lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/08/dataset-xml-deserialization-data-schema-load-order.aspx&amp;amp;subject=DataSet Xml Deserialization Data / Schema Load Order" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/08/dataset-xml-deserialization-data-schema-load-order.aspx&amp;amp;t=DataSet+Xml+Deserialization+Data+%2f+Schema+Load+Order" target="_blank" title="Submit DataSet Xml Deserialization Data / Schema Load Order to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/08/dataset-xml-deserialization-data-schema-load-order.aspx&amp;amp;title=DataSet+Xml+Deserialization+Data+%2f+Schema+Load+Order" target="_blank" title="Submit DataSet Xml Deserialization Data / Schema Load Order to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/08/dataset-xml-deserialization-data-schema-load-order.aspx&amp;amp;phase=2" target="_blank" title="Submit DataSet Xml Deserialization Data / Schema Load Order to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/07/08/dataset-xml-deserialization-data-schema-load-order.aspx&amp;amp;title=DataSet+Xml+Deserialization+Data+%2f+Schema+Load+Order" target="_blank" title="Add DataSet Xml Deserialization Data / Schema Load Order to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=55596" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/.NET/default.aspx">.NET</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/code/default.aspx">code</category></item><item><title>Silly Design Decision?</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/30/silly-design-decision.aspx</link><pubDate>Mon, 30 Jun 2008 04:43:51 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:54386</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=54386</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/30/silly-design-decision.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SillyDesignDecision_A4EB/Silly-TL-placement_2.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="420" alt="Silly-TL-placement" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SillyDesignDecision_A4EB/Silly-TL-placement_thumb.jpg" width="320" align="left" border="0" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Just a bit of disclaimer up front... This is purely based from my point of view / observation and I don&amp;#39;t claim to have any prior knowledge or understanding on why this thing is designed this way, so I might be completely wrong.&amp;nbsp; If so, please let me know.&lt;/p&gt; &lt;p&gt;Every morning, I usually pass by this particular street crossing (Panglima Polim and Panglima Polim 9 from Barito to go toward Darmawangsa) to get to work (See attached map below).&lt;/p&gt; &lt;p&gt;And usually if I am lucky, the traffic light at Panglima Polim will be green by the time I arrived at the intersection, but this is not the case most of the time.&lt;/p&gt; &lt;p&gt;Having nothing better to do I started looking around and let my mind wonder about.&amp;nbsp; One thing keeps coming up in my mind as I looked around the area and it really bothers me a lot.&lt;/p&gt; &lt;p&gt;If you see the picture to the left, you can see the 2 traffic lights, one at Panglima Polim crossing and another one 1 street parallel to the first traffic light and the distance between the two is probably not more than 30 meters.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;As you can see, this can be quite a dilemma, especially if there are a lot of traffic coming from Barito that is going on toward Panglima Polim 9 and this is happening quite often.&amp;nbsp; What happen next, you can imagine for yourself.&amp;nbsp; The tail of the traffic going toward Panglima Polim 9 will block the perpendicular traffic of Panglima Polim since the two traffic lights are not even synchronized!&amp;nbsp; Meaning if the first traffic light is &lt;font color="#008000"&gt;green&lt;/font&gt; the one after that is actually &lt;font color="#ff0000"&gt;red&lt;/font&gt;!&amp;nbsp; So you moved a little across Panglima Polim and stopped right away for the next traffic light.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SillyDesignDecision_A4EB/Silly-TL-placement_4.gif"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="420" alt="Cybermap: Panglima Polim" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/SillyDesignDecision_A4EB/Silly-TL-placement_thumb_1.gif" width="620" border="0" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Map image from &lt;a href="http://cybermap.co.id" target="_blank"&gt;Cybermap&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I wonder why the need for the second traffic light at all.&amp;nbsp; I believe it does more harm than good.&amp;nbsp; I am also wondering what kind of analysis had been done before putting the second traffic lights in place.&amp;nbsp; I am wondering what kind of process was used to decide to put this silly traffic lights configuration.&amp;nbsp; Last but not least, what can you do to remove it or at least turn it off completely (the second traffic light).&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;One agitated Jakarta road user.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post: &lt;/strong&gt;&lt;a href="mailto:?body=Thought you might like this: http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/30/silly-design-decision.aspx&amp;amp;subject=Silly Design Decision?" target="_blank" title="Send via email"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Mail.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.facebook.com/sharer.php?u=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/30/silly-design-decision.aspx&amp;amp;t=Silly+Design+Decision%3f" target="_blank" title="Submit Silly Design Decision? to DotNetKicks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Facebook.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://del.icio.us/post?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/30/silly-design-decision.aspx&amp;amp;title=Silly+Design+Decision%3f" target="_blank" title="Submit Silly Design Decision? to del.icio.us"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Delicious.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="http://www.digg.com/submit?url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/30/silly-design-decision.aspx&amp;amp;phase=2" target="_blank" title="Submit Silly Design Decision? to digg.com"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Digg.16.gif" border="0"&gt;&lt;/a&gt; | &lt;a href="https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;mkt=en-us&amp;amp;url=http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/30/silly-design-decision.aspx&amp;amp;title=Silly+Design+Decision%3f" target="_blank" title="Add Silly Design Decision? to Live Bookmarks"&gt;&lt;img src="http://geeks.netindonesia.net/Images/Share.Live.16.gif" border="0"&gt;&lt;/a&gt;&lt;/div&gt;&lt;img src="http://geeks.netindonesia.net/aggbug.aspx?PostID=54386" width="1" height="1"&gt;</description><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Design/default.aspx">Design</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Rant/default.aspx">Rant</category><category domain="http://geeks.netindonesia.net/blogs/jimmy/archive/tags/Live/default.aspx">Live</category></item><item><title>Of Usability and User Experience</title><link>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/24/of-usability-and-user-experience.aspx</link><pubDate>Tue, 24 Jun 2008 04:23:32 GMT</pubDate><guid isPermaLink="false">5cc3a90d-ac9a-472a-8983-30514957434c:53593</guid><dc:creator>Jimmy Chandra</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.netindonesia.net/blogs/jimmy/rsscomments.aspx?PostID=53593</wfw:commentRss><comments>http://geeks.netindonesia.net/blogs/jimmy/archive/2008/06/24/of-usability-and-user-experience.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/OfUsabilityandUserExperience_9FB8/gauge_4.jpg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="220" alt="gauge" src="http://geeks.netindonesia.net/blogs/jimmy/WindowsLiveWriter/OfUsabilityandUserExperience_9FB8/gauge_thumb_1.jpg" width="420" align="left" border="0" /&gt;&lt;/a&gt;There are a couple of things that I like about this picture.&amp;nbsp; Well, not actually the picture, but the car itself.&amp;nbsp; This is the dashboard of my Nissan Grand Livina.&amp;nbsp; I am not sure if any other cars have similar dashboard or not, but I think this one is pretty usable.&amp;nbsp; And from using the car, the usability factor can be found not just on this dashboard but also on some other components of the car.&lt;/p&gt; &lt;p&gt;So, you might ask yourself, &amp;quot;What is so special about this design?&amp;nbsp; It sort of look like any other car dashboard to me.&amp;nbsp; There is really nothing special about it.&amp;quot;&amp;nbsp; Instead of 