<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><!-- generator="wordpress/2.2" --><rss 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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Tod means Fox</title>
	<link>http://blog.todmeansfox.com</link>
	<description>Business Intelligence, Data Warehousing, SQL, Visual FoxPro.</description>
	<pubDate>Mon, 10 Nov 2008 16:12:17 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2</generator>
	<language>en</language>
			<geo:lat>42.350909</geo:lat><geo:long>-71.54753</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/TodMeansFox" type="application/rss+xml" /><item>
		<title>ETL Subsystem 25: Version Control</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/448546485/</link>
		<comments>http://blog.todmeansfox.com/2008/11/10/etl-subsystem-25-version-control/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 16:10:35 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Data Warehousing]]></category>

		<category><![CDATA[Data Integration]]></category>

		<category><![CDATA[SQL Server 2005]]></category>

		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/11/10/etl-subsystem-25-version-control/</guid>
		<description><![CDATA[This article is part of a series discussing the Kimball Group&#8217;s &#8220;34 Subsystems of ETL&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. In my articles, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.
When I sat down at my desk and began [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size: x-small"><em>This article is part of a series discussing the Kimball Group&#8217;s &#8220;<a href="http://www.intelligententerprise.com/showArticle.jhtml?articleID=202405400">34 Subsystems of ETL</a>&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">In my articles</a>, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.</em></p>
<p>When I sat down at my desk and began putting together my notes on this subsystem a couple of weeks ago, I was reminded how important version control can really be. In fact, as I was looking through a few articles and books on the matter, I realized that I don&#8217;t do a great job of version control management. And unfortunately for data-warehoused businesses around the planet, I&#8217;m not alone. </p>
<h4>What I currently do</h4>
<p>I use version control software for all packages, database scripts, and configurations. Although not the greatest of the bunch, MS <a href="http://msdn.microsoft.com/en-us/vs2005/aa718670.aspx">Visual SourceSafe </a>does the job (we&#8217;ll be switching to <a href="http://www.serena.com/Products/dimensions/index.html">Serena Dimensions</a> soon, though). From reading various articles and from a few first-hand experiences I can tell you that many teams don&#8217;t even do this much. Ouch. </p>
<p>I tag each package, job, and source with a version number and relate these versions to the database and BI application versions. I will also label the source code in VSS to match. For example: version 4.0 of the database aligns with version 3.1 of the data integration systems which supports version 1.7 of the BI Portal. I currently coordinate this using a spreadsheet in Excel, with high hopes to get this into the database in the form of metadata that can be queried and used for planning and deployment purposes.</p>
<p>I should mention that versioning is particularly important in compliance-laden environments. If it is important to show an auditor how data got from point A to point B, then you&#8217;ll need to dig out the exact versions of the software that loaded the data at the time. This is why including version numbers in your logging and auditing routines is very important. I wrote earlier this year on this topic in my article &#8220;<a href="http://my.advisor.com/doc/19452">Auditing Your Warehouse for Sarbanes-Oxley Compliance</a>&#8220;. Take a look if you want more information and to see how I implemented this using SSIS. </p>
<p>At this time, I could segue into impact analysis; I&#8217;ll leave that for another post. </p>
<p>In addition to source control software and versioning, I use an LDM (Logical Data Mapping) that is stored as &#8220;business&#8221; metadata in the database. This metadata explains all source-to-target mappings and is sensitive to start and end dates. For example, if a vendor adds a column to one of our input files, I add the new column to the LDM and set the begin/end dates appropriately so that the historical mappings are left in tact. In this scenario, I can load an old file or a new file with little effort. When time permits, I will build logic into my SSIS packages so that, based on the date of the file being processed, the appropriate child package will be loaded. </p>
<h4>What I don&#8217;t do yet</h4>
<p>So far so good, but this is where I fall short. I have source control. I use major and minor versions and connect them to all other elements in the data warehouse environment. I even have a time-sensitive, table-driven LDM system. But I am lacking in the &#8220;control&#8221; area which has me worried. I have a lot of to-do items and half implementations. </p>
<p>What I need is a (fully automated, metadata-driven) system to coordinate different releases on different schedules and allow the packages to work (or not work) under certain database versions and environments. It would be nice to have some indicator in the ETL system that tell me if a certain version of a certain input file will load with a certain version of the database. To complicate matters more, much of what I do is based on certain mathematical models that sometimes change (yep, they have versions too). The question becomes, what version of what package works with models X, Y, Z for what database. Normally (99% of the time), everything is simple: the latest version of the package works for the latest version of each model on the current version of the data warehouse. That other 1% of the time is what makes my job interesting!  </p>
<p>Assuming that you already use source control…</p>
<h3>SQL Server 2005 Integration Services (SSIS)</h3>
<p>Some elements of version control are simple using SSIS. For starters, you are able to set the VersionMajor and VersionMinor properties to your ETL version. When you make a major change to the package &#8212; so that it will no longer work with historical data, for example &#8212; then you can also update the package ID (see property &#8220;ID&#8221; under the Identification group in the Properties window). As a general rule, you should update this ID if the package works fundamentally different than it did before.</p>
<p>When I get around to implementing the system for selecting the correct version of the package that matches the input file version, I&#8217;ll be sure to write about it. For now, it&#8217;s merely a figment of my imagination and needs some fleshing out. </p>
<p>What I <em>have</em> done, though, is create a custom Task which examines the input source file against the LDM. If a column name or type is out of place, the file is rejected. This prevents loading a file that might have an extra column suddenly or if columns were swapped for some reason. We deal with input data that is (mostly) trustworthy, but sometimes dirty. As a result, this extra checking has become necessary. If anyone is interested, I would be happy to share the code and logic of this custom Task in a future post. Just let me know!</p>
<p>The above is not a scenario that exists in every environment. For me, detecting the file version is very important. For you, it might not be a challenging issue.</p>
<p>I have also linked the package&#8217;s ID to the LDM and my logging system so that each package &#8212; as represented by its GUID &#8212; can relate to one or more versions of my mappings. This allows me to modify packages, but keeps the modifications tied to a particular mapping.    </p>
<h3>Hand Coding with Visual FoxPro (VFP9)</h3>
<p>Good developers will appropriately version their software. This should be part of <em>How to Write Software 101</em>, but is surprising to me how many times I&#8217;ve seen poor or non-existent versioning schemes. Hand-coding ETL is also a software development project and deserves the same versioning-attention you would give to any other good software.</p>
<p>In addition to versioning and source control, you should also consider versioning your metadata as I discussed above. I have written about and given presentations on this topic in the past with respect to the Logical Data Mappings. Check the following for more details:</p>
<ul>
<li><a href="http://blog.todmeansfox.com/whitepapers/">Hand Coding the Data Warehouse with VFP</a></li>
<li><a href="http://blog.todmeansfox.com/download/">2007 Fox Forward Presentation Logical Data Map Database </a></li>
<li><a href="http://blog.todmeansfox.com/all-articles/">Warehouse Data with Microsoft Visual FoxPro</a></li>
</ul>
<p>The LDM is not the only metadata to add to your version control, but this should give you a real good start! </p>
<h3>From Here</h3>
<p>So you have a good version control system in place. Now you need to migrate your current versions from your development environment into production. That&#8217;s what Subsystem 26 is all about. And lucky enough, that&#8217;s next on my list!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=RodQN"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=RodQN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=06AON"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=06AON" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/448546485" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/11/10/etl-subsystem-25-version-control/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/11/10/etl-subsystem-25-version-control/</feedburner:origLink></item>
		<item>
		<title>ETL Subsystem 24: Recovery and Restart System</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/441016460/</link>
		<comments>http://blog.todmeansfox.com/2008/11/03/etl-subsystem-24-recovery-and-restart-system/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 14:38:02 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Data Warehousing]]></category>

		<category><![CDATA[Data Integration]]></category>

		<category><![CDATA[SQL Server 2005]]></category>

		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/11/03/etl-subsystem-24-recovery-and-restart-system/</guid>
		<description><![CDATA[This article is part of a series discussing the Kimball Group&#8217;s &#8220;34 Subsystems of ETL&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. In my articles, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.
As eluded to in my previous post (Backup System), [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size: x-small"><em>This article is part of a series discussing the Kimball Group&#8217;s &#8220;<a href="http://www.intelligententerprise.com/showArticle.jhtml?articleID=202405400">34 Subsystems of ETL</a>&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">In my articles</a>, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.</em></p>
<p>As eluded to in my previous post (<a href="http://blog.todmeansfox.com/2008/10/28/etl-subsystem-23-backup-system/">Backup System</a>), bad things happen to good people. There are a ton of reasons to justify having a good backup procedure. A lot can go wrong with the hardware and software that make up your system. From network failures to bad service pack installs, a backup system is a must. But the best backup system in the world only gets you so far if you don&#8217;t have a system to recover or restart a failed process. </p>
<p>This is an ETL / <strong>Data Integration</strong> topic, so I&#8217;ll leave out discussion on restore capabilities found in backup tools. Of course, there may be times when restoring entire files, intermediate results, and staged data is necessary, but this is a job for your IT department. I&#8217;ll focus instead on how the ETL system should handle exceptions and failures.</p>
<p>At its most basic level, a recovery and restart system must allow you to stop, start, and retry your ETL processes. </p>
<p><img src='http://blog.todmeansfox.com/wp-content/uploads/2008/11/man-pulling-hair-out-2.thumbnail.jpg' alt='man-pulling-hair-out-2.jpg' />Some might argue (and I have been in the room with these debaters) that it is simpler and more manageable to simply restart the jobs from the beginning and not bother with the added complexities of recovery and restart. While this might be true for simple environments or small jobs, it is certainly not true for larger, more critical projects. Restarting, for example, saves you from having to re-acquire data from your sources. This is a huge benefit, as some sources are only available to you during certain load windows. In some cases &#8212; like in my environment &#8212; some source files are overwritten each day! Other times, your source data might come from an FTP site. Downloading the same (large) data over and over takes time.</p>
<p>Keep in mind that your recovery and restart systems must be smart enough to clean up partial or damaged work. You&#8217;ll need the ability to back out of processes that partially finished, or even to rollback committed changes in order to ensure continued quality and integrity of your data warehouse and staging area. This is not an easy task and requires a lot of planning. Make your life easier by planning well ahead of time and try to link your recovery and restart procedures directly to the times when you write data to disk (&#8221;staging&#8221;).</p>
<h3>SQL Server 2005 Integration Services (SSIS)</h3>
<p>To start, use transactions in your packages. Transactions are an often underused capability of SSIS. They should be a part of your package designs so that blocks of tasks can be handled together as logical units. Transactions can be defined on the Task and container level, giving you the flexibility to nest and work with transactions in parallel. To get this working, you will need to set TransactionOption on the parent container to &#8220;Required&#8221;. This will initiate a new transaction if its parent hasn&#8217;t already done so. Child Tasks can participate by also setting TransactionOption to &#8220;Required&#8221; or &#8220;Supported&#8221;. A common technique you could employ: Use a Sequence Container to group related Tasks together, setting the Sequence Container&#8217;s TransactionOption to &#8220;Required&#8221; and all of its contained Tasks TransactionOption to &#8220;Supported&#8221;. </p>
<p>But transactions only get you part of the way there, and are not suited for every situation. </p>
<p>SSIS comes with a powerful and also underused feature called &#8220;Checkpoints&#8221;. Checkpoints allow you to restart failed packages from the point of failure, instead of rerunning the whole package again. The process is rather simple. SSIS will record information about its current execution to a special log file (this log file is overwritten each time the package is started from the beginning). When the package fails, and is subsequently rerun, the package will read the checkpoint log and attempt to pick up where it left off.</p>
<p>What&#8217;s particularly handy about SSIS&#8217;s implementation is that you can control checkpointing on Tasks and containers using the FailPackageOnFailure property. Set this property to True for each Task you want to participate. Furthermore, checkpointing is smart enough to recognize and handle transactions.</p>
<h3>Hand Coding with Visual FoxPro (VFP9)</h3>
<p>VFP supports transactions for both database tables and free tables (the latter works in VFP9 if you use the MAKETRANSACTABLE() function). This is nice, but doesn&#8217;t allow you &#8212; without some creative coding &#8212; to wrap transactions in the same way SSIS does with its containers and tasks.  </p>
<p>You also don&#8217;t get built-in functionality to resume processes in Visual FoxPro after a failure. You might be able to use the RETRY command in combination with an error handler to fix problems as they are occurring, but for the sake of this subsystem, you need a &#8220;retry&#8221; mechanism that can span multiple sessions (i.e. restarting a process after the executable has already exited). The consequence is that you will need to design your ETL system in such a way that it can pick up where it left off, or go back to a previous step. You will need to:</p>
<ul>
<li>Create &#8220;markers&#8221; in the workflow of your code (the most natural place for any marker is right after data has been staged to disk, but you could also create intermediate markers as well)</li>
<li>Log successful passes through each marker so the system will know where to pick up where it left off</li>
<li>Make each marker smart enough to clean up any partial work left over by a previous failed run</li>
</ul>
<p>The easiest way to implement the third point above is to use transactions in combination with cursors for all temporary work. If a job fails (the lights go out) then your cursors will be lost, but you should be able to restart from the last good marker. Since the cursors didn&#8217;t do anything permanent, there is nothing to clean up. This creates a natural and easy-to-manage recovery and restart system.</p>
<p>The bottom line: You&#8217;ll need to be creative when implementing a recovery and restart system using VFP (or any other hand coded solution). </p>
<h3>From Here</h3>
<p>Next, I&#8217;ll talk about version control (Subsystem 25) and version migration (Subsystem 26). Both of these subsystems deal with deployment and have tripped up many teams (I&#8217;ve been a part of such teams and have hopefully learned from the mistakes).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=mgVzN"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=mgVzN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=040IN"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=040IN" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/441016460" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/11/03/etl-subsystem-24-recovery-and-restart-system/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/11/03/etl-subsystem-24-recovery-and-restart-system/</feedburner:origLink></item>
		<item>
		<title>ETL Subsystem 23: Backup System</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/434828741/</link>
		<comments>http://blog.todmeansfox.com/2008/10/28/etl-subsystem-23-backup-system/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 15:42:05 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Data Warehousing]]></category>

		<category><![CDATA[Data Integration]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/10/28/etl-subsystem-23-backup-system/</guid>
		<description><![CDATA[This article is part of a series discussing the Kimball Group&#8217;s &#8220;34 Subsystems of ETL&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. In my articles, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.
You&#8217;ve just spent the better part of the year [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size: x-small"><em>This article is part of a series discussing the Kimball Group&#8217;s &#8220;<a href="http://www.intelligententerprise.com/showArticle.jhtml?articleID=202405400">34 Subsystems of ETL</a>&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">In my articles</a>, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.</em></p>
<p>You&#8217;ve just spent the better part of the year designing a perfect ETL system - from <a href="http://blog.todmeansfox.com/2007/12/07/etl-subsystem-1-data-profiling/">data profiling</a> to <a href="http://blog.todmeansfox.com/2008/09/16/etl-subsystem-21-data-propagation-manager/">data propagation</a>. You&#8217;re in production, and all jobs are running on schedule in what seems to be an eerie harmony. You lean back in your chair. <em>Victory</em>, you think. </p>
<p>Then comes the call: Your database server crashed. Now what? </p>
<p>You must have a reliable backup system in place &#8212; and not just overnight tape backups conducted by your IT department. Those are a good first (baby) step, but they are usually not good enough, especially to help you recover from failures in mid ETL stride. Even with a fully redundant environment, you have got to be sure that you can re-run jobs from your staging area no matter where they failed. This is an ETL responsibility not to be passed off to IT. This means that an accessible backup of all staging data is essential. Remember, you should stage data at each major step in the ETL process (after load, after cleansing, conforming, and just before delivery). Doing so allows you to return to these staging points in order to recover from failures when they occur during ETL processing. I&#8217;ll discuss this more in my next post &#8220;ETL Subsystem 24: Recovery and Restart System&#8221;. </p>
<p>If you use a staging area, then you&#8217;re already part of the way there. The only thing you need to manage at this point is to plan and implement your backup strategy. Backing up staged data as it is being staged can be tricky. You can write to two different locations, on different machines or on different drives of the same machine. Consider this the poor-man&#8217;s approach to staging area backups. I&#8217;ve done this often; as it is easy and inexpensive (disk space is cheap and getting cheaper). More sophisticated mechanisms exist (for example, check out <a href="http://www-01.ibm.com/software/tivoli/products/continuous-data-protection/">IBM Tivoli</a>). Your policies, existing services, compliance concerns, and your ability to recreate lost data will all play a factor in determining what level of backups you need to make.</p>
<p>Storage of these backups, including the question on how long to keep the archives, is something you&#8217;ll need to consider as well. For critical data that cannot be reproduced, you will want to store it for a very long time in a safe location. For easily reproduced data, you might want to keep it long enough to appease the auditors. For the staging area, it might be safe to keep it only until the next run. </p>
<h3>From Here</h3>
<p>I won&#8217;t frame this subsystem using SSIS or Visual FoxPro, as I&#8217;ve done with the other subsystems to date. Backing up your data and files &#8212; unless you use the poor-man&#8217;s approach &#8212; is not a function that you can do using the ETL tooling. And doing a manual copy of staging data might be as simple as moving files from one directory to another, or using database replication to replicate changes from your main database to a linked, backup database on another machine.</p>
<p>You have a lot of decisions to make when it comes to your backup system. Next post, I&#8217;ll discuss recovery and restart, ETL Subsystem 24. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=z7WDM"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=z7WDM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=5FxBM"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=5FxBM" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/434828741" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/10/28/etl-subsystem-23-backup-system/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/10/28/etl-subsystem-23-backup-system/</feedburner:origLink></item>
		<item>
		<title>ETL Subsystem 22: Scheduler</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/426632578/</link>
		<comments>http://blog.todmeansfox.com/2008/10/20/etl-subsystem-22-scheduler/#comments</comments>
		<pubDate>Mon, 20 Oct 2008 17:46:16 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Data Warehousing]]></category>

		<category><![CDATA[Data Integration]]></category>

		<category><![CDATA[SQL Server 2005]]></category>

		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/10/20/etl-subsystem-22-scheduler/</guid>
		<description><![CDATA[This article is part of a series discussing the Kimball Group&#8217;s &#8220;34 Subsystems of ETL&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. In my articles, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.
This subsystem addresses one of the more basic management-related [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size: x-small"><em>This article is part of a series discussing the Kimball Group&#8217;s &#8220;<a href="http://www.intelligententerprise.com/showArticle.jhtml?articleID=202405400">34 Subsystems of ETL</a>&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">In my articles</a>, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.</em></p>
<p><img src='http://blog.todmeansfox.com/wp-content/uploads/2008/10/time.thumbnail.jpg' alt='Schedule' />This subsystem addresses one of the more basic management-related functions of ETL: Scheduling. You must provide a way to reliably run your packages and scripts. Data moves into and out of the Data Warehouse continuously; scheduling provides a structured and predictable way of managing the process. </p>
<p>I use the term &#8220;predictable&#8221; because it is often necessary to provide business users and other applications with data at specific intervals throughout the day and week. In my current project, for example, we provide a reporting data mart to a specific analytical application every morning at 9am. This reporting mart must have data up until the close of the previous day (and is not refreshed throughout the current day). If the timing wasn&#8217;t right (if, for example, some of yesterday&#8217;s data came into the database at 9:30), then the reporting database would not be ready for the business users. All of these timing issues are solved with a scheduler (and of course some agreements with the data providers to ensure data is available to process by the time the scheduled task runs!). </p>
<p>Scheduling is also used to organize and arrange processes so that dependencies and relationships among disparate data sources are processed logically. If data A must be loaded before data B and C, then data A will be scheduled first (worth mentioning again: a prerequisite for this is that the data is available from the source at the right time as well!). If one load fails, a graceful exit from the process must be made with adequate notifications and alerts. Restarting at failure points (without having to rerun the entire process) is also a highly desireable feature of any scheduler. </p>
<p>I&#8217;ll get into these topics more in a few of my next subsystem posts.</p>
<h3>SQL Server 2005 Integration Services (SSIS)</h3>
<p>Scheduling SSIS packages is easy. The best option you have is also the most intuitive: The SQL Server Agent.</p>
<p><a href='http://blog.todmeansfox.com/wp-content/uploads/2008/10/sqlagentscheduler.gif' title='SQL Agent Job Scheduler'><img src='http://blog.todmeansfox.com/wp-content/uploads/2008/10/sqlagentscheduler.thumbnail.gif' alt='SQL Agent Job Scheduler' /></a>The SQL Server Agent is a Microsoft Windows service that executes scheduled tasks. These tasks are referred to as Jobs. A single job can consist of multiple steps and be run on multiple schedules. Schedules can be configured to respond to a specific event, at intervals, specific times, or on demand. In a single job, for example, you can run a few SSIS packages, some database stored procedures, and a few command line utilities. These can all be scheduled at various times throughout the day (perhaps each hour, or once in the morning and again at lunch), and you can get an email telling you when it finished.</p>
<p>The scheduling aspect of SQL Agent is quite powerful. Not only can you create a seemingly endless combination of schedules, you also have full control over how to handle each step if it fails or succeeds. All of these steps can be linked together in such a way that if any one job step fails, processing can halt or move on to another step (of your choice). If you think about it, you have built-in If/Else/EndIf and CASE logic available right in the scheduler. I find that developers who come from a programming background can make quick sense of this put together some rather elaborate and logical flows, with dependancies, prerequisites, and alternative paths built in. </p>
<p>Knowing this ahead of time can save you some effort in your ETL packages. So here&#8217;s a tip: Use the scheduler to manage package dependencies where you can, rather than trying to build these complexities into your Control Flows. Of course, every package should start out by examining the environment, to be sure that it has everything it needs to start processing. This might be the existence of a CSV file in some directory, a flag in a staging table that indicates a previous process has finished, or any other check-able condition. If you can get into the habit of using the scheduler for some dependency management, and you are familiar with using parent/child packages, then you really have full control over your ETL processes.</p>
<p>One drawback to using the scheduler for managing dependencies is that your packages are now dependent on the scheduler! If, for example, you need to debug a package, you may be forced to run other packages first, or you may need to manually create the environment ahead of time (set flags, move files, run other scripts, etc.). This is in contrast to having a single super master package call dozens of other master packages and SQL Tasks in a more visual way. The scheduler in this environment would simply schedule the super master package and that&#8217;s all. </p>
<h3>Hand Coding with Visual FoxPro (VFP9)</h3>
<p>Finding solutions for management-related and process-related development problems in VFP is easy if you utilize the wealth of information and tools available from the FoxPro community. The community has always been one of FoxPro&#8217;s greatest assets. And this subsystem, more than any other discussed so far, highlights this. </p>
<p>Scheduling is not something you can do out-of-the-box with VFP. One very good option is to simply use the Windows Task Scheduler to run your compiled executables or application files. If you&#8217;ve been following Doug Hennig&#8217;s blog, then you might have seen his excellent Task Scheduler class. He writes:</p>
<blockquote><p>This provides classes that can be used to create tasks in the Windows Task Scheduler. There are separate classes for Windows Vista, which uses Task Scheduler 2.0 and earlier Windows versions, which use Task Scheduler 1.0. Updated 2007/04/26.</p></blockquote>
<p><a href="http://www.stonefield.com/pub/TaskScheduler.zip">TaskScheduler.zip</a> is available for download on <a href="http://www.stonefield.com/techpap.aspx">Stonefield&#8217;s Whitepaper and SourceCode</a> page. </p>
<p>If you&#8217;re using SQL Server for your data warehouse database, then you could (and rightfully should) use the SQL Agent to run your VFP ETL applications from the command line (see my previous section on SSIS). In fact, in one system I worked with, I used a combination of SSIS packages with VFP compiled applications to handle a fairly complex VFP/SQL Server data integration environment. I used VFP much like SQL Server would rely on stored procedures and the CLR to conduct some complex row and set-based analytics. The SQL Agent &#8212; as with any scheduler &#8212; is a great way to bind different technologies together. </p>
<p>An option you should not explore is using the VFP Timer control in a running VFP application to schedule tasks. There are better options out there. If you disagree, feel free to start a discussion in the comments section of this post. I&#8217;ve attempted to use the Timer a few times in the past for these sorts of things, only to scrap it and go another way. One area worth exploring, however, is using a Timer in an application designed for the SysTray. Microsoft provided a SysTray class as part of their Solutions Samples when VFP8 was released. But even still, the scheduling capabilities of both SQL Agent and the Window&#8217;s Task Scheduler are very good and built in to both Windows and SQL Server environments.</p>
<h3>From Here</h3>
<p>I&#8217;ll continue discussing the management-related ETL Subsystems in my next series of posts. The next one is the Backup System, ETL Subsystem 23. Feel free to pass along any questions in the meantime!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=tDJYM"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=tDJYM" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=8ykRM"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=8ykRM" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/426632578" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/10/20/etl-subsystem-22-scheduler/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/10/20/etl-subsystem-22-scheduler/</feedburner:origLink></item>
		<item>
		<title>Busy Stretch</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/411885912/</link>
		<comments>http://blog.todmeansfox.com/2008/10/05/busy-stretch/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 13:09:40 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/10/05/busy-stretch/</guid>
		<description><![CDATA[Man I&#8217;ve been busy! Not only has my posting been limited in the past 3 weeks, but almost all of my extra-curricular activities have been put on hold as well (it feels like months ago I last played my guitar). There are a few things going on currently. Topmost on the list is the rollout [...]]]></description>
			<content:encoded><![CDATA[<p>Man I&#8217;ve been busy! Not only has my posting been limited in the past 3 weeks, but almost all of my extra-curricular activities have been put on hold as well (it feels like months ago I last played my guitar). There are a few things going on currently. Topmost on the list is the rollout of the first real significant upgrade to our DW/BI Project here at ING. When I mull over the &#8220;feature&#8221; list, it amazes me how our team of a few developers and analysts (all quant&#8217;s), and 2 contractors (an SSIS developer and a QA Manager) got it done. What&#8217;s more, it looks like we&#8217;ll be right on schedule with the release with a few days to spare. Of course, I hope now I haven&#8217;t jinxed us!</p>
<p>I joined this project in mid-stride back in January when I was hired as an external consultant. I was coming over fresh from the United States, to a new and exciting land, Belgium (where the waffles are hot and the chocolate is worth dying for) and a new industry, financials. After a year and a half in healthcare at Cardinal Health, I felt I was ready to enter the financial world &#8212; particularly investment management. And so I joined the quant team in the quantitative research department at ING Investment Management. </p>
<p>I was hired as a BI/DW consultant (functioning primarily as an Integration Architect) and was immediately charged with supporting the in-place data integration (ETL) processes for the then un-released DW/BI system. I began my work by documenting (some functional, bust mostly technical) the entire system. In a few weeks I had uncovered many issues and offered a long list of improvements to the team. Many items on my list were directly related to many of the <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">ETL Subsystems</a> that I&#8217;ve been discussing. Taking these to heart, we began the long process of refactoring, renaming, and redeveloping some of the processes that were in place. The focus was on future maintainability and performance. I&#8217;ve chronicled some of these in a few of my recent posts. </p>
<p>In addition to this, I slowly took over the project management duties and have now been managing the development activities for the entire team. By mid-summer, and due in part to several converging circumstances, I was hired as a full time member of the quant team. Now, my stake in this project&#8217;s success is even greater! </p>
<p>I expect to be just as busy over the next two weeks as the final touches are added to this release of the project. I&#8217;ve also started to compile a list of &#8220;lessons learned&#8221;, most of which will be relevant-enough to share with you all. I think that some of these might surprise you!</p>
<p>This week I&#8217;ll continue my posts on the ETL Subsystems. I&#8217;ll also likely start working on another article for Advisor (topic yet unknown). Lastly, planning for the next release of our DW/BI system is already underway, with development starting as early as November! </p>
<p>PS: If you ever find yourself feeling a bit overwhelmed or too engaged in your work, I highly recommend re-reading Walden (ahh, come on &#8212; everyone&#8217;s read Walden, right?!?). It has always managed to level me, reminding me how important it is to just sit back and relax once in a while.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=YWL5M"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=YWL5M" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=d1iXM"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=d1iXM" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/411885912" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/10/05/busy-stretch/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/10/05/busy-stretch/</feedburner:origLink></item>
		<item>
		<title>ETL Subsystem 21: Data Propagation Manager</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/394242411/</link>
		<comments>http://blog.todmeansfox.com/2008/09/16/etl-subsystem-21-data-propagation-manager/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 14:22:24 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Data Warehousing]]></category>

		<category><![CDATA[Data Integration]]></category>

		<category><![CDATA[SQL Server 2005]]></category>

		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/09/16/etl-subsystem-21-data-propagation-manager/</guid>
		<description><![CDATA[This article is part of a series discussing the Kimball Group&#8217;s &#8220;34 Subsystems of ETL&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. In my articles, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.
It will often become necessary for you to move [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size: x-small"><em>This article is part of a series discussing the Kimball Group&#8217;s &#8220;<a href="http://www.intelligententerprise.com/showArticle.jhtml?articleID=202405400">34 Subsystems of ETL</a>&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">In my articles</a>, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.</em></p>
<p>It will often become necessary for you to move data from the data warehouse to other applications, databases, and servers. This is a little different then scaling out your data warehouse to support multiple servers (an integration server, relational database server, reporting server(s), analytic server(s), etc.); typically, distributing data in this way is done via replication techniques. But this subsystem addresses another important need.</p>
<p>I usually refer to this need as &#8220;<strong>Data Provisioning</strong>&#8220;. Provisioning is a term borrowed from the telecommunications industry meant to describe the process of providing various telecom services to a customer. A data provision is simply a service that provides data to some client. The client can be an Excel sheet, XML file, application, operational system, or perhaps a master (MDM) database. </p>
<p>This subsystem is not the only place that you&#8217;ll be provisioning data to various client applications. BI Applications often allow various extracts and downloads that can be made available to the same list of clients. This usually comes by way of a downloadable report or extract. However, the data propagation subsystem provides a few additional benefits above what BI Applications can usually deliver. First, as an ETL process, you can utilize the full power of the ETL system to perform additional transformations on the data before delivery. Second, propagating data can be part of the ETL pipeline so that provisions can be made available as soon as the dimensional models are loaded (highly desirable if the provision is meant to update an operational or master data system). </p>
<p>Consider though that as an ETL function, these data provisions are best suited for well-defined, almost-never-changing requests for data. You would not use this subsystem to provide data in an ad hoc way to an analyst! You would, however, use this subsystem to provide a daily extract to your risk department for compliance reasons. </p>
<h3>SQL Server 2005 Integration Services (SSIS)</h3>
<p>The only challenge that you&#8217;re bound to face is providing the data in the various formats required by the client. I&#8217;ve found that Excel is particularly tricky to work with and as a consequence, I usually push my clients to accept CSV or Tab delimited files instead! </p>
<h3>Hand Coding with Visual FoxPro (VFP9)</h3>
<p>You&#8217;ll have no problems propagating data with FoxPro. In many cases, you can use SQL to get the data you need and simply write it to a table or file on disk. The COPY TO command supports different formats and it isn&#8217;t difficult to create outputs in other formats such as XML. Using the same techniques you would employ to connect to various servers (using ODBC drivers for example), you can push data into almost any environment. This is a strength of FoxPro that sets it apart from other ETL scripting languages. </p>
<h3>From Here</h3>
<p>There&#8217;s no real magic to propagating data. It&#8217;s an ETL function with the typical extract, transform, and load operations. You can treat it as part of your current ETL system; perhaps running provisions after your facts are loaded. Alternatively, provisions can be run on a schedule independent of normal ETL processing or can be run on demand as needed.</p>
<p>…</p>
<p>This post wraps up the “Data Delivery” function in the ETL environment. In my next post, I&#8217;ll move on to “ETL Management” functions including scheduling, backup, security and metadata.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=2ELYL"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=2ELYL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=HhPGL"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=HhPGL" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/394242411" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/09/16/etl-subsystem-21-data-propagation-manager/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/09/16/etl-subsystem-21-data-propagation-manager/</feedburner:origLink></item>
		<item>
		<title>Book Review: Wordpress Theme Design</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/384907609/</link>
		<comments>http://blog.todmeansfox.com/2008/09/06/book-review-wordpress-theme-design/#comments</comments>
		<pubDate>Sat, 06 Sep 2008 09:22:22 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Review]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/09/06/book-review-wordpress-theme-design/</guid>
		<description><![CDATA[Over the past few months I&#8217;ve had the book &#8220;WordPress Theme Design&#8221; on my desk ready to be reviewed (it&#8217;s another book from Packt publishing). I finally got to it earlier this week. You can read my review over at Amazon. I gave it 3 stars mainly because it wasn&#8217;t complete and lacked some of [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://blog.todmeansfox.com/wp-content/uploads/2008/09/wordpress_theme_design.thumbnail.jpg' alt='Wordpress Theme Design' />Over the past few months I&#8217;ve had the book &#8220;<a href="http://www.packtpub.com/wordpress-theme-design/book">WordPress Theme Design</a>&#8221; on my desk ready to be reviewed (it&#8217;s another book from <a href="http://www.packtpub.com/">Packt publishing</a>). I finally got to it earlier this week. You can read my review <a href="http://www.amazon.com/review/product/1847193099/ref=pr_all_summary_cm_cr_acr_txt?_encoding=UTF8&#038;showViewpoints=1">over at Amazon</a>. I gave it 3 stars mainly because it wasn&#8217;t complete and lacked some of the details I&#8217;d like to see in a &#8220;guide&#8221; book. But I can&#8217;t say I didn&#8217;t learn anything. </p>
<p>One of the reasons I picked up this title was because I&#8217;ve been itching to redesign Tod means Fox. I use WordPress (and like it very much) and have all the tools (and some questionable skills) for a redesign. But don&#8217;t worry, any redesign will have the same glorious orange that helps remind me of FoxPro, Firefox, ING, Packt, and Holland! But honestly, It&#8217;s been a while and I&#8217;m restless. I also want a redesign to be done entirely on my new iMac. If I do it quick enough, it will be my first real work performed on the new machine. </p>
<p>It turns out though that the book wasn&#8217;t very helpful. I&#8217;m sure it will sit on my shelf until some day in the distant future when its time to &#8220;clean up&#8221; the office. I&#8217;ll likely be on revision <em>n</em> of Tod means Fox, and who knows where WordPress will be. But I suppose that&#8217;s the nature of buying technology books. </p>
<p>Very few tech books stand the test of time. Those that do are usually pure reference and theory books and not how-to books.</p>
<p>I keep reference books (like the <em>PHP Cookbook</em>, <em>The Complete Reference: MySQL</em>, and of course the <em>Hacker&#8217;s Guide to Visual FoxPro</em>) at arms length. These books I go to often. Then there are the theory books. These are books I keep further away but access often &#8212; and usually not in front of the computer. Books like Kimball&#8217;s <em>The Data Warehouse Toolkit</em> and Zeldman&#8217;s <em>Designing with Web Standards</em> fit into this category. </p>
<p>OK, enough babbling. I&#8217;d be interested to hear your thoughts on a redesign, WordPress, time-tested tech books, or the fabulous color orange.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=aSvRL"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=aSvRL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=ExzmL"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=ExzmL" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/384907609" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/09/06/book-review-wordpress-theme-design/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/09/06/book-review-wordpress-theme-design/</feedburner:origLink></item>
		<item>
		<title>SQL Server and FoxPro on September 9 MS Security Bulletin</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/384328071/</link>
		<comments>http://blog.todmeansfox.com/2008/09/05/sql-server-and-foxpro-on-september-9-ms-security-bulletin/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 16:45:13 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[SQL Server 2005]]></category>

		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/09/05/sql-server-and-foxpro-on-september-9-ms-security-bulletin/</guid>
		<description><![CDATA[According to Microsoft&#8217;s advanced notification system for security updates, slated to be released on September 9, SQL Server and Visual FoxPro are among the affected software. A webcast will likely be held the day after the bulletin is released. The critical issue has to do with a vulnerability allowing remote code execution.
Specifically, these FoxPro versions [...]]]></description>
			<content:encoded><![CDATA[<p>According to Microsoft&#8217;s <a href="http://www.microsoft.com/technet/security/bulletin/ms08-sep.mspx">advanced notification system</a> for security updates, slated to be released on September 9, SQL Server and Visual FoxPro are among the affected software. A webcast will likely be held the day after the bulletin is released. The critical issue has to do with a vulnerability allowing remote code execution.</p>
<p>Specifically, these FoxPro versions as installed on Microsoft Windows 2000 Service Pack 4:</p>
<ul>
<li>Microsoft Visual FoxPro 8.0 Service Pack 1</li>
<li>Microsoft Visual FoxPro 9.0 Service Pack 1</li>
<li>Microsoft Visual FoxPro 9.0 Service Pack 2</li>
</ul>
<p>For SQL Server:</p>
<ul>
<li>SQL 2000 Reporting Services Service Pack 2</li>
<li>SQL Server 2005 Service Pack 2</li>
<li>SQL Server 2005 x64 Edition Service Pack 2</li>
<li>SQL Server 2005 for Itanium-based Systems Service Pack 2</li>
</ul>
<p>Be sure to check out the full report when issued on September 9th if this concerns you (.NET, MS Office, and IE users, you had better have a look too!).</p>
<p><a href="http://www.microsoft.com/technet/security/bulletin/ms08-sep.mspx#EDJAE">Security Bulletin website</a></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=A8ThL"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=A8ThL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=rTzML"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=rTzML" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/384328071" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/09/05/sql-server-and-foxpro-on-september-9-ms-security-bulletin/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/09/05/sql-server-and-foxpro-on-september-9-ms-security-bulletin/</feedburner:origLink></item>
		<item>
		<title>ETL Subsystem 20: OLAP Cube Builder</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/383243693/</link>
		<comments>http://blog.todmeansfox.com/2008/09/04/etl-subsystem-20-olap-cube-builder/#comments</comments>
		<pubDate>Thu, 04 Sep 2008 13:17:30 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Data Warehousing]]></category>

		<category><![CDATA[Data Integration]]></category>

		<category><![CDATA[SQL Server 2005]]></category>

		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/09/04/etl-subsystem-20-olap-cube-builder/</guid>
		<description><![CDATA[This article is part of a series discussing the Kimball Group&#8217;s &#8220;34 Subsystems of ETL&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. In my articles, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.
In my previous post, I discussed OLAP, the Analytics [...]]]></description>
			<content:encoded><![CDATA[<p style="font-size: x-small"><em>This article is part of a series discussing the Kimball Group&#8217;s &#8220;<a href="http://www.intelligententerprise.com/showArticle.jhtml?articleID=202405400">34 Subsystems of ETL</a>&#8220;. The Subsystems are a group of &#8220;Best Practices&#8221; for delivering a BI/DW solution. <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">In my articles</a>, I discuss how each Subsystem can be implemented in SSIS or hand coded in Visual FoxPro.</em></p>
<p>In my <a href="http://blog.todmeansfox.com/2008/08/26/analytical-databases/">previous post</a>, I discussed OLAP, the Analytics Server, and Cubes as a primer to this post. If you&#8217;re new to this topic, please have a look there for more details. This post is specific to building cubes from the ETL environment.</p>
<p>Cube building is simply the process of populating the analytical server database with data from the relational database. The relational database can contain relational or dimensional models.</p>
<p>You will want to re-build your analytical (OLAP) database after loading data into your dimensional model. This will keep your analytical data stored in the analytical database in sync with your dimensional models stored in the relational database. From the ETL point-of-view, the basic process works like this:</p>
<ol>
<li>Extract data from disparate sources for a business process</li>
<li>Cleanse and conform the data</li>
<li>Load Dimensions</li>
<li>Load Facts, rebuilding any aggregate fact tables</li>
<li>Build cubes and other analytical server objects (like aggregates and dimensions)</li>
</ol>
<p>These steps are repeated for each atomic business process dimensional model in the data warehouse. The first four are familiar, as I have discussed them at length. The last one should seem natural: You need to devise a way to alert the analytical database that the data warehouse has just been updated. The best place to do this is directly in the ETL system. How you handle the rebuild process is dependent upon how the OLAP vendor&#8217;s database works (I offer some suggestions below).</p>
<p>One thing to consider before building cube-updating code in your ETL workflow is latency. Latency, in this context, describes the time delay between the moment the atomic business process dimensional model is up-to-date, and the moment the related cube is up-to-date. It might seem natural to keep this in sync as close as possible. Certainly placing the code to update the cubes right after processing the fact tables in the ETL system is the way to go. But check your requirements. You may only need to have data refreshed once a day, in the early mornings for example (whereas your ETL system might run every 4 hours). You may also have a research environment where OLAP data need only be one week fresh. You can save yourself a lot of processing time by getting these requirements right. </p>
<p>To accommodate this and other scenarios, I highly recommend putting any cube-building or OLAP-related update code in a separate ETL package or module. As with fact and dimension processing, a master package or program (depending on your tool) will &#8220;call&#8221; the child packages or modules. You could embed some logic in the final step to only process cubes after the morning ETL run, for example. </p>
<p>I do not recommend processing OLAP cubes on a fixed schedule unless you can predict with certainty when your dimensional models will be ready. Normally, it makes most sense to kick off this process as soon as the facts have been loaded.</p>
<h3>SQL Server 2005 Integration Services (SSIS)</h3>
<p>If you&#8217;re using SSIS to update your cubes, then you are likely using SQL Server Analysis Services as your analytical database. If not, and you use SSIS, I&#8217;d like to know what you&#8217;re using for your analytic server and how you&#8217;re building your cubes! </p>
<p>SSIS comes with a powerful task that handles cube-building for you. It&#8217;s called &#8220;Analysis Services Processing Task&#8221; and can do the following: (a) connect to a SSAS database through the Analysis Services connection; (b) specify various objects in the database to update (measure groups, partitions, dimensions, cubes, mining models, mining structures, and databases); (c) define batch-mode or sequence mode to process objects together or one after another; (d) perform an impact analysis on objects associated with the cube; and (e) specify whether dependent and affected objects are also processed. </p>
<p>The Analysis Services Execute DDL Task also allows you to work with cubes by giving you the ability to run DDL statements, as defined by the Analysis Services Scripting Language (ASSL). These statements are included in an XMLA command (more on XMLA below). Although this task can&#8217;t process a cube, it can manipulate it. For details on the ASSL language, check out the <a href="http://msdn.microsoft.com/en-us/library/ms128525.aspx">Analysis Services Scripting Language Reference</a>.</p>
<h3>Hand Coding with Visual FoxPro (VFP9)</h3>
<p>FoxPro, like all programming languages, just isn&#8217;t an analytical database engine so there is no native cube or cube builder. So a lot here depends on what type of technology you are using to handle your cubes. </p>
<p>Your first stop should be to check with the vendor to see if there is an api or technique available to update and rebuild cubes. Even if this functionality exists, it might not be the best option.</p>
<p>For your second stop, look into running XML for Analysis (XMLA) scripts against the database. XMLA is a SOAP-based protocol for interacting with OLAP databases. Through web services, you simply issue commands (like &#8220;process&#8221;) and receive responses. For more information on XMLA, please check out the <a href="http://www.xmlforanalysis.com/">XML for Analysis</a> website.</p>
<h3>From Here</h3>
<p>It is normal for an ETL developer to be involved in generating cubes for analysis services, so this is a skill you should try to foster. Understanding dimensional modeling will give you a huge head start. </p>
<p>Next post (I&#8217;m getting closer and closer to the magic 34 &#8212; I just hope Ralph and the gang don&#8217;t decide to renumber them on me or something), I&#8217;ll go through ETL Subsystem 21: Data Propagation Manager!</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=JWc85L"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=JWc85L" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=ZMOclL"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=ZMOclL" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/383243693" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/09/04/etl-subsystem-20-olap-cube-builder/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/09/04/etl-subsystem-20-olap-cube-builder/</feedburner:origLink></item>
		<item>
		<title>Top 7 Reasons I Wear a Suit</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/378112807/</link>
		<comments>http://blog.todmeansfox.com/2008/08/29/top-7-reasons-i-wear-a-suit/#comments</comments>
		<pubDate>Fri, 29 Aug 2008 14:18:44 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/08/29/top-7-reasons-i-wear-a-suit/</guid>
		<description><![CDATA[I dislike wearing suits. 
It used to be that I could code in my favorite Phish t-shirt wearing sandals. I had a key instead of a badge, and lunch usually meant a few greasy pizzas or clam cakes. In those days, my attire only meant something if there was an off-site or if clients were [...]]]></description>
			<content:encoded><![CDATA[<p>I dislike wearing suits. </p>
<p>It used to be that I could code in my favorite <a href="http://www.phish.com">Phish </a>t-shirt wearing sandals. I had a key instead of a badge, and lunch usually meant a few greasy pizzas or clam cakes. In those days, my attire only meant something if there was an off-site or if clients were coming to visit &#8220;the shop&#8221; (which was a tiny building several miles from the heart of the big city). I could easily bounce back and forth between long and short hair and between full beard and cleaned-shaved. Ahh&#8230; those were the days.</p>
<p>Now I work in a major international city for a rather large bank. I code in a suit when I&#8217;m not in meetings, wear nice shoes, carry a badge, and eat salads and yogurt for lunch. *sigh*</p>
<p>To be fair, I enjoy the new challenges and the big city. And if wearing a suit on occasion is a consequence, I can live with it. So while a suit is not fully mandatory, I still wear one at times. Here&#8217;s why:</p>
<ol>
<li>It easily puts me in line with the dress code</li>
<li>Dressing is simpler in the morning (although sometimes it takes a couple of tries to get the perfect knot in my tie)</li>
<li>My wife tells me I look great</li>
<li>Dressing down on Friday never felt so good</li>
<li>I look more important than I am</li>
<li>I feel more important than I am</li>
<li>My jacket flaps behind me in the wind when I ride my bike to the train station, which makes me feel like a super hero with a cape</li>
</ol>
<p>Other than those fantastic reasons, wearing a suit is a real drag. </p>
<p><a href='http://blog.todmeansfox.com/wp-content/uploads/2008/08/pr2s_amsterdam_bicycle_suit1.jpg' title='Some man on a bike wearing a suit in Europe'><img src='http://blog.todmeansfox.com/wp-content/uploads/2008/08/pr2s_amsterdam_bicycle_suit1.thumbnail.jpg' alt='Some man on a bike wearing a suit in Europe' /></a> (I do admit, there is something rather Monty Pythonish about wearing a suit on a bike. I bet I look pretty silly to the folks driving past me. But riding my bike gives me more than 30 minutes a day of much-needed exercise, and on top of that, the price of gas here in Europe would blow your mind!)</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=Lpi5dK"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=Lpi5dK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=ZtUQGK"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=ZtUQGK" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/378112807" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/08/29/top-7-reasons-i-wear-a-suit/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/08/29/top-7-reasons-i-wear-a-suit/</feedburner:origLink></item>
		<item>
		<title>Analytical Databases</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/375271520/</link>
		<comments>http://blog.todmeansfox.com/2008/08/26/analytical-databases/#comments</comments>
		<pubDate>Tue, 26 Aug 2008 14:39:48 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Statistics]]></category>

		<category><![CDATA[Business Intelligence]]></category>

		<category><![CDATA[SQL Server 2005]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/08/26/analytical-databases/</guid>
		<description><![CDATA[Most of what I discuss on Tod means Fox (and especially in my 34 Subsystem series) has to do with relational database engines (SQL Server 2005 and Visual FoxPro in particular). For most data integration projects, desktop and web solutions, and data warehouses, the relational database is all you&#8217;ll need. It can be used to [...]]]></description>
			<content:encoded><![CDATA[<p><img src='http://blog.todmeansfox.com/wp-content/uploads/2008/08/ying-yang.thumbnail.PNG' alt='ying yang of relational verses analytical databases' />Most of what I discuss on Tod means Fox (and especially in my <a href="http://blog.todmeansfox.com/2007/11/26/34-subsystems-of-etl-data-integration/">34 Subsystem series</a>) has to do with relational database engines (SQL Server 2005 and Visual FoxPro in particular). For most data integration projects, desktop and web solutions, and data warehouses, the relational database is all you&#8217;ll need. It can be used to create and manage both relational and dimensional models. But in Business Intelligence applications, chances are that you&#8217;ll need an additional, more specialized form of multidimensional data storage and retrieval. Analytical databases cover this need. In fact, <a href="http://en.wikipedia.org/wiki/Codd">Dr. Codd</a>, the inventor of the relational database, often explained how analytical databases are a &#8220;necessary companion&#8221; to relational databases. </p>
<h3>The OLAP Story</h3>
<p>OLAP stands for Online Analytical Processing. It is a terrible name to describe multidimensional analytical databases. Instead of a more meaningful name, like FASMI (Fast Analysis of Shared Multidimensional Information) proposed by Nigel Pendse of &#8220;<a href="http://www.olapreport.com/">OLAP Report</a>&#8221; we seem to be stuck with OLAP. With great pain, I will continue to discuss analytical databases using the OLAP terminology. </p>
<p>Basically, an OLAP (*sigh*) database has certain characteristics that set it apart from relational databases. And, coincidentally, Pendse included all characteristics in the FASMI acronym. Check out the OLAP Report for more details. If you’re just getting into business analytics, or are in the process of evaluating analytical database software – you must visit this site!</p>
<h3>The Smartness Factor</h3>
<p>I like to think of the relational database as &#8220;dumb&#8221; and the analytic database as &#8220;smart&#8221;. Let me explain:</p>
<p>The primary focus of Analytic servers is to get the (often pre-calculated) data out of the database as quickly as possible, allowing the user to zoom in and out along different hierarchies. Contrast this with the Codd’s relational model which seeks to eliminate data anomalies at transaction time through normalization: data retrieval is slow and often complex. With this in mind, you can get a feel for how a database engine can store, catalog, and retrieve data differently. (In fact, this is what makes dimensional modeling in general so favorable for querying and analytics – it is not bound by the restrictiveness imposed by normalization. I’d also like to note that as with <strong>dimensional models</strong>, OLAP databases are multidimensional.)</p>
<p>While the relational database plays a very important role, so does the multidimensional (OLAP) database. It&#8217;s simply built differently to service a different need. </p>
<p>Primarily, analytic servers can manage aggregates, aggregate navigation, and complex calculations and summaries across hierarchies at blazing speeds. These skills were borrowed from both navigational database designs (think of the DOM or a Wiki) and hierarchal designs (trees with leaves and branches). A lot of this has to do with how the data is stored.</p>
<h3>Storage</h3>
<p>Analytics servers offer a different type of storage. MOLAP, or Multidimensional OLAP, can be much more efficient than relational engines. Some tools (like SQL Server Analysis Services) allow you to store your analytical databases in a relational way (ROLAP) or using a hybrid approach (HOLAP). Personally, I see no benefit at all with ROLAP, aside from real-time systems where using the relational database is a must because of the latency involved with updating the OLAP database. (Not to digress too much here, but even real-time environments can use MOLAP storage by using partitions and caches correctly.)</p>
<p>MOLAP is more natural and faster. This may differ depending on your tool choice, but I beg someone to tell me differently.  For a detailed discussion on how MOLAP and ROLAP engines store data, you can try this resource &#8220;<a href="http://download.microsoft.com/download/8/5/e/85eea4fa-b3bb-4426-97d0-7f7151b2011c/SSAS2005PerfGuide.doc">Analysis Services 2005 Performance Guide</a>&#8221; (which defines the way Analysis Services does it). </p>
<p>HOLAP storage is an interesting option and could actually perform well &#8211;even better than MOLAP in some instances &#8212; with less disk usage. But a lot of this depends on how many aggregates are defined and how often the system needs to query the relational database. It might be a good consideration, but if you&#8217;re not sure and you have plenty of disk space (disk space is cheap), then go with MOLAP.</p>
<h3>The smartness factor<sup>2</sup> (the MDX language)</h3>
<p>I like to think of SQL as &#8220;dumb&#8221; and MDX as &#8220;smart&#8221;. Let me explain:</p>
<p>The MultiDimensional eXpression (MDX) language was created about 10 years ago by Microsoft to work specifically with multidimensional data stored in analytical servers. This OLAP-specific language improves upon the SQL syntax, removing much of the bulkiness associated with the language. MDX is an elegant and highly relevant partner to the analytical database. While you could get out what you need using SQL, most every SQL statement will be a challenging one. It’s like cutting down a tree with a hand saw as opposed to using a chain saw. MDX is painless and intuitive. Concepts such as dimensions, hierarchies, and sets are built into the syntax. For more on MDX and the mdXML standard, please visit <a href="http://www.xmlforanalysis.com/"> XML For Analysis</a>.</p>
<p>Central to the MDX language is the cube concept, which deserves a proper introduction:</p>
<h3>Cubes</h3>
<p>OLAP data is stored in structures called cubes. As you know, a cube is a 3-dimensional solid that, given a point on three of its faces which form a vertex, can take you to a precise point somewhere within the cube itself. <img src='http://blog.todmeansfox.com/wp-content/uploads/2008/08/cube.thumbnail.PNG' alt='A cube' />This point represents the aggregate metric you want to view. The faces represent the different dimensions (like Product, Customer, and Time) that are used to find the point. The dimensions are further broken down by its hierarchies on each face.</p>
<p>Cubes are sometimes &#8212; and more aptly &#8212; called <em>hypercubes</em> (or a tesseract or &#8220;n-cube&#8221;) because analysis often makes it necessary to examine more than three points. As soon as you look at more than three faces, you need higher dimensionality.</p>
<p>I admit, when I first heard about cubes I was a bit intimidated. I felt that they were too complex and advanced. Now, working with cubes is natural. Notice though that the concept of a cube is almost the same thing as a star schema. The only difference (at least that I can really think of) is that a star schema generally stores atomic data, and barring any usable aggregate fact table, calculations need to be done on the fly. The cube theoretically stores the results of these calculations inside the cube. </p>
<h3>Dimensional Modeling</h3>
<p>If you read my blog, then you know I advocate dimensional models for proper data warehousing. If you also advocate and use dimensional models, then the concepts discussed so far will fit you well.</p>
<p>What&#8217;s great about using <strong>Dimensional Models</strong> in your relational database is that your OLAP database will almost mirror the design, making the development and deployment of your cubes so much easier. Not only that, but the cubes will likely load faster and be easier to maintain when built off of the dimensional model. Note you can still achieve most of what you can do without an analytics server, just by using a properly constructed set of business process dimensional models. The OLAP database is just smarter, making several tasks (navigating hierarchies, security, and calculations to name a few) easier. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=e21okK"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=e21okK" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=gkMcwK"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=gkMcwK" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/375271520" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/08/26/analytical-databases/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/08/26/analytical-databases/</feedburner:origLink></item>
		<item>
		<title>FoxPro on the Mac via Parallels</title>
		<link>http://feeds.feedburner.com/~r/TodMeansFox/~3/368125356/</link>
		<comments>http://blog.todmeansfox.com/2008/08/18/foxpro-on-the-mac-via-parallels/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 14:05:05 +0000</pubDate>
		<dc:creator>Tod McKenna</dc:creator>
		
		<category><![CDATA[Personal]]></category>

		<category><![CDATA[VFP]]></category>

		<guid isPermaLink="false">http://blog.todmeansfox.com/2008/08/18/foxpro-on-the-mac-via-parallels/</guid>
		<description><![CDATA[As you may know, last weekend I bought my first Mac. In a week, I&#8217;ve made a ton of progress and am starting to feel rather comfortable with the new OS. My first impression remains strong: The Mac is awesome. It takes fewer clicks to get things done, it is faster than PCs of equivalent [...]]]></description>
			<content:encoded><![CDATA[<p>As you may know, last weekend <a href="http://blog.todmeansfox.com/2008/08/10/itod/">I bought my first Mac</a>. In a week, I&#8217;ve made a ton of progress and am starting to feel rather comfortable with the new OS. My first impression remains strong: The Mac is awesome. It takes fewer clicks to get things done, it is faster than PCs of equivalent power, and it is much more intuitive. There are still a few things to do, like check with Adobe about cross-platform upgrades of Dreamweaver, Photoshop, and Acrobat. </p>
<p>I have, however, managed to place one very important piece of the migration puzzle: Getting FoxPro up and running.</p>
<h3>Virtualization</h3>
<p>To get Windows running on the Mac, you basically have two options: Dual boot via <a href="http://www.apple.com/macosx/features/bootcamp.html">Boot Camp</a> or use Virtualization. Boot Camp was not a great option for me because I want to work in the Mac and share items between the Windows install and OSX. For virtualization, I seemed to have three choices: <a href="http://www.virtualbox.org/">VirtualBox by Sun</a>, <a href="http://www.vmware.com/products/fusion/">VMware Fusion</a>, or <a href="http://www.parallels.com/en/products/desktop/">Parallels Desktop for Mac</a>. </p>
<p>Reviews for Parallels were slightly better overall, and I got a recommendation from a colleague, so I went with it. For less than 100 Euro, this software is simply incredible. Installation was as simple as downloading and running the installer. These were the steps I took:</p>
<ol>
<li>Downloaded the latest version from parallels.com</li>
<li>Double-clicked &#8220;Install Parallels Desktop&#8221;</li>
<li>Went through the Wizard, clicking Continue through each step</li>
<li>Accepted the terms of the license</li>
<li>Selected my Mac&#8217;s HD for the install destination</li>
<li>After the install finished, I moved the icon to the Dock</li>
<li>Started the software and from the Help menu clicked &#8220;Activate Product&#8221;</li>
<li>Entered the activation code that Parallels sent me via email</li>
<li>Clicked &#8216;New&#8217; from the File menu to create a new VM via the OS Installation Assistant</li>
<li>Selected &#8220;Windows Express Installation&#8221;, Next</li>
<li>Selected &#8220;Windows XP&#8221;, Next</li>
<li>Entered the XP product key, set some basic settings, and gave the VM a name</li>
<li>Chose to allocate more resourced to the VM than to Mac OSX</li>
<li>Clicked Finish</li>
</ol>
<p>Next, I installed Windows XP Professional using the new VM window created by Parallels. This was the fastest XP install I&#8217;ve ever done. Not only that, but the entire process was the same as if I had been on a PC (just in a window &#8212; which is a bit ironic). When Windows booted for the first time, and I heard the familiar Windows theme, I felt a sense of cool calm overcome me. <em>This was going to work.</em> </p>
<h4>Ejecting the CD</h4>
<p>During install, I had to insert my Windows 2000 disk (I have an Upgrade copy of XP Pro). I think it took me about 30 minutes to figure out how to eject the XP Pro CD from the Mac! Here&#8217;s how I did it:</p>
<ol>
<li>Right-click on the CD icon in the footer of the Parallels Desktop window</li>
<li>Choose &#8216;Disconnect&#8217;</li>
<li>The CD drive will re-appear in OSX&#8217;s Disk Utility application, where it can be ejected.</li>
<li>Right-click on the CD icon in the footer of the Parallels Desktop window to reconnect when ready</li>
</ol>
<p>When the VM is running, it &#8216;owns&#8217; the CD drive. Because I was installing XP Pro, I didn&#8217;t have any obvious way to eject the disk. There&#8217;s no button on the Mac and I wasn&#8217;t yet ready to <a href="http://forums.macosxhints.com/archive/index.php/t-47915.html">straighten out a paper clip</a>! The above steps are a bit of a hassle, but certainly doable.</p>
<h4>Two-times the Charm</h4>
<p>Of course, I had to do it all twice (my fault). I have an XP Pro version 2002 CD without any Service Packs. After Windows installed, I went straight for Windows update and let it install SP2. It failed with some read errors and then Windows would no longer boot. So, I deleted the VM and started over. No biggie. This was <em>easy</em>. This time, I installed SP1 and then went straight for SP3. That worked and now I&#8217;m golden. After getting all the other updates, I was ready for the Fox.</p>
<h3>Installing Visual FoxPro v9</h3>
<p>Ok, so there was nothing to installing FoxPro. I literally put the CD in, installed the prerequisites, and then VFP. No surprises, no issues, no problems. I ran some basic checks and so far everything seems to run fine. I&#8217;ve yet to do any development but if I have any issues, I&#8217;ll be sure to report them. </p>
<p>I recall at FoxForward 2007 seeing a few Macs. If you&#8217;re using VFP on your Mac &#8212; let me know about it. I&#8217;d like to know how you&#8217;ve done it (Boot Camp? VM Ware?) and if you&#8217;ve encountered any issues.</p>
<h3>Lord Voldemort</h3>
<p>Lastly, I&#8217;ve named my XP Pro Virtual Machine &#8220;<a href="http://en.wikipedia.org/wiki/Lord_Voldemort">Lord Voldemort</a>&#8221; of Harry Potter fame. My entire home network is named after various Harry Potter characters. I named my iMac <a href="http://en.wikipedia.org/wiki/Albus_Dumbledore">Dumbledore</a>. </p>
<p>This seems totally appropriate. </p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/TodMeansFox?a=URJB1K"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=URJB1K" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/TodMeansFox?a=GvDTpK"><img src="http://feeds.feedburner.com/~f/TodMeansFox?i=GvDTpK" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/TodMeansFox/~4/368125356" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.todmeansfox.com/2008/08/18/foxpro-on-the-mac-via-parallels/feed/</wfw:commentRss>
		<feedburner:origLink>http://blog.todmeansfox.com/2008/08/18/foxpro-on-the-mac-via-parallels/</feedburner:origLink></item>
	</channel>
</rss>
