<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Chillisoft Blog</title>
	<atom:link href="http://www.chillisoft.co.za/blog/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.chillisoft.co.za/blog</link>
	<description>Chillisoft are the developers of Habanero, the Enterprise Application Framework</description>
	<pubDate>Wed, 31 Mar 2010 13:47:52 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Habanero 2.3.2 released</title>
		<link>http://www.chillisoft.co.za/blog/?p=384</link>
		<comments>http://www.chillisoft.co.za/blog/?p=384#comments</comments>
		<pubDate>Wed, 31 Mar 2010 13:47:52 +0000</pubDate>
		<dc:creator>PeterWiles</dc:creator>
		
		<category><![CDATA[Habanero]]></category>

		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=384</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=384';
var dzone_title = 'Habanero 2.3.2 released';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
We&#8217;ve just recently released to the world version 2.3.2 of the Habanero Enterprise Application Framework.  The download is available on the Habanero download page.  This is the most stable version of the framework yet - the new version contains over 1000 new tests and has lots of bug fixes and enhancements over 2.3.1. Here is [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=384';
var dzone_title = 'Habanero 2.3.2 released';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>We&#8217;ve just recently released to the world version 2.3.2 of the Habanero Enterprise Application Framework.  The download is available on the <a href="http://www.habanerolabs.com/Download/tabid/198/Default.aspx">Habanero download page</a>.  This is the most stable version of the framework yet - the new version contains over 1000 new tests and has lots of bug fixes and enhancements over 2.3.1. Here is a description of some of the bigger ones:</p>
<ul>
<li>Added Support for MSAccess2007</li>
<li>Dramatically improved the performance of loading collections.</li>
<li>Added the IN operator to loading BusinessObjectCollections.  This uses a very similar to notation to SQL where clauses. I will hopefully do a separate post on this on <a href="http://www.habanerolabs.com/Blogs/tabid/229/BlogID/7/Default.aspx">my Habanero blog</a></li>
<li>Created a DataAccessorMultiSource, which can switch between DataAccessors based on the type loaded or saved.</li>
</ul>
<p>Have a look at the <a href="http://www.habanerolabs.com/HabaneroChangelog/tabid/227/Default.aspx">change log page</a> for a full list of the changes.  We&#8217;re also busy restructuring the project and will soon be releasing a whole slew of related libraries which we&#8217;ve been developing the past few months. Stay tuned!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D384';
  addthis_title  = 'Habanero+2.3.2+released';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=384</wfw:commentRss>
		</item>
		<item>
		<title>Checking Field Exists in VB6 RecordSet</title>
		<link>http://www.chillisoft.co.za/blog/?p=380</link>
		<comments>http://www.chillisoft.co.za/blog/?p=380#comments</comments>
		<pubDate>Fri, 04 Sep 2009 10:40:52 +0000</pubDate>
		<dc:creator>EricSavage</dc:creator>
		
		<category><![CDATA[Software development]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=380</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=380';
var dzone_title = 'Checking Field Exists in VB6 RecordSet';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
If you try to access a record in an ADODB record set where the record does not exist, you&#8217;re likely to get an exception.  The first question to ask of course is why you&#8217;re writing code for a field that might not exist, but certainly in my example, I was developing a class that [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=380';
var dzone_title = 'Checking Field Exists in VB6 RecordSet';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>If you try to access a record in an ADODB record set where the record does not exist, you&#8217;re likely to get an exception.  The first question to ask of course is why you&#8217;re writing code for a field that might not exist, but certainly in my example, I was developing a class that was extensible and ready to be scaled depending on the requirements.  To be more specific, it was populating the properties of a class once a record set had been filled by a fetch from the database.  I had no guarantee that the SQL statement would meet specs, so I needed some error catching, just populating those properties that had corresponding record set fields.<span id="more-380"></span></p>
<p>Here then is the code written to check if the field existed.  It is written in VB6:</p>
<blockquote>
<pre>Private Function RecordSetHasField(strField As String, rs As ADODB.Recordset) As Boolean
    Dim objField As Field
    For Each objField In rs.Fields
        If UCase(objField.Name) = UCase(strField) Then
            RecordSetHasField = True
            Exit Function
        End If
    Next
    RecordSetHasField = False
End Function</pre>
</blockquote>
<p>A typical use could be something like the following:</p>
<blockquote>
<pre>If RecordSetHasField("OrderedGauge", rs) Then
    If Not IsNull(rs!OrderedGauge) Then
        MetalGaugeOrig = rs!OrderedGauge
    End If
End If</pre>
</blockquote>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D380';
  addthis_title  = 'Checking+Field+Exists+in+VB6+RecordSet';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=380</wfw:commentRss>
		</item>
		<item>
		<title>Excel Worksheets are not Zero-Based: Exception from HRESULT: 0&#215;800A03EC</title>
		<link>http://www.chillisoft.co.za/blog/?p=378</link>
		<comments>http://www.chillisoft.co.za/blog/?p=378#comments</comments>
		<pubDate>Wed, 26 Aug 2009 14:36:48 +0000</pubDate>
		<dc:creator>EricSavage</dc:creator>
		
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=378</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=378';
var dzone_title = 'Excel Worksheets are not Zero-Based: Exception from HRESULT: 0&#215;800A03EC';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
I experienced the following message while trying to write to an Excel file from C# code using Interop:
System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800A03EC
   at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData&#38; msgData)
   at Microsoft.Office.Interop.Excel.Range.set__Default(Object RowIndex, Object ColumnIndex, Object )
The problem was down to inserting values at a zero index.  Excel documents begin their range [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=378';
var dzone_title = 'Excel Worksheets are not Zero-Based: Exception from HRESULT: 0&#215;800A03EC';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>I experienced the following message while trying to write to an Excel file from C# code using Interop:</p>
<pre>System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x800A03EC
   at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData&amp; msgData)
   at Microsoft.Office.Interop.Excel.Range.set__Default(Object RowIndex, Object ColumnIndex, Object )</pre>
<p>The problem was down to inserting values at a zero index.  Excel documents begin their range at 1, not 0.  Now that&#8217;s a mindshift for a long-time zero-based programmer!</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D378';
  addthis_title  = 'Excel+Worksheets+are+not+Zero-Based%3A+Exception+from+HRESULT%3A+0%26%23215%3B800A03EC';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=378</wfw:commentRss>
		</item>
		<item>
		<title>Using a fake session for testing</title>
		<link>http://www.chillisoft.co.za/blog/?p=361</link>
		<comments>http://www.chillisoft.co.za/blog/?p=361#comments</comments>
		<pubDate>Fri, 19 Jun 2009 09:18:31 +0000</pubDate>
		<dc:creator>EricSavage</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=361</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=361';
var dzone_title = 'Using a fake session for testing';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
I&#8217;ve been working on an application that uses Habanero and Visual WebGui (VWG) to provide a simple website that lets a department manage a list of facilities.  At Chillisoft we use test-driven development to build robust applications, and we attempt to get our business, logic and presentation layer as close to 100% test coverage [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=361';
var dzone_title = 'Using a fake session for testing';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>I&#8217;ve been working on an application that uses Habanero and Visual WebGui (VWG) to provide a simple website that lets a department manage a list of facilities.  At Chillisoft we use test-driven development to build robust applications, and we attempt to get our business, logic and presentation layer as close to 100% test coverage as possible.</p>
<p>I was writing tests for a section of code that calls through to VWGContext.Current.Session, which effectively allows you to store and retrieve session variables in the same way you do in ASP.Net.  The trouble is that Current returns null because no web environment has been launched.<span id="more-361"></span></p>
<p>I developed a workaround class that allows you to switch between using the real session and fake internal session.  The end behaviour is exactly the same, but you&#8217;re obviously able to get your test layer running correctly.</p>
<p>The code is listed below and you can adapt it for ASP.Net quite easily by just replacing VWGContext with HttpContext.  I do have a nUnit test class for this as well - just enquire below if you would like it.</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">Gizmox.WebGUI.Forms</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF;">namespace</span> MyProject
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
    <span style="color: #008080; font-style: italic;">/// Provides a way to fake out your sessions for the purpose of testing.</span>
    <span style="color: #008080; font-style: italic;">/// Defaults to using the VWG Session, but you can set UseRealSession to</span>
    <span style="color: #008080; font-style: italic;">/// false to manage a fake session that stores values in the same way a</span>
    <span style="color: #008080; font-style: italic;">/// web session does.</span>
    <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> SessionManager
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">static</span> SessionManager _current<span style="color: #008000;">;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">bool</span> UseRealSession <span style="color: #000000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">private</span> Dictionary<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, <span style="color: #FF0000;">object</span><span style="color: #008000;">&gt;</span> _fakeSession <span style="color: #008000;">=</span>
            <span style="color: #008000;">new</span> Dictionary<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, <span style="color: #FF0000;">object</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets and sets a particular session variable.  Returns null if you</span>
        <span style="color: #008080; font-style: italic;">/// access a variable that has not been stored.</span>
        <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">object</span> <span style="color: #0600FF;">this</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">string</span> propertyName<span style="color: #000000;">&#93;</span>
        <span style="color: #000000;">&#123;</span>
            get
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>UseRealSession<span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #0600FF;">return</span> VWGContext.<span style="color: #0000FF;">Current</span>.<span style="color: #0000FF;">Session</span><span style="color: #000000;">&#91;</span>propertyName<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
&nbsp;
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #008000;">!</span>_fakeSession.<span style="color: #0000FF;">ContainsKey</span><span style="color: #000000;">&#40;</span>propertyName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">return</span> null<span style="color: #008000;">;</span>
                <span style="color: #0600FF;">return</span> _fakeSession<span style="color: #000000;">&#91;</span>propertyName<span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            set
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>UseRealSession<span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    VWGContext.<span style="color: #0000FF;">Current</span>.<span style="color: #0000FF;">Session</span><span style="color: #000000;">&#91;</span>propertyName<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
                    return<span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
&nbsp;
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_fakeSession.<span style="color: #0000FF;">ContainsKey</span><span style="color: #000000;">&#40;</span>propertyName<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    _fakeSession<span style="color: #000000;">&#91;</span>propertyName<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
                <span style="color: #0600FF;">else</span>
                <span style="color: #000000;">&#123;</span>
                    _fakeSession.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>propertyName, value<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
        <span style="color: #008080; font-style: italic;">/// Clears the values stored in the &quot;false&quot; session.</span>
        <span style="color: #008080; font-style: italic;">/// This is useful for testing, where every test needs</span>
        <span style="color: #008080; font-style: italic;">/// to start from a clean slate.</span>
        <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Clear<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            _fakeSession <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Dictionary<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, <span style="color: #FF0000;">object</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">/// &lt;summary&gt;</span>
        <span style="color: #008080; font-style: italic;">/// Gets the current session or creates a new one if not available.</span>
        <span style="color: #008080; font-style: italic;">/// The session uses the real VWG session by default - call</span>
        <span style="color: #008080; font-style: italic;">/// &lt;code&gt;SessionManager.Current.UseRealSession = false&lt;/code&gt;</span>
        <span style="color: #008080; font-style: italic;">/// if you want to use the fake session manager.</span>
        <span style="color: #008080; font-style: italic;">/// &lt;/summary&gt;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> SessionManager Current
        <span style="color: #000000;">&#123;</span>
            get
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>_current <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#123;</span>
                    _current <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> SessionManager<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                    _current.<span style="color: #0000FF;">UseRealSession</span> <span style="color: #008000;">=</span> true<span style="color: #008000;">;</span>
                <span style="color: #000000;">&#125;</span>
                <span style="color: #0600FF;">return</span> _current<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
            set
            <span style="color: #000000;">&#123;</span>
                _current <span style="color: #008000;">=</span> value<span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>You can use the code in the following way:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">SessionManager.<span style="color: #0000FF;">Current</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Eric&quot;</span><span style="color: #008000;">;</span>
<span style="color: #FF0000;">string</span> name <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span>SessionManager.<span style="color: #0000FF;">Current</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span></pre></div></div>

<p>General use of this code in a working application requires no setup, since the SessionManager defaults to using VWGContext.  However, when you are writing a test class that tests code using the sessions, you&#8217;ll need to modify the TestFixtureSetUp and the SetUp:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #000000;">&#91;</span>TestFixtureSetUp<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> SetupTestFixture<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    SessionManager.<span style="color: #0000FF;">Current</span>.<span style="color: #0000FF;">UseRealSession</span> <span style="color: #008000;">=</span> false<span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#91;</span>SetUp<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Setup<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    SessionManager.<span style="color: #0000FF;">Current</span>.<span style="color: #0000FF;">Clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>Any feedback is welcome.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D361';
  addthis_title  = 'Using+a+fake+session+for+testing';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=361</wfw:commentRss>
		</item>
		<item>
		<title>Guji in Habanero Land #4: Using XSLT and XML to list Business Objects in a Word Document</title>
		<link>http://www.chillisoft.co.za/blog/?p=346</link>
		<comments>http://www.chillisoft.co.za/blog/?p=346#comments</comments>
		<pubDate>Thu, 18 Jun 2009 15:46:31 +0000</pubDate>
		<dc:creator>DeerashaSingh</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=346</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=346';
var dzone_title = 'Guji in Habanero Land #4: Using XSLT and XML to list Business Objects in a Word Document';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
Use cases are an important part of the communication between a client and a developer, or a user and a business analyst. That much is evident, since they are written in plain English and describe the business process in detail from the user’s point of view.  All this is great except these use cases seem [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=346';
var dzone_title = 'Guji in Habanero Land #4: Using XSLT and XML to list Business Objects in a Word Document';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>Use cases are an important part of the communication between a client and a developer, or a user and a business analyst. That much is evident, since they are written in plain English and describe the business process in detail from the user’s point of view.  All this is great except these use cases seem to create a huge administration overhead. What’s that I hear you say? “That’s the Project administrator/co-ordinators job”? No, we don’t have such a luxury! (We chose premium filter coffee and an espresso machine over having a co-ordinator).</p>
<p><span id="more-346"></span><br />
In one of my less noob- like moments, I have realised that a requirements phase more often than not results in an abundance of use cases, which need to be tracked and managed. I did not choose to be an administrator, so I have promptly recognised the dire need for the Use Case Manager. To date use case management applications have focused on the analyst’s need to keep track of use cases. This works well for classic software methodologies like the water fall approach, but requirements are extremely fluid in agile software development, so transparency and simplicity in communication is vital. For a start, the use cases need to be available to everyone, making rapid feedback possible.  Since there are often multiple revisions of Requirements Documents, the user must be able to generate a new document whenever changes are made to the use cases.</p>
<p>My tasks for this month include implementing the following use cases in the Use Case Manager:</p>
<p><a href="http://www.chillisoft.co.za/blog/wp-content/uploads/2009/06/fig-1-use-cases2.png"><img class="aligncenter size-full wp-image-349" title="fig-1-use-cases2" src="http://www.chillisoft.co.za/blog/wp-content/uploads/2009/06/fig-1-use-cases2.png" alt="" width="500" height="125" /></a></p>
<p>And now to the technical bit. How do I get the Use Cases into a word document? Converting objects from C# code into a document seemed to require the use of some third party software. “GloryDev” aka Brett suggested two free utilities: <a href="http://www.stringtemplate.org/  ">stringTemplate</a> and <a href="http://nvelocity.sourceforge.net/">NVelocity </a>. Now having the attention span of a gnat does not help when trying to decipher what these things are. Having barely any experience with .NET alone, I have to figure out the what, why and when of templates. Templates?! I’m sure both tools are well defined for their purpose, but this noob has no idea what that is. I couldn’t join the dots between generating documents from code and using these “template engines”.  So I puzzled over what to do…. for a while.<br />
In a world where another option is but a google away, it is very difficult to try and stick with something that isn’t producing results fast and after two weeks of mucking about I needed results….fast! My helpful fellow devs suggested using Active Reports, but again my lack of knowledge was a stumbling block. Also, it’s not free, so I only wanted to try it as a last resort.<br />
Finally, the mention of XSLT took me down a viable path. There was still a learning curve, but perhaps not as steep a climb towards completion of the task. I was warned that XSLT was very hard to maintain, and it violated the requirement that it must be open to automated testing. The other devs took pity on me though, and allowed me to try it since I was not getting anywhere with the other methods yet.<br />
The Habanero Business Object can be saved to XML, so I had the Project along with Packages, Use Cases and Use Case Steps saved to a file I could transform.<br />
I googled “Xml to Word” and found some interesting articles. <a href="http://www.developer.com/xml/article.php/10929_3798066_2">This article certainly took the pain out of producing word documents.</a> Following it step by step along with the<a href="http://www.w3schools.com/xsl/xsl_intro.asp"> w3 schools tutorials</a> on XML, XSLT and XPATH, I produced a listing of Use Cases in a Project, sorted by Package. This is the trick Chris Bennett thankfully chose to share with the world in the above article:<br />
1.    Create the layout you want in Word.</p>
<p>2.    Save the document to XML (which Word allows you to do)</p>
<p>3.    Then tweak the XML into XSLT by (get this!) adding a few lines</p>
<p>That’s one more use case done. Next, I needed to find a way to insert the table from this listing at a specified point in the Requirements Document. Another chance to investigate something I know nothing about… google help me! And the search for examples to study and documentation to read begins.<br />
I have found that to make the best use of MSDN, its best to google to get there; the site search is just shameful (don’t snigger its true). Google found a detailed how-to (105 printed pages… ahem) <a href="http://msdn.microsoft.com/en-us/library/aa192495.aspx#wordobject_link9">using the word object model</a> which even had snippets of C# code. So I read through that and tried out some of the code to get a better idea of the domain.</p>
<p>Another resource that came in handy- this straightforward article from <a href=" http://blogs.techrepublic.com.com/howdoi/?p=190">techrepublic</a>. And you’ve got to love the description of seeing an open word instance as “both intriguing and scary”.<br />
There was also an older, Visual Basic, Chillisoft-developed project that used bookmarks in the word object model to produce reports. This was the approach I was advised to use, and the code for it didn’t turn out as unwieldy as I thought it would. And another trick: record a macro for what you’re trying to do in Word, and attempt to translate that into C# code.</p>
<p>If I got anything out of this long, strange trip it would be that modelling what you want to do before you do it in code is very helpful. To save someone else the toil, this is C# code for inserting the content of one Word document into another:</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> WriteRequirementsToWordDocument<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> projectDocName, <span style="color: #FF0000;">string</span> requirementsTemplateName, <span style="color: #FF0000;">string</span> generatedDocName, <span style="color: #FF0000;">string</span> insertionPointBookmark<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #FF0000;">object</span> missing <span style="color: #008000;">=</span> Type.<span style="color: #0000FF;">Missing</span><span style="color: #008000;">;</span>
_Application oWord <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Application <span style="color: #000000;">&#123;</span> Visible <span style="color: #008000;">=</span> <span style="color: #0600FF;">false</span><span style="color: #000000;">&#125;</span><span style="color: #008000;">;</span>
_Document oDoc<span style="color: #008000;">;</span>
_Document projectDoc<span style="color: #008000;">;</span>
<span style="color: #0600FF;">try</span>
<span style="color: #000000;">&#123;</span>
<span style="color: #FF0000;">object</span> fileName <span style="color: #008000;">=</span> Path.<span style="color: #0000FF;">Combine</span><span style="color: #000000;">&#40;</span>Environment.<span style="color: #0000FF;">CurrentDirectory</span>, requirementsTemplateName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
oDoc <span style="color: #008000;">=</span> oWord.<span style="color: #0000FF;">Documents</span>.<span style="color: #0000FF;">Open</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> fileName, <span style="color: #0600FF;">ref</span> missing,<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #FF0000;">object</span> projectFileName <span style="color: #008000;">=</span> Path.<span style="color: #0000FF;">Combine</span><span style="color: #000000;">&#40;</span>Environment.<span style="color: #0000FF;">CurrentDirectory</span>, projectDocName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
projectDoc <span style="color: #008000;">=</span> oWord.<span style="color: #0000FF;">Documents</span>.<span style="color: #0000FF;">Open</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> projectFileName,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
projectDoc.<span style="color: #0000FF;">Activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
oWord.<span style="color: #0000FF;">Selection</span>.<span style="color: #0000FF;">WholeStory</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
oWord.<span style="color: #0000FF;">Selection</span>.<span style="color: #0000FF;">Copy</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
oDoc.<span style="color: #0000FF;">Activate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #FF0000;">object</span> insertAtBookmark <span style="color: #008000;">=</span> insertionPointBookmark<span style="color: #008000;">;</span>
&nbsp;
oWord.<span style="color: #0000FF;">Selection</span>.<span style="color: #0600FF;">GoTo</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> insertAtBookmark<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
oWord.<span style="color: #0000FF;">Selection</span>.<span style="color: #0000FF;">Paste</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #FF0000;">object</span> requirementsFileName <span style="color: #008000;">=</span>Path.<span style="color: #0000FF;">Combine</span><span style="color: #000000;">&#40;</span>Environment.<span style="color: #0000FF;">CurrentDirectory</span>,generatedDocName<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
oDoc.<span style="color: #0000FF;">SaveAs</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> requirementsFileName, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing,
<span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #0600FF;">finally</span>
<span style="color: #000000;">&#123;</span>
oWord.<span style="color: #0000FF;">Quit</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing, <span style="color: #0600FF;">ref</span> missing<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>To look at this technique in context you can download the <a href="http://ucm.codeplex.com">Use Case Manager off Codeplex</a>.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D346';
  addthis_title  = 'Guji+in+Habanero+Land+%234%3A+Using+XSLT+and+XML+to+list+Business+Objects+in+a+Word+Document';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=346</wfw:commentRss>
		</item>
		<item>
		<title>Habanero 2.3.0 is out!</title>
		<link>http://www.chillisoft.co.za/blog/?p=344</link>
		<comments>http://www.chillisoft.co.za/blog/?p=344#comments</comments>
		<pubDate>Fri, 12 Jun 2009 20:43:24 +0000</pubDate>
		<dc:creator>EricSavage</dc:creator>
		
		<category><![CDATA[Habanero]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=344</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=344';
var dzone_title = 'Habanero 2.3.0 is out!';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
Habanero version 2.3.0 is the most stable and powerful version of Habanero available and the development team believes this version is going to knock the competition off the shelves. On top of a range of performance improvements, bug fixes, dependency inversions and extended test coverage, you&#8217;ll get new features like serialisation of BusinessObjects and a [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=344';
var dzone_title = 'Habanero 2.3.0 is out!';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>Habanero version 2.3.0 is the most stable and powerful version of Habanero available and the development team believes this version is going to knock the competition off the shelves. On top of a range of performance improvements, bug fixes, dependency inversions and extended test coverage, you&#8217;ll get new features like serialisation of BusinessObjects and a bunch of nifty UI tools.</p>
<p><strong>What&#8217;s the Big Deal?</strong></p>
<p>What sets Habanero apart from other data or ORM frameworks? <span id="more-344"></span></p>
<p><strong><em>Agile from data to presentation</em></strong><br />
Firstly, Habanero provides an agile toolset right from the data layer through to the front end. Most ORM frameworks focus on reading data out of the database, but don&#8217;t go beyond that. As the developer you&#8217;re then required to tie a range of heterogenous frameworks together in order to move data through the data layer, the business logic layer and the presentation layer. Habanero ties these all seamlessly together, automating so much of the default implementations that lengthen your development time.</p>
<p><strong><em>Switch out your data layer</em></strong><br />
Secondly, Habanero&#8217;s data handling allows you to swap in any data layer you choose, now that the dependency inversion between BO and DB is complete. As a developer you have the freedom to source your data from a database, an XML file, an Excel document, a web service or any medium you would like to create a Data Accessor for, and then get standard Business Object and Presentation layer behaviour. Furthermore, Habanero&#8217;s approach to Business Objects allows for fourth normal form application development.</p>
<p><strong><em>Runtime UI generation</em></strong><br />
Habanero then provides runtime generation of controls like grids and forms to edit your Business Objects. A lot of development time is spent building an interface piece by piece through the designer, which is particularly inefficient when you are creating an edit form for a number of fields from a single entity. Habanero automates this kind of interface, enforcing data validation, and providing real-time synchronisation between components displaying the same data.</p>
<p><strong><em>One application for desktop and web</em></strong><br />
Finally, Habanero abstracts the specific UI environment so that you can code one set of controls to be released in multiple environments. By generating all components through IControlFactory, you need only switch out the implementation of IControlFactory you use in order to release the same application on either the desktop or the web. With support for the Visual WebGui AJAX framework, this marks a huge stride in simplifying web development. Gone are the old days of tedious ASP CRUD page design and you can now generate a data-driven web application in a fraction of the previous time and with twice the intelligence.</p>
<p><strong>Free open source</strong></p>
<p>Habanero v2.3.0 is now available for free download on the official site. As part of the Habanero community, we&#8217;re looking forward to hearing your contributions to the Habanero project, as well as integrating your own code into this groundbreaking framework.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D344';
  addthis_title  = 'Habanero+2.3.0+is+out%21';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=344</wfw:commentRss>
		</item>
		<item>
		<title>The most useful keyboard shortcut you never used</title>
		<link>http://www.chillisoft.co.za/blog/?p=342</link>
		<comments>http://www.chillisoft.co.za/blog/?p=342#comments</comments>
		<pubDate>Tue, 09 Jun 2009 08:20:31 +0000</pubDate>
		<dc:creator>EricSavage</dc:creator>
		
		<category><![CDATA[Software development]]></category>

		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=342</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=342';
var dzone_title = 'The most useful keyboard shortcut you never used';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
Learning to use keyboard shortcuts is a double-edged sword.  On one hand, you get fed up with how hard it is to pull off a task and you feel a certain sense of triumph when you find a shorter way of doing a repetitive task.  On the other blade, becoming more efficient in what you [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=342';
var dzone_title = 'The most useful keyboard shortcut you never used';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>Learning to use keyboard shortcuts is a double-edged sword.  On one hand, you get fed up with how hard it is to pull off a task and you feel a certain sense of triumph when you find a shorter way of doing a repetitive task.  On the other blade, becoming more efficient in what you do is part of the service to your employment contract.  You&#8217;re getting paid to perform a quality service as quickly as you can.</p>
<p>So what then is &#8220;the most useful keyboard shortcut you never used&#8221;&#8230;<span id="more-342"></span></p>
<p>Ctrl+A</p>
<p>This is the shortcut for &#8220;select all&#8221;, which selects all the text in the current control or document.  It&#8217;s supported by most text editors, including fields on a web page, email editors, text editors, Office documents.  So let&#8217;s look at some sample uses&#8230;</p>
<p>You&#8217;ve just written a nice comment on someone&#8217;s blog and you have that nagging doubt that the browser will get stuck and when you press Back your comment text will have disappeared.  Just before you hit the Post button, hit Ctrl+A and then Ctrl+C.  Now your text is sitting in memory in case everything goes wonky.</p>
<p>Formatting a document &#8230; you&#8217;ve just drawn up an entire Word document and want to change the font.  So now you scroll to the top, carefully place your cursor at the top, get annoyed, try again.  Then you scroll to the bottom and try to find the end of the selection (or even worse, you try dragging your mouse across several pages).  Instead, just press Ctrl+A and you&#8217;ve selected all the text.</p>
<p>You&#8217;ve just written text and you want to clear it.  Perhaps you filled in a web field and you don&#8217;t like it and want to start again.  Usually you would try aim your mouse pointer at the top left and try drag it, with a mixture of results, including missing the first character or the extra lines and spaces at the end.  Just hit Ctrl+A and Delete.  Job done.</p>
<p>To be honest, I only really started using Ctrl+A in the last year, and now I find myself using it all over the place.  Seeing as I&#8217;m done with this blog post, I&#8217;ll now press Ctrl+A, Ctrl+C and Publish.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D342';
  addthis_title  = 'The+most+useful+keyboard+shortcut+you+never+used';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=342</wfw:commentRss>
		</item>
		<item>
		<title>Active Reports rapid Xml processing options</title>
		<link>http://www.chillisoft.co.za/blog/?p=340</link>
		<comments>http://www.chillisoft.co.za/blog/?p=340#comments</comments>
		<pubDate>Fri, 05 Jun 2009 12:37:53 +0000</pubDate>
		<dc:creator>EricSavage</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[active reports]]></category>

		<category><![CDATA[reporting]]></category>

		<category><![CDATA[xml]]></category>

		<category><![CDATA[xslt]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=340</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=340';
var dzone_title = 'Active Reports rapid Xml processing options';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
Active Reports provides the XMLDataSource option for sourcing your data from xml.  My knowledge of all its ins and outs is not substantial, but I ran into two significant problems in a recent project which led me towards an alternative, innovative approach.
The first problem is that an xml document does not guarantee a structure like [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=340';
var dzone_title = 'Active Reports rapid Xml processing options';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>Active Reports provides the XMLDataSource option for sourcing your data from xml.  My knowledge of all its ins and outs is not substantial, but I ran into two significant problems in a recent project which led me towards an alternative, innovative approach.<span id="more-340"></span></p>
<p>The first problem is that an xml document does not guarantee a structure like a database does.  Xml&#8217;s flexibility in the layout of elements is beautiful on one hand but hard to fit into a report that expects a fixed structure.</p>
<p>The second problem in my case was the use of sub-reports to cover for different structures in the xml document.  I won&#8217;t get fully into the detail, but where an element holds recurring sub-items, you can use sub-reports to list all the items.  The trouble is that a significant number of sub-reports kill your report generation performance.  I had a particular problem where my first report would take 15 seconds to generate on the server, and then degrade by another 5 seconds every time I ran it again.  This is of course totally unacceptable for a frequently used report.</p>
<p>Here then was my innovation &#8230; combine Active Reports and XSLT.  Active Reports provides the RichTextBox, which has an Html property to which you can assign the Html you generate from your XSLT.</p>
<p>Now there are a few pros and cons worth mentioning here.  Firstly, using reports as the output of your html provides pagination, which is a lot harder to pull off with pure XSLT and html pages.  As a con, XSLT is obviously not the most friendly computer language you&#8217;ve ever used and certainly not as easy as using a visual report designer.  What can be said though is that it is technically testable, or in other words, you can write a set of unit tests to ensure that it does what it&#8217;s meant to, which in my opinion is rather hard with Active Reports.</p>
<p>The other concern which needs to be mentioned is that the RichTextBox Html feature is something of a work in progress at the Active Reports lab.  I was originally using the version 3 build 5.0.0.117, which had a number of deficiencies in the html formatting, including no underlining and bold.  I upgraded to build 5.2.1236.2 (released May 2009), which fixed a number of issues, but still inserts an extra new line between tables.</p>
<p>Where the previous report was taking anything from 15 to 90 seconds to run, the newer version ran in 3 to 4 seconds consistently, a massive improvement.  For now I&#8217;m willing to suffer the trade-offs in order to get the rapid report generation.</p>
<p>Here then is the general code to generate the Html.  You&#8217;ll obviously need to adapt it for your own structure.  In this case the XML I wanted to transform was actually stored in the XMLDataSource, whereas you might source your xml from elsewhere.  You&#8217;ll notice that the html needs to be generated for each node or each instance of the detail section.</p>
<blockquote>
<pre>private void detail_Format(object sender, EventArgs e)
{
    XMLDataSource dataSource = (XMLDataSource)this.DataSource;

    if (_recordCounter &gt;= dataSource.NodeList.Count) return;
    XmlNode resultRootNode =
       dataSource.NodeList[_recordCounter].ParentNode;

    string htmlOutput = GenerateResultsHtml(
       resultRootNode.OuterXml, _xslFilePath);
    const string xmlHeader =
       @"&lt;?xml version=""1.0"" encoding=""utf-8""?&gt;";
    resultsTextBox.Html = htmlOutput.Replace(xmlHeader, "");

    _recordCounter++;
}</pre>
<pre>public static string GenerateResultsHtml(string xml,
    string xslFilePath)
{
    XsltSettings settings = new XsltSettings();
    settings.EnableDocumentFunction = true;
    settings.EnableScript = true;

    XslCompiledTransform transform = new XslCompiledTransform();
    transform.Load(xslFilePath, settings, null);

    XmlReader xmlReader = XmlReader.Create(new StringReader(xml));
    StringBuilder stringBuilder = new StringBuilder();
    XmlWriter xmlWriter = XmlWriter.Create(
        stringBuilder, transform.OutputSettings);

    if (xmlWriter != null)
    {
        transform.Transform(xmlReader, xmlWriter);
        xmlWriter.Close();
    }
    xmlReader.Close();
    return stringBuilder.ToString();
}</pre>
</blockquote>
<p>As one last admission, the XSLT was already available for me to use.  Be warned that the transform language while very powerful is a little bit thorny.  At any rate, if you&#8217;re experiencing the kinds of problems I was, this may be a viable solution.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D340';
  addthis_title  = 'Active+Reports+rapid+Xml+processing+options';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=340</wfw:commentRss>
		</item>
		<item>
		<title>Active Reports: Displaying reports in a browser</title>
		<link>http://www.chillisoft.co.za/blog/?p=338</link>
		<comments>http://www.chillisoft.co.za/blog/?p=338#comments</comments>
		<pubDate>Fri, 05 Jun 2009 10:37:00 +0000</pubDate>
		<dc:creator>EricSavage</dc:creator>
		
		<category><![CDATA[ASP.Net]]></category>

		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=338</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=338';
var dzone_title = 'Active Reports: Displaying reports in a browser';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
Our client required a modification to an existing web solution that displayed confidential results in html format, which could be printed from the results page.  The data was sensitive and was being forged, so we looked at adding a watermark.  This required moving across to using reporting rather than html, so we started building up [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=338';
var dzone_title = 'Active Reports: Displaying reports in a browser';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p>Our client required a modification to an existing web solution that displayed confidential results in html format, which could be printed from the results page.  The data was sensitive and was being forged, so we looked at adding a watermark.  This required moving across to using reporting rather than html, so we started building up a report structure.</p>
<p>I was very pleased to find that Active Reports provided a WebViewer control, especially since it gave you the option of either displaying reports with an ActiveX option or with a Adobe Reader option.  My assumption was the latter required extra processing to convert a document to PDF first.  However, the ActiveX option requires the client user to have internet access to download the plugin, whereas the Adobe browser plugin can be installed from a downloadable installer that can be run on any PC.<span id="more-338"></span></p>
<p>I was seriously misled though.  Having run down the development path with WebViewer for a while, I couldn&#8217;t get rid of the licensing message at the bottom and discovered that the control is only available to Professional users, whereas we were using Standard.  If you do have Active Reports Professional, have a look at the WebViewer.</p>
<p>Fortunately, the Active Reports website hinted at another approach, which I adapted for my own use and it works well.  My original concern with PdfExport was that the user experienced the lag that happens while Adobe Reader fires up in its own window.  Also, if I displayed the PDF in the current window, you lose the context of the website.</p>
<p>The end solution uses an IFrame, effectively using two pages to achieve the solution.  The ViewSpecResult (the parent page) has an IFrame and the PdfPage sits inside it and invokes the report generation.</p>
<p>Here is the ViewSpecResultASP markup:</p>
<blockquote>
<pre>&lt;%@ Page Language="C#" AutoEventWireup="true"
   CodeBehind="ViewSpecResult.aspx.cs"
   Inherits="ResultsViewing.ViewSpecResult" %&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt;
&lt;head id="Head1" runat="server"&gt;
    &lt;title&gt;Results Viewing&lt;/title&gt;
    &lt;link href="FormStyling.css" rel="stylesheet" type="text/css" /&gt;

    &lt;style id="headerscript" runat="server" type="text/css"&gt;
        IFRAME
        {
            POSITION: absolute;
        }
    &lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;
    &lt;form id="form1" runat="server"&gt;
        &lt;div&gt;
            &lt;iframe runat="server" src="PDFPage.aspx" height="70%"
                width="98%" id="IFRAME1"&gt;&lt;/iframe&gt;
        &lt;/div&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</blockquote>
<p>The ViewSpecResult C#/VB code is empty.  The PdfPage ASP markup is like this:</p>
<blockquote>
<pre>&lt;%@ Page Language="C#" AutoEventWireup="true"
   CodeBehind="PDFPage.aspx.cs" Inherits="ResultsViewing.PDFPage" %&gt;
&lt;%@ Import Namespace="ResultsViewing"%&gt;

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;

&lt;html xmlns="http://www.w3.org/1999/xhtml" &gt;
&lt;head runat="server"&gt;
    &lt;title&gt;Results Report&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;form id="form1" runat="server"&gt;
    &lt;div&gt;

    &lt;/div&gt;
    &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
</blockquote>
<p>The PdfPage.aspx.cs code looks something like this in my application:</p>
<blockquote>
<pre>public partial class PDFPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string xml = ReportController.GenerateXmlForSpecimenArray();

        MemoryStream m_stream =
           ReportController.GenerateReportToMemoryStream(xml);

        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposistion",
           "inline; filename=MyExport.pdf");
        Response.BinaryWrite(m_stream.ToArray());
        Response.End();
    }
}</pre>
</blockquote>
<p>This calls through to a central controller close, which generates the report something like this:</p>
<blockquote>
<pre>public static ReportSimple GenerateReport(string xml)
{
    string xslFilename = HttpContext.Current.Server.MapPath("~")
        + "header.xsl";
    ReportSimple report = new ReportSimple(xslFilename);

    XMLDataSource dataSource = new XMLDataSource();
    dataSource.FileURL = null;
    dataSource.RecordsetPattern = "//SPECIMEN_HEADER";
    dataSource.LoadXML(xml);

    TrimXmlNodes(dataSource);
    report.DataSource = dataSource;
    SetWatermark(report);
    report.Run();

    return report;
}

public static MemoryStream GenerateReportToMemoryStream(string xml)
{
    MemoryStream memoryStream = new MemoryStream();
    ReportSimple report = GenerateReport(xml);

    PdfExport export = new PdfExport();
    export.Security.Encrypt = true;
    export.Security.Permissions = PdfPermissions.AllowPrint;
    export.Export(report.Document, memoryStream);
    memoryStream.Position = 0;
    return memoryStream;
}</pre>
</blockquote>
<p>Now all this code has been adapted from the official Active Reports knowledge base, where the solution is more complex in that it provides for a separate Web Service to do the report generation, which helps to spread the server load.  This was overkill for my application.</p>
<p>Note that I pulled off some interesting XML data sourcing for this application.  I&#8217;ll write about it in another post after this for those who are interested.  I saved huge amounts of processing time this way using XSLT.</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D338';
  addthis_title  = 'Active+Reports%3A+Displaying+reports+in+a+browser';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=338</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft SQL Server Reporting Services &#8220;Object reference not set&#8221; error</title>
		<link>http://www.chillisoft.co.za/blog/?p=330</link>
		<comments>http://www.chillisoft.co.za/blog/?p=330#comments</comments>
		<pubDate>Tue, 02 Jun 2009 13:04:55 +0000</pubDate>
		<dc:creator>MarkWhitfeld</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[Chillisoft]]></category>

		<category><![CDATA[Databases]]></category>

		<category><![CDATA[Microsoft]]></category>

		<category><![CDATA[Object reference not set to an instance of an object.]]></category>

		<category><![CDATA[SQL Server Reporting Services]]></category>

		<guid isPermaLink="false">http://www.chillisoft.co.za/blog/?p=330</guid>
		<description><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=330';
var dzone_title = 'Microsoft SQL Server Reporting Services &#8220;Object reference not set&#8221; error';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>

I had a system deployed to a client site, and everything was working perfectly. The system administrator at the client site did a few things on the server, and next thing the Reports in the web site that use Microsoft SQL Server Reporting Services were giving an error.
Nothing had changed that should have affected the [...]]]></description>
			<content:encoded><![CDATA[<div style="position:relative; width: 100%; padding: 0 0 30px 0;"><div style="position: absolute; bottom: 10px; right:115px; width: 42px;"><script type="text/javascript">
<!--
var dzone_url = 'http://www.chillisoft.co.za/blog/?p=330';
var dzone_title = 'Microsoft SQL Server Reporting Services &#8220;Object reference not set&#8221; error';
var dzone_blurb = '';
var dzone_style = '2';
//-->
</script>
<script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"></script> 
</div>
<p><!--[endif]--></p>
<p class="MsoNormal">I had a system deployed to a client site, and everything was working perfectly. The system administrator at the client site did a few things on the server, and next thing the Reports in the web site that use Microsoft SQL Server Reporting Services were giving an error.</p>
<p class="MsoNormal">Nothing had changed that should have affected the site! So, what could be causing the error?</p>
<p class="MsoNormal">The error in the report viewer was: “Object reference not set to an instance of an object.”</p>
<p class="MsoNormal">That’s an all too familiar error to anyone that has programmed in .NET and it is always slightly amusing to find it in someone else’s released program. The other day I got one from SQL Server Administrator when I clicked on something in the tree view on the left (just after I had freshly installed Reporting Services). Aha, so they are not infallible! A slight grin etched itself across my face. Well, anyway, the solution was a tried and tested standard Windows solution&#8230; Restart the PC. Amazing how often that works with Microsoft stuff hey! But in my case I was getting the error in <strong>my</strong> application, in a section that I had no control over, so how could I save myself this embarrassment?<span id="more-330"></span></p>
<p class="MsoNormal">Well, to get to the root of the issue, I had a look at the ReportServer_XXX.log found in the “C:\Program Files (x86)\Microsoft SQL Server\MSSQL.2\Reporting Services\LogFiles” folder on the server. The error message I was seeking was nowhere to be found! Aaargh! So, to the next point of call, the system event log. Aha! I found an error message there:</p>
<pre class="MsoNormal"><em>Event Type: Warning
 Event Source: ASP.NET 2.0.50727.0
 Event Category: Web Event
 Event ID: 1309
 Date: 6/2/2009
 Time: 10:25:45 AM
 User: N/A
 Computer: SERVERX
 Description:
 Event code: 3005
 Event message: An unhandled exception has occurred.
 Event time: 6/2/2009 10:25:45 AM
 Event time (UTC): 6/2/2009 8:25:45 AM
 Event ID: aeb8ddc7f53b431ead3b7a0c88ec5a5b
 Event sequence: 77
 Event occurrence: 2
 Event detail code: 0</em></pre>
<pre><em>Application information:
 Application domain: /LM/W3SVC/1/root/Reports-2-128884044406093750
 Trust level: RosettaMgr
 Application Virtual Path: /Reports
 Application Path: C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportManager\
 Machine name: SERVERX</em></pre>
<pre><em>Process information:
 Process ID: 1544
 Process name: w3wp.exe
 Account name: NT AUTHORITY\NETWORK SERVICE</em></pre>
<pre><em>Exception information:
 Exception type: NullReferenceException
 Exception message: Object reference not set to an instance of an object.</em></pre>
<pre><em>Request information:
 Request URL: http://localhost/Reports/Reserved.ReportViewerWebControl.axd?OpType=StyleSheet&amp;Version=2005.090.1399.00 [^]
 Request path: /Reports/Reserved.ReportViewerWebControl.axd
 User host address: 127.0.0.1
 User: SERVERX\UserX
 Is authenticated: True
 Authentication Type: Negotiate
 Thread account name: NT AUTHORITY\NETWORK SERVICE</em></pre>
<pre><em>Thread information:
 Thread ID: 6
 Thread account name: NT AUTHORITY\NETWORK SERVICE
 Is impersonating: True
 Stack trace: at Microsoft.Reporting.WebForms.WebRequestHelper.GetExceptionForMoreInformationNode(XmlNode moreInfo, XmlNamespaceManager namespaces)
 at Microsoft.Reporting.WebForms.WebRequestHelper.ExceptionFromWebResponse(Exception e)
 at Microsoft.Reporting.WebForms.ServerReport.ServerUrlRequest(Boolean isAbortable, String url, Stream outputStream, String&amp; mimeType, String&amp; fileNameExtension)
 at Microsoft.Reporting.WebForms.ServerReport.GetStyleSheet(String styleSheetName)
 at Microsoft.Reporting.WebForms.ReportServerStyleSheetOperation.PerformOperation(NameValueCollection urlQuery, HttpResponse response)
 at Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context)
 at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
 at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously)</em></pre>
<pre><em>Custom event details:</em></pre>
<pre><em>For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp. [^]</em></pre>
<p class="MsoNormal">
<p class="MsoNormal">That’s great, but it doesn’t really help that much. It’s not really something I can debug, fix and recompile because it’s right in the middle of Microsoft.Reporting. Well, ok maybe it’s slightly to the left of the middle of the component, but it’s still out of reach!</p>
<p class="MsoNormal">I turned to Google for answers. Very quickly I found this result:</p>
<p class="MsoNormal"><a href="http://social.msdn.microsoft.com/forums/en-US/sqlreportingservices/thread/ef0f1c39-fc92-4cde-9920-597a8d6981f9/">http://social.msdn.microsoft.com/forums/en-US/sqlreportingservices/thread/ef0f1c39-fc92-4cde-9920-597a8d6981f9/</a></p>
<p class="MsoNormal">I tried accessing the Reports Manager web site at <a href="http://localhost/Reports">http://localhost/Reports</a> and got the 403 error that the guys in the forum post above were talking about. At the end of the forum post it gives the solution. Some other places suggested reinstalling SQL Server, don’t listen to them!!!!!</p>
<p class="MsoNormal"><strong>!!! SOLUTON !!!</strong></p>
<p class="MsoNormal">Just open the Reporting Services Configuration tool and in the Report Server Virtual Directory Settings section tick the “Apply Default Settings” checkbox and click “Apply”. No more problem!</p>
<p class="MsoNormal">So, the problem was not with my Web Site, but in fact some strange problem with Reporting Services. Whew, I was doubting myself for a moment there. The “Object reference not set to an instance of an object” bug is someone else’s embarrassment to sort out <span style="font-family: Wingdings;"><span> <img src='http://www.chillisoft.co.za/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></span></p>
<p class="MsoNormal"><a href="http://www.chillisoft.co.za/blog/wp-content/uploads/2009/06/virtualdirset.jpg"><img class="alignleft size-medium wp-image-331" title="virtualdirset" src="http://www.chillisoft.co.za/blog/wp-content/uploads/2009/06/virtualdirset-300x201.jpg" alt="" width="419" height="280" /></a></p>
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">
<p class="MsoNormal">Hope this has helped you.</p>
<p class="MsoNormal">All the best&#8230;</p>
<script type="text/javascript">
  addthis_url    = 'http%3A%2F%2Fwww.chillisoft.co.za%2Fblog%2F%3Fp%3D330';
  addthis_title  = 'Microsoft+SQL+Server+Reporting+Services+%26%238220%3BObject+reference+not+set%26%238221%3B+error';
  addthis_pub    = '';
</script><script type="text/javascript" src="http://s7.addthis.com/js/addthis_widget.php?v=12" ></script>
</div>]]></content:encoded>
			<wfw:commentRss>http://www.chillisoft.co.za/blog/?feed=rss2&amp;p=330</wfw:commentRss>
		</item>
	</channel>
</rss>
