<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tim laqua dot com &#187; Thoughts</title>
	<atom:link href="http://timlaqua.com/category/thoughts/feed/" rel="self" type="application/rss+xml" />
	<link>http://timlaqua.com</link>
	<description>Thoughts and Code from Tim Laqua</description>
	<lastBuildDate>Fri, 03 Feb 2012 23:12:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Uncivil UNIONs</title>
		<link>http://timlaqua.com/2012/02/uncivil-unions/</link>
		<comments>http://timlaqua.com/2012/02/uncivil-unions/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 16:12:43 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[bi]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=878</guid>
		<description><![CDATA[If you asked any SQL Server Developer or DBA what UNION does, they would tell you it combines two result sets. Then if you were to ask them if they knew it removed duplicates without the ALL argument, they would say yes. That's academic, but I dare you to go look at their and your [...]]]></description>
			<content:encoded><![CDATA[<p>If you asked any SQL Server Developer or DBA what UNION does, they would tell you it combines two result sets.  Then if you were to ask them if they knew it removed duplicates without the ALL argument, they would say yes.  That's academic, but I dare you to go look at their and your code and see how often UNION without the ALL argument is used.  UNION is evil.  Why do I say that?  Because DISTINCT is evil and blocking operations are evil so it follows that UNION is evil.</p>
<p>Would you be OK with the following query as the source for a fact table?</p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">SELECT</span> <span style="color: #0000FF;">DISTINCT</span> <span style="color: #808080;">*</span>
<span style="color: #0000FF;">FROM</span>
<span style="color: #808080;">&#40;</span>
  <span style="color: #0000FF;">SELECT</span> <span style="color: #0000FF;">DISTINCT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>t1<span style="color: #808080;">&#93;</span>
  <span style="color: #0000FF;">UNION</span> <span style="color: #808080;">ALL</span>
  <span style="color: #0000FF;">SELECT</span> <span style="color: #0000FF;">DISTINCT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>t2<span style="color: #808080;">&#93;</span>
<span style="color: #808080;">&#41;</span> a</pre></div></div>

<p>No?  Then why are you OK with this?</p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>t1<span style="color: #808080;">&#93;</span>
<span style="color: #0000FF;">UNION</span>
<span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>t2<span style="color: #808080;">&#93;</span></pre></div></div>

<p>Personally, I tend to use UNION to combine data from two different sources.  For example, if I wanted to combine the sales transactions from two JDE instances - the query might look like:</p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>JDE1<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>dbo<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>F42119<span style="color: #808080;">&#93;</span>
<span style="color: #0000FF;">UNION</span>
<span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>JDE2<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>dbo<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>F42119<span style="color: #808080;">&#93;</span></pre></div></div>

<p>Each line here in a sales detail represents a line on an order, so assuming you selected all the PK columns in your query, a UNION won't remove any rows within either set, but when combined - it's possible the same PK could exist in both systems.  Now you could split hairs and say it's highly unlikely the rest of the row would be identical, but that's not the point - it's wrong to ever DISTINCT a set of transactions intended for creating a fact table.  Sure, in this particular case you could add a "SourceSystem" column that would stop that, but then you still have to accept that the UNION is blocking and expensive.  Just because a DISTINCT doesn't modify results doesn't mean it didn't do any work - it actually did a great deal of work.  Now consider that we're usually not selecting 2 columns, we're selecting 10-20. Do you want to wait for it to figure out all the rows are distinct when you already knew that?  Further, if they're not distinct you probably screwed up a JOIN somewhere.</p>
<p>As far as coding standards regarding UNION go, I would suggest never using UNION without the ALL clause and doing your DISTINCT elsewhere if that's actually what you intended.  Does that seem silly?  Yes - but I would wager you won't ever use the 2nd one outside of building Dimensions.</p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>JDE1<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>dbo<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>F42119<span style="color: #808080;">&#93;</span>
<span style="color: #0000FF;">UNION</span> <span style="color: #808080;">ALL</span>
<span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>JDE2<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>dbo<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>F42119<span style="color: #808080;">&#93;</span>
&nbsp;
<span style="color: #008080;">--OR</span>
&nbsp;
<span style="color: #0000FF;">SELECT</span> <span style="color: #0000FF;">DISTINCT</span> <span style="color: #808080;">*</span> <span style="color: #0000FF;">FROM</span>
<span style="color: #808080;">&#40;</span>
  <span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>JDE1<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>dbo<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>F42119<span style="color: #808080;">&#93;</span>
  <span style="color: #0000FF;">UNION</span> <span style="color: #808080;">ALL</span>
  <span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">&#91;</span>c1<span style="color: #808080;">&#93;</span>,<span style="color: #808080;">&#91;</span>c2<span style="color: #808080;">&#93;</span> <span style="color: #0000FF;">FROM</span> <span style="color: #808080;">&#91;</span>JDE2<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>dbo<span style="color: #808080;">&#93;</span>.<span style="color: #808080;">&#91;</span>F42119<span style="color: #808080;">&#93;</span>
<span style="color: #808080;">&#41;</span></pre></div></div>

<p>And don't get me started on unioning subqueries with GROUP BY's - Why don't you just throw half your processers in the garbage, light tempdb on fire and put all your data in heaps.</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2012/02/uncivil-unions/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Pattern for Conditionally Sending SSRS Subscriptions</title>
		<link>http://timlaqua.com/2011/10/pattern-for-conditionally-sending-ssrs-subscriptions/</link>
		<comments>http://timlaqua.com/2011/10/pattern-for-conditionally-sending-ssrs-subscriptions/#comments</comments>
		<pubDate>Wed, 19 Oct 2011 20:51:34 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Scripts & Code]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[bi]]></category>
		<category><![CDATA[ssrs]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=768</guid>
		<description><![CDATA[This is a pretty common request - send the report if there's an issue, don't send it if there's not an issue. This is a simple pattern for doing that using Data Driven Subscriptions. Here, we're not using the data driven subscription to dynamically populate recipient and parameter information, we're just using it to suppress [...]]]></description>
			<content:encoded><![CDATA[<p>This is a pretty common request - send the report if there's an issue, don't send it if there's not an issue.  This is a simple pattern for doing that using Data Driven Subscriptions.  Here, we're not using the data driven subscription to dynamically populate recipient and parameter information, we're just using it to suppress the sending of the report if the report has no value.</p>
<p>To do this, we only need one thing - a query that returns one row if the report should be sent and zero rows if the report should not be sent.  Here is an example - Let's say I want to send a report out if a JDE Address Book record with an AT1 of 'DC' has been updated after a certain julian date.</p>
<p>First, write a query to return rows meeting that criteria:<span id="more-768"></span></p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">SELECT</span> <span style="color: #808080;">*</span>
<span style="color: #0000FF;">FROM</span> LIB.<span style="color: #202020;">F0101</span>
<span style="color: #0000FF;">WHERE</span> ABAT1 <span style="color: #808080;">=</span> <span style="color: #FF0000;">'DC'</span>
	<span style="color: #808080;">AND</span> ABUPMJ <span style="color: #808080;">&gt;=</span> <span style="color: #000;">111292</span></pre></div></div>

<p>That's great, but it can return multiple rows...  So just select the first record (because all we care about is if we have one or more than one - exactly how many is irrelevant).  We also don't care what the column values are, so just select some arbitrary value.</p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">SELECT</span> <span style="color: #0000FF;">TOP</span> <span style="color: #000;">1</span> <span style="color: #000;">1</span> <span style="color: #0000FF;">AS</span> DoStuff
<span style="color: #0000FF;">FROM</span> LIB.<span style="color: #202020;">F0101</span>
<span style="color: #0000FF;">WHERE</span> ABAT1 <span style="color: #808080;">=</span> <span style="color: #FF0000;">'DC'</span>
	<span style="color: #808080;">AND</span> ABUPMJ <span style="color: #808080;">&gt;=</span> <span style="color: #000;">111292</span></pre></div></div>

<p>So now we have what we need in SQL - let me add one final note on this for those DB2 users out there.  DB2 doesn't understand "TOP" so we have to use their syntax, FETCH FIRST (and likewise for MySQL, use LIMIT).</p>

<div class="wp_syntax"><div class="code"><pre class="tsql" style="font-family:monospace;"><span style="color: #0000FF;">SELECT</span> <span style="color: #000;">1</span> <span style="color: #0000FF;">AS</span> DoStuff
<span style="color: #0000FF;">FROM</span> LIB.<span style="color: #202020;">F0101</span>
<span style="color: #0000FF;">WHERE</span> ABAT1 <span style="color: #808080;">=</span> <span style="color: #FF0000;">'DC'</span>
	<span style="color: #808080;">AND</span> ABUPMJ <span style="color: #808080;">&gt;=</span> <span style="color: #000;">111292</span>
<span style="color: #0000FF;">FETCH</span> <span style="color: #0000FF;">FIRST</span> <span style="color: #000;">1</span> <span style="color: #0000FF;">ROWS</span> <span style="color: #0000FF;">ONLY</span></pre></div></div>

<p>Now, you're ready to create your subscription.</p>
<h6>Go in to your report Subscriptions and click on the New Data Driven Subscription button</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/DataDrivenSubscriptionButton.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/DataDrivenSubscriptionButton.png" alt="" title="DataDrivenSubscriptionButton" width="482" height="31" class="alignnone size-full wp-image-771" /></a></p>
<h6>Enter meaningful name and select Shared Data Source</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/Step1-GeneralOptions.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/Step1-GeneralOptions.png" alt="" title="Step1-GeneralOptions" width="660" height="308" class="alignnone size-full wp-image-772" /></a><br />
<em>* If you don't use shared data sources - you should <img src='http://timlaqua.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </em></p>
<h6>Select Shared Data Source</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/Step2-DataSource.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/Step2-DataSource.png" alt="" title="Step2-DataSource" width="491" height="99" class="alignnone size-full wp-image-773" /></a><br />
<em>* I really hope you don't have a shared data source called "local" - this is just an example</em></p>
<h6>Enter query we developed above</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/Step3-Query.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/Step3-Query.png" alt="" title="Step3-Query" width="629" height="530" class="alignnone size-full wp-image-774" /></a></p>
<h6>Enter the usual options - all static values</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/Step4-SubscriptionOptions.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/Step4-SubscriptionOptions.png" alt="" title="Step4-SubscriptionOptions" width="574" height="537" class="alignnone size-full wp-image-775" /></a></p>
<h6>Enter parameters - usually just "Use Default"</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/Step5-Parameters.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/Step5-Parameters.png" alt="" title="Step5-Parameters" width="546" height="210" class="alignnone size-full wp-image-776" /></a><br />
<em>* This is one drawback to the pattern, you have to type in your parameter(s) - no dropdowns here if you're not using the default</em></p>
<h6>Select your schedule type</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/Step6-ChooseSchedule.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/Step6-ChooseSchedule.png" alt="" title="Step6-ChooseSchedule" width="488" height="137" class="alignnone size-full wp-image-777" /></a></p>
<h6>And finally the usual timed schedule options</h6>
<p><a style="padding-left: 3px; border-left: 5px solid #bbbbbb; display: block;" href="http://timlaqua.com/wp-content/uploads/2011/10/Step7-DefineSchedule.png"><img src="http://timlaqua.com/wp-content/uploads/2011/10/Step7-DefineSchedule.png" alt="" title="Step7-DefineSchedule" width="520" height="541" class="alignnone size-full wp-image-778" /></a></p>
<p>The schedule you specify will be both the time when the above query is executed to see if the report should be sent as well as the time the report will be sent out (assuming it should be sent out).  As far as who the report is sent to, 99% of the time this should be a distribution list that can be managed elsewhere.  You don't want to be wading through SSRS to update the list of subscribed users (unless you're the only subscribed user... then go ahead).</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2011/10/pattern-for-conditionally-sending-ssrs-subscriptions/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Troubleshooting: 1998 Jeep Grand Cherokee (ZJ) Doesn&#8217;t Start &#8211; Cranks, No Fuel, No Spark</title>
		<link>http://timlaqua.com/2011/07/troubleshooting-1998-jeep-grand-cherokee-zj-doesnt-start-cranks-no-fuel-no-spark/</link>
		<comments>http://timlaqua.com/2011/07/troubleshooting-1998-jeep-grand-cherokee-zj-doesnt-start-cranks-no-fuel-no-spark/#comments</comments>
		<pubDate>Mon, 25 Jul 2011 02:45:02 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[How-to Guides]]></category>
		<category><![CDATA[Thoughts]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=714</guid>
		<description><![CDATA[This has been one of the most frustrating repairs we have come across. One day the Jeep just plain refused to start anymore. We have had prolonged starting times for a while now where we will let fuel pump prime at least twice before it would start, but it would always start. Nothing really precluded [...]]]></description>
			<content:encoded><![CDATA[<p>This has been one of the most frustrating repairs we have come across.  One day the Jeep just plain refused to start anymore.  We have had prolonged starting times for a while now where we will let fuel pump prime at least twice before it would start, but it would always start.  Nothing really precluded the no start condition, we just turned it off one day and it didn't want to start again.  The symptoms don't really point to any particular component (other than the PCM) and without some fancy tools, you'll do exactly what we did - replace the PCM... and it won't fix anything.  So we took out our fancy tool, looked up some diagnostic diagrams on <a href="http://www.alldatadiy.com/" title="alldatadiy.com">alldatadiy.com</a>, and got to work.</p>
<p>A few things to check for right away to see if you're having the same issue we were:</p>
<ul>
<li>Check to see if the fuel pump runs during cranking - ours didn't</li>
<li>Check for spark during cranking - we didn't have any</li>
<li>Check to see if your check engine light is on (ours WASN'T)</li>
<li>Check your voltage and fuel gauges with the ignition on - ours didn't register anything</li>
<li>Check to see if your low fuel light is on - our was</li>
<p><a href="http://timlaqua.com/wp-content/uploads/2011/07/FuelLightSymptom.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/FuelLightSymptom-1024x764.jpg" alt="" title="FuelLightSymptom" width="550" height="410" class="alignnone size-large wp-image-728" /></a><br />
<span id="more-714"></span></p>
<p>Fancy tool time - we hooked up the Genisys EVO to the data link connecter (located under the steering wheel):<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/DataLinkLocation.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/DataLinkLocation-1024x764.jpg" alt="" title="DataLinkLocation" width="550" height="410" class="alignnone size-large wp-image-718" /></a></p>
<p>We first tried to connect to the PCM computer to view the Datastream (and check codes) - whatever it would tell us:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/EVOComputerSelection.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/EVOComputerSelection-764x1024.jpg" alt="" title="EVOComputerSelection" width="550" height="737" class="alignnone size-large wp-image-723" /></a></p>
<p>Aaaaand it said it didn't want to talk to us:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/EVOPCMFail.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/EVOPCMFail-764x1024.jpg" alt="" title="EVOPCMFail" width="550" height="737" class="alignnone size-large wp-image-725" /></a></p>
<p>Then we moved on to the BUS monitor to see if the bus was up and what computers we could talk to:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/EVOBUSMonitor.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/EVOBUSMonitor-764x1024.jpg" alt="" title="EVOBUSMonitor" width="550" height="737" class="alignnone size-large wp-image-722" /></a></p>
<p>Looks like the Body computer (BCM) is willing to talk to us:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/EVOBCMOk.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/EVOBCMOk-764x1024.jpg" alt="" title="EVOBCMOk" width="550" height="737" class="alignnone size-large wp-image-721" /></a></p>
<p>Now, we see the bus is up, the PCM appears to be down - so we replaced the PCM.  Unfortunately replacing the PCM did absolutely nothing for us other than lighten our wallets.  At this point, we did some digging on AllDataDiy for an appropriate troubleshooting test to figure out what on earth was going on.  While I can't re-publish their content due to the ToS agreement, I can tell you how we arrived at our final solution.</p>
<p>We started by testing the Throttle Position Sensor voltages:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/ThrottlePositionSensor.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/ThrottlePositionSensor-1024x764.jpg" alt="" title="ThrottlePositionSensor" width="550" height="410" class="alignnone size-large wp-image-731" /></a></p>
<p>Pin 3 should be above 4 volts:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/DMMLow.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/DMMLow-1024x764.jpg" alt="" title="DMMLow" width="550" height="410" class="alignnone size-large wp-image-720" /></a></p>
<p>Since it was under 4 volts, we unplugged the Camshaft Position Sensor (connector locations below - this is the passenger side of the engine compartment):<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/PositionSensorsArrows.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/PositionSensorsArrows-1024x764.jpg" alt="" title="PositionSensorsArrows" width="550" height="410" class="alignnone size-large wp-image-739" /></a></p>
<p>And checked again - still under 4 volts:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/DMMLow.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/DMMLow-1024x764.jpg" alt="" title="DMMLow" width="550" height="410" class="alignnone size-large wp-image-720" /></a></p>
<p>Then we unplugged the Crankshaft Position Sensor and checked voltage again:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/DMMHish.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/DMMHish-1024x764.jpg" alt="" title="DMMHish" width="550" height="410" class="alignnone size-large wp-image-719" /></a></p>
<p>Finally, a bad component!  We replaced the Crankshaft Position Sensor and verified that all was well<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/CrankshaftPositionSensor.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/CrankshaftPositionSensor-1024x764.jpg" alt="" title="CrankshaftPositionSensor" width="550" height="410" class="alignnone size-large wp-image-717" /></a></p>
<p>Fuel Gauges now work, voltage works, and the low fuel light isn't on anymore<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/FuelGaugeWorking.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/FuelGaugeWorking-1024x764.jpg" alt="" title="FuelGaugeWorking" width="550" height="410" class="alignnone size-large wp-image-727" /></a></p>
<p>We started it up and checked the ECM datastream again - all systems go<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/EVOGoodDatastream.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/EVOGoodDatastream-764x1024.jpg" alt="" title="EVOGoodDatastream" width="550" height="737" class="alignnone size-large wp-image-724" /></a></p>
<p>Now, the troubleshooting procedure we started out with had us unplug the ECM at the beginning and then test the TPS pin 3 voltage - but these pictures are from us reproducing it after the fact and we forgot to unplug the ECM first... so we logged a code:<br />
<a href="http://timlaqua.com/wp-content/uploads/2011/07/EVOTPSCode.jpg"><img src="http://timlaqua.com/wp-content/uploads/2011/07/EVOTPSCode-764x1024.jpg" alt="" title="EVOTPSCode" width="550" height="737" class="alignnone size-large wp-image-726" /></a></p>
<p>I mention this code just as a side note - we cleared the code with the EVO, but if you just ignore it long enough it'll go away after a few cycles.</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2011/07/troubleshooting-1998-jeep-grand-cherokee-zj-doesnt-start-cranks-no-fuel-no-spark/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Analysis Services Writeback &#8211; Working with Weight Expressions</title>
		<link>http://timlaqua.com/2010/11/analysis-services-writeback-working-with-weight-expressions/</link>
		<comments>http://timlaqua.com/2010/11/analysis-services-writeback-working-with-weight-expressions/#comments</comments>
		<pubDate>Sat, 06 Nov 2010 17:57:21 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Scripts & Code]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[analysis services]]></category>
		<category><![CDATA[excel 2010]]></category>
		<category><![CDATA[ssas]]></category>
		<category><![CDATA[weight expression]]></category>
		<category><![CDATA[writeback]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=405</guid>
		<description><![CDATA[While writeback has been around for a while, it didn't really get easy to do until Excel 2010 was released because wrapping a UI around it was cumbersome. Now that we have a simple writeback UI via the What-If analysis dialogs in Excel, it's pry worth poking around at how to get things to allocate [...]]]></description>
			<content:encoded><![CDATA[<p>While writeback has been around for a while, it didn't really get easy to do until Excel 2010 was released because wrapping a UI around it was cumbersome.  Now that we have a simple writeback UI via the What-If analysis dialogs in Excel, it's pry worth poking around at how to get things to allocate the way you want.</p>
<p>Here's our starting point in the Adventure Works cube (note, I commented out all the scope statements in the MDX script that distribute quarterly quotas/targets to months - in AW, quotas only exist in the data warehouse at the calendar quarter level):<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-Start.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-Start.png" alt="" title="Writeback-Start" width="245" height="180" class="alignnone size-full wp-image-415" /></a></p>
<p>Let's start with something simple - Equal Allocation:<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-EvenDist.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-EvenDist.png" alt="" title="Writeback-EvenDist" width="247" height="182" class="alignnone size-full wp-image-407" /></a><br />
<span id="more-405"></span><br />
Now let's try to figure out this Weight Expression thing by throwing a 1 in there:<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-WeightExpressionOne.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-WeightExpressionOne-178x300.png" alt="" title="Writeback-WeightExpressionOne" width="178" height="300" class="alignnone size-medium wp-image-417" /></a></p>
<p>Now discard previous changes and enter the quota at the Semester level again:<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-WeightExpressionOne-LeafCount.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-WeightExpressionOne-LeafCount.png" alt="" title="Writeback-WeightExpressionOne-LeafCount" width="246" height="181" class="alignnone size-full wp-image-420" /></a></p>
<p>Ok, that wasn't what we intended - but it does kind of explain what it's up to.  That's the number of detail cells (leaves) that it wrote data to - and it wrote the entire quota amount to each cell, then added them all up.  Note that the first leaf got the true-up balance - if your custom aggregation doesn't roll up properly, it seems that it figures out how much you were off and tosses whatever number is required to make it aggregate right in to the first leaf.</p>
<p>Now to get the right weight expression, we have to divide 1 (the entire quota) by the number of leaves that it's writing data to.  Sales quotas are related to the Date dimension, the Sales Territory dimension, and the Employee dimension, so it's going to write out one value for every intersection of the leaves of those dimensions (at whichever level the measure group is related to the dimension, so it doesn't write out a value for every date, it writes out a value for every quarter - because that's the level that quotas are associated with the date dimension, calendar quarter).  So we basically want:</p>
<p><strong>1 / [number of employees] / [number of sales regions] / [number of quarters]</strong></p>
<p>Here's the weight expression to accomplish that (note that we assume that we know what we're trying to do here:  enter quotas at the fiscal semester level.  That's why the following expression gets the Semester ancestor of the current fiscal calendar member, because we know that we want to distribute evenly across all quarters and we entered data at the semester level)</p>

<div class="wp_syntax"><div class="code"><pre class="mdx" style="font-family:monospace;"><span style="color: #cc66cc;">1</span>
<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
	<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		 <span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[All]</span>
		<span style="color: #66cc66;">,</span><span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>
	<span style="color: #003300; font-weight: bold;">&#41;</span>
 <span style="color: #003300; font-weight: bold;">&#41;</span>
<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
	<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		 <span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Sales Territory Region]</span>.<span style="color: #333333;">[All]</span>
		<span style="color: #66cc66;">,</span><span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Sales Territory Region]</span>.<span style="color: #333333;">[Sales Territory Region]</span>
	<span style="color: #003300; font-weight: bold;">&#41;</span>
 <span style="color: #003300; font-weight: bold;">&#41;</span>
<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
	<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		 <span style="color: #AF0000;">Ancestor</span><span style="color: #003300; font-weight: bold;">&#40;</span>
			 <span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #AF0000;">CurrentMember</span>
			<span style="color: #66cc66;">,</span><span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #333333;">[Fiscal Semester]</span>
		 <span style="color: #003300; font-weight: bold;">&#41;</span>
		<span style="color: #66cc66;">,</span><span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #333333;">[Fiscal Quarter]</span>
	<span style="color: #003300; font-weight: bold;">&#41;</span>
<span style="color: #003300; font-weight: bold;">&#41;</span></pre></div></div>

<p>And, of course, we end up with our old friend Equal Allocation:<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-WeightExpressionOne-Descendants-Results.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-WeightExpressionOne-Descendants-Results.png" alt="" title="Writeback-WeightExpressionOne-Descendants-Results" width="245" height="179" class="alignnone size-full wp-image-419" /></a></p>
<p>Now say you wanted to enter quotas at the intersection of the Fiscal Year and the Country.  Now we don't want all the sales regions anymore, we just want the Descendants of the current sales region's Ancestor at the Country level:</p>
<p>We start here:<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-FiscalYear-SalesTerritory-Start.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-FiscalYear-SalesTerritory-Start.png" alt="" title="Writeback-FiscalYear-SalesTerritory-Start" width="348" height="261" class="alignnone size-full wp-image-409" /></a></p>
<p>And enter the following Weight Expression:</p>

<div class="wp_syntax"><div class="code"><pre class="mdx" style="font-family:monospace;"><span style="color: #cc66cc;">1</span>
<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
	<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		 <span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[All]</span>
		<span style="color: #66cc66;">,</span><span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>
	<span style="color: #003300; font-weight: bold;">&#41;</span>
 <span style="color: #003300; font-weight: bold;">&#41;</span>
<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
	<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		 <span style="color: #AF0000;">Ancestor</span><span style="color: #003300; font-weight: bold;">&#40;</span>
			 <span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Sales Territory]</span>.<span style="color: #AF0000;">CurrentMember</span>
			<span style="color: #66cc66;">,</span><span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Country]</span>
		 <span style="color: #003300; font-weight: bold;">&#41;</span> 
		<span style="color: #66cc66;">,</span><span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Region]</span>
	<span style="color: #003300; font-weight: bold;">&#41;</span>
 <span style="color: #003300; font-weight: bold;">&#41;</span>
<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
	<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		 <span style="color: #AF0000;">Ancestor</span><span style="color: #003300; font-weight: bold;">&#40;</span>
			 <span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #AF0000;">CurrentMember</span>
			<span style="color: #66cc66;">,</span><span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #333333;">[Fiscal Year]</span>
		 <span style="color: #003300; font-weight: bold;">&#41;</span>
		<span style="color: #66cc66;">,</span><span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #333333;">[Fiscal Quarter]</span>
	<span style="color: #003300; font-weight: bold;">&#41;</span>
<span style="color: #003300; font-weight: bold;">&#41;</span></pre></div></div>

<p>And then we enter the quota at the intersection of Fiscal Semester and Country:<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-FiscalYear-SalesTerritory-Even.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-FiscalYear-SalesTerritory-Even-300x153.png" alt="" title="Writeback-FiscalYear-SalesTerritory-Even" width="300" height="153" class="alignnone size-medium wp-image-408" /></a></p>
<p>So all we've done this far is reproduce numbers similar to what Equal Allocation would get us.  But what did we just do really?  We distributed the sales quotas across all employees - but only Sales People have sales quotas...  oops (the following is sliced by [Employee].[Sales Person Flag] on columns):<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-SalesPerson-Oops.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-SalesPerson-Oops-300x104.png" alt="" title="Writeback-SalesPerson-Oops" width="300" height="104" class="alignnone size-medium wp-image-412" /></a></p>
<p>And now we finally get to why we want to use Weight Expressions in the first place.  We only want to distribute quotas across sales people (note that we've went back to just distributing evenly across all sales regions again for simplicity):</p>

<div class="wp_syntax"><div class="code"><pre class="mdx" style="font-family:monospace;"><span style="color: #CC00FF;">iif</span><span style="color: #003300; font-weight: bold;">&#40;</span><span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>.<span style="color: #AF0000;">CurrentMember</span>.<span style="color: #FF00FF;">Properties</span><span style="color: #003300; font-weight: bold;">&#40;</span><span style="color: #ff0000;">&quot;Sales Person Flag&quot;</span><span style="color: #003300; font-weight: bold;">&#41;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;True&quot;</span>
<span style="color: #66cc66;">,</span>
	<span style="color: #cc66cc;">1</span>
	<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
			 <span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[All]</span>
			<span style="color: #66cc66;">,</span><span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Employee]</span>
		<span style="color: #003300; font-weight: bold;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #333333;">[Employee]</span>.<span style="color: #333333;">[Sales Person Flag]</span>.&amp;<span style="color: #333333;">[True]</span>
	 <span style="color: #003300; font-weight: bold;">&#41;</span>
	<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
			 <span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Sales Territory Region]</span>.<span style="color: #333333;">[All]</span>
			<span style="color: #66cc66;">,</span><span style="color: #333333;">[Sales Territory]</span>.<span style="color: #333333;">[Sales Territory Region]</span>.<span style="color: #333333;">[Sales Territory Region]</span>
		<span style="color: #003300; font-weight: bold;">&#41;</span>
	 <span style="color: #003300; font-weight: bold;">&#41;</span>
	<span style="color: #66cc66;">/</span><span style="color: #CC00FF;">Count</span><span style="color: #003300; font-weight: bold;">&#40;</span>
		<span style="color: #0000FF;">Descendants</span><span style="color: #003300; font-weight: bold;">&#40;</span>
			 <span style="color: #AF0000;">Ancestor</span><span style="color: #003300; font-weight: bold;">&#40;</span>
				 <span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #AF0000;">CurrentMember</span>
				<span style="color: #66cc66;">,</span><span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #333333;">[Fiscal Semester]</span>
			 <span style="color: #003300; font-weight: bold;">&#41;</span>
			<span style="color: #66cc66;">,</span><span style="color: #333333;">[Date]</span>.<span style="color: #333333;">[Fiscal]</span>.<span style="color: #333333;">[Fiscal Quarter]</span>
		<span style="color: #003300; font-weight: bold;">&#41;</span>
	<span style="color: #003300; font-weight: bold;">&#41;</span>
<span style="color: #66cc66;">,</span>Null<span style="color: #003300; font-weight: bold;">&#41;</span></pre></div></div>

<p>And the results:<br />
<a href="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-SalesPerson-Correct.png"><img src="http://timlaqua.com/wp-content/uploads/2010/11/Writeback-SalesPerson-Correct-300x108.png" alt="" title="Writeback-SalesPerson-Correct" width="300" height="108" class="alignnone size-medium wp-image-411" /></a></p>
<p>Great, we got that particular slice all fixed up - but what about if we slice by employee?  Did we distribute sales quotas for the US across sales people that don't even work in the US?  What-If analysis is just that - "what happens if I do this?"  If you're never going to look at more detailed slices, it's fine the way it is.  If you're using writeback to publish data to the cube and let others slice on it all willy-nilly, you need to examine all the slices you just wrote data to and make sure your weight expression allocates the data the way you intended it to.</p>
<p>In the end, do we expect business users to be able to write their own weight expressions, publish to the masses, and understand what exactly just happened?  I doubt it.  That's a bit much to ask.  We can, however, create accurate weight expressions for business users if we know exactly where they want to enter the new data.</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2010/11/analysis-services-writeback-working-with-weight-expressions/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VersionOne Nag: Reminding Us To Burn Our Points</title>
		<link>http://timlaqua.com/2010/02/versionone-nag-reminding-us-to-burn-our-points/</link>
		<comments>http://timlaqua.com/2010/02/versionone-nag-reminding-us-to-burn-our-points/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 04:19:41 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Scripts & Code]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[powershell]]></category>
		<category><![CDATA[version one]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=341</guid>
		<description><![CDATA[You'll forget - we all do. After a hard day of work, the last thing that pops in to your head is "hey, I should go update this story in VersionOne before I go home." Oh no, the only thing you're thinking about is how bad traffic will be, what you're having for dinner, your [...]]]></description>
			<content:encoded><![CDATA[<p>You'll forget - we all do.  After a hard day of work, the last thing that pops in to your head is "hey, I should go update this story in VersionOne before I go home."  Oh no, the only thing you're thinking about is how bad traffic will be, what you're having for dinner, your trip to Seattle, which bar has the best drink specials tonight, etc.  So accepting that we forget to burn points now and then, why don't we just make a script to remind us?  While you're at it, might as well add a reminder for when you accidentally close a story without setting the ToDo points to zero.</p>
<p>Luckily, since you obviously use VersionOne (because it's the gold standard), there's an API for that:<br />
<span id="more-341"></span><br />
<em>Note:  The following script will request your VersionOne username and password via Read-Host - if you want this to run every day at 4pm, you need to embed your username and password somewhere (securestring support in powershell is helpful, but still - nothing's perfect in this scenario unless you can use LDAP auth)</em></p>
<p><strong>PowerShell script: v1Nag.ps1</strong></p>

<div class="wp_syntax"><div class="code"><pre class="powershell" style="font-family:monospace;"><span style="color: #800080;">$emailFrom</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;whoever.replies@shouldgoto.com&quot;</span>
<span style="color: #800080;">$emailSMTPServer</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;your.smtpserver.com&quot;</span>
<span style="color: #800080;">$teamName</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;Your Team Name in VersionOne&quot;</span>
&nbsp;
<span style="color: #800080;">$url</span> <span style="color: pink;">=</span> <span style="color: #800000;">&quot;https://wwwXXX.v1host.com/yourhostingid/&quot;</span>
<span style="color: #800080;">$username</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">Read-Host</span> <span style="color: #800000;">&quot;User&quot;</span>
<span style="color: #800080;">$password</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">Read-Host</span> <span style="color: #008080; font-style: italic;">-assecurestring</span> <span style="color: #800000;">&quot;Password&quot;</span>
&nbsp;
<span style="color: #800080;">$password</span> <span style="color: pink;">=</span> <span style="color: #000000;">&#91;</span>System.Runtime.InteropServices.Marshal<span style="color: #000000;">&#93;</span>::PtrToStringAuto<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#91;</span>System.Runtime.InteropServices.Marshal<span style="color: #000000;">&#93;</span>::SecureStringToBSTR<span style="color: #000000;">&#40;</span><span style="color: #800080;">$password</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$apiClient</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">resolve-path</span> <span style="color: #800000;">&quot;versionone.sdk.apiclient.dll&quot;</span>
<span style="color: #800080;">$objectModel</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">resolve-path</span> <span style="color: #800000;">&quot;versionone.sdk.objectmodel.dll&quot;</span>
<span style="color: #000000;">&#91;</span>Reflection.Assembly<span style="color: #000000;">&#93;</span>::<span style="color: #800000;">LoadFrom</span><span style="color: #000000;">&#40;</span><span style="color: #800080;">$apiClient</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">&gt;</span> <span style="color: #800080;">$NULL</span>
<span style="color: #000000;">&#91;</span>Reflection.Assembly<span style="color: #000000;">&#93;</span>::<span style="color: #800000;">LoadFrom</span><span style="color: #000000;">&#40;</span><span style="color: #800080;">$objectModel</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">&gt;</span> <span style="color: #800080;">$NULL</span>
<span style="color: #800080;">$v1</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">new-object</span> VersionOne.SDK.ObjectModel.V1Instance<span style="color: #000000;">&#40;</span> <span style="color: #800080;">$url</span><span style="color: pink;">,</span> <span style="color: #800080;">$username</span><span style="color: pink;">,</span> <span style="color: #800080;">$password</span><span style="color: #000000;">&#41;</span>
<span style="color: #800080;">$v1</span>.Validate<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$sf</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">new-object</span> VersionOne.SDK.ObjectModel.Filters.StoryFilter
<span style="color: #800080;">$v1</span>.Get.Iterations<span style="color: #000000;">&#40;</span><span style="color: #800080;">$null</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">|</span> <span style="color: pink;">?</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.IsActive <span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$sf</span>.Iteration.Add<span style="color: #000000;">&#40;</span><span style="color: #800080;"><span style="color: #000080;">$_</span></span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #800080;">$v1</span>.Get.Teams<span style="color: #000000;">&#40;</span><span style="color: #800080;">$null</span><span style="color: #000000;">&#41;</span> <span style="color: pink;">|</span> <span style="color: pink;">?</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.Name <span style="color: #FF0000;">-match</span> <span style="color: #800080;">$teamName</span> <span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$sf</span>.Team.Add<span style="color: #000000;">&#40;</span><span style="color: #800080;"><span style="color: #000080;">$_</span></span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span> 
<span style="color: #800080;">$stories</span> <span style="color: pink;">=</span> <span style="color: #800080;">$v1</span>.Get.Stories<span style="color: #000000;">&#40;</span><span style="color: #800080;">$sf</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$memberDetail</span> <span style="color: pink;">=</span> <span style="color: pink;">@</span><span style="color: #000000;">&#123;</span><span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$story</span> <span style="color: #0000FF;">in</span> <span style="color: #800080;">$stories</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
	<span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$owner</span> <span style="color: #0000FF;">in</span> <span style="color: #800080;">$story</span>.Owners<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
		<span style="color: #0000FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: pink;">!</span><span style="color: #800080;">$memberDetail</span>.Contains<span style="color: #000000;">&#40;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> 		
			<span style="color: #800080;">$md</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">New-Object</span> PSObject <span style="color: pink;">|</span> <span style="color: #008080; font-weight: bold;">select</span> Email<span style="color: pink;">,</span> DetailEstimate<span style="color: pink;">,</span> ToDo<span style="color: pink;">,</span> Effort<span style="color: pink;">,</span> EffortToday<span style="color: pink;">,</span> DoneWithToDo
			<span style="color: #800080;">$md</span>.Email <span style="color: pink;">=</span> <span style="color: #800080;">$owner</span>.Email;
			<span style="color: #800080;">$md</span>.DetailEstimate <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.ToDo <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.Effort <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.EffortToday <span style="color: pink;">=</span> <span style="color: #000000;">0</span>;
			<span style="color: #800080;">$md</span>.DoneWithToDo <span style="color: pink;">=</span> <span style="color: pink;">@</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
			<span style="color: #800080;">$memberDetail</span>.Add<span style="color: #000000;">&#40;</span><span style="color: #800080;">$owner</span>.ID<span style="color: pink;">,</span> <span style="color: #800080;">$md</span><span style="color: #000000;">&#41;</span>
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.ToDo <span style="color: pink;">+=</span> <span style="color: #800080;">$story</span>.ToDo;
		<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.DetailEstimate <span style="color: pink;">+=</span> <span style="color: #800080;">$story</span>.DetailEstimate;
&nbsp;
		<span style="color: #0000FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$story</span>.ToDo <span style="color: #FF0000;">-ne</span> <span style="color: #000000;">0</span> <span style="color: #FF0000;">-and</span> <span style="color: #800080;">$story</span>.Status.CurrentValue <span style="color: #FF0000;">-eq</span> <span style="color: #800000;">&quot;Done&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.DoneWithToDo <span style="color: pink;">+=</span> <span style="color: #800080;">$story</span>;
		<span style="color: #000000;">&#125;</span>
&nbsp;
		<span style="color: #0000FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$effortRecord</span> <span style="color: #0000FF;">in</span> <span style="color: #800080;">$story</span>.GetEffortRecords<span style="color: #000000;">&#40;</span><span style="color: #800080;">$null</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
			<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.Effort <span style="color: pink;">+=</span> <span style="color: #800080;">$effortRecord</span>.Value;
			<span style="color: #0000FF;">if</span> <span style="color: #000000;">&#40;</span><span style="color: #800080;">$effortRecord</span>.CreateDate <span style="color: #FF0000;">-ge</span> <span style="color: #000000;">&#91;</span>DateTime<span style="color: #000000;">&#93;</span>::Today<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
				<span style="color: #800080;">$memberDetail</span><span style="color: #000000;">&#91;</span><span style="color: #800080;">$owner</span>.ID<span style="color: #000000;">&#93;</span>.EffortToday <span style="color: pink;">+=</span> <span style="color: #800080;">$effortRecord</span>.Value;
			<span style="color: #000000;">&#125;</span>
		<span style="color: #000000;">&#125;</span>
	<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #800080;">$smtp</span> <span style="color: pink;">=</span> <span style="color: #008080; font-weight: bold;">new-object</span> Net.Mail.SmtpClient<span style="color: #000000;">&#40;</span><span style="color: #800080;">$emailSMTPServer</span><span style="color: #000000;">&#41;</span>
&nbsp;
<span style="color: #800080;">$memberDetail</span>.Values <span style="color: pink;">|</span> <span style="color: pink;">?</span><span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.EffortToday <span style="color: #FF0000;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #FF0000;">-and</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.ToDo <span style="color: #FF0000;">-gt</span> <span style="color: #000000;">0</span><span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$smtp</span>.Send<span style="color: #000000;">&#40;</span><span style="color: #800080;">$emailFrom</span><span style="color: pink;">,</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.Email<span style="color: pink;">,</span> <span style="color: #800000;">&quot;V1 Nag: No Points Burned Down Today&quot;</span><span style="color: pink;">,</span> <span style="color: #800000;">&quot;Please make sure you have recorded any effort completed on your stories for the day.&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #800080;">$memberDetail</span>.Values <span style="color: pink;">|</span> <span style="color: pink;">?</span><span style="color: #000000;">&#123;</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.DoneWithToDo.Count <span style="color: #FF0000;">-gt</span> <span style="color: #000000;">0</span> <span style="color: #000000;">&#125;</span> <span style="color: pink;">|</span> <span style="color: pink;">%</span> <span style="color: #000000;">&#123;</span> <span style="color: #800080;">$smtp</span>.Send<span style="color: #000000;">&#40;</span><span style="color: #800080;">$emailFrom</span><span style="color: pink;">,</span> <span style="color: #800080;"><span style="color: #000080;">$_</span></span>.Email<span style="color: pink;">,</span> <span style="color: #800000;">&quot;V1 Nag: Story Marked As Done With ToDo Balance&quot;</span><span style="color: pink;">,</span> <span style="color: #800000;">&quot;Please make sure you have zero'd out ToDo on your Completed/Done stories.&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#125;</span></pre></div></div>

<p>You'll need to download the .NET SDK and build the requisite DLLs from:<br />
<a href="http://community.versionone.com/Downloads/default.aspx">http://community.versionone.com/Downloads/default.aspx</a></p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2010/02/versionone-nag-reminding-us-to-burn-our-points/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wouldn&#8217;t it be fun if Cubes could talk?</title>
		<link>http://timlaqua.com/2009/11/wouldnt-it-be-fun-if-cubes-could-talk/</link>
		<comments>http://timlaqua.com/2009/11/wouldnt-it-be-fun-if-cubes-could-talk/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 19:47:21 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Scripts & Code]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[amo]]></category>
		<category><![CDATA[analysis services]]></category>
		<category><![CDATA[bi]]></category>
		<category><![CDATA[business intelligence]]></category>
		<category><![CDATA[cubes]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=291</guid>
		<description><![CDATA[I didn't say "wouldn't it be useful" because after putting a test together, asking a cube questions with no context tends to return answers that it probably shouldn't have returned. In BI, it is incredibly important to understand what exactly it is you're asking for - if we just say we want "sales" and return [...]]]></description>
			<content:encoded><![CDATA[<p>I didn't say "wouldn't it be useful" because after putting a test together, asking a cube questions with no context tends to return answers that it probably shouldn't have returned.  In BI, it is incredibly important to understand what exactly it is you're asking for - if we just say we want "sales" and return an answer, nobody really knows what we meant by "sales."  Sure, in various circles, "sales" means the same thing - but once you start talking to different areas, departments, etc - the meaning of the word starts to shift.</p>
<p>But I digress - asking cubes questions is still pretty fun and some of the random things it returns when you point it at your own cubes can be flat out hilarious.</p>
<p>Here's a few questions thrown at the Adventure Works cube in the Adventure Works DW 2008 Analysis Services database<br />
<span id="more-291"></span></p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">what was sales for nichole nara
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works])
$13,295.38
what were sales for nichole nara in cy 2004
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works]))
$2,419.06
what were sales for nichole nara in cy 2004 in north america
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works])))
No Results Found
what were sales for nichole nara in cy 2004 for bikes
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Product].[Category].[Bikes]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM (SELECT {[Customer].[Customer].[Nichole Nara]} ON 0 FROM [Adventure Works])))
$2,384.07
what were sales in north america in fy 2003 for bikes
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Product].[Category].[Bikes]} ON 0 FROM (SELECT {[Date].[Fiscal Year].[FY 2003]} ON 0 FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America]} ON 0 FROM [Adventure Works])))
$1,739,306.95
sales for cy 2004 in cy q1, cy q2, and cy q4 in north america and canada
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America],[Customer].[Country].[Canada]} ON 0 FROM (SELECT {[Date].[Calendar Quarter of Year].[CY Q1],[Date].[Calendar Quarter of Year].[CY Q2],[Date].[Calendar Quarter of Year].[CY Q4]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM [Adventure Works])))
I don't know - Query Failure: Members belong to different hierarchies in the  function.
sales for cy 2004 in cy q1, cy q2, and cy q4 in north america
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Sales Territory].[Sales Territory Group].[North America]} ON 0 FROM (SELECT {[Date].[Calendar Quarter of Year].[CY Q1],[Date].[Calendar Quarter of Year].[CY Q2],[Date].[Calendar Quarter of Year].[CY Q4]} ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2004]} ON 0 FROM [Adventure Works])))
$3,967,371.16
sales between cy 2003 and cy 2004 for large resellers
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT [Large Resellers] ON 0 FROM (SELECT {[Date].[Calendar Year].[CY 2003]:[Date].[Calendar Year].[CY2004]} ON 0 FROM [Adventure Works]))
$19,561,960.04
sales for top 50 customers in fy 2004 in fy q1 and fy q3
SELECT {[Measures].[Internet Sales Amount]} ON 0  FROM (SELECT {[Date].[Fiscal Quarter of Year].[FY Q1],[Date].[Fiscal Quarter of Year].[FY Q3]} ON 0 FROM (SELECT {[Date].[Fiscal Year].[FY 2004]} ON 0 FROM (SELECT [Top 50 Customers] ON 0 FROM [Adventure Works])))
$177,263.41</pre></div></div>

<p>The above questions returned pretty much exactly what I was looking for except for the one that threw us an error about members belonging to different hierarchies.  That one was because "Canada" was in [Customer].[Country] and "north america" was in [Sales Territory].[Sales Territory Group].  Yeah, it was a dumb question because canada is in north america, but it illustrates that when you don't qualify things, you can get some pretty confusing results.</p>
<p><strong>How's it work?</strong></p>
<ol>
<li>Enumerate all the Attribute Values for each Attribute Hierarchy and store them as "keywords"</li>
<li>Get some input</li>
<li>Look for the aforementioned "keywords" in the input string</li>
<li>Construct an MDX query based on what "keywords" were found in the string</li>
<li>Make sure there aren't any extra (non-noise) words in the string</li>
<li>Run Query</li>
<li>Return Results</li>
</ol>
<p><strong>How the queries are constructed</strong></p>
<ul>
<li>Attribute Values just create a subcube - it creates a new nested subcube for each list, range, or named set it finds</li>
<li>It only supports one measure as written and it just selects that from whatever quagmire of subcubes it's created</li>
</ul>
<p>There are tons of issues with this methodology when we have role playing dimensions because the attribute values will be the same for these dimensions - so only the first one enumerated will get in (there's a way to ignore certain dimensions in the app.config - ignore all but one role playing dimension).  It throws away context and calls it "noise" - now that's dangerous;  if you throw away the context and just look for keywords, it's pretty easy to answer a question that wasn't really asked (oops).</p>
<p>As far as configuring this thing goes - take a look at the app.config and throw in appropriate values for your setup.  You'll have to tweak the *Pattern values to fit things you want to match or exclude in your particular cube.  It's configured for the Adventure Works cube right now, but I didn't work with it much - I just flat out excluded a few dims and hierarchies that would obviously confuse it.</p>
<p>Also note that, as written, it needs an Analysis Services 2008 cube.</p>
<p>Let me know if you want to give it a try and I'll be more than happy to work with you on configuring/modifying it for your setup.  Also post comments on interesting observations you have when asking cubes unqualified questions <img src='http://timlaqua.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><a href='http://timlaqua.com/wp-content/uploads/2009/11/SmartCube.zip'>Download the VS 2008 Project: SmartCube.zip</a></p>
<p>Also note, the project uses an interface called IODoodad for getting questions and responding - this has two public methods, GetInput() and Respond().  The original theory here is that we could make an old-school IRC bot type thing.  We did manage to hook it to Yammer for its IO, respond to private messages and public messages prefixed with @cube, etc.  I didn't really explain the config for YammerIO (there's a custom config section for that that needs a bunch of OAuth stuff).  Again, if you're interested in getting that working, let me know and I'll post instructions.  The project above is set to use ConsoleIO.</p>
<p>I don't plan on doing any more development here, it was just a quick PoC to see what it looked like and get some initial feedback.  If anyone's interested in moving forward with it and making it smarter (the project arguably should have been titled DumbCube at this point), let me know so I can post a link to your work and fork away <img src='http://timlaqua.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2009/11/wouldnt-it-be-fun-if-cubes-could-talk/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Customer Service at the Golf Course (the customer is NOT always right)</title>
		<link>http://timlaqua.com/2009/03/customer-service-at-the-golf-course-the-customer-is-not-always-right/</link>
		<comments>http://timlaqua.com/2009/03/customer-service-at-the-golf-course-the-customer-is-not-always-right/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 12:00:45 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Golf]]></category>
		<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[customer servie]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=175</guid>
		<description><![CDATA[In most businesses, the name of the game is giving the customer what they want when they want it. Putting the right opportunities in front of them at the right time. At the golf course (the elitist ones), the game changes quite a bit. Take the Pro Shop for example - everything is overpriced, at [...]]]></description>
			<content:encoded><![CDATA[<p>In most businesses, the name of the game is giving the customer what they want when they want it.  Putting the right opportunities in front of them at the right time.  At the golf course (the elitist ones), the game changes quite a bit.  Take the Pro Shop for example - everything is overpriced, at least 20% above what you could get it for at TGW or GolfGalaxy.  Why?  Because if you're in need of something before a round and you remember just as you're standing in the pro shop, you're certainly not going to hop in your car and head over to GolfGalaxy - you just buy it there, you're trapped more or less.  Don't even bother trying to work with the pro shop guys on the price either, they could care less.  Which brings me to my second point - the staff.<br />
<span id="more-175"></span><br />
In most businesses, the staff is friendly and there to serve your every need (within reason) - here, at the golf course, the staff appears to be convinced that you are there to mess up their course.  It is your priveledge to play on their course - not your right.  Paying your greens fees in no way gives you the right to run amok leaving divots, unraked bunkers, and unsightly walking paths through all the hazards.  There is quite a bit to be said for cleaning up after yourself on the golf course - a few irresponsible patrons can do some pretty serious damage to the course.  But really, most golf course staff take it way too far.  Yesterday I showed up late for a tee time (by late, I mean on time - i was supposed to be on the tee box when I was paying my greens fees).  The pro shop guy started spouting off about how horrible this situation was, then I went on to say I was solo for the day, while my tee time was reserved for two.  Which, of course, led to a lecture on how much money I just cost him.  Playing as a single, the course goes pretty quick - the only issue is that you do take up the space between the group in front of you and the group behind you.  Regardless, the pro shop guy felt the need to ask the twosome (who had taken my slot on the teebox) if I could play with them.  They agreed (reluctantly - again, the staff pretty much tells you the way it is - they didn't have much of a choice).  So I played the first hole with them and jumped ahead to the 2nd hole once they both found the green.  Unfortunately, this is where I found the two foursomes in front of me and I got stuck there for the front 9.</p>
<p>I know, I shouldn't have played ahead and subsequently made the group behind me wait to tee off until after my 2nd shot, but I didn't come to the golf course to play with these two guys - and they didn't come here to play with me.  This isn't to say that two singles don't often find each other and have a nice time playing together - I'm saying that when a group comes to the course, they come to play together - not with strangers.  Singles are a different situation.</p>
<p>It is your duty as a responsible golfer to always replace divots, rake bunkers, and avoid tromping around in the weeds needlessly (usually hunting for balls, sometimes your own).  It just bothers me that the golf course staff, more often than not, seem to assume the worst about you.</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2009/03/customer-service-at-the-golf-course-the-customer-is-not-always-right/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Ellipsis &#8230; stop abusing it!</title>
		<link>http://timlaqua.com/2008/09/the-ellipsis-stop-abusing-it/</link>
		<comments>http://timlaqua.com/2008/09/the-ellipsis-stop-abusing-it/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 23:36:08 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[elipsis]]></category>
		<category><![CDATA[grammar]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=39</guid>
		<description><![CDATA[I have no idea how many times in the last week I've fell prey to the errant ellipsis. You see it in an instant message and then wait for the rest of the thought like a dog awaiting a promised treat. Alas, nothing follows. Do you ask for the rest of the thought? Do you [...]]]></description>
			<content:encoded><![CDATA[<p>I have no idea how many times in the last week I've fell prey to the errant ellipsis.  You see it in an instant message and then wait for the rest of the thought like a dog awaiting a promised treat.  Alas, nothing follows.  Do you ask for the rest of the thought?  Do you wait and try to followup next time you see them in person?  Or...  Even worse... do they not know what an ellipsis means?  For some reason more often than not lately I have been a victim of the "I just end sentences with multiple periods" syndrome.  Stop it.  You can not add extra periods to imply that you are super duper done with your statement.  Sure, extra exclimation points are good fun - but extra periods like... mean something - they don't indicate extra done-ness.</p>
<p>Now, I'm certainly not a grammar specialist, but when I see an ellipsis, I get all excited waiting for the held back nugget of drama.  Then when it doesn't come I am sad.  So, so sad.  So please.  One period means "statement over," while more than one means "more awesome stuff to come."</p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2008/09/the-ellipsis-stop-abusing-it/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Starting a Business = Divorce?</title>
		<link>http://timlaqua.com/2008/07/starting-a-business-divorce/</link>
		<comments>http://timlaqua.com/2008/07/starting-a-business-divorce/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 13:17:23 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Thoughts]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://timlaqua.com/?p=35</guid>
		<description><![CDATA[So I was trying to find some sort of "start a business" packet with all the required forms and such - so I naturally searched Google for "minnesota start a business packet" And what is the 3rd ranked hit? Starting a divorce. Nice.]]></description>
			<content:encoded><![CDATA[<p>So I was trying to find some sort of "start a business" packet with all the required forms and such - so I naturally searched Google for "minnesota start a business packet"</p>
<p>And what is the 3rd ranked hit?  Starting a divorce.  Nice.</p>
<p><a href='http://timlaqua.com/wp-content/uploads/2008/07/start-a-business-search.jpg'><img src="http://timlaqua.com/wp-content/uploads/2008/07/start-a-business-search.jpg" alt="" title="start-a-business-search" width="500" height="383" class="alignnone size-full wp-image-36" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://timlaqua.com/2008/07/starting-a-business-divorce/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

