<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3314324161486095135</id><updated>2011-12-13T07:23:54.048-07:00</updated><category term='PHP'/><category term='Drupal'/><category term='ArcIMS'/><category term='Firefox'/><category term='MS Access'/><category term='Javascript'/><category term='MS Outlook'/><category term='SQL Server'/><category term='HTML'/><category term='ArcGIS'/><category term='Ubuntu'/><category term='ArcSDE'/><category term='Windows'/><category term='ASP.Net'/><category term='IIS'/><title type='text'>oneidía</title><subtitle type='html'>One Idea A Day, What I Learned Today</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>57</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-4697929392271484785</id><published>2011-02-25T11:40:00.001-07:00</published><updated>2011-02-25T11:41:01.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>My new favorite Greasemonkey Script</title><content type='html'>Block experts-exchange from all Google search results!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://userscripts.org/scripts/show/9462"&gt;No Experts Exchange UserScript&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;Now thanks to the magic of Geasemonkey there's more Experts-Exchange cluttering your searches.&lt;br /&gt;&lt;br /&gt;Since I use the &lt;a href="https://www.eff.org/https-everywhere"&gt;HTTPS-Everywhere Firefox Add-on&lt;/a&gt; from the Electronic Frontier Foundation, I had to add a line to the script to also block Experts-Exchange on https://encrypted.google.com.&lt;br /&gt;&lt;br /&gt;Here's the full script with my edit:&lt;br /&gt;&lt;pre class="brush: js"&gt;// ==UserScript==&lt;br /&gt;// @name           No Experts Exchange&lt;br /&gt;// @namespace      JRice&lt;br /&gt;// @description    We HATES them, Exchange, dirty Expertsses!&lt;br /&gt;// @include        http://www.google.com/*&lt;br /&gt;// @include        https://encrypted.google.com/*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;br /&gt;var count = 0;&lt;br /&gt;list = document.getElementsByTagName('a');&lt;br /&gt;for (i=0; i&lt;list.length; (list[i].classname="=" (list[i].href.match(="" ))="" )="" ;="" experts-exchange="" i++)="" if="" l="" list[i].parentnode.parentnode.style.display="none" {="" }=""&gt;&lt;/list.length;&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-4697929392271484785?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/4697929392271484785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=4697929392271484785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4697929392271484785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4697929392271484785'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2011/02/my-new-favorite-greasemonkey-script.html' title='My new favorite Greasemonkey Script'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-2965592395521203910</id><published>2010-10-21T08:04:00.000-06:00</published><updated>2010-10-21T08:04:29.466-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcIMS'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcSDE'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>gis.stackexchange.com</title><content type='html'>The best &lt;a href="http://stackoverflow.com/"&gt;programming site on the net&lt;/a&gt;, now has a dedicated GIS section at &lt;a href="http://gis.stackexchange.com/"&gt;gis.stackexchange.com&lt;/a&gt;.&amp;nbsp; Not much else to say here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-2965592395521203910?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/2965592395521203910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=2965592395521203910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2965592395521203910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2965592395521203910'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/10/gisstackexchangecom.html' title='gis.stackexchange.com'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5651777022440031625</id><published>2010-09-20T17:00:00.005-06:00</published><updated>2010-09-20T17:13:04.285-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Simple HTTP Redirect with Querystring in IIS7</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_siWGhB-JGNY/TJfmrsjCn9I/AAAAAAAAAm0/yX8JvNd-dM4/s1600/clickin.png" imageanchor="1"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_siWGhB-JGNY/TJfmrsjCn9I/AAAAAAAAAm0/yX8JvNd-dM4/s1600/clickin.png" /&gt;&lt;/a&gt;&lt;/div&gt;HTTP Redirect seems simple enough.  Always was in IIS6 and in IIS7 there's even a button labeled &lt;i&gt;HTTP Redirect&lt;/i&gt; that promises relative redirects.&amp;nbsp; It looks like it'll be as easy Apache finally.&amp;nbsp; That is until you try to redirect a querystring.&amp;nbsp; Then everything bombs.&lt;br /&gt;&lt;br /&gt;Turns out it still is relatively easy, except you have to know that Microsoft changed $S$Q to $V$Q.  Why?  $Ss and $Gs I suspect.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;And How.&lt;/b&gt;&lt;br /&gt;In our example we'll redirect all pages under &lt;i&gt;http://olddomain.com/content&lt;/i&gt; to &lt;i&gt;http://mydomain.com/content. &lt;/i&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Pick the virtual directory you want to redirect.      e.g. &lt;i&gt;http://olddomain.com/content &lt;/i&gt;&lt;/li&gt;&lt;li&gt;Click &lt;i&gt;HTTP Redirect&lt;/i&gt; under &lt;i&gt;IIS &lt;/i&gt;in the IIS management console.&lt;/li&gt;&lt;li&gt;In the HTTP Redirect Dialog:&lt;/li&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_siWGhB-JGNY/TJfnR39S7LI/AAAAAAAAAm8/rsOtZ_0uxBg/s1600/redirect.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_siWGhB-JGNY/TJfnR39S7LI/AAAAAAAAAm8/rsOtZ_0uxBg/s1600/redirect.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Check &lt;i&gt;Redirect requests to this destination&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Enter your new path ending with $V$Q.&amp;nbsp; e.g. &lt;i&gt;http://mydomain.com$V$Q&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Counter-intuitively check &lt;i&gt;Redirect all request to exact destination (instead of relative destination)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Choose the appropriate Status Code (Permanent or Temporary)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Apply Changes and Test&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5651777022440031625?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5651777022440031625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5651777022440031625' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5651777022440031625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5651777022440031625'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/09/simple-http-redirect-with-querystring.html' title='Simple HTTP Redirect with Querystring in IIS7'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_siWGhB-JGNY/TJfmrsjCn9I/AAAAAAAAAm0/yX8JvNd-dM4/s72-c/clickin.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5470499700971823730</id><published>2010-09-15T22:07:00.003-06:00</published><updated>2010-09-15T22:12:31.669-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>SEO is officially dead</title><content type='html'>&lt;p&gt;Yes, I know we're all tired of hearing that some technology is dead.  Wired was wrong about the web dying in 1997 and 2010.  Truth be told Wired isn't exactly good at identifying mortality. Phone calls aren't dead, the desktop isn't dead, cyberspace isn't dead, drm isn't dead, wifi isn't dead, guitar hero isn't dead and DRM isn't dead, yet (though Zuckerman is trying his best).  Well, they were right about the floppy disk.&lt;/p&gt;&lt;object height="385" width="640"&gt;&lt;param name="movie" value="http://www.youtube.com/v/IDW3nrJ4ZuA&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/IDW3nrJ4ZuA&amp;color1=0xb1b1b1&amp;color2=0xd0d0d0&amp;hl=en_US&amp;feature=player_embedded&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;p&gt;Wait.  That wasn't my point.&lt;/p&gt;&lt;p&gt;My point was that SEO is &lt;em&gt;*actually*&lt;/em&gt; dead.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Here's why.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Several minutes ago I google "fckeditor background marinelli".  I find &lt;a href="http://drupal.fckeditor.net/tricks"&gt;a solution that works&lt;/a&gt;.  Using it I figure out a better way.  I &lt;a href="http://oneidia.blogspot.com/2010/09/theming-fckeditor-to-work-with.html"&gt;blog it&lt;/a&gt;.  I hit the back button to review the search results again.  My blog entry (I just typed) is result six.&lt;/p&gt;&lt;p&gt;&lt;a href="http://lmgtfy.com/?q=fckeditor+background+marinelli"&gt;http://lmgtfy.com/?q=fckeditor+background+marinelli&lt;/a&gt;&lt;/p&gt;&lt;p&gt;SEO is dead.  Long live content.  Thank you Google Instant.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5470499700971823730?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5470499700971823730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5470499700971823730' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5470499700971823730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5470499700971823730'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/09/seo-is-officially-dead.html' title='SEO is officially dead'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-8217074077663057611</id><published>2010-09-15T21:47:00.001-06:00</published><updated>2010-09-15T21:48:09.316-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><title type='text'>Theming fckeditor to work with Marinelli Drupal Theme</title><content type='html'>&lt;p&gt;Marinelli, a nearly flawless Drupal theme has one major flaw.  It is not optimized to work with the fckeditor WYSIWYG editor.  There are others as well.&lt;/p&gt;&lt;p&gt;Some googling located some good tips for configuring modules/fckeditor/fckeditor.config.js to work with Marinelli on &lt;a href="http://drupal.fckeditor.net/tricks"&gt;http://drupal.fckeditor.net/tricks&lt;/a&gt;.  This solution is good, but it doesn't work well in multi-site situation or if more than one theme is enabled.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Here is a simpler solution:&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Go to admin/settings/fckeditor and select "edit" next to the profile you want to fix.&lt;/li&gt;&lt;li&gt;Make sure under "Style and template files" your Editor CSS is set to "Use theme CSS"&lt;/li&gt;&lt;li&gt; Under "Advanced Options", find "Custom javascript configuration" and paste the following:&lt;br/&gt;&lt;pre class="brush: php"&gt;&lt;br /&gt;FCKConfig.BodyId = "primary";&lt;br /&gt;FCKConfig.BodyClass = "singlepage";&lt;br /&gt;FCKConfig.EditorAreaStyles = "body{background:#FFFFFF;text-align:left;font-size:0.8em}";&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Spank "Save"&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you are running a multi-site installation as I am this is really the way to go as I share my fckeditor module via sites/all/modules.&lt;/p&gt;&lt;p&gt;Another option is if you want to go all kind of whacky with your javascripting is to create a separate fckeditor.config.js in your theme directory and choose "Yes" under "Advanced Options" &gt; "Load fckeditor.config.js from theme path."&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-8217074077663057611?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/8217074077663057611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=8217074077663057611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/8217074077663057611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/8217074077663057611'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/09/theming-fckeditor-to-work-with.html' title='Theming fckeditor to work with Marinelli Drupal Theme'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5679548494466182419</id><published>2010-09-13T01:14:00.004-06:00</published><updated>2011-12-13T07:23:54.090-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><title type='text'>Using Drupal Feeds Module to Import Content from MS Access</title><content type='html'>Feeds works brilliantly, but there is a couple weird gotchas when working from MS Access to Drupal that are worth documenting:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Seems self-explanatory, but since you are importing as .txt or .csv make sure you &lt;a href="http://oneidia.blogspot.com/2010/09/finding-and-replacing-special.html"&gt;remove all carriage returns&lt;/a&gt;.&amp;nbsp; In MS Access this involves writing an update query and doing a replace on all Chr(10) and Chr(13).&amp;nbsp; e.g. Replace(Replace([myfield],Chr(10),"&amp;lt;br /&amp;gt;"),Chr(13),"&amp;lt;br /&amp;gt;")&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Although CCK Date fields import perfectly as MS Access dates, published dates do not.&amp;nbsp; This is because the published field in Drupal is a Unix Timestamp which is a quite different than Access dates.&amp;nbsp; The easiest way I know to fix this is to export your data to Excel and then use the Excel integer date value to convert to a Unix Timestamp.&lt;br /&gt;&lt;br /&gt;We've all seen this right?&amp;nbsp; That really long integer you see when you misformat a date?&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Anyway, to fix you need to first account for the difference between the start dates of the two time systems and then account for the fact that excel is decimal days and unix is seconds (or something like that).&lt;br /&gt;&lt;br /&gt;Formula:&lt;br /&gt;UnixDate = (A2 - 25569) * 86400.&lt;br /&gt;&lt;br /&gt;Where:&lt;br /&gt;25569 = Difference in days between 1900(Unix) and 1970(Excel)&lt;br /&gt;86400 = Number of seconds in a day&lt;br /&gt;Source: &lt;a href="http://blog.webconsultingengineering.com/phptalk/timestamp-excel2unix.html"&gt;webconsultingengineering.com&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Exporting from MS Access can also cause you problems with Memo fields.&amp;nbsp; Strangely, if you use Text Qualifiers your exported &lt;a href="http://oneidia.blogspot.com/2010/09/ms-access-truncating-exports-of-memo.html"&gt;Memo fields will be truncated&lt;/a&gt; to 512 characters.&amp;nbsp; Don't do that.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;If Importing Taxonomy fields to Drupal, you'll need to edit your Taxonomies at least for now to Free Text.&amp;nbsp; You can set them back later, but at least for me, even if the Term existed it wouldn't insert unless I set it to Free Text.&amp;nbsp; Your mileage may vary.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Apostrophes will cause you nightmares.  They terminate strings early.  Replace them with right apostrophes or quotes.&lt;br /&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;Real HTML required.  If you're like me and you've stored all your &amp;lt;HTML&amp;gt; as &amp;amp;lt;HTML&amp;amp;gt; in your ASP and .Net applications to get around Microsoft injection filters you'll have to undo all that silliness.&lt;/li&gt;&lt;/ol&gt;And I think that's it.  If I remember any more from this evening I'll edit this post.  Good times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5679548494466182419?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5679548494466182419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5679548494466182419' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5679548494466182419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5679548494466182419'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/09/using-drupal-feeds-module-to-import.html' title='Using Drupal Feeds Module to Import Content from MS Access'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-2239987755635044082</id><published>2010-09-13T00:51:00.001-06:00</published><updated>2010-09-13T01:21:04.091-06:00</updated><title type='text'>Finding and Replacing Special Characters in MS Access</title><content type='html'>Most special characters like Tabs and Line Break and Carriage Returns can be found and replaced in MS Access by using the character codes.&amp;nbsp; But you can't use the find and replace dialog.&lt;br /&gt;&lt;br /&gt;Instead, author an update query and enter the following to remove tabs:&lt;br /&gt;Replace([myfield],Chr(9),"")&lt;br /&gt;&lt;br /&gt;If removing line breaks you need to replace both the line break and carriage return character:&lt;br /&gt;Replace(Replace([myfield],Chr(10),""),Chr(13),"")&lt;br /&gt;&lt;br /&gt;If editing for HTML you'd edit this to the following for HTML line breaks:&lt;br /&gt; Replace(Replace([myfield],Chr(10),"&amp;lt;br /&amp;gt;"),Chr(13),"&amp;lt;br /&amp;gt;")&lt;br /&gt;&lt;br /&gt;For other characters, &lt;a href="http://en.wikipedia.org/wiki/ASCII#ASCII_control_characters"&gt;look up the ascii character code&lt;/a&gt;. (use the numbers in the "Dec" column in the tables)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-2239987755635044082?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/2239987755635044082/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=2239987755635044082' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2239987755635044082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2239987755635044082'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/09/finding-and-replacing-special.html' title='Finding and Replacing Special Characters in MS Access'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-2791014735395627373</id><published>2010-09-13T00:43:00.001-06:00</published><updated>2010-09-13T01:23:12.526-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><title type='text'>MS Access Truncating Exports of Memo Fields at 512 Characters</title><content type='html'>Recently I was surprised to find that exports of Memo fields to csv and txt truncate at 512 characters.&lt;br /&gt;&lt;br /&gt;Thankfully, there is an easy, albeit poorly documented hack.&amp;nbsp; In the export wizard set "Text Qualifier" to "{none}"&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_siWGhB-JGNY/TI3H0slEnvI/AAAAAAAAAmo/VVuer9Egx8Q/s1600/export.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://2.bp.blogspot.com/_siWGhB-JGNY/TI3H0slEnvI/AAAAAAAAAmo/VVuer9Egx8Q/s400/export.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-2791014735395627373?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/2791014735395627373/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=2791014735395627373' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2791014735395627373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2791014735395627373'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/09/ms-access-truncating-exports-of-memo.html' title='MS Access Truncating Exports of Memo Fields at 512 Characters'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_siWGhB-JGNY/TI3H0slEnvI/AAAAAAAAAmo/VVuer9Egx8Q/s72-c/export.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-7986028202621764252</id><published>2010-09-10T08:10:00.002-06:00</published><updated>2010-09-10T08:12:45.592-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><title type='text'>Microsoft.Jet.OLEDB.4.0 on a 64bit OS with IIS7</title><content type='html'>When attempting to run Microsoft Jet Connection to MS Access Databases on a 64bit Machine you will get the following unhelpful error:&lt;br /&gt;&lt;i&gt;The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Googling will point you on a couple crazy paths involving recompiling your application in 32 bit mode. The solution isn't that complicated if you are using IIS7.&lt;br /&gt;&lt;br /&gt;In IIS7 right-click on your application pool and choose "Advanced Settings"&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_siWGhB-JGNY/TIo75KES4KI/AAAAAAAAAmc/XGATHqNbBi8/s1600/32bit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_siWGhB-JGNY/TIo75KES4KI/AAAAAAAAAmc/XGATHqNbBi8/s320/32bit.png" /&gt;&lt;/a&gt;&lt;/div&gt;In the dialog that opens, set "Enable 32-bit Applications" to "True".&lt;br /&gt;&lt;br /&gt;There I fixed it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-7986028202621764252?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/7986028202621764252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=7986028202621764252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7986028202621764252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7986028202621764252'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/09/microsoftjetoledb40-on-64bit-os-with.html' title='Microsoft.Jet.OLEDB.4.0 on a 64bit OS with IIS7'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_siWGhB-JGNY/TIo75KES4KI/AAAAAAAAAmc/XGATHqNbBi8/s72-c/32bit.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-3724817554453533728</id><published>2010-03-29T00:23:00.018-06:00</published><updated>2010-03-29T01:37:18.869-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><title type='text'>Working with Views Templates in Drupal</title><content type='html'>&lt;p&gt;Working with Views can be a little confusing for anyone new to Drupal.  Don't get me wrong, Views is an absolutely brilliant piece of programming (thanks merlinofchaos!), but there are so many options that finding the correct toggle can be daunting.  And no matter how brilliant, eventually you'll discover you've outgrown all available options in rewriting and variable usage and you need to figure out how to modify values via php.  The answer?  Views templates.  And Views helps you out there too!&lt;/p&gt;&lt;h4&gt;And How&lt;/h4&gt;&lt;p&gt;For this example we are going to focus on one specific problem: creating a list of image thumbnails.&lt;/p&gt;&lt;p&gt;In our hypothetical we have extended a node type via cck to include an image upload called [field_image_value] that we display when viewing the full node.&amp;nbsp; When each node is created a thumbnail is auto-created via the IMCE Plugin on upload.  We've given them a suffix of &lt;i&gt;_thumbnail&lt;/i&gt; such that &lt;i&gt;our-image-filename.jpg&lt;/i&gt; becomes thumbnail &lt;i&gt;our-image-filename_thumbnail.jpg&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;For our block output we want something like this for each node retrieved:&lt;/p&gt;&lt;pre class="brush: html"&gt;&lt;br /&gt;&lt;a href="http://yourdomain.com/path/to/node"&gt;&lt;img alt="Image thumbnail" src="http://yourdomain.com/path/to/images/our-image-filename_thumbnail.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;h4&gt;&lt;a href="http://yourdomain.com/path/to/node"&gt;Node Title&lt;/a&gt;&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;Node Teaser, limited to two hundred characters...&lt;/p&gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Sounds easy right?  Actually, yes it is, as long as you know the correct steps.&lt;/p&gt;&lt;h4&gt;Step 1: Construct View&lt;/h4&gt;&lt;P&gt;Construct your view so that you have [field_image_value], [title] and [teaser] as fields.&amp;nbsp; For [field_image_value] and [title] check the last option, &lt;i&gt;Link this field to its node&lt;/i&gt;.&lt;/p&gt;&lt;p&gt;Open [field_image_value], which contains the path to the large image and check &lt;i&gt;Rewrite the output of this field&lt;/i&gt; and type the following:&lt;/p&gt;&lt;pre class="brush: html"&gt;&lt;img alt="Image thumbnail" src='[field_image_value]' /&gt;&lt;/pre&gt;&lt;p&gt;Add an argument to limit your view results to just the node type you have created with an image cck field.  Add a block display and save your view.&lt;/p&gt;&lt;p&gt;Now if you add your block to a page you should see we everything you want except all the images are fullsize.  Time for view templates.&lt;/p&gt;&lt;h4&gt;Step 2: Determine view name&lt;/h4&gt;&lt;p&gt;Return to your view and under Basic Settings, click &lt;i&gt;Theme: &lt;und&gt;Information&lt;/und&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Below, you'll see all the possible template file names you could use to theme your view.  In this example, we are interested in theming a specific field when it appears inside of a specific view (not every instance) so we'll want to look under our [field_image_value] for the correct template which should follow this format: views-view-field--[Our_View_Name]--[field_image_value].tpl.php&lt;/p&gt;&lt;p&gt;So, for Our_View_Name the correct filename would be:&lt;/p&gt;&lt;pre class="brush: html"&gt;views-view-field--Our-View-Name--field-image-value.tpl.php&lt;/pre&gt;&lt;h4&gt;Step 3: Make your template&lt;/h4&gt;&lt;p&gt;So we're not starting from scratch copy &lt;i&gt;/modules/views/theme/views-view-field.tpl.php&lt;/i&gt; to &lt;i&gt;/themes/yourtheme/views-view-field--Our-View-Name--field-image-value.tpl.php&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Now, if you revisit your view, open Basic Settings &gt; &lt;i&gt;Theme: &lt;und&gt;Information&lt;/und&gt;&lt;/i&gt;, and click the button at the bottom, &lt;i&gt;Rescan Template Files&lt;/i&gt; you'll see that your new template file appears in &lt;strong&gt;bold&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Opening this template you'll see it's pretty basic.  Out of the box, we're just passing a variable along, but Merlin has provided some documentation to assist with more complicated theming:&lt;/p&gt;&lt;pre class="brush: php"&gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;// $Id: views-view-field.tpl.php,v 1.1 2008/05/16 22:22:32 merlinofchaos Exp $&lt;br /&gt; /**&lt;br /&gt;  * This template is used to print a single field in a view. It is not&lt;br /&gt;  * actually used in default Views, as this is registered as a theme&lt;br /&gt;  * function which has better performance. For single overrides, the&lt;br /&gt;  * template is perfectly okay.&lt;br /&gt;  *&lt;br /&gt;  * Variables available:&lt;br /&gt;  * - $view: The view object&lt;br /&gt;  * - $field: The field handler object that can process the input&lt;br /&gt;  * - $row: The raw SQL result that can be used&lt;br /&gt;  * - $output: The processed output that will normally be used.&lt;br /&gt;  *&lt;br /&gt;  * When fetching output from the $row, this construct should be used:&lt;br /&gt;  * $data = $row-&gt;{$field-&gt;field_alias}&lt;br /&gt;  *&lt;br /&gt;  * The above will guarantee that you'll always get the correct data,&lt;br /&gt;  * regardless of any changes in the aliasing that might happen if&lt;br /&gt;  * the view is modified.&lt;br /&gt;  */&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;?php print $output; ?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Our situation is pretty straight-forward, we'll just add a tiny bit of php to replace ".jpg" with "_thumb.jpg" for our [field_image_value].&lt;/p&gt;&lt;pre class="brush: php"&gt;&lt;br /&gt;&amp;lt;?php print str_replace(".jpg", "_thumbnail.jpg", $output);?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Save your template, and flush the Theme Registry cache.  &lt;strong&gt;You're done!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you revisit the page displaying your block, you'll see the thumbnails are now displayed.&lt;/p&gt;&lt;h4&gt;But what if I don't?&lt;/h4&gt;&lt;p&gt;Here are a few gotchas and possible solutions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If the image displays as an error then there is likely a typo in your template&lt;/li&gt;&lt;li&gt;If the original image displays and not the thumbnail make sure you have rescanned your templates and try flushing all your caches.  Also, check that your browser isn't caching, if using in most browsers you can use CTRL-R to do a complete refresh&lt;/li&gt;&lt;li&gt;If your administration theme is different than your production theme, then your templates will not reflect the changes inside of the views previews&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-3724817554453533728?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/3724817554453533728/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=3724817554453533728' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3724817554453533728'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3724817554453533728'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/03/working-with-views-templates-in-drupal.html' title='Working with Views Templates in Drupal'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-307720354128669270</id><published>2010-01-07T12:18:00.003-07:00</published><updated>2010-03-29T00:44:14.447-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcIMS'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcSDE'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Making Code Samples Readable Online</title><content type='html'>After lazily just pasting code in &amp;lt;pre&amp;gt; blocks for years, this morning I finally got around to researching a code highlighter like you see on almost all the programming websites.&lt;br /&gt;&lt;br /&gt;Thanks to &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter"&gt;SyntaxHighlighter&lt;/a&gt; adding this feature was embarrassingly easy.  It is self-contained javascript that works on a pre or script tag decorated with a html class calling a brush alias, e.g. &lt;br /&gt;&lt;pre class="brush: html"&gt;&amp;lt;pre class="brush: sql"&amp;gt;&lt;br /&gt;   INSERT INTO MyWebsite (pre, script)&lt;br /&gt;      VALUES (complete, awesomeness)&lt;br /&gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Oh, but it's not just SQL, no there's a whole easel of brushes included:&lt;br /&gt;&lt;table width="100%" border="0" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;  &lt;th&gt; Brush name&lt;br /&gt;&lt;/th&gt;&lt;th&gt; Brush aliases&lt;br /&gt;&lt;/th&gt;&lt;th&gt; File name&lt;br /&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:ActionScript3" title="SyntaxHighlighter:Brushes:ActionScript3"&gt;ActionScript3&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; as3, actionscript3&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushAS3.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;  &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Bash" title="SyntaxHighlighter:Brushes:Bash"&gt;Bash/shell&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; bash, shell&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushBash.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:CSharp" title="SyntaxHighlighter:Brushes:CSharp"&gt;C#&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; c-sharp,&amp;nbsp;csharp&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushCSharp.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Cpp" title="SyntaxHighlighter:Brushes:Cpp"&gt;C++&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; cpp, c&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushCpp.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:CSS" title="SyntaxHighlighter:Brushes:CSS"&gt;CSS&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; css&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushCss.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Delphi" title="SyntaxHighlighter:Brushes:Delphi"&gt;Delphi&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; delphi, pas, pascal&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushDelphi.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Diff" title="SyntaxHighlighter:Brushes:Diff"&gt;Diff&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; diff, patch&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushDiff.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Groovy" title="SyntaxHighlighter:Brushes:Groovy"&gt;Groovy&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; groovy&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushGroovy.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:JavaScript" title="SyntaxHighlighter:Brushes:JavaScript"&gt;JavaScript&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; js, jscript, javascript&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushJScript.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Java" title="SyntaxHighlighter:Brushes:Java"&gt;Java&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; java&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushJava.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:JavaFX" title="SyntaxHighlighter:Brushes:JavaFX"&gt;JavaFX&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; jfx, javafx&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushJavaFX.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Perl" title="SyntaxHighlighter:Brushes:Perl"&gt;Perl&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; perl, pl&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushPerl.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:PHP" title="SyntaxHighlighter:Brushes:PHP"&gt;PHP&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; php&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushPhp.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Plain" title="SyntaxHighlighter:Brushes:Plain"&gt;Plain Text&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; plain, text&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushPlain.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:PowerShell" title="SyntaxHighlighter:Brushes:PowerShell"&gt;PowerShell&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; ps, powershell&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushPowerShell.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Python" title="SyntaxHighlighter:Brushes:Python"&gt;Python&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; py, python&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushPython.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Ruby" title="SyntaxHighlighter:Brushes:Ruby"&gt;Ruby&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; rails, ror, ruby&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushRuby.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:Scala" title="SyntaxHighlighter:Brushes:Scala"&gt;Scala&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; scala&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushScala.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:SQL" title="SyntaxHighlighter:Brushes:SQL"&gt;SQL&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; sql&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushSql.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:VB" title="SyntaxHighlighter:Brushes:VB"&gt;Visual Basic&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; vb, vbnet&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushVb.js&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt; &lt;td&gt; &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes:XML" title="SyntaxHighlighter:Brushes:XML"&gt;XML&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt; xml, xhtml, xslt, html, xhtml&lt;br /&gt;&lt;/td&gt;&lt;td&gt; shBrushXml.js&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Steps to install Syntax Highlighter&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to http://alexgorbatchev.com/wiki/SyntaxHighlighter and download the source code&lt;/li&gt;&lt;li&gt;Upload the source code to somewhere accessible on the internet, note the url&lt;/li&gt;&lt;li&gt;Follow the installation instructions for blogger available here &lt;a href="http://geektalkin.blogspot.com/2009/11/embed-code-syntax-highlighting-in-blog.html"&gt;http://geektalkin.blogspot.com/2009/11/embed-code-syntax-highlighting-in-blog.html&lt;/a&gt; (general installation and usage here &lt;a href="http://alexgorbatchev.com/wiki/SyntaxHighlighter:Usage"&gt;http://alexgorbatchev.com/wiki/SyntaxHighlighter:Usage&lt;/a&gt;).&lt;/li&gt;&lt;li&gt;Was it good for you?  &lt;a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&amp;amp;hosted_button_id=2930402"&gt;Send Alex a beer&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Thanks Alex!  I sent you enough to cover a pizza.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-307720354128669270?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/307720354128669270/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=307720354128669270' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/307720354128669270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/307720354128669270'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2010/01/making-code-samples-readable-online.html' title='Making Code Samples Readable Online'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5445629721008127574</id><published>2009-11-19T09:47:00.001-07:00</published><updated>2010-01-07T11:15:04.474-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Server User-Defined Data Types Not Visible to MS Access on Linked Table Refresh</title><content type='html'>Had one of those, "am I on crazy pills?!" problems the past few weeks.  In an MS Access database I had a whole slew of SQL Server Linked Tables that included User-Defined Data Types(UDT).  The UDTs were mostly auditing fields that referenced defaults to pull in the system.user and current datetime.&lt;br /&gt;&lt;br /&gt;Everything worked great.&lt;br /&gt;&lt;br /&gt;That was until I added a field and asked a user (with very elevated privileges) to refresh the linked tables.  They did, but the audit fields referencing the user-defined types disappeared.&lt;br /&gt;&lt;br /&gt;At first, I thought it was some silliness in their file-based DSN, but even using my connection (with Windows-based security... so it pointed to their account) the audit fields remained hidden.&lt;br /&gt;&lt;br /&gt;To make the whole story more perverse, if I used the same connection logged in as me (I am a dbo) the tables refreshed with the audit fields and they could also see them.&lt;br /&gt;&lt;br /&gt;After much googling I finally stumbled upon &lt;a href="http://www.mrlwork.com/post/170"&gt;this post&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/bb522526.aspx"&gt;this msdn article&lt;/a&gt; which indicate that user-defined types have permissions  including: CREATE, GRANT, DENY, ALTER, CONTROL, TAKE OWNERSHIP, REFERENCES, EXECUTE, VIEW DEFINITION and REVOKE.&lt;br /&gt;&lt;br /&gt;To set permissions to allow anyone to view a user-defined datatype, use the following&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;grant execute on TYPE::[dbo].[user_data_type] to public;&lt;/pre&gt;&lt;br /&gt;Or the appropriate user or role.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"&lt;a href="http://www.mrlwork.com/post/170"&gt;Microsoft SQL User Defined Types&lt;/a&gt;". &lt;i&gt;My Real Life Work&lt;/i&gt;, Charles Solar. 2009-08-21.&amp;nbsp;&lt;/li&gt;&lt;li&gt;"&lt;a href="http://msdn.microsoft.com/en-us/library/bb522526.aspx"&gt;User-Defined Table Types&lt;/a&gt;", &lt;i&gt;SQL Server Books Online&lt;/i&gt; (MSDN). Sep. 30, 2009.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5445629721008127574?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5445629721008127574/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5445629721008127574' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5445629721008127574'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5445629721008127574'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/11/sql-server-user-defined-data-types-not.html' title='SQL Server User-Defined Data Types Not Visible to MS Access on Linked Table Refresh'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-7512947979157906281</id><published>2009-10-21T16:06:00.002-06:00</published><updated>2010-01-07T11:10:03.140-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Clearing SQL Server Log Files (ldf)</title><content type='html'>Often I'm asked by collaborating agencies and organizations for a copy of our databases.&amp;nbsp; True, I could do an export and give them just the tables, but I'm just making work for them.&amp;nbsp; The easiest solution would be to export the SQL Server database with all the data types, rules, triggers, views and stored procedures.&lt;br /&gt;&lt;br /&gt;What's the problem?&amp;nbsp; Log files on my databases are at least several hundred megabytes if not gigabytes.&amp;nbsp; One option is it simply send them the mdf and ask them to attach the mdf and in SQL Server 2008 if you delete the ldf reference in the attach dialog it will auto-create one.&amp;nbsp; If you want to include the ldf to avoid the conversation or have other reasons to reduce the log file it gets a little more complicated because if transaction logging is enabled the simple dropdowns won't do squat.&lt;br /&gt;&lt;br /&gt;Compacting a log file for database YOURDB:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Start a new query&lt;/li&gt;&lt;li&gt;Enter the following: &lt;br /&gt;&lt;pre class="brush: sql"&gt;-- Set the database to manipulate&lt;br /&gt;Use YOURDB;&lt;br /&gt;go&lt;br /&gt;-- Truncate the log by changing the&lt;br /&gt;-- database recovery model to SIMPLE&lt;br /&gt;alter database YOURDB&lt;br /&gt;Set recovery simple;&lt;br /&gt;go&lt;br /&gt;-- Compress the log file using shrinkfile &lt;br /&gt;--([filename w/o extension], [megabytes for new size])&lt;br /&gt;--    OR  &lt;br /&gt;--([filename w/o extension], EMPTYFILE)  - to empty log file&lt;br /&gt;dbcc shrinkfile (YOURDB_Log, 1);&lt;br /&gt;go&lt;br /&gt;-- Reset recovery mode to full transactions.&lt;br /&gt;alter database YOURDB&lt;br /&gt;Set recovery full;&lt;br /&gt;Go&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Done!&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-7512947979157906281?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/7512947979157906281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=7512947979157906281' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7512947979157906281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7512947979157906281'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/10/clearing-sql-server-log-files-ldf.html' title='Clearing SQL Server Log Files (ldf)'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-2752552664937524576</id><published>2009-10-19T23:38:00.000-06:00</published><updated>2009-10-19T23:38:17.813-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Installing the Citrix 11 ICA Client XenApp on Ubuntu 9.04 Jaunty Jackalope</title><content type='html'>&lt;b&gt;If you have root access:&lt;/b&gt; &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install required &lt;a href="http://packages.ubuntu.com/intrepid/libmotif3" title="More information about this package"&gt;libmotif3 package&lt;/a&gt; from the Ubuntu repositories&lt;/li&gt;&lt;li&gt;Download the &lt;i&gt;en.linuxx86.tar.gz&lt;/i&gt; file from &lt;a href="http://www.citrix.com/English/ss/downloads/details.asp?downloadId=3323&amp;amp;productId=186&amp;amp;c1=sot2755&amp;amp;c2=pov163080&amp;amp;c3=ost1349860" title="More information about the client"&gt;Citrix website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Extract the contents of the archive&lt;/li&gt;&lt;li&gt;Open &lt;i&gt;Applications&lt;/i&gt; &amp;gt; &lt;i&gt;Accessories&lt;/i&gt; &amp;gt; &lt;i&gt;Terminal &lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Type "sudo bash setupwfc" and enter the root password &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Choose "1" to &lt;i&gt;Install Citrix Receiver for Linux 11.0&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Accept default install location (&lt;i&gt;/usr/lib/ICAClient&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;"y" to Proceed with installation&lt;/li&gt;&lt;li&gt;"1" to Accept License Agreement&lt;/li&gt;&lt;li&gt;Agree to remaining defaults (y) and press 3 to quit installer&lt;/li&gt;&lt;/ol&gt;Running Citrix now you may get the following error:&lt;br /&gt;&lt;i&gt;You have not chosen to trust "Name of SSL Certificate", the issuer of the server's security certificate (SSL error 61)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To fix this copy all the .crt files from  &lt;i&gt;/usr/share/ca-certificates/mozilla&lt;/i&gt; to &lt;i&gt;/usr/lib/ICAClient/keystore/cacerts &lt;/i&gt;the easiest way to do this is to open a terminal window, browse to &lt;i&gt;/user/lib/ICAClient/keystore/cacerts&lt;/i&gt; and enter the following:&lt;br /&gt;&lt;i&gt; sudo cp /usr/share/ca-certificates/mozilla/*.crt .&lt;/i&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;b&gt;If you only have User Access:&lt;/b&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install required &lt;a href="http://packages.ubuntu.com/intrepid/libmotif3" title="More information about this package"&gt;libmotif3 package&lt;/a&gt; from the Ubuntu repositories&lt;/li&gt;&lt;li&gt;Download the &lt;i&gt;en.linuxx86.tar.gz&lt;/i&gt; file from &lt;a href="http://www.citrix.com/English/ss/downloads/details.asp?downloadId=3323&amp;amp;productId=186&amp;amp;c1=sot2755&amp;amp;c2=pov163080&amp;amp;c3=ost1349860" title="More information about the client"&gt;Citrix website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Extract the contents of the archive&lt;/li&gt;&lt;li&gt;Double-click on &lt;i&gt;setupwfc&lt;/i&gt; and choose &lt;i&gt;Run in Terminal&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Choose "1" to &lt;i&gt;Install Citrix Receiver for Linux 11.0&lt;/i&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Accept default install location (&lt;i&gt;/home/yourusername/ICAClient/linuxx86&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;"y" to Proceed with installation&lt;/li&gt;&lt;li&gt;"1" to Accept License Agreement&lt;/li&gt;&lt;li&gt;Agree to remaining defaults (y) and press 3 to quit installer&lt;/li&gt;&lt;/ol&gt;Running Citrix now you may get the following error:&lt;br /&gt;&lt;i&gt;You have not chosen to trust "Name of SSL Certificate", the issuer of the server's security certificate (SSL error 61)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To fix this copy all the .crt files from  &lt;i&gt;/usr/share/ca-certificates/mozilla&lt;/i&gt; to &lt;i&gt;/home/yourusername/ICAClient/linuxx86/keystore/cacerts&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: x-small;"&gt;These directions modified from nearly perfect, but difficult to follow (for me) directions found at &lt;a href="http://techxplorer.com/2008/11/07/installing-the-citrix-presentation-server-client-on-ubuntu/"&gt;http://techxplorer.com/2008/11/07/installing-the-citrix-presentation-server-client-on-ubuntu/ &lt;/a&gt;&lt;/span&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-2752552664937524576?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/2752552664937524576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=2752552664937524576' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2752552664937524576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2752552664937524576'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/10/installing-citrix-11-ica-client-xenapp.html' title='Installing the Citrix 11 ICA Client XenApp on Ubuntu 9.04 Jaunty Jackalope'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-1463038138552047681</id><published>2009-10-07T17:29:00.000-06:00</published><updated>2009-10-07T17:30:47.123-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcIMS'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcSDE'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Repairing Broken Data Sources</title><content type='html'>&lt;b&gt;What do you do when you open your map and you have a layer that looks like this?  What does it mean?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_siWGhB-JGNY/Ss0dRTlvNUI/AAAAAAAAAjk/-vIp6qob-0E/s1600-h/BrokenState.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_siWGhB-JGNY/Ss0dRTlvNUI/AAAAAAAAAjk/-vIp6qob-0E/s320/BrokenState.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The red exclamation point is a visual indicator that something is incorrect in the layer's data source.&amp;nbsp; To fix it you'll need to know where the data lives and tell the layer in the map this information.&amp;nbsp; You're giving direction to poor lost layer so it can find itself, you're a metaphysical geographer!&lt;br /&gt;&lt;br /&gt;&amp;nbsp;Repairing a data source:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_siWGhB-JGNY/Ss0f4k8KsEI/AAAAAAAAAjs/SKep0YTYiTM/s1600-h/properties.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_siWGhB-JGNY/Ss0f4k8KsEI/AAAAAAAAAjs/SKep0YTYiTM/s320/properties.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Right-click on the layer, from the contextual menu choose &lt;i&gt;Properties&lt;/i&gt;&lt;/li&gt;&lt;li&gt;In the Properties dialog box choose the &lt;i&gt;Source &lt;/i&gt;tab&lt;/li&gt;&lt;li&gt;Click &lt;i&gt;Set Data Source&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Browse to the location of the data layer, select and click &lt;i&gt;Add&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;OK&lt;/i&gt; out of the Properties dialog&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;If all went well your data is now displayed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;But what if it isn't one layer?&amp;nbsp; What if you have an entire map of mis-pathed layers?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Here's where ArcCatalog comes to the rescue: &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Locate the map in ArcCatalog&lt;/li&gt;&lt;li&gt;Right-click and select &lt;i&gt;Set Data Source(s)&lt;/i&gt;&amp;nbsp; &lt;/li&gt;&lt;li&gt;Highlight one of the Data Layers that is in error and click &lt;i&gt;Replace...&lt;/i&gt;&lt;/li&gt;&lt;li&gt;The find box should load with the erroneous path of the layer you select, if not enter it&lt;/li&gt;&lt;li&gt;In the replace box enter the correct path and click &lt;i&gt;Ok&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Repeat as necessary&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;b&gt;But what if they are SDE Layers?&amp;nbsp; This whole batch thing is no help at all.&lt;/b&gt;&lt;br /&gt;Yes, this is where it gets nasty. Basically, you're left out in the cold.&amp;nbsp; You can either fix them one at time, or you're going to need a little script my coworker developed I'll share in my next post.&lt;br /&gt;&lt;br /&gt;See you in the server logs,&lt;br /&gt;Brent&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-1463038138552047681?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/1463038138552047681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=1463038138552047681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1463038138552047681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1463038138552047681'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/10/repairing-broken-data-sources.html' title='Repairing Broken Data Sources'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_siWGhB-JGNY/Ss0dRTlvNUI/AAAAAAAAAjk/-vIp6qob-0E/s72-c/BrokenState.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-7917963983283279510</id><published>2009-09-16T16:32:00.000-06:00</published><updated>2009-09-16T16:32:40.425-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>When 1+2+3 &lt;&gt; 3+2+1 = Stretching Vista Desktops</title><content type='html'>I've had the same background on my machine for almost a year now.&amp;nbsp; A south atlas (south up), pacific-centered, night image of our lovely planet that wonderfully confused those that hovered over my shoulder and was an appropriate homage to my cartography profession.&amp;nbsp; It was time for a change and it seemed simple enough.&amp;nbsp; Found a good image and right clicked, set as desktop background.&amp;nbsp; Suddenly my image wasn't stretched across two screens but instead duplicated on each screen.&amp;nbsp; Even switching back to my old image produced the same result.&amp;nbsp; No longer was South America inverted on the left screen and Africa in the right.&amp;nbsp; Now the image was small and duplicated.&amp;nbsp; What the heck?&lt;br /&gt;&lt;br /&gt;Way too many google searches later I finally learned that right-clicking on the image and then setting properties in Vista has different results than first opening desktop properties and then browsing to the image and setting the properties.&amp;nbsp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-7917963983283279510?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/7917963983283279510/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=7917963983283279510' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7917963983283279510'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7917963983283279510'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/09/when-123-321-stretching-vista-desktops.html' title='When 1+2+3 &lt;&gt; 3+2+1 = Stretching Vista Desktops'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-6673559072390737127</id><published>2009-09-11T12:30:00.000-06:00</published><updated>2009-09-11T12:31:08.902-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Search Results to Text File in Windows Vista</title><content type='html'>&lt;ol&gt;&lt;li&gt;Do a standard search in Windows Explorer.&amp;nbsp;&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;In this case I want .mxd's modified after March 22, 2009 so in the search box enter “*.mxd date:&amp;gt;3/22/2009”&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;When search is done highlight all results (CTRL-A)&lt;/li&gt;&lt;li&gt;Hold down SHIFT, hover over results and right-click choosing “Copy as Path”&lt;/li&gt;&lt;li&gt;Paste results in Notepad&lt;/li&gt;&lt;/ol&gt;Source: &lt;a href="http://www.winhelponline.com/blog/print-search-results-in-windows-vista/"&gt;http://www.winhelponline.com/blog/print-search-results-in-windows-vista/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-6673559072390737127?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/6673559072390737127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=6673559072390737127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6673559072390737127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6673559072390737127'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/09/search-results-to-text-file-in-windows.html' title='Search Results to Text File in Windows Vista'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5589058586435404352</id><published>2009-06-15T18:32:00.001-06:00</published><updated>2010-01-07T11:16:05.244-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>The Case IsNull Now</title><content type='html'>In SQL Server views I've been using CASE statements to look for nulls for years.  I've just nullified this practice.&lt;br /&gt;&lt;br /&gt;For the following Employees Table:&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;EmployeeID&lt;/th&gt;&lt;th&gt;LastName&lt;/th&gt;&lt;th&gt;FirstName&lt;/th&gt;&lt;th&gt;Nickname&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;39&lt;/td&gt;&lt;td&gt;Carter&lt;/td&gt;&lt;td&gt;James&lt;/td&gt;&lt;td&gt;Jimmy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;Reagan&lt;/td&gt;&lt;td&gt;Ronald&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;Bush&lt;/td&gt;&lt;td&gt;George&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;Clinton&lt;/td&gt;&lt;td&gt;William&lt;/td&gt;&lt;td&gt;Bill&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Would be used to create the View:&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th&gt;EmployeeID&lt;/th&gt;&lt;th&gt;LastName&lt;/th&gt;&lt;th&gt;Handle&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;39&lt;/td&gt;&lt;td&gt;Carter&lt;/td&gt;&lt;td&gt;Jimmy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;40&lt;/td&gt;&lt;td&gt;Reagan&lt;/td&gt;&lt;td&gt;Ronald&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;41&lt;/td&gt;&lt;td&gt;Bush&lt;/td&gt;&lt;td&gt;George&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;42&lt;/td&gt;&lt;td&gt;Clinton&lt;/td&gt;&lt;td&gt;Bill&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;This is the CASE:&lt;pre class="brush: sql"&gt;SELECT EmployeeID&lt;br /&gt;, LastName&lt;br /&gt;, CASE Nickname&lt;br /&gt;WHEN Null THEN FirstName&lt;br /&gt;ELSE Nickname&lt;br /&gt;END As Handle&lt;br /&gt;FROM Employees&lt;/pre&gt;&lt;br /&gt;ISNULLified by:&lt;pre class="brush: sql"&gt;SELECT EmployeeID&lt;br /&gt;, LastName&lt;br /&gt;, ISNULL(Nickname, FirstName) AS Handle&lt;br /&gt;FROM Employees&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5589058586435404352?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5589058586435404352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5589058586435404352' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5589058586435404352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5589058586435404352'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/06/case-isnull-now.html' title='The Case IsNull Now'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-766405203069509415</id><published>2009-05-03T00:46:00.000-06:00</published><updated>2009-05-03T15:34:38.510-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Forming a New Reality</title><content type='html'>&lt;fieldset&gt;&lt;legend&gt;This post is part of an ongoing series&lt;/legend&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/04/design-for-exceptions.html"&gt;Design for Exceptions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/05/spreading-sheets-and-letting-relations.html"&gt;Spreading the Sheets and Letting Relations In&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/05/forming-new-reality.html"&gt;Forming a New Reality&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;em&gt;There's more to come... we're starting simple and working up... this will slowly become more complex to include SQL Server, ASP.Net web apps and ArcGIS.&lt;/em&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://resources.stupiddingo.com/files/spreadingsheets.zip"&gt;&lt;img style="vertical-align:bottom" src="http://resources.stupiddingo.com/icon/accdb.gif" alt="accdb icon"/&gt;&lt;/a&gt;&lt;a href="http://resources.stupiddingo.com/files/FormingNewReality.zip"&gt;Download the MS Access 2007 Project&lt;/a&gt; used in this post.&lt;br /&gt;&lt;br /&gt;Now that we have our relationships all set up creating usable edit forms in MS Access 2007 is ludicrously easy.&lt;br /&gt;&lt;br /&gt;Creating an Edit Form in MS Access in Four Satisfying Steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open Beer, Open Access Project&lt;/li&gt;&lt;li&gt;Highlight the table for which you want to create a form (let's start with Cities)&lt;/li&gt;&lt;li&gt;Click the Create Tab, Select Form&lt;/li&gt;&lt;li&gt;Press Save, Sip Beer&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I'm not kidding.  It is that easy.  Here's my form (sips beer)&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfuIJvEpAqI/AAAAAAAAAeE/tZ8I39N2Ty0/s1600-h/frmCities.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 364px; height: 385px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfuIJvEpAqI/AAAAAAAAAeE/tZ8I39N2Ty0/s400/frmCities.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331004284759245474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Repeat four steps for ZipCodes:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_siWGhB-JGNY/SfuJYfsfAYI/AAAAAAAAAeM/yUJdOMR_TII/s1600-h/frmZipCodes.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 376px; height: 400px;" src="http://2.bp.blogspot.com/_siWGhB-JGNY/SfuJYfsfAYI/AAAAAAAAAeM/yUJdOMR_TII/s400/frmZipCodes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331005637841060226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow!  We are amazing.  What else is there to do?  (sips beer)&lt;br /&gt;&lt;br /&gt;And that's the problem here, we're just sitting around sipping beer.  This isn't real data.  Well, it is real data, but it's a tiny little subset.  Seven cities, seven zipcodes and nine relationships is not the real world.  The real world has complexity.  &lt;br /&gt;&lt;br /&gt;In the real world Atlanta has 113 zip codes.  In the real world the USPS recognizes twelve distinct Atlantas.  And there's two in Georgia.  Were you thinking Fulton or Dekalb county?&lt;br /&gt;&lt;br /&gt;So let's get some real data.  Since bafflingly the USPS &lt;a href="http://www.usps.com/ncsc/addressinfo/fivedigitzip.htm"&gt;doesn't give zip code data away&lt;/a&gt; I had to do some searching for a zipcode database.  I found a text file at &lt;a href="http://populardata.com"&gt;PopularData.com&lt;/a&gt; that's "a few years old" but will work for this demo.  Kudos.  Thanks for making free what should be free, can we get a Wikipedia project going on this?  Quick everyone go visit &lt;a href="http://populardata.com"&gt;PopularData.com&lt;/a&gt; and click some ads... and send &lt;a href="http://www.usps.com/customerservice/welcome.htm"&gt;hate mail to the Postmaster General&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Our new text file when imported to MS Access looks like this (snippet of all 42,741 of them):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_siWGhB-JGNY/SfuSSryy4DI/AAAAAAAAAeU/8Fsryvh1JUo/s1600-h/42741.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 282px;" src="http://2.bp.blogspot.com/_siWGhB-JGNY/SfuSSryy4DI/AAAAAAAAAeU/8Fsryvh1JUo/s400/42741.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331015433614188594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Running a quick summation query...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfuUBuhNX1I/AAAAAAAAAec/0RPvl86zFNo/s1600-h/SummationQuery.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 225px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfuUBuhNX1I/AAAAAAAAAec/0RPvl86zFNo/s400/SummationQuery.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331017341311213394" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;code&gt;SELECT ZIP_CODES.City, ZIP_CODES.State, ZIP_CODES.County, Count(ZIP_CODES.ZipCode) AS CountOfZipCode&lt;br /&gt;FROM ZIP_CODES&lt;br /&gt;GROUP BY ZIP_CODES.City, ZIP_CODES.State, ZIP_CODES.County;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/SfuUjHtGq8I/AAAAAAAAAek/HYqByj0kA2E/s1600-h/Summation2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 314px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/SfuUjHtGq8I/AAAAAAAAAek/HYqByj0kA2E/s400/Summation2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331017915007675330" /&gt;&lt;/a&gt;&lt;br /&gt;We find we have 30,244 unique cities... that is provided my assumption that there are not two towns in the same state and county with the same name is correct.  Well, it that isn't correct it's their own fault (sips beer).&lt;br /&gt;&lt;br /&gt;Now that we have this data, I feel a need to normalize it first.  Since, y'all are old hats at this I'll go do the normalizing and just report back the database diagram.  Hold on...&lt;br /&gt;&lt;br /&gt;... We're back! &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_siWGhB-JGNY/Sf0k2t3IHGI/AAAAAAAAAes/epce66XPdKE/s1600-h/RelationshipNew.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 281px;" src="http://2.bp.blogspot.com/_siWGhB-JGNY/Sf0k2t3IHGI/AAAAAAAAAes/epce66XPdKE/s400/RelationshipNew.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331458056318884962" /&gt;&lt;/a&gt;&lt;br /&gt;Sorry, that took a little longer than I expected, I had to go out to &lt;a href="http://www.batchgeocode.com/"&gt;batchgeocode.com&lt;/a&gt; and fix 153 locations without latitudes and longitudes.  As you can see I made a few changes.  The text file we started with was fabulous for reporting, but not maintainable for data editing and relationships, so we had to do a little moving around.  Don't worry, it won't be the last time.  For the moment though I'm pretty happy with it.  Now let's try those forms again.&lt;br /&gt;&lt;br /&gt;First we need to setup some new lookups in the table designs for the new relationships.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;In the Cities table add a lookup for CountyID&lt;/li&gt;&lt;li&gt;In the County table add a lookup for StateID&lt;/li&gt;&lt;li&gt;In the Cities_ZipCode table add a lookup for TypeID&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/Sf0odi7Pu-I/AAAAAAAAAe0/B97VsotFtsk/s1600-h/CitiesDesign4Counties.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 258px; height: 366px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/Sf0odi7Pu-I/AAAAAAAAAe0/B97VsotFtsk/s400/CitiesDesign4Counties.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331462021933153250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With that done it's time to lay back and let MS Access do the work.  You remember the steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open Beer, Open Access Project&lt;/li&gt;&lt;li&gt;Highlight the table for which you want to create a form (let's start with Cities)&lt;/li&gt;&lt;li&gt;Click the Create Tab, Select Form&lt;/li&gt;&lt;li&gt;Press Save, Sip Beer&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Beautiful, we have a new Cities form with our brand new design behind it.  Time go polish off the rest of that six-pack.   Or maybe not.&lt;br /&gt;&lt;br /&gt;You were feeling pretty good about yourself until you realized that almost every state in the union has a Washington County.  There's 31 of them to be exact.  &lt;br /&gt;&lt;br /&gt;I'd call this form less than useful:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/Sf00q3NiBWI/AAAAAAAAAe8/nZf-i83PWvU/s1600-h/LessThanUseful.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 282px; height: 400px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/Sf00q3NiBWI/AAAAAAAAAe8/nZf-i83PWvU/s400/LessThanUseful.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331475444856391010" /&gt;&lt;/a&gt;&lt;br /&gt;There's five Ewing counties!  With no idea of which is in which state.  I think we can do better.&lt;br /&gt;&lt;br /&gt;Let's make a query that displays both County and State.  Then let's switch our lookup to view this query. This won't be enough to save this 3,230 record drop-down, but it is a good practice for more moderate lists under a couple hundred records.&lt;br /&gt;&lt;br /&gt;First, make a new query titled VU_Counties.  You can use the following SQL or match what I have in design view:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SELECT Counties.CountyID, [County] &amp; " (" &amp; [State] &amp; ")" AS Name&lt;br /&gt;FROM States INNER JOIN Counties ON States.StateID = Counties.StateID&lt;br /&gt;ORDER BY [County] &amp; " (" &amp; [State] &amp; ")";&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_siWGhB-JGNY/Sf05wmvp6_I/AAAAAAAAAfE/2g3hcsKLs8s/s1600-h/VU_County.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 318px; height: 314px;" src="http://3.bp.blogspot.com/_siWGhB-JGNY/Sf05wmvp6_I/AAAAAAAAAfE/2g3hcsKLs8s/s400/VU_County.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331481041073466354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now go back to the Lookup for the Counties table and switch the data source to your new query, VU_Counties.&lt;br /&gt;&lt;br /&gt;Time for our four favorite steps!&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open Beer, Open Access Project&lt;/li&gt;&lt;li&gt;Highlight the table for which you want to create a form (let's start with Cities)&lt;/li&gt;&lt;li&gt;Click the Create Tab, Select Form&lt;/li&gt;&lt;li&gt;Press Save, Sip Beer&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/Sf06zAERvSI/AAAAAAAAAfM/CT-xC-ndEhU/s1600-h/LessThanUseful2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 273px; height: 400px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/Sf06zAERvSI/AAAAAAAAAfM/CT-xC-ndEhU/s400/LessThanUseful2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331482181742214434" /&gt;&lt;/a&gt;&lt;br /&gt;Well, that's better.  It'll probably work for a while.  But I have three more beers in this six pack so I might as well keep "improving" this form (does the sprinkler fading into the robot).&lt;br /&gt;&lt;br /&gt;I see two main problems with this form:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You can't find the data you want to edit with 30,243 cities to choose from&lt;/li&gt;&lt;li&gt;Once you find your city, editing the county is still a nightmare&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;STEP 1: Filtering your data&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;The Hack&lt;/em&gt;&lt;br /&gt;MS Access has the beautiful filter tools built in.  To jump to filter by any column in a table on the &lt;span style="font-weight:bold;"&gt;Home &lt;/span&gt;tab look for the &lt;span style="font-weight:bold;"&gt;Sort &amp;amp; Filter&lt;/span&gt; fieldset.  Click &lt;span style="font-weight:bold;"&gt;Advanced &lt;/span&gt;and then choose &lt;span style="font-weight:bold;"&gt;Filter by Form&lt;/span&gt;.  This will give you a table or form that mirrors the data your were just viewing.  Enter parameters to filter the data, and then press the &lt;span style="font-weight:bold;"&gt;Toggle Filter&lt;/span&gt; button in the &lt;span style="font-weight:bold;"&gt;Sort &amp;amp; Filter&lt;/span&gt; fieldset.&lt;br /&gt;&lt;br /&gt;Some examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Entering CENTERVILLE in the City filed (in the table or form) will limit the display to the cities with this name that the USPS recognizes.&lt;/li&gt;&lt;li&gt;Entering LIKE "*(HI)" in the Counties field will filter the results to cities in Hawaii&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;em&gt;For Real People&lt;/em&gt;&lt;br /&gt;While those options are great, I've discovered that the average user does is not pleased working with filters.  We have to give them something more obvious.  This google thing is pretty popular, let's try to model our approach on that.&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open your &lt;span style="font-style:italic;"&gt;Cities &lt;/span&gt;form and switch to &lt;span style="font-weight:bold;"&gt;Design View&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Select the &lt;span style="font-weight:bold;"&gt;Textbox &lt;/span&gt;tool and drag a box in your header for users to type in the city they want to find.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_siWGhB-JGNY/Sf1DHj7s-WI/AAAAAAAAAfU/3bVeHFrlUDI/s1600-h/txtSearch.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 214px;" src="http://2.bp.blogspot.com/_siWGhB-JGNY/Sf1DHj7s-WI/AAAAAAAAAfU/3bVeHFrlUDI/s400/txtSearch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331491331060332898" /&gt;&lt;/a&gt;Open the &lt;span style="font-weight:bold;"&gt;Property Sheet&lt;/span&gt; by right-clicking and choosing &lt;span style="font-weight:bold;"&gt;Properties &lt;/span&gt;or selecting the &lt;span style="font-weight:bold;"&gt;Property Sheet&lt;/span&gt; button in the far right of the &lt;span style="font-weight:bold;"&gt;Design &lt;/span&gt;tab. Change the name of your textbox to &lt;span style="font-style:italic;"&gt;txtSearch&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Now add a button next to your textbox.  Name it &lt;span style="font-style:italic;"&gt;cmdSearch&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;In the &lt;span style="font-weight:bold;"&gt;Properties Sheet&lt;/span&gt; for &lt;span style="font-style:italic;"&gt;cmdSearch&lt;/span&gt;, switch to the &lt;span style="font-weight:bold;"&gt;Event &lt;/span&gt;tab and for the &lt;span style="font-weight:bold;"&gt;On Click&lt;/span&gt; event change the drop-down to [Event Procedure].&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/Sf1E7xYFKBI/AAAAAAAAAfc/68UMhkiUOro/s1600-h/cmdSearch.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 193px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/Sf1E7xYFKBI/AAAAAAAAAfc/68UMhkiUOro/s400/cmdSearch.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331493327533844498" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Now double-click the &lt;span style="font-weight:bold;"&gt;...&lt;/span&gt; button next to &lt;span style="font-weight:bold;"&gt;[Event Procedure]&lt;/span&gt;.  This will open the VBA Editor.  Welcome to programming!  Your cursor will fall inside what is called a subroutine.  This subroutine executes when the button you just created is clicked.  We want the button to requery the dataset behind our form based on what is in the textbox.  You want your screen to look like this:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Option Compare Database&lt;br /&gt;&lt;br /&gt;Private Sub cmdSearch_Click()&lt;br /&gt;Me.RecordSource = "SELECT * FROM [Cities] WHERE [City] LIKE '*" &amp; txtSearch.Value &amp; "*';"&lt;br /&gt;Me.Requery&lt;br /&gt;End Sub&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Save and close the VBA Editor&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Congrats you've built in search functionality.  Lookout Sergey and Larry!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;STEP 2: Making Editing Bearable&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;I still think our County drop-down could use some work.  I propose we add a State dropdown above it that filters the list by State to ease picking a county and remove the problem with duplicates.&lt;br /&gt;&lt;br /&gt;Like we added the textbox and buttons in the last step, switch to design view and drag a combobox onto the form.  This will start a wizard, follow along.&lt;ol&gt;&lt;li&gt;Accept the default values choice &lt;span style="font-style:italic;"&gt;I want to look up the values in a table or query&lt;/span&gt;. and click &lt;span style="font-weight:bold;"&gt;Next&lt;/span&gt;&lt;/li&gt;Choose the table &lt;span style="font-style:italic;"&gt;States &lt;/span&gt;and click &lt;span style="font-weight:bold;"&gt;Next&lt;/span&gt;&lt;li&gt;&lt;li&gt;Add &lt;span style="font-style:italic;"&gt;StateID &lt;/span&gt;and &lt;span style="font-style:italic;"&gt;State &lt;/span&gt;and click &lt;span style="font-weight:bold;"&gt;Next&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Choose to sort the &lt;span style="font-style:italic;"&gt;State &lt;/span&gt;column &lt;span style="font-weight:bold;"&gt;Ascending &lt;/span&gt;and click &lt;span style="font-weight:bold;"&gt;Next&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Accept the default values to hide the key column and click &lt;span style="font-weight:bold;"&gt;Next&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Accept the default to &lt;span style="font-style:italic;"&gt;Remember the Value for Later Use&lt;/span&gt; and click &lt;span style="font-weight:bold;"&gt;Next&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Change the name to &lt;span style="font-style:italic;"&gt;State &lt;/span&gt;and click &lt;span style="font-weight:bold;"&gt;Finish&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Now select the combobox and use the arrow keys to move it above the Counties field.&lt;br /&gt;&lt;br /&gt;Finally, we need to add some action.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We need to add to our &lt;span style="font-style:italic;"&gt;VU_Counties&lt;/span&gt; query the &lt;span style="font-style:italic;"&gt;StateID&lt;/span&gt;.  Open the query in Design View and drag and drop &lt;span style="font-style:italic;"&gt;StateID &lt;/span&gt;from the &lt;span style="font-style:italic;"&gt;States &lt;/span&gt;table to the query results at the bottom.  Close and save&lt;/li&gt;&lt;li&gt;In Design View of your &lt;span style="font-style:italic;"&gt;Cities &lt;/span&gt;form select the &lt;span style="font-style:italic;"&gt;State &lt;/span&gt;dropdown and open the &lt;span style="font-weight:bold;"&gt;Property Sheet&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;In the &lt;span style="font-weight:bold;"&gt;After Update&lt;/span&gt; Event, select &lt;span style="font-weight:bold;"&gt;[Event Procedure]&lt;/span&gt; and click &lt;span style="font-weight:bold;"&gt;...&lt;/span&gt;&lt;/li&gt;&lt;li&gt;In the VBA Editor add the following code:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Private Sub State_AfterUpdate()&lt;br /&gt;   Me.CountyID.RowSource = "SELECT [CountyID], [County] FROM [VU_Counties] WHERE ([StateID] = " &amp; cmboState.Value &amp; ") ORDER BY [County];"&lt;br /&gt;   Me.CountyID.Requery&lt;br /&gt;End Sub&lt;br /&gt;&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Save and close the VBA Editor&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/Sf1TLI2c8nI/AAAAAAAAAfk/kLSPFvmxXQA/s1600-h/Better.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 361px; height: 400px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/Sf1TLI2c8nI/AAAAAAAAAfk/kLSPFvmxXQA/s400/Better.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5331508984696074866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Test your code.  This is far more usable.  I still see room for improvement, but at least your users won't lynch you.  And if you were following along it's time for beer number six.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://resources.stupiddingo.com/files/spreadingsheets.zip"&gt;&lt;img style="vertical-align:bottom" src="http://resources.stupiddingo.com/icon/accdb.gif" alt="accdb icon"/&gt;&lt;/a&gt;&lt;a href="http://resources.stupiddingo.com/files/FormingNewReality.zip"&gt;Download the MS Access 2007 Project&lt;/a&gt; used in this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-766405203069509415?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/766405203069509415/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=766405203069509415' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/766405203069509415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/766405203069509415'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/05/forming-new-reality.html' title='Forming a New Reality'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_siWGhB-JGNY/SfuIJvEpAqI/AAAAAAAAAeE/tZ8I39N2Ty0/s72-c/frmCities.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-2818766698338161999</id><published>2009-05-01T09:01:00.000-06:00</published><updated>2009-05-03T12:00:07.004-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Spreading the Sheets and Letting Relations In</title><content type='html'>&lt;fieldset&gt;&lt;legend&gt;This post is part of an ongoing series&lt;/legend&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/04/design-for-exceptions.html"&gt;Design for Exceptions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/05/spreading-sheets-and-letting-relations.html"&gt;Spreading the Sheets and Letting Relations In&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/05/forming-new-reality.html"&gt;Forming a New Reality&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;em&gt;There's more to come... we're starting simple and working up... this will slowly become more complex to include SQL Server, ASP.Net web apps and ArcGIS.&lt;/em&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://oneidia.blogspot.com/2009/04/design-for-exceptions.html"&gt;my last post&lt;/a&gt; I went off on relational database design patterns.  Now let's try implementing these patterns in MS Access.&lt;br /&gt;&lt;a href="http://resources.stupiddingo.com/files/spreadingsheets.zip"&gt;&lt;img style="vertical-align:bottom" src="http://resources.stupiddingo.com/icon/accdb.gif" alt="accdb icon"/&gt;&lt;/a&gt;&lt;a href="http://resources.stupiddingo.com/files/spreadingsheets.zip"&gt;Download the MS Access 2007 Project&lt;/a&gt; used in this post.&lt;br /&gt;&lt;br /&gt;In the old days we made spreadsheets.  And they got ugly really quick.  Let's work with our city-zipcode analogy from &lt;a href="http://oneidia.blogspot.com/2009/04/design-for-exceptions.html"&gt;last time&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We started with what is basically a spreadsheet in MS Access:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_siWGhB-JGNY/SfsR13zSRLI/AAAAAAAAAb0/0uE6u7GI8bw/s1600-h/Spreadsheet.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 211px; height: 124px;" src="http://3.bp.blogspot.com/_siWGhB-JGNY/SfsR13zSRLI/AAAAAAAAAb0/0uE6u7GI8bw/s400/Spreadsheet.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330874201132909746" /&gt;&lt;/a&gt;&lt;br /&gt;We outgrew this quickly when we added Meridian:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsSwxysiPI/AAAAAAAAAb8/4ISwyXxEclM/s1600-h/SpreadBase.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 278px; height: 124px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsSwxysiPI/AAAAAAAAAb8/4ISwyXxEclM/s400/SpreadBase.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330875213132105970" /&gt;&lt;/a&gt;&lt;br /&gt;I didn't mention this in my last post, but I see this all too often.  Basic database design cue, if you're numbering your columns your design is wrong.&lt;br /&gt;&lt;br /&gt;Why?  Boise has 29 zipcodes.  New York has 161.  Washington, DC has 278.  Do you really want 278 columns for storing zipcodes?&lt;br /&gt;&lt;br /&gt;So you try something else.  You create what really is the right pattern, but it lacks referential integrity.  If you could spell and type perfectly it would be ideal.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsU1xioltI/AAAAAAAAAcE/d-SJpsDpOS8/s1600-h/InView.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 222px; height: 224px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsU1xioltI/AAAAAAAAAcE/d-SJpsDpOS8/s400/InView.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330877497987339986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ok, the answer is "in view" or "in query" for an MS Access world.  This is what we want to come up with, it just isn't maintainable in the real world.  Take Coeur d'Alene, Idaho for example.  In our main database at work there is 34 ways to spell Coeur d'Alene because someone left town a textfield with no zip code validation.  What we need to do is break this table into a discrete entity.  We only have to type Coeur d'Alene once and numerical dyslexics like me only have to type zip codes once.  We throw a table in the middle that is not human-readable that ties the primary keys (unique autonumbers that mean nothing) into the middle table to tie together this many-to-many relationship.  Ideally, humans don't even view this table, it sits in the background and stores the relationships human define using forms looking at real world data (city names and zipcodes in this case).&lt;br /&gt;&lt;div&gt;&lt;div style="float:right;"&gt;&lt;br /&gt;&lt;strong&gt;Design View&lt;/strong&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfstV0IE4zI/AAAAAAAAAd8/qhedzuYpebU/s1600-h/CitiesDesign.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 238px; height: 239px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfstV0IE4zI/AAAAAAAAAd8/qhedzuYpebU/s400/CitiesDesign.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330904436716135218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Datasheet View&lt;/strong&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_siWGhB-JGNY/SfsYOouunGI/AAAAAAAAAcM/IlfpLqe_fSI/s1600-h/Cities.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 189px; height: 202px;" src="http://2.bp.blogspot.com/_siWGhB-JGNY/SfsYOouunGI/AAAAAAAAAcM/IlfpLqe_fSI/s400/Cities.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330881223653760098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br clear="all"/&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="float:right;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_siWGhB-JGNY/SfsssZVYSkI/AAAAAAAAAdk/wdkACoPi6So/s1600-h/ZipCodesDesign.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 243px; height: 383px;" src="http://3.bp.blogspot.com/_siWGhB-JGNY/SfsssZVYSkI/AAAAAAAAAdk/wdkACoPi6So/s400/ZipCodesDesign.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330903725149538882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/SfsYemtMnPI/AAAAAAAAAcc/Rr3RMikkfio/s1600-h/ZipCodes.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 187px; height: 224px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/SfsYemtMnPI/AAAAAAAAAcc/Rr3RMikkfio/s400/ZipCodes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330881497988373746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br clear="all"/&gt;&lt;br /&gt;&lt;small&gt;* There's some cool things going on here.  Since zip codes in New England start with leading zeros, I've made zipcodes a text field.  Uniqueness is being enforced through an Index that doesn't allow duplicates and an Input Mask is requiring all zipcodes to be five digits.  With this setup both "123" and "ababa" would not be allowed.  Additionally we couldn't add "83714" twice.  This is being enforced at the table level so all forms, queries and other programs (ArcGIS) that may use this table will have to comply with these validation rules.&lt;/small&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="float:right;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfstLpb1YBI/AAAAAAAAAd0/swseurUJqnw/s1600-h/Cities_ZipCodesDesign.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 239px; height: 349px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfstLpb1YBI/AAAAAAAAAd0/swseurUJqnw/s400/Cities_ZipCodesDesign.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330904262047522834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_siWGhB-JGNY/SfsYaO7FG_I/AAAAAAAAAcU/PQtourDMB20/s1600-h/Cities_ZipCodes.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 227px; height: 245px;" src="http://3.bp.blogspot.com/_siWGhB-JGNY/SfsYaO7FG_I/AAAAAAAAAcU/PQtourDMB20/s400/Cities_ZipCodes.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330881422884674546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br clear="all"/&gt;&lt;br /&gt;Now we relate these together.  In MS Access 2007, go to the &lt;span style="font-weight:bold;"&gt;Database Tools&lt;/span&gt; tab and select &lt;span style="font-weight:bold;"&gt;Relationships&lt;/span&gt;.  Click Show Table to add your tables and then drag and drop your relationships.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsdNZOWEOI/AAAAAAAAAck/XrLG697qH1I/s1600-h/relate.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 387px; height: 400px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsdNZOWEOI/AAAAAAAAAck/XrLG697qH1I/s400/relate.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330886699869671650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Your tables should already have autonumbers set up as Primary Keys for Cities.CityID, ZipCodes.ZipCodeID and Cities_ZipCodes.ID.  When you make the relationships choose the following checkboxes:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Select &lt;span style="font-weight:bold;"&gt;Enforce Referential Integrity&lt;/span&gt; - This will ensure that you do not add a CityID or ZipCodeID to Cities_ZipCodes that does not exist in the main Cities or ZipCodes table.&lt;/li&gt;&lt;li&gt;Do not select &lt;span style="font-weight:bold;"&gt;Cascade Update Related Records&lt;/span&gt;.  We we do not need to cascade updates because we are following best practices and not allowing our primary keys to mean anything in the real world.  If you were to use zipcode for example as your primary key you would have to set this, because invariably zipcodes will change and your primary keys will have to change.  When this is your model bad things will happen.  Not right away.  After you have thousands of records.  Don't let your primary keys mean anything.  Choose long integers or guids.  Period.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Cascade Delete Related Records&lt;/span&gt; - This will delete related records in Cities_ZipCodes when you delete a City or ZipCode from the main Cities or ZipCodes table.  This will prevent orphaned records in Cities_ZipCodes.  Having recommended this, I will add that this is a dangerous setting for scenarios where inexperienced users have the ability to delete records as the entire history for a record could be deleted, e.g. the 278 zipcodes for New York City if a user were to delete the one record for New York.  Make sure your security settings match your users.  And consider not really deleting anything, just adding a flag that makes data appear to disappear for most users.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Save and close.  Now with one query we can recreate the table dynamically that we had above without 34 misspelling of Coeur d'Alene.&lt;br /&gt;&lt;br /&gt;In MS Access 2007 Select the &lt;span style="font-weight:bold;"&gt;Create &lt;/span&gt;Tab and click &lt;span style="font-weight:bold;"&gt;Query Design&lt;/span&gt;.  Now use Show Table again to add your three tables.  Auto-magically they will relate to each other using the rules you just added in the Relationship Diagram.  All that's left is to double-click (or drag) Cities.City and ZipCodes.ZipCode and they will drop into the results area.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/Sfse9aNB2II/AAAAAAAAAcs/WYH8Fqm-Uuc/s1600-h/Query1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 368px; height: 327px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/Sfse9aNB2II/AAAAAAAAAcs/WYH8Fqm-Uuc/s400/Query1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330888624277936258" /&gt;&lt;/a&gt;&lt;br /&gt;You can also swing over to the SQL by clicking an icon in the lower right.  When you're a big boy you may come here first, but we all start GUI (it's a fact ask a mid-wife).&lt;br /&gt;&lt;code&gt;SELECT Cities.City, ZipCodes.ZipCode&lt;br /&gt;FROM ZipCodes INNER JOIN (Cities INNER JOIN Cities_ZipCodes ON Cities.CityID = Cities_ZipCodes.CityID) ON ZipCodes.ZipCodeID = Cities_ZipCodes.ZipCodeID&lt;br /&gt;ORDER BY Cities.City, ZipCodes.ZipCode;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now run the query and you will get the same table we had in Figure 3.  So we got reporting down.  Now how do we swing data entry.&lt;br /&gt;&lt;br /&gt;We'll start with a table hack.  In MS Access you can bastardize a table to act like a mini-form.  This is a good place to start.&lt;br /&gt;&lt;br /&gt;Open Cities_ZipCodes and switch to design view.  We're going to add lookups for those two foreign keys, CityID and ZipCodeID so they are human readable.&lt;br /&gt;&lt;br /&gt;Select CityID and in the lower panel click the Lookup tab.  Add the following settings:&lt;br /&gt;&lt;table border="1" padding="1"&gt;&lt;tr&gt;&lt;th&gt;Property&lt;/th&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;What is going on here?&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Display Control&lt;/td&gt;&lt;td&gt;Combobox&lt;/td&gt;&lt;td&gt;This will display a combobox pick list instead of a textbox&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Row Source Type&lt;/td&gt;&lt;td&gt;Table/Query&lt;/td&gt;&lt;td&gt;This is the data source type we are using to fill the pick list&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Row Source&lt;/td&gt;&lt;td&gt;Cities&lt;/td&gt;&lt;td&gt;Use the cities table to fill the list&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bound Column&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;We saying that the field CityID matches the first field in the Cities table&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Column Count&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Pass across the first two fields: CityID and City&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Column Heads&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Don't display column headings, only really useful if you are bringing back a slew of fields such as City, County and State&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Column Widths&lt;/td&gt;&lt;td&gt;0";1"&lt;/td&gt;&lt;td&gt;By settings CityID to 0" I am hiding it and displaying City 1" wide, but since it is the only one it will stretch to however wide the column ends up being.  Note this is in inches, semi-colon delimited.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_siWGhB-JGNY/Sfsi_k_7YYI/AAAAAAAAAc0/WVvOqggPpzI/s1600-h/Lookup.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 357px; height: 398px;" src="http://3.bp.blogspot.com/_siWGhB-JGNY/Sfsi_k_7YYI/AAAAAAAAAc0/WVvOqggPpzI/s400/Lookup.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330893059582026114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Repeat these settings for ZipCodeID, Save and open the table.&lt;br /&gt;&lt;br /&gt;Surprise!  We have a human-readable spreadsheet... but every value is validated for referential integrity!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfskN6WcUVI/AAAAAAAAAc8/l5raPI4EYYw/s1600-h/Surprise.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 286px; height: 364px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfskN6WcUVI/AAAAAAAAAc8/l5raPI4EYYw/s400/Surprise.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330894405343400274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now before we move to forms we have one more table perversion that MS Access allows: Subdatasheets.  This method, combined with the look-ups we just authored will let us manage many-to-many relationships as if they were convenient hierarchies in table view.&lt;br /&gt;&lt;br /&gt;Open the Cities table in datasheet (table) view.  If you're using MS Access 2007 you'll see some + symbols auto-magically added themselves to your datasheet.  Click one and the related records in Cities_ZipCodes will be displayed.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsmVw2wafI/AAAAAAAAAdE/S02NvKf203Y/s1600-h/Subdatasheet.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 307px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfsmVw2wafI/AAAAAAAAAdE/S02NvKf203Y/s400/Subdatasheet.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5330896739256789490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now, for various reasons, for example you added a second relationship to cities (maybe a states table) this won't appear magically.  No worries.  Follow these steps:&lt;br /&gt;Select the &lt;span style="font-weight:bold;"&gt;Home &lt;/span&gt;tab, browse across the &lt;span style="font-weight:bold;"&gt;Records &lt;/span&gt;Fieldset and you'll see a small &lt;span style="font-weight:bold;"&gt;More &lt;/span&gt;button.  Click this and select &lt;span style="font-weight:bold;"&gt;SubDataSheet&lt;/span&gt;.  Find the table you wish to relate, if you have the Cities table open select Cities_ZipCodes and identify the parent and child fields that match, in this case CityID.&lt;br /&gt;&lt;br /&gt;This turned into a long post.  In the next installment I'll add some forms to manage our postal codes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://resources.stupiddingo.com/files/spreadingsheets.zip"&gt;&lt;img style="vertical-align:bottom" src="http://resources.stupiddingo.com/icon/accdb.gif" alt="accdb icon"/&gt;&lt;/a&gt;&lt;a href="http://resources.stupiddingo.com/files/spreadingsheets.zip"&gt;Download the MS Access 2007 Project&lt;/a&gt; used in this post.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-2818766698338161999?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/2818766698338161999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=2818766698338161999' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2818766698338161999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2818766698338161999'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/05/spreading-sheets-and-letting-relations.html' title='Spreading the Sheets and Letting Relations In'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_siWGhB-JGNY/SfsR13zSRLI/AAAAAAAAAb0/0uE6u7GI8bw/s72-c/Spreadsheet.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-6187765086036654840</id><published>2009-04-30T21:59:00.000-06:00</published><updated>2009-05-03T11:59:48.089-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Design for Exceptions</title><content type='html'>&lt;fieldset&gt;&lt;legend&gt;This post is part of an ongoing series&lt;/legend&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/04/design-for-exceptions.html"&gt;Design for Exceptions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/05/spreading-sheets-and-letting-relations.html"&gt;Spreading the Sheets and Letting Relations In&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://oneidia.blogspot.com/2009/05/forming-new-reality.html"&gt;Forming a New Reality&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;em&gt;There's more to come... we're starting simple and working up... this will slowly become more complex to include SQL Server, ASP.Net web apps and ArcGIS.&lt;/em&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;One of the biggest mistakes I run into every day is databases and spreadsheets which weren't designed for the exceptions.  I get it, most of your data fits in your model.  But then you run into data that doesn't fit your world view and you call me.  And that's when things get ugly.&lt;br /&gt;&lt;br /&gt;We need an example.&lt;br /&gt;&lt;br /&gt;Let's use ZipCodes.  We all know how these work right?  Each city has a zip code.  Here's some examples from here in Southwest Idaho:&lt;br /&gt;&lt;table padding="1" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;City&lt;/th&gt;&lt;th&gt;ZipCode&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Eagle&lt;/td&gt;&lt;td&gt;83616&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Kuna&lt;/td&gt;&lt;td&gt;83634&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Idaho City&lt;/td&gt;&lt;td&gt;83631&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;That wasn't so hard was it?  Our spreadsheet is done!&lt;br /&gt;&lt;br /&gt;Not so fast cowboy.  What do we do with Meridian?  It has three Zips: 83642, 83646, 83680.&lt;br /&gt;&lt;br /&gt;You've seen this before though and you got it taken care of don't you?  That's hierarchical!&lt;br /&gt;&lt;table padding="1" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan="2"&gt;Cities&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;CityID&lt;/th&gt;&lt;th&gt;City&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Eagle&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Kuna&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Idaho City&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Meridian&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;(I'll add the City in parentheses for clarity.)&lt;br /&gt;&lt;table padding="1" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan="3"&gt;ZipCodes&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ZipCodeID&lt;/th&gt;&lt;th&gt;ZipCode&lt;/th&gt;&lt;th&gt;CityID&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;83616&lt;/td&gt;&lt;td&gt;1 (Eagle)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;83634&lt;/td&gt;&lt;td&gt;2 (Kuna)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;83631&lt;/td&gt;&lt;td&gt;3 (Idaho City)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;83642&lt;/td&gt;&lt;td&gt;4 (Meridian)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;83646&lt;/td&gt;&lt;td&gt;4 (Meridian)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;83680&lt;/td&gt;&lt;td&gt;4 (Meridian)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;You mad dawg!  You got it.  But wait, the USPS is kinkier than that.  83714 is valid in Garden City, Boise and Hidden Springs!  &lt;a href="http://zip4.usps.com/zip4/welcome.jsp"&gt;USPS Postal Code Lookup&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now what?!  Welcome to the real world where &lt;a href="http://www.everythingismiscellaneous.com/"&gt;everything is miscellaneous&lt;/a&gt;.  Hierarchies only exist in human relationships and these days with a 50%+ divorce rate that isn't even true.  Nice family bush you got there.&lt;br /&gt;&lt;br /&gt;So what to do?  You got a many-to-many on your hands.  It's funny how common this pattern is... I'd call it more the rule than the default, yet somehow we always want to split things into distinct categories.  I think it is a relic of the filing cabinet age that'll disappear in the few years.   Google won, Yahoo lost the hierarchy war.  &lt;a href="http://www.shirky.com/writings/ontology_overrated.html"&gt;Ontology is overrated&lt;/a&gt; and this is the pattern behind the free tagging web and real relationships in the real world.  It's time for desktop databases to do a better job of handling these relationships.  But I'll leave that for another post.  For now you need a new pattern.  Three tables:&lt;br /&gt;&lt;table padding="1" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan="2"&gt;Cities&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;CityID&lt;/th&gt;&lt;th&gt;City&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Eagle&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Kuna&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Idaho City&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Meridian&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Boise&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Garden City&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Hidden Springs&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table padding="1" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan="2"&gt;ZipCodes&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ZipCodeID&lt;/th&gt;&lt;th&gt;ZipCode&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;83616&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;83634&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;83631&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;83642&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;83646&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;83680&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;83714&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;(I've added the City name/Zip Code in parenthesis for clarity.)&lt;br /&gt;&lt;table padding="1" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th colspan="4"&gt;Cities_By_ZipCode&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ID&lt;/th&gt;&lt;th&gt;CityID&lt;/th&gt;&lt;th&gt;ZipCode&lt;/th&gt;&lt;th&gt;()&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;(Eagle-83616)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;(Kuna-83634)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;(Idaho City-83631)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;(Meridian-83642)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;(Meridian-83646)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;(Meridian-83680)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;(Boise-83714)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;(Garden City-83714)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;(Hidden Springs-83714)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;(In reality Boise has 29 Zip Codes and Garden City has two, but let's keep it a little simpler for this explanation)&lt;br /&gt;&lt;br /&gt;I picked Zip Codes because they are a human constructed order that's outgrown it's own hierarchy.  We could have just of easily used the classic teachers to students model and then dropped in co-teachers (my Dad had that job once), or tried to decide if a tomato is a fruit or veggie, or whether hot burns like fire or jalapeño... the world is full of them.  If you look deep enough it's hierarchical relationships that are really uncommon.&lt;br /&gt;&lt;br /&gt;In my next post, &lt;a href="http://oneidia.blogspot.com/2009/05/spreading-sheets-and-letting-relations.html"&gt;Spreading the Sheets and Letting Relations In&lt;/a&gt;, I'll give some examples of how to work with many-to-many relationships in MS Access.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;UPDATE: Above I tangentially mentioned Clay Shirky's talk &lt;a href="http://www.shirky.com/writings/ontology_overrated.html"&gt;Ontology is Overrated&lt;/a&gt; and it's worth more than that.  Like all of Shirky's talks it's brilliant, but this one is one of his best.  Five years old and still a great read.&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-6187765086036654840?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/6187765086036654840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=6187765086036654840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6187765086036654840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6187765086036654840'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/04/design-for-exceptions.html' title='Design for Exceptions'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-1999664885705106949</id><published>2009-04-29T17:52:00.000-06:00</published><updated>2009-04-29T18:44:47.067-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcSDE'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>An Inquiry into IN Query</title><content type='html'>I had to select a ton of records today for a project in ArcGIS.  You know the normal method, hellish SQL repetition: &lt;code&gt;ID = 1 OR ID = 5 OR ID = 6 OR ID = 12 OR ID = 14 OR ID = 27 OR ID = 41 OR ID = 43&lt;/code&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 345px; height: 400px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/Sfjpc1ILAxI/AAAAAAAAAbk/01NOP_l5Tlk/s400/OldSkool.png" alt="" id="BLOGGER_PHOTO_ID_5330266840499946258" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;The past few months I've been working a lot in SQL Server and this experience made this repetition seem like too much work.  So I got lazy and I made an inquiry into &lt;strong&gt;IN&lt;/strong&gt; query: &lt;code&gt;ID IN (1,5,6,12,14,27,41,43)&lt;/code&gt;&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 345px; height: 400px;" src="http://2.bp.blogspot.com/_siWGhB-JGNY/SfjqhX8mnBI/AAAAAAAAAbs/ll8nKHkcPIo/s400/NewSkool.png" alt="" id="BLOGGER_PHOTO_ID_5330268018077768722" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;And it just worked.  There's no documentation in the main help file that even mentions it.  If you do open the ArcGIS Help and search on "SQL Reference" nearly half way down you find a section on Subqueries.  Here they explain that &lt;strong&gt;IN&lt;/strong&gt; queries are supported in geodatabases and &lt;strong&gt;EXISTS&lt;/strong&gt; is supported as well!  Who knew?  How was I supposed to know this if I hadn't gotten lazy?&lt;br /&gt;&lt;br /&gt;Here's what you'll find in the ArcGIS Help File:&lt;br /&gt;&lt;fieldset&gt;&lt;legend&gt;&lt;strong&gt;Subqueries&lt;/strong&gt;&lt;/legend&gt;&lt;br /&gt;&lt;small&gt;&lt;em&gt;NOTE: Coverages, shapefiles, and other non-geodatabase file-based data sources do not support subqueries. Subqueries done on a versioned ArcSDE feature class which has been registered without the option to move edits to base will not return features stored in the delta tables. File geodatabases provide the limited support for subqueries explained in this section, while personal and ArcSDE geodatabases provide full support. For information on the full set of subquery capabilities of personal and ArcSDE geodatabases, refer to your DBMS documentation.&lt;/em&gt;&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;A subquery is a query nested within another query. It can be used to apply predicate or aggregate functions or to compare data with values stored in another table. This can be done with the IN or ANY keywords. For example, this query would select only the countries that are not also listed in the table indep_countries:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This query would return the features with a GDP2006 greater than the GDP2005 of any of the features contained in countries:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"GDP2006" &gt; (SELECT MAX("GDP2005") FROM countries)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For each record in the table, a subquery may need to parse all the data in its target table. It may be extremely slow to execute on a large dataset.&lt;br /&gt;&lt;br /&gt;Subquery support in file geodatabases is limited to the following:&lt;br /&gt;&lt;br /&gt;IN predicate. For example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"COUNTRY_NAME" NOT IN (SELECT "COUNTRY_NAME" FROM indep_countries)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Scalar subqueries with comparison operators. A scalar subquery returns a single value. For example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"GDP2006" &gt; (SELECT MAX("GDP2005") FROM countries)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For file geodatabases, the set functions AVG, COUNT, MIN, MAX, and SUM can only be used within scalar subqueries.&lt;br /&gt;&lt;br /&gt;EXISTS predicate. For example:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;EXISTS (SELECT * FROM indep_countries WHERE "COUNTRY_NAME" = 'Mexico')&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Operator&lt;/th&gt;&lt;th&gt;Description&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;[NOT] EXISTS&lt;/td&gt;&lt;td&gt;Returns TRUE if the subquery returns at least one record; otherwise, it returns FALSE. For example, this expression returns TRUE if the OBJECTID field contains a value of 50:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;EXISTS (SELECT * FROM parcels WHERE "OBJECTID" = 50)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;EXISTS is supported in file, personal, and ArcSDE geodatabases only.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align:top;"&gt;[NOT] IN&lt;/td&gt;&lt;td&gt;Selects a record if it has one of several strings or values in a field. When preceded by NOT, it selects a record if it doesn't have one of several strings or values in a field. For example, this expression searches for four different state names:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"STATE_NAME" IN ('Alabama', 'Alaska', 'California', 'Florida')&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For file, personal, and ArcSDE geodatabases, this operator can also be applied to a subquery:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;"STATE_NAME" IN (SELECT "STATE_NAME" FROM states WHERE "POP" &gt; 5000000)&lt;/code&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/fieldset&gt;&lt;br /&gt;&lt;br /&gt;Remix &lt;strong&gt;IN&lt;/strong&gt; with some external SQL that &lt;strong&gt;EXISTS&lt;/strong&gt; here in &lt;a href="http://oneidia.blogspot.com/2007/06/arcgis-one-to-many-labeling.html"&gt;ArcGIS One-to-Many Labeling&lt;/a&gt; and you might confuse ArcSDE for an RDMS.  Just don't try look for anything meaningful in a &lt;strong&gt;RELATE&lt;/strong&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-1999664885705106949?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/1999664885705106949/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=1999664885705106949' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1999664885705106949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1999664885705106949'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/04/inquiry-into-in-query.html' title='An Inquiry into IN Query'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_siWGhB-JGNY/Sfjpc1ILAxI/AAAAAAAAAbk/01NOP_l5Tlk/s72-c/OldSkool.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-8253812132811982079</id><published>2009-04-24T16:11:00.000-06:00</published><updated>2009-04-24T16:48:48.739-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Outlook'/><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Making Macro Security Warnings Disappear</title><content type='html'>You know those annoying Microsoft Office Macro Security Warnings?  There is a way to make them disappear, at least for you.&lt;br /&gt;&lt;br /&gt;Here's the Steps.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Find the &lt;span style="font-weight: bold;" class="ui"&gt;Microsoft Office Tools&lt;/span&gt; folder generally under &lt;span style="font-weight: bold;"&gt;Start &gt; All Programs &gt; Microsoft Office &gt; Microsoft Office Tools&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Select &lt;span style="font-weight: bold;" class="ui"&gt;Digital Certificate for VBA Projects&lt;/span&gt; (if you don't have such a link see &lt;a href="http://office.microsoft.com/en-us/help/HP052495581033.aspx"&gt;this article&lt;/a&gt;)  &lt;/li&gt;&lt;li&gt;Fill out the form and name it &lt;span style="font-style: italic;"&gt;"Whatever makes you happy"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Open your Microsoft Office Application and Open Visual Basic Editor&lt;/li&gt;&lt;li&gt;Navigate to the Macro that is causing you Warnings&lt;/li&gt;&lt;li&gt;Go to &lt;span style="font-weight: bold;"&gt;Tools &gt; Digital Signature&lt;/span&gt; and click &lt;span style="font-weight: bold;"&gt;Choose&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Highlight the Certificate you just created, e.g. &lt;span style="font-style: italic;"&gt;"Whatever makes you happy"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Restart the Microsoft Office Application&lt;br /&gt;&lt;/li&gt;&lt;li&gt;This time when you get the security warning choose, "Always Trust this Publisher"&lt;/li&gt;&lt;li&gt;No more messages!&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-8253812132811982079?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/8253812132811982079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=8253812132811982079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/8253812132811982079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/8253812132811982079'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/04/making-macro-security-warnings.html' title='Making Macro Security Warnings Disappear'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5609741119574956235</id><published>2009-04-23T16:00:00.004-06:00</published><updated>2010-03-01T09:57:09.768-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Outlook'/><title type='text'>Attachment Reminder - and more for MS Outlook</title><content type='html'>I just did it again.  We don't like to admit it, but we all have.  You write a long letter describing the attachment, press send and then 10 seconds later remember you didn't actually attach the message.&lt;br /&gt;&lt;br /&gt;I finally decided to do something about it.&lt;br /&gt;&lt;br /&gt;Turns out it isn't too hard.  Chiefly because Jimmy Peña at &lt;a href="http://www.codeforexcelandoutlook.com/"&gt;Code for Excel and Outlook&lt;/a&gt; already did all the hard work of writing up an excellent &lt;a href="http://www.codeforexcelandoutlook.com/outlook-vba/etiquette-check/"&gt;MS Outlook Etiquette Check Macro&lt;/a&gt; that does all the dirty work for you.&lt;br /&gt;&lt;br /&gt;What's left for you to do?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In MS Outlook go to Tools &gt; Macros &gt; Visual Basic Editor&lt;/li&gt;&lt;li&gt;Under the Project Panel (far left) Browse to Project1 &gt; Microsoft Office Outlook Objects &gt; ThisOutlookSession&lt;/li&gt;&lt;li&gt;Double-click ThisOutlookSesson to Open (if you haven't been here before this will be a big blank canvas)&lt;/li&gt;&lt;li&gt;Visit &lt;a href="http://www.codeforexcelandoutlook.com/outlook-vba/etiquette-check/"&gt;Code for Excel and Outlook Etiquette Check Code&lt;/a&gt; and select "Copy to Clipboard" at the top of the code.  Or you can also copy from the code I've modified below if you prefer.&lt;/li&gt;&lt;li&gt;Go back to Visual Basic Editor and paste the Code into ThisOutlookSesson&lt;/li&gt;&lt;li&gt;Save and Close&lt;/li&gt;&lt;span style="font-weight: bold;"&gt;UPDATE Apr 24, 2009 3:56PM:&lt;/span&gt; Check your macro security settings:&lt;ul&gt;&lt;li&gt;In Outlook 2000 to 2003, choose &lt;b&gt;Tools | Macro | Security &lt;/b&gt;and set security to &lt;b&gt;Medium&lt;/b&gt;. In Outlook 2007, the macro security settings are in the &lt;strong&gt;Tools | Trust Center&lt;/strong&gt; dialog. Set macro security to &lt;b&gt;Warn on all macros&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Restart Outlook.&lt;/li&gt;&lt;li&gt;When Outlook re-opens you will see a security warning dialog. Choose "Enable Macros"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There is a hack around this we'll leave that for &lt;a href="http://oneidia.blogspot.com/2009/04/making-macro-security-warnings.html"&gt;another post&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Now just try to be rude.  Open a new email message and don't bother with a subject.  Press send.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 328px; height: 182px;" src="http://3.bp.blogspot.com/_siWGhB-JGNY/SfDognSqe0I/AAAAAAAAAbU/Cer5_hK_Woo/s400/nosubject.png" alt="" id="BLOGGER_PHOTO_ID_5328014006180019010" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Add "Check out this attachment it'll change your world" to the body and spank send.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 328px; height: 182px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/SfDolm6M9II/AAAAAAAAAbc/_iZsWXMMXoc/s400/noattachment.png" alt="" id="BLOGGER_PHOTO_ID_5328014091976766594" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Ain't that all kinds of slick?  It also will remind you if of missing recipients, blank bodies, signatureless messages, large attachments and too many attachments.&lt;br /&gt;&lt;br /&gt;Thanks Jimmy you made my day.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;VBA Code&lt;/strong&gt;&lt;br /&gt;&lt;pre class="brush: vb"&gt;Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)&lt;br /&gt;'&lt;br /&gt;' code to manipulate emails after hitting 'Send', but just before they are&lt;br /&gt;' actually sent&lt;br /&gt;'&lt;br /&gt;&lt;br /&gt;If TypeName(Item) = "MailItem" Then&lt;br /&gt;&lt;br /&gt;' we only want to work on messages, not contacts/notes etc&lt;br /&gt;&lt;br /&gt;Dim olApp As Outlook.Application&lt;br /&gt;Dim objNS As Outlook.NameSpace&lt;br /&gt;Dim objFolder As Outlook.MAPIFolder&lt;br /&gt;Dim Msg As Outlook.MailItem&lt;br /&gt;Dim sRecip As Outlook.Recipient&lt;br /&gt;&lt;br /&gt;Set olApp = Application&lt;br /&gt;Set objNS = olApp.GetNamespace("MAPI")&lt;br /&gt;' set object reference to item passed byval so we can manipulate&lt;br /&gt;&lt;br /&gt;Set Msg = Item&lt;br /&gt;&lt;br /&gt;' test for missing recipients&lt;br /&gt;&lt;br /&gt;If Msg.Recipients.Count = 0 Then&lt;br /&gt;Cancel = True&lt;br /&gt;MsgBox "There are no recipients." &amp; vbCr &amp; _&lt;br /&gt;vbCr &amp; "Please select a recipient and re-send your message.", vbCritical&lt;br /&gt;Msg.Display&lt;br /&gt;GoTo ErrorHandle&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;' test for invalid subject lines &amp; empty body&lt;br /&gt;Select Case Msg.Subject&lt;br /&gt;Case "", "Re:", "RE:", "FW:"&lt;br /&gt;Cancel = True&lt;br /&gt;MsgBox "You are sending a message without a subject." &amp; vbCr &amp; _&lt;br /&gt;vbCr &amp; "Please correct before sending.", vbCritical&lt;br /&gt;Msg.Display&lt;br /&gt;GoTo ErrorHandle&lt;br /&gt;End Select&lt;br /&gt;&lt;br /&gt;If Len(Msg.Body) &lt; 2 Then&lt;br /&gt;Cancel = True&lt;br /&gt;MsgBox "You are sending a message without any body text." &amp; vbCr &amp; _&lt;br /&gt;vbCr &amp; "Please correct before sending.", vbCritical&lt;br /&gt;Msg.Display&lt;br /&gt;GoTo ErrorHandle&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;' check for too many attachments (or too large), it's rude&lt;br /&gt;&lt;br /&gt;If Msg.Attachments.Count &gt; 2 Then&lt;br /&gt;If MsgBox("You are sending more than 2 attachments." &amp; _&lt;br /&gt;"Some people might consider this rude. Continue?", _&lt;br /&gt;vbYesNo + vbInformation) = vbNo Then&lt;br /&gt;Cancel = True&lt;br /&gt;Msg.Display&lt;br /&gt;GoTo ErrorHandle&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;If (Msg.Attachments.Count &gt; 0) And (Msg.Size &gt; 100000) Then&lt;br /&gt;If MsgBox("Your email is pretty big, do you want to stop " &amp; _&lt;br /&gt;"and zip the attachment(s)?", vbYesNo + vbExclamation) _&lt;br /&gt;= vbYes Then&lt;br /&gt;Cancel = True&lt;br /&gt;Msg.Display&lt;br /&gt;GoTo ErrorHandle&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;' check for missing attachments&lt;br /&gt;&lt;br /&gt;If InStr(LCase(Msg.Body), "attach") And (Msg.Attachments.Count = 0) Then&lt;br /&gt;If MsgBox("An attachment was mentioned, but there is no " &amp; _&lt;br /&gt;"attachment to this email. Send anyway?" _&lt;br /&gt;, vbYesNo + vbExclamation + vbDefaultButton1) = vbNo Then&lt;br /&gt;Cancel = True&lt;br /&gt;Msg.Display&lt;br /&gt;GoTo ErrorHandle&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;' check for missing signature, it's rude, but allow send anyway&lt;br /&gt;&lt;br /&gt;If InStr(Msg.Body, "ENTER PART OF YOUR SIGNATURE HERE") = 0 Then&lt;br /&gt;If MsgBox("You forgot your signature!" &amp; vbCr &amp; _&lt;br /&gt;"Do you want to add it first?", vbYesNo _&lt;br /&gt;+ vbExclamation) = vbYes Then&lt;br /&gt;Cancel = True&lt;br /&gt;Msg.Display&lt;br /&gt;GoTo ErrorHandle&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;ErrorHandle:&lt;br /&gt;Set Msg = Nothing&lt;br /&gt;Set objNS = Nothing&lt;br /&gt;Set objFolder = Nothing&lt;br /&gt;Set olApp = Nothing&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/fieldset&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5609741119574956235?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5609741119574956235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5609741119574956235' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5609741119574956235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5609741119574956235'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/04/attachment-reminder-and-more-for-ms.html' title='Attachment Reminder - and more for MS Outlook'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_siWGhB-JGNY/SfDognSqe0I/AAAAAAAAAbU/Cer5_hK_Woo/s72-c/nosubject.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-4995773776553536071</id><published>2009-04-20T12:39:00.000-06:00</published><updated>2009-04-20T12:40:24.595-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Folder Contents to File (Vista contextual menu)</title><content type='html'>&lt;a href="http://www.winhelponline.com/articles/206/1/How-to-add-the-Print-Directory-feature-for-file-system-folders-in-Windows-Vista.html"&gt;http://www.winhelponline.com/articles/206/1/How-to-add-the-Print-Directory-feature-for-file-system-folders-in-Windows-Vista.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-4995773776553536071?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/4995773776553536071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=4995773776553536071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4995773776553536071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4995773776553536071'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/04/folder-contents-to-file-vista.html' title='Folder Contents to File (Vista contextual menu)'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-7680064317279507955</id><published>2009-04-13T22:11:00.000-06:00</published><updated>2009-04-13T22:36:44.277-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Firefox'/><title type='text'>HowTo Remove Annoying Advertisements and Take Back Your Browser</title><content type='html'>I finally got completely fed up with Yahoo Mail today.  Consistently the ads would stall the browser and slow down response times, never mind just being annoying.&lt;br /&gt;&lt;br /&gt;I've known about Greasemonkey for years but never had the incentive until today to see if I could nuke these annoyances.&lt;br /&gt;&lt;br /&gt;It was embarrassingly easy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 1:&lt;/span&gt; Get a real browser.  &lt;a href="http://www.getfirefox.com/"&gt;Download Firefox&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 2:&lt;/span&gt; Download and install the &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/748"&gt;Greasemonkey Add-on&lt;/a&gt;.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 3:&lt;/span&gt; Install the &lt;a href="http://userscripts.org/scripts/show/4619"&gt;Yahoo Mail Cleaner&lt;/a&gt; script for Greasemonkey.&lt;br /&gt;&lt;br /&gt;Viola!  No more ads.  And better yet, this isn't a black box, it's ludicrously simple javascript:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;// ==UserScript==&lt;br /&gt;// @name           Yahoo Mail cleaner&lt;br /&gt;// @namespace      http://userscripts.org/yahoomailcleaner&lt;br /&gt;// @description    Removes ads from Yahoo Mail (AJAX)&lt;br /&gt;// @include        http://*.mail.yahoo.com/dc/launch*&lt;br /&gt;// ==/UserScript==&lt;br /&gt;&lt;br /&gt;if (window.wrappedJSObject.kPartner) {&lt;br /&gt;    window.wrappedJSObject.kPartner.bucket = 0;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;One if block.  It's embarrassing that I lived with ads that long.&lt;br /&gt;&lt;br /&gt;But why stop there.&lt;br /&gt;&lt;br /&gt;I don't really like ads in facebook either.&lt;br /&gt;There's a script for that: &lt;a href="http://userscripts.org/scripts/show/46560"&gt;Remove Facebook Ads &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hate how a google image search lands you in iframe hell?&lt;br /&gt;There's a script for that: &lt;a href="http://userscripts.org/scripts/show/5059"&gt;Google Image Relinker Mod&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Think video sites shouldn't burn your eyeballs out?&lt;br /&gt;There's a script for that, too: &lt;a href="http://userscripts.org/scripts/show/34965"&gt;YouTube Comfort in Black&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There's even a script for all of you freaks who think the old facebook was better, though I'm not following you here, so you'll have to go find that one yourself.  And accept a little change into your life in the process.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-7680064317279507955?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/7680064317279507955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=7680064317279507955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7680064317279507955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7680064317279507955'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/04/howto-remove-annoying-advertisements.html' title='HowTo Remove Annoying Advertisements and Take Back Your Browser'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-4391029600927400667</id><published>2009-03-26T15:12:00.000-06:00</published><updated>2009-04-30T23:44:13.809-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcSDE'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Saving changes not permited in SQL 2008</title><content type='html'>There's a nasty little checkbox selected by default in SQL Server Management Studio 2008 that prevents table changes from being committed.  It's not permissions, it is an installation and user specific checkbox hidden under tools &gt; options &gt; designers.  Uncheck "Prevent saving changes that require table re-creation".&lt;br /&gt;&lt;br /&gt;Source and more info: http://pragmaticworks.com/community/blogs/brianknight/archive/2008/06/04/sql-server-2008-designer-behavior-change-saving-changes-not-permitted.aspx&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-4391029600927400667?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/4391029600927400667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=4391029600927400667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4391029600927400667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4391029600927400667'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/03/saving-changes-in-not-permited-in-sql.html' title='Saving changes not permited in SQL 2008'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-2140130064006311248</id><published>2009-03-16T15:55:00.000-06:00</published><updated>2009-03-16T16:48:46.492-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcSDE'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Restoring Orphaned SQL Server 2008 Users</title><content type='html'>We keep moving databases across servers and reinstalling SQL Server at my office.  Almost everything transitions perfectly except SQL Server Users.  Unless the user already exists in the Master Security table, the database user is left orphaned inside the database without the ability to perform any useful function.  Like you right now, but we're gonna change that.&lt;br /&gt;&lt;br /&gt;Here is an example, note how there is a User Name but no Login Name.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/Sb7XPDQLL1I/AAAAAAAAAaQ/oVP0_gMrM08/s1600-h/sqluser.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 358px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/Sb7XPDQLL1I/AAAAAAAAAaQ/oVP0_gMrM08/s400/sqluser.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5313921263914921810" /&gt;&lt;/a&gt;&lt;small&gt;User Name but no Login Name&lt;/small&gt;  &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 1: Recreate the User in Master&lt;/b&gt;&lt;br /&gt;First, if they don't already exist, is to recreate the user in the master database by browsing to the root level Security folder in SQL Server Management Studio, choose Logins and right-click create user.&lt;br /&gt;&lt;br /&gt;You tried to check the database database under the "User Mapping" page didn't you?  &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/Sb7RTOGvnsI/AAAAAAAAAaI/TKnnLTPZX0o/s1600-h/sqlusererror.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 128px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/Sb7RTOGvnsI/AAAAAAAAAaI/TKnnLTPZX0o/s400/sqlusererror.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5313914738477866690" /&gt;&lt;/a&gt;&lt;small&gt;Create failed for User 'UserName'.&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;That was a good idea hotshot, but it ain't gonna work for you.  Just create the user and Ok your way out of there. Time for Step 2.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Step 2: Remap User to Database&lt;/b&gt;&lt;br /&gt;We need to run a system stored procedure I found on &lt;a href="http://msdn.microsoft.com/en-us/library/ms174378.aspx"&gt;MSDN&lt;/a&gt;, it is pretty straightforward, unfortunately it must be performed for each database.&lt;br /&gt;&lt;small&gt;NOTE: There's got to be a better way, and supposedly this method is deprecated, but this is the only thing I could get to work in my instance, so if you got something better please share.&lt;/small&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:blue"&gt;USE&lt;/span&gt; DATABASENAME&lt;span style="color:#666"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue"&gt;EXEC&lt;/span&gt; &lt;span style="color:maroon"&gt;sp_change_users_login&lt;/span&gt; &lt;span style="color:red"&gt;'Auto_Fix'&lt;/span&gt;&lt;span style="color:#666"&gt;,&lt;/span&gt; &lt;span style="color:red"&gt;'UserName'&lt;/span&gt;&lt;span style="color:#666"&gt;, NULL, &lt;/span&gt;&lt;span style="color:red"&gt;'UserPassword'&lt;/span&gt;&lt;span style="color:#666"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:blue"&gt;GO&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where:&lt;br /&gt;DATABASENAME = The name of your database&lt;br /&gt;UserName = SQL Server Login to repair&lt;br /&gt;UserPassword = SQL Server Login's password to repair&lt;br /&gt;&lt;br /&gt;Full documentation on MSDN for sp_change_users_login&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms174378.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms174378.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-2140130064006311248?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/2140130064006311248/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=2140130064006311248' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2140130064006311248'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/2140130064006311248'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/03/restoring-orphaned-sql-server-2008.html' title='Restoring Orphaned SQL Server 2008 Users'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_siWGhB-JGNY/Sb7XPDQLL1I/AAAAAAAAAaQ/oVP0_gMrM08/s72-c/sqluser.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-1283764110962499231</id><published>2009-02-11T09:38:00.000-07:00</published><updated>2009-02-11T09:45:22.349-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><title type='text'>Converting a string (dd/mm/yyyy) to a date in MS Access</title><content type='html'>For the best result in an MS Access query split the string into segments and use the DateSerial function:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;GMTDate: IIf([GMT_Date]="",Null,DateSerial(Mid([GMT_Date],7,4),Mid([GMT_Date],4,2),Mid([GMT_Date],1,2)))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;where dates are written in the format dd/mm/yyyy (23/12/2008).&lt;br /&gt;&lt;br /&gt;When combining date and time fields from string use DateSerial + TimeSerial, e.g.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;GMTDateTime: DateSerial(2008, 9, 23) + TimeSerial(10, 39, 1)) &lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-1283764110962499231?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/1283764110962499231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=1283764110962499231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1283764110962499231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1283764110962499231'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/02/converting-string-ddmmyyyy-to-date-in.html' title='Converting a string (dd/mm/yyyy) to a date in MS Access'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-554072107789734899</id><published>2009-01-02T12:26:00.000-07:00</published><updated>2009-01-02T12:57:43.562-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Linking to external databases and servers in SQL Server</title><content type='html'>In order to select tables in a stored procedure, view or trigger in an external database you must use the fully qualified name in the select statement.&lt;br /&gt;&lt;br /&gt;For example, to select from a table in a separate database on the same SQL Server instance you might write:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SELECT     AuthorID, Author&lt;br /&gt;FROM         BooksDb.dbo.PIC_Author&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You can also select cross-databases by adding the server name:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;SELECT     AuthorID, Author&lt;br /&gt;FROM         Server2.BooksDb.dbo.PIC_Author&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Until this morning the SQL Statement above had always worked for me, but this morning using a new server (running SQL2008) I received the following error message:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;---------------------------&lt;br /&gt;Microsoft SQL Server Management Studio&lt;br /&gt;---------------------------&lt;br /&gt;SQL Execution Error.&lt;br /&gt;&lt;br /&gt;Executed SQL statement: SELECT AuthorID, Author FROM Server2.BooksDb.dbo.PIC_Author&lt;br /&gt;Error Source: .Net SqlClient Data Provider&lt;br /&gt;Error Message: Could not find server 'Server2' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.&lt;br /&gt;---------------------------&lt;br /&gt;OK   Help &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;I’d never seen this error before and found this article (&lt;a href="Will you please remind me how to select data from a table in a different SQL database?"&gt;http://msdn.microsoft.com/en-us/library/aa259589(SQL.80).aspx&lt;/a&gt;) explaining how to use sp_addlinkedserver.&lt;br /&gt;&lt;br /&gt;So I executed the following on the SQL Server 2008 box:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;USE master&lt;br /&gt;GO&lt;br /&gt;EXEC sp_addlinkedserver&lt;br /&gt;   'Server2'&lt;br /&gt;GO&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And afterward the former SQL expression “SELECT AuthorID, Author FROM Server2.BooksDb.dbo…” executed successfully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-554072107789734899?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/554072107789734899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=554072107789734899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/554072107789734899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/554072107789734899'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2009/01/linking-to-external-databases-and.html' title='Linking to external databases and servers in SQL Server'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-3038234319790902024</id><published>2008-12-03T13:54:00.000-07:00</published><updated>2009-01-02T12:59:07.142-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Translating Coordinates</title><content type='html'>Of all the GIS questions I field, coordinate system related questions are the most frequent.  The following is typical:&lt;br /&gt;&lt;blockquote&gt;I got a shape file of land parcels from Bonneville Co. and am trying to overlay that onto the County NAIP imagery.  For some reason, when I have the same coordinate system and datum assigned to all layers, the NAIP and shape files are projecting at different scales and not even coming close to lining up.  I’ve tried everything in my limited arsenal.  If you have any idea of what’s going on, please let me know.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;The problem here is not a lack of understanding of the software (or grammar), but misunderstanding concepts behind assigning and translating a coordinate systems.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Translate This&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I've found language translation to be the most accurate analogy for making sense of coordinate systems in ArcGIS.&lt;br /&gt;&lt;br /&gt;Suppose you're traveling on a ferry in the Baltic Sea (why not?).  A frazzled tourist is running from person to person animatedly asking a question. Fortunately, you have a web browser on your phone and you call up Google Translate to assist. You are two dropdown listboxes away from understanding:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First, you must correctly identify what language they are speaking.&lt;/li&gt;&lt;li&gt;Second, you must indicate what language to which you want the information translated (most likely English)&lt;/li&gt;&lt;/ul&gt;You hand your phone over and they pound quickly into the keys:&lt;br /&gt;&lt;blockquote&gt;missa ovat wc&lt;/blockquote&gt;You've selected English as the output for your benefit, but the original language requires a guess, so you randomly start trying local tongues.&lt;br /&gt;&lt;br /&gt;Swedish suggests Ovat has bad aim...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/STcDJd31LiI/AAAAAAAAAVw/dHByKeQUeME/s1600-h/swedish-english.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 154px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/STcDJd31LiI/AAAAAAAAAVw/dHByKeQUeME/s400/swedish-english.png" alt="" id="BLOGGER_PHOTO_ID_5275688949660331554" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ms. Latvia haz Water Closet...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_siWGhB-JGNY/STcDOw3ybOI/AAAAAAAAAV4/KuyJtP_V6NE/s1600-h/latvian-english.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 159px;" src="http://3.bp.blogspot.com/_siWGhB-JGNY/STcDOw3ybOI/AAAAAAAAAV4/KuyJtP_V6NE/s400/latvian-english.png" alt="" id="BLOGGER_PHOTO_ID_5275689040659770594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ah, the Finn has to pee!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/STcC-_UP0kI/AAAAAAAAAVo/Zx0VeSvySh8/s1600-h/finnish-english.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 153px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/STcC-_UP0kI/AAAAAAAAAVo/Zx0VeSvySh8/s400/finnish-english.png" alt="" id="BLOGGER_PHOTO_ID_5275688769659327042" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Ah, but how do we ask the Dutch crew?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_siWGhB-JGNY/STcF-V6uRnI/AAAAAAAAAWA/-rF0bO7MxA4/s1600-h/finnish-dutch.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 150px;" src="http://1.bp.blogspot.com/_siWGhB-JGNY/STcF-V6uRnI/AAAAAAAAAWA/-rF0bO7MxA4/s400/finnish-dutch.png" alt="" id="BLOGGER_PHOTO_ID_5275692057081300594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Projections in ArcGIS present exactly the same problem. ArcGIS needs to “know” what coordinate system you want everything to be in, and it needs to know what coordinate system the different layers are in to begin with, so it can successfully translate.  In some situations (generally where the datum differs) it is a best practice to permanently re-project the data to match the rest of your data.  The most insidious errors occur when you incorrectly guess one or more coordinate systems and receive gibberish in response.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;IdaHos to the Rescue&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;So what to do when layers don't play well with others?  Out here we bring on the IdaHos.  Or "Projection Finder" as I call it professionally.  This is a layer I made that is projected in IDTM83 and displays where fifteen common projections fall to use in identifying projections.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_siWGhB-JGNY/STcRn1-XElI/AAAAAAAAAWI/kQnkfUeEB80/s1600-h/Idahos.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 372px;" src="http://4.bp.blogspot.com/_siWGhB-JGNY/STcRn1-XElI/AAAAAAAAAWI/kQnkfUeEB80/s400/Idahos.png" alt="" id="BLOGGER_PHOTO_ID_5275704864689033810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;How to use this layer:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open a new map and add the Project Finder layer first.  &lt;span style="font-style: italic;"&gt;This is important as starting a new map and adding a layer sets the default projection of the data frame to match the first layer added&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;For the layer you want to determine a projection for, first make sure it has no projection defined.  There are two ways you can do this: in Windows Explorer delete the corresponding .prj file or in ArcCatalog right-click on the layer, select Properties, select the XY Coordinate System Tab and spank the Clear button.&lt;/li&gt;&lt;li&gt;Once the coordinate system is nuked, add the layer to the map.&lt;/li&gt;&lt;li&gt;Zoom to the layer to to see in which projected Idaho it falls.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now you can go to Toolbox &gt; Data Management Tools &gt; Projections and Transformations &gt; Define Projection and do just that.&lt;/li&gt;&lt;li&gt;Once it is defined, remove it and re-add it to your map and it should move to fall inside IDTM83 since it now has a projection defined it is reprojecting on the fly to match the data frame.  This is a good thing.&lt;/li&gt;&lt;/ol&gt;You're Finnished.&lt;br /&gt;&lt;br /&gt;Oliko se hyvä sinulle? &lt;a href="http://foamee.com/people/StupidDingo"&gt;Osta minulle olutta.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Downloads&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://resources.stupiddingo.com/files/Projection_Finder.zip"&gt;Projection Finder shapefile and layer&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-3038234319790902024?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/3038234319790902024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=3038234319790902024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3038234319790902024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3038234319790902024'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/12/translating-coordinates.html' title='Translating Coordinates'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_siWGhB-JGNY/STcDJd31LiI/AAAAAAAAAVw/dHByKeQUeME/s72-c/swedish-english.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5117505462416859751</id><published>2008-11-21T15:44:00.000-07:00</published><updated>2008-11-21T15:55:32.331-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Replace ntext with n/varchar(MAX)</title><content type='html'>Starting with SQL Server 2005 replace ntext with more efficient varchar(max).  varchar(max) and nvarchar(max) store data fields smaller than 8,000 characters in the table rather than as a large object (LOB/BLOB).&lt;br /&gt;&lt;br /&gt;Beware when upgrading data currently stored as NText as it will remain a LOB until you run an update query setting the value equal to the current value, e.g.&lt;br /&gt;&lt;blockquote&gt;UPDATE testTable SET testText = testText&lt;/blockquote&gt;&lt;br /&gt;Full details and thanks go to &lt;a href="http://geekswithblogs.net/johnsPerfBlog/archive/2008/04/16/ntext-vs-nvarcharmax-in-sql-2005.aspx"&gt;Making Stuff Faster&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5117505462416859751?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5117505462416859751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5117505462416859751' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5117505462416859751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5117505462416859751'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/11/replace-ntext-with-nvarcharmax.html' title='Replace ntext with n/varchar(MAX)'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-1984866849132712732</id><published>2008-09-12T13:34:00.000-06:00</published><updated>2008-09-12T13:37:26.883-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Like?</title><content type='html'>How do you search for * and ? (asterisks and question marks) in MS Access?&lt;br /&gt;&lt;br /&gt;Bracket the criteria:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SELECT * FROM Table WHERE Column NOT LIKE "*[*]*"&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-1984866849132712732?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/1984866849132712732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=1984866849132712732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1984866849132712732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1984866849132712732'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/09/like.html' title='Like?'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-705953560366245924</id><published>2008-04-30T16:42:00.000-06:00</published><updated>2008-04-30T16:53:28.195-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Serving up KML in IIS 6</title><content type='html'>To serve up KML in IIS 6, you have to add a few MIME Types.  The easiest way to do this is to apply new MIME Type settings globally by changing the properties on your server's "Web Sites" folder in IIS.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Google Earth reads KML and KMZ files. The MIME type for KML files is&lt;br /&gt;&lt;br /&gt;    * application/vnd.google-earth.kml+xml&lt;br /&gt;&lt;br /&gt;The MIME type for KMZ files is&lt;br /&gt;&lt;br /&gt;    * application/vnd.google-earth.kmz&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Source: &lt;a href="http://code.google.com/apis/kml/documentation/kml_tut.html#kml_server"&gt;Google KML Tutorial&lt;/a&gt;&lt;br /&gt;  &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;To add a MIME type to a Web site or directory&lt;br /&gt;&lt;br /&gt;1. In IIS Manager, right-click the Web site or Web site directory for which you want to add a MIME type, and click Properties.&lt;br /&gt;&lt;br /&gt;2. Click the HTTP Headers tab.&lt;br /&gt;&lt;br /&gt;3. Click MIME Types.&lt;br /&gt;&lt;br /&gt;4. Click New.&lt;br /&gt;&lt;br /&gt;5. In the Extension box, type the file name extension.&lt;br /&gt;&lt;br /&gt;6. In the MIME type box, type a valid MIME type. If you define a MIME type that has already been defined at a higher level, you are prompted to select the level where the MIME type should reside.&lt;br /&gt;&lt;br /&gt;To create a MIME type for an undefined MIME type, type an asterisk (*) in the Extension box, and type application/octet-stream in the MIME type box.&lt;br /&gt;&lt;br /&gt;To create a MIME type for a file without an extension, type a period (.) in the Extension box, and type your MIME type in the MIME type box.&lt;br /&gt;&lt;br /&gt;7. Click OK.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Source: &lt;a href="http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/eb5556e2-f6e1-4871-b9ca-b8cf6f9c8134.mspx?mfr=true"&gt;Microsoft TechNet&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-705953560366245924?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/705953560366245924/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=705953560366245924' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/705953560366245924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/705953560366245924'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/serving-up-kml-in-iis-6.html' title='Serving up KML in IIS 6'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-4266306105132229158</id><published>2008-04-10T11:02:00.000-06:00</published><updated>2008-04-10T11:25:26.792-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MS Access'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Resultant table not allowed to have more than one AutoNumber field</title><content type='html'>&lt;a href="http://bp1.blogger.com/_siWGhB-JGNY/R_5IihirKUI/AAAAAAAAAN4/X5NTamjXNO0/s1600-h/autonumbererror.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_siWGhB-JGNY/R_5IihirKUI/AAAAAAAAAN4/X5NTamjXNO0/s400/autonumbererror.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5187663578733947202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ever get this error on a create table or insert query?  The work around is quite simple.  Cast the autonumber as an integer.  In query design view change your field definition for one of your autonumbers to read:&lt;br /&gt;&lt;pre&gt; XID: CInt([ID])&lt;/pre&gt;&lt;br /&gt;Or in SQL View:&lt;br /&gt;&lt;pre&gt;CInt([ID]) AS XID&lt;/pre&gt;&lt;br /&gt;(Ran into this error message again this morning and it reminded me I should share the workaround.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-4266306105132229158?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/4266306105132229158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=4266306105132229158' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4266306105132229158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4266306105132229158'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/resultant-table-not-allowed-to-have.html' title='Resultant table not allowed to have more than one AutoNumber field'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_siWGhB-JGNY/R_5IihirKUI/AAAAAAAAAN4/X5NTamjXNO0/s72-c/autonumbererror.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-3966291080066196145</id><published>2008-04-08T19:00:00.000-06:00</published><updated>2008-04-08T21:52:02.676-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Simple Record-Level Auditing in SQL Server &amp; ArcSDE</title><content type='html'>I've had simple auditing set up in my databases for years thanks to our old DBA.  This is not robust transaction logging, it just answers the questions "Who created this?", "When was this created?", "Who last edited this?" and "When was this last edited?".&lt;br /&gt;&lt;br /&gt;After witnessing a brand new table audit itself without triggers, I set about to understand the setup.  This seemed curious to me, so I thought it might also be curious to you.&lt;br /&gt;&lt;br /&gt;It turned out to be a two step system which rendered my insert triggers superfluous (at least I think so, tell me if I'm missing something and I need insert triggers after all). &lt;br /&gt;&lt;br /&gt;Our solution uses a combination of two methods.  For inserts we are going to tie our audit fields to User Defined Data Types which inherit Defaults we have specified.  For updates we will build a trigger to log the changes.  We will use the following fields in our tables to track inserts and updates:&lt;pre&gt;AUD_NUser - Creator&lt;br /&gt;AUD_NDate - Creation Date&lt;br /&gt;AUD_EUser - Editor&lt;br /&gt;AUD_EDate - Edit Date&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;STEP 1: Create Defaults&lt;/strong&gt;&lt;br /&gt;Defaults, according to the SQL Server Help, specify what values are used in a column if you do not specify a value for the column when inserting a row.  Often we will manually specify a default (e.g. "0" for an integer field to hold counts)&lt;br /&gt;&lt;br /&gt;In SQL Server, right-click on "Defaults" and select "New Default".&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_siWGhB-JGNY/R_w46nPlRVI/AAAAAAAAANs/xKAIvXcgMoM/s1600-h/defaultproperties.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_siWGhB-JGNY/R_w46nPlRVI/AAAAAAAAANs/xKAIvXcgMoM/s400/defaultproperties.gif" alt="" id="BLOGGER_PHOTO_ID_5187083450441876818" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;und&gt;Default for logging Insert User&lt;/und&gt;&lt;pre&gt;Name: "DEF_UserName"&lt;br /&gt;Value: "system_user"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;und&gt;Default for logging Insert Date&lt;/und&gt;&lt;pre&gt;Name: "DEF_Date"&lt;br /&gt;Value: "GetDate()"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;NOTE: If the user is logged into SQL Server using Windows Authentication, SYSTEM_USER returns the Windows 2000 or Windows NT 4.0 login (e.g. "MYDOMAIN\myusername"). If the user is logged in to SQL Server using SQL Server Authentication, SYSTEM_USER returns the SQL Server login (e.g. "sa").&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;STEP 2: Create User-Defined Data Types&lt;/strong&gt;&lt;br /&gt;User-defined data types allow one to build custom specifications beyond the generic integer, decimal, varchar options.  For example, one could create a custom character field of length 5 to store zip codes.&lt;br /&gt;&lt;br /&gt;In SQL Server, right-click on "User Defined Data Types" and select "New User Defined Data Type".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_siWGhB-JGNY/R_w46nPlRUI/AAAAAAAAANk/iaWAI4PtxhA/s1600-h/udtproperties.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_siWGhB-JGNY/R_w46nPlRUI/AAAAAAAAANk/iaWAI4PtxhA/s400/udtproperties.gif" alt="" id="BLOGGER_PHOTO_ID_5187083450441876802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;und&gt;User-Defined Data Type for storing Usernames&lt;/und&gt;&lt;pre&gt;Name: "AUD_UserName"&lt;br /&gt;Data type: "char"&lt;br /&gt;Length: "50"  (note this may need to be longer depending on your domain and usernames)&lt;br /&gt;Allow NULLS: Check&lt;br /&gt;Rule: "(none)"&lt;br /&gt;Default: "dbo.DEF_UserName"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;und&gt;User-Defined Data Type for storing Timestamps&lt;/und&gt;&lt;pre&gt;Name: "AUD_Timestamp"&lt;br /&gt;Data type: "smalldatetime"&lt;br /&gt;Length: "4"&lt;br /&gt;Allow NULLS: Check&lt;br /&gt;Rule: "(none)"&lt;br /&gt;Default: "dbo.DEF_Date"&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;STEP 3: Creating Audit Fields in the Database Table&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Add the following audit fields to your database table.  Set the Data Types to your new User Defined Types, note the Length, Default Value and Allow Nulls fields will be configured automatically.&lt;br /&gt;&lt;pre&gt;&lt;strong&gt;Field       Data Type&lt;/strong&gt;&lt;br /&gt;AUD_NUser   AUD_UserName&lt;br /&gt;AUD_NDate   AUD_Timestamp&lt;br /&gt;AUD_EUser   AUD_UserName&lt;br /&gt;AUD_EDate   AUD_Timestamp&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Congratulations, inserts are now covered!  And the best part is, for any future table you only have to repeat Step 3 (we'll look into automating that too in a future post).&lt;br /&gt;&lt;br /&gt;On to updates....&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;STEP 4: Create a Trigger to log Updates&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In SQL Server, right-click on your a Table with Audit Fields and select "All Tasks" and then "Manage Triggers".  The Trigger Properties dialog will open with "&amp;lt;new&amp;gt;" selected as the name.  Below this in the "Text:" textbox enter the following substituting [tablename] and [primarykey] to match your table.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_siWGhB-JGNY/R_w46HPlRTI/AAAAAAAAANc/2IF2l8ZFDrE/s1600-h/triggerproperties.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_siWGhB-JGNY/R_w46HPlRTI/AAAAAAAAANc/2IF2l8ZFDrE/s400/triggerproperties.gif" alt="" id="BLOGGER_PHOTO_ID_5187083441851942194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;Create Trigger [tablename]_UTrig ON dbo.[tablename] For Update As&lt;br /&gt;SET NOCOUNT ON&lt;br /&gt;UPDATE a SET a.AUD_EUser = System_User, a.AUD_EDate = getdate()&lt;br /&gt;FROM [tablename] a JOIN Inserted b ON a.[primarykey] = b.[primarykey]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You now have basic auditing in your database that works no matter where the edits take place be in SQL Server, MS Access, a custom application or even ArcGIS.&lt;br /&gt;&lt;br /&gt;Yes, ArcGIS!  And not only when editing a linked SQL Server data table, but also with integrated security now part of ArcGIS, you can add these edit fields to an SDE Table using the same steps described above and log edits to an SDE feature layer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-3966291080066196145?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/3966291080066196145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=3966291080066196145' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3966291080066196145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3966291080066196145'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/simple-record-level-auditing-in-sql.html' title='Simple Record-Level Auditing in SQL Server &amp; ArcSDE'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_siWGhB-JGNY/R_w46nPlRVI/AAAAAAAAANs/xKAIvXcgMoM/s72-c/defaultproperties.gif' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-786170083589402779</id><published>2008-04-08T17:28:00.000-06:00</published><updated>2008-04-08T22:13:21.196-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Making Copies with a HP DesignJet 5000ps (Queue Management)</title><content type='html'>At my old job making copies on the plotter was a piece of cake.  You went into the Queue, selected the job and number of copies and presto!  For some reason, possibly because I hardly make paper maps anymore, learning queue management on the DesignJet 5000ps did not come intuitively.&lt;br /&gt;&lt;br /&gt;My latest map kept running out of memory on the plotter, so when it finally did print after spooling for three hours, I had the incentive I needed to explore the DesignJet 5000ps menus.&lt;br /&gt;&lt;br /&gt;I must admit that I have waited five years and wasted the total of several days spooling print jobs.  It isn't even complicated.&lt;br /&gt;&lt;br /&gt;Starting at the Main Menu (use "Top" key to make sure you are at the Main Menu)&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Press the "ENTER" button (this will select the first option "Printing")&lt;/li&gt;&lt;li&gt;Highlight "Queueing &amp;amp; Nesting..." and press "ENTER"&lt;/li&gt;&lt;li&gt;Highlight "Queue Management" and press "ENTER"&lt;/li&gt;&lt;li&gt;Highlight the job number (These are negative numbers in the order last printed.  Select "-1" for the last job.)&lt;/li&gt;&lt;li&gt;Highlight "Copies = 0..." and Press "ENTER"&lt;/li&gt;&lt;li&gt;Highlight the number of copies you want in the Copies Menu and Press "ENTER"&lt;/li&gt;&lt;li&gt;Press the "BACK" button to return to the Job Menu (Titled "-1:" in this example)&lt;/li&gt;&lt;li&gt;Highlight "Move to Top" and Press "ENTER"&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The plotter should start warming up and printing will begin almost immediately.  Best yet, it will continue to print with no interruption for processing.&lt;br /&gt;&lt;br /&gt;I just made three copies of a 36"x60" shaded relief poster in the time it took to type this out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-786170083589402779?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/786170083589402779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=786170083589402779' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/786170083589402779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/786170083589402779'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/making-copies-with-hp-designjet-5000ps.html' title='Making Copies with a HP DesignJet 5000ps (Queue Management)'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-3619103515898533229</id><published>2008-04-04T18:18:00.000-06:00</published><updated>2008-04-08T18:50:34.791-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Recording a Booby Observation for Posterity</title><content type='html'>&lt;div style="float:right; margin:0 0 10px 10px;font-size:0.8em;"&gt;&lt;a href="http://bp2.blogger.com/_siWGhB-JGNY/R_wJw3PlRSI/AAAAAAAAANU/hrkhHFRKEF4/s1600-h/Booby.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_siWGhB-JGNY/R_wJw3PlRSI/AAAAAAAAANU/hrkhHFRKEF4/s320/Booby.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5187031605891646754" /&gt;&lt;/a&gt;&lt;br/&gt;CC Licensed photo by &lt;a href="http://en.wikipedia.org/wiki/User:Rileypie"&gt;Rileypie&lt;/a&gt;&lt;/div&gt;Building on the database that spurred my &lt;a href="http://oneidia.blogspot.com/2008/04/color-considerations.html"&gt;Color Considerations&lt;/a&gt;, I spent the better part of today debating the best way to log observers in a database.  Having documented it to explore the pros and cons with my coworkers, I figured I'd share my musings with y'all as well.  What way do you think is best?  Is there a better pattern I left out?&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;OUR EXAMPLE&lt;/strong&gt;&lt;br /&gt;On a blue-footed booby capture Nov. 11, 2007 we had four biologists recorded on the capture event: Mike, Roy, Phil and Jay. &lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;How do I record this?  Let’s review a few options:&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;OPTION 1&lt;/strong&gt;&lt;br /&gt;Two Integer Fields to an Observer lookup table&lt;pre&gt;Observer1ID: “272”     (MIKE)&lt;br /&gt;Observer2ID: “312”     (ROY)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NEGATIVE: The rest of the observers disappear in the data abyss.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;strong&gt;OPTION 2&lt;/strong&gt;&lt;br /&gt;One Integer Field to an Observer lookup, One Free Text Field&lt;pre&gt;Observer1ID: “272”     (MIKE)&lt;br /&gt;OtherObservers: “ROY, PHIL, JAY”&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NEGATIVE:  Nothing lost, but only able to reliably query on Observer1… Other Observers are listed, but there is no way to find PHIL.  He could be “PHIL, P., PHILLIP, PHILIP, or FILLUP”&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;OPTION 3&lt;/strong&gt;&lt;br /&gt;Observation Table linked to Observation_Observer Table by ObservationID&lt;br /&gt;&lt;br /&gt;Observation_Observer Table has the following Structure for example record, “123”&lt;pre&gt;ObservationID    ObserverID   Rank&lt;br /&gt;123              272          1&lt;br /&gt;123              312          2&lt;br /&gt;123              21           3&lt;br /&gt;123              128          4&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NEGATIVE: The weakness of this model is that it is possible to enter an observation with no observer since enforcing the creation of child record in a database is difficult and one would have to rely on the interface for data integrity.  Additionally, querying subtables is just a pain and often done incorrectly by users.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;OPTION 4&lt;/strong&gt;&lt;br /&gt;Modified Option 3 – With Observers assigned roles.&lt;br /&gt;Observation Table linked to Observation_Observer Table by ObservationID&lt;br /&gt;&lt;br /&gt;Observation_Observer Table has the following Structure for example record, “123”&lt;pre&gt;ObservationID    ObserverID   RoleID&lt;br /&gt;123              272          1   (Primary Observer)&lt;br /&gt;123              312          2   (Secondary Observer)&lt;br /&gt;123              21           6   (Sample Collector)&lt;br /&gt;123              128          2   (Secondary Observer)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NEGATIVE:  This model shares most of the same weaknesses as Option 3.  The addition of roles does codify the each of the observer's parts better, but introduces another weakness that no Role is necessarily required.  At least in Option 3 one could produce a 1-to-1 relationship by selecting the highest ranked Observer (lowest number) as long as one tested for nulls first.&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Option 5&lt;/strong&gt;&lt;br /&gt;Modified Option 2 &amp; 4 combined – Primary Observer in the Main Table with Secondary Observers in a subtable assigned roles. &lt;br /&gt;&lt;br /&gt;Observation Table&lt;pre&gt;PrimaryObserverID: “272”&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Observation_Observer Table has the following Structure for example record, “123”&lt;pre&gt;ObservationID    ObserverID   RoleID&lt;br /&gt;123              312          2   (Secondary Observer)&lt;br /&gt;123              21           3   (Sample Collector)&lt;br /&gt;123              128          4   (Secondary Observer)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NEGATIVE:  The only weakness of this is that entering secondary observers may be a little tiring over the free text field Option 2.  One may also want to consider the ability to enter free text for anecdotal observations rather than creating another Observer record.  Perhaps certain applications would enter structured data in the Observation Comment field and the PrimaryObserver would be “Anecdotal – See comments”.  For most incidentals however, follow-up is very important making the addition of a new observer an obvious and necessary step so a biologist has a phone number or email to confirm the sighting.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have my favorite.  Which option do you think has the best combination of ease of use and future queryability?  Do you have a better design pattern?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-3619103515898533229?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/3619103515898533229/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=3619103515898533229' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3619103515898533229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3619103515898533229'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/recording-booby-observation-for.html' title='Recording a Booby Observation for Posterity'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_siWGhB-JGNY/R_wJw3PlRSI/AAAAAAAAANU/hrkhHFRKEF4/s72-c/Booby.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-1749466394747749003</id><published>2008-04-02T17:18:00.000-06:00</published><updated>2008-04-08T17:57:02.139-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Color Considerations</title><content type='html'>I love the odd places my job takes me.  Today I am building a database to house all of the "marks" we place on animals we capture.  Tags, Collars, Leg Bands, RFID Tags (they're in fish &lt;span style="font-style: italic;"&gt;and &lt;/span&gt;your passport), Tattoos, Radio Collars, GPS Collars, Backpacks, Wing Tags.... the list is seemingly endless.&lt;br /&gt;&lt;br /&gt;The fun thing about designing databases is figuring out ahead of time all the exceptions.  For the moment at least, I now know more details about tagging animals than many field biologists.&lt;br /&gt;&lt;br /&gt;So far we have the following attributes:&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tag Type&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Collar, Band, Round, Square&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tag Location&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Right Leg, Left Leg, Right Wing, Left Wing, Neck, Nose, Right Ear, Left Ear&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Tag Construction&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Plastic, Metal, Leather, Ink (tattoo)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Color&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Red, Green, Yellow, Black, White&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Mark&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;R-2345, 562626849057, TIGGER, Y-7892-23&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="note"&gt;(We'll leave radio frequencies out of our discussion and focus purely on the visual aspects)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The challenging part of this is deciding what to leave in, what to leave out.&lt;br /&gt;&lt;br /&gt;I can probably discard Tag Construction and just allow color to cover it.  But discarding color and moving everything over to tag type (e.g. Yellow Right Ear Tag, Pink Fluffy Collar) would result in an unusable dropdown-list-from-hell.&lt;br /&gt;&lt;br /&gt;In designing databases, you search for the optimal combination of fields which allows the user to subset the information when necessary, but not fragment it so far that information cannot be located or easily entered.&lt;br /&gt;&lt;br /&gt;For example, when looking for a Wolverine with a Yellow Ear Tag (but you don't know the Tag Number) one may query by Species, Tag Color and Tag Location and get a list of yellow-tagged wolverines in return.&lt;br /&gt;&lt;br /&gt;This all sounds simple, but for this to work you can't have a free text field for color.  If you do, and many of our historical spreadsheets and databases do just this, you get the following "Y" , "Yellow", "Yell", "Ylw" and "Yellew".  So oddly enough, you need a pick list for color.  And the same rules apply.  Not too many or you'll end up with "Marigold", "Wheat", "Burnt Umber*" and "Mustard" and when searching for "Yellow" you won't find any wolverines.  Add too few and the appropriate color may not be available (e.g. Pink).&lt;br /&gt;&lt;br /&gt;We need a standard list of colors.  Wikipedia &lt;a href="http://en.wikipedia.org/wiki/Color"&gt;assists&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;In the 1969 study &lt;a href="http://en.wikipedia.org/wiki/Basic_Color_Terms:_Their_Universality_and_Evolution" title="Basic Color Terms: Their Universality and Evolution"&gt;Basic Color Terms: Their Universality and Evolution&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Brent_Berlin" title="Brent Berlin"&gt;Brent Berlin&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Paul_Kay" title="Paul Kay"&gt;Paul Kay&lt;/a&gt; describe a pattern in naming "basic" colors (like "red" but not "red-orange" or "dark red" or "blood red", which are "shades" of red). All languages that have two "basic" color names distinguish dark/cool colors from bright/warm colors. The next colors to be distinguished are usually red and then blue or green. All languages with six "basic" colors include black, white, red, green, blue and yellow. The pattern holds up to a set of twelve: black, grey, white, pink, red, orange, yellow, green, blue, purple, brown, and &lt;a href="http://en.wikipedia.org/wiki/Azure_%28color%29" title="Azure (color)"&gt;azure&lt;/a&gt; (distinct from blue in &lt;a href="http://en.wikipedia.org/wiki/Russian_language" title="Russian language"&gt;Russian&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Italian_language" title="Italian language"&gt;Italian&lt;/a&gt; but not English).&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;From which we now have our final color list** (user additions will be possible of course, but strongly discouraged).&lt;br /&gt;&lt;pre&gt;ColorID Color&lt;br /&gt;-99     Unknown&lt;br /&gt;1       Black&lt;br /&gt;2       White&lt;br /&gt;3       Red&lt;br /&gt;4       Green&lt;br /&gt;5       Blue&lt;br /&gt;6       Yellow&lt;br /&gt;7       Grey&lt;br /&gt;8       Pink&lt;br /&gt;9       Orange&lt;br /&gt;10      Purple&lt;br /&gt;11      Brown&lt;br /&gt;12      Azure&lt;/pre&gt;&lt;br /&gt;Granted, graphic artists and &lt;a href="http://www.youtube.com/watch?v=13KelrbkGpI"&gt;Donnie Hoyle&lt;/a&gt; will tell me that we should probably have two lists, one for hue and one for saturation, but these are biologists we're talking about.  I'll catch enough flack for "Azure".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;More Reading:&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_colors"&gt;Wikipedia's complete list of colors&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/List_of_Crayola_crayon_colors"&gt;Crayola Crayon Color Compendium&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="note"&gt;* There actually is no "Burnt Umber" in a Crayola pack, although it is my favorite random color name.  It is an amalgamation of two other Crayola colors, "Burnt Sienna" and "Raw Umber," both fine colors in their own right.&lt;br /&gt;** The optimal solution would probably not use named colors at all, but instead a graphical color picker where one used an eyedropper to capture the color.  Then searches would be performed using a fuzzy threshold slider (like photoshop's select by color) to select tags with a similiar hue and saturation.  One problem with this approach however would be that it would lack color blind usability.  And again, these are biologists, not graphic artists.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://stupiddingo.blogspot.com/2008/04/color-considerations.html"&gt;Color Considerations&lt;/a&gt; is cross-posted on my personal blog &lt;a href="http://stupiddingo.blogspot.com"&gt;Stupid Dingo&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-1749466394747749003?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/1749466394747749003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=1749466394747749003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1749466394747749003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1749466394747749003'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/color-considerations.html' title='Color Considerations'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-6614220647510467781</id><published>2008-04-02T12:09:00.000-06:00</published><updated>2008-04-02T19:15:29.962-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Auto Format (and Color) Outlook Appointments</title><content type='html'>A few years ago I got turned on to the idea of indexing your life by color.  In a quick glance your mind can comprehend really complex patterns.  By coloring entries in my calendar I am able to tell immediately if I am available or if a future appointment conflicts with a work meeting.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_siWGhB-JGNY/R_PM43PlRPI/AAAAAAAAAMM/SYn6OoifIPo/s1600-h/calendar.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_siWGhB-JGNY/R_PM43PlRPI/AAAAAAAAAMM/SYn6OoifIPo/s400/calendar.gif" alt="" id="BLOGGER_PHOTO_ID_5184712873307620594" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There are a number of ways to set this up.  Outlook allows you to add a label to every appointment.  However this is an Outlook specific feature and I sync my calendar across Outlook, Yahoo! and iCalendar.  The later two don't even have labels.&lt;br /&gt;&lt;br /&gt;Besides, calendars should be simple.  Complexity only hinders usability, so I prefer an automated solution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How to color appointments in Outlook automatically:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;In Calendar, right-click the calendar grid, and then click Automatic Formatting on the shortcut menu. &lt;/li&gt;&lt;li&gt;Click Add, and then type a name for the rule. &lt;/li&gt;&lt;li&gt;In the Label list, click a color. &lt;/li&gt;&lt;li&gt;Click Condition to specify the conditions under which the color will be applied.&lt;/li&gt;&lt;/ol&gt;&lt;span class="note"&gt;Note: If you manually assign a color to an item, automatic coloring cannot be used on that item.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Step 4 opens the Condition Filter Dialog.  There's a lot you can do.&lt;br /&gt;&lt;br /&gt;Here's a simple example I use to highlight Meetings in my Calendar:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_siWGhB-JGNY/R_PPw3PlRQI/AAAAAAAAAMU/oGfRncFqDeo/s1600-h/CalendarFilter.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp1.blogger.com/_siWGhB-JGNY/R_PPw3PlRQI/AAAAAAAAAMU/oGfRncFqDeo/s400/CalendarFilter.gif" alt="" id="BLOGGER_PHOTO_ID_5184716034403550466" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-6614220647510467781?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/6614220647510467781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=6614220647510467781' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6614220647510467781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6614220647510467781'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/auto-format-and-color-outlook.html' title='Auto Format (and Color) Outlook Appointments'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_siWGhB-JGNY/R_PM43PlRPI/AAAAAAAAAMM/SYn6OoifIPo/s72-c/calendar.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-6184249928468065090</id><published>2008-04-01T23:59:00.000-06:00</published><updated>2008-04-02T00:02:01.229-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>Ctrl-Shift-R</title><content type='html'>No wonder Ctrl-F5 never seemed to work.&lt;blockquote&gt;Force a browser reload.  Internet Explorer Users should press Ctrl-F5. Firefox Users should press Ctrl-Shift-R.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-6184249928468065090?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/6184249928468065090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=6184249928468065090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6184249928468065090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6184249928468065090'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/04/ctrl-shift-r.html' title='Ctrl-Shift-R'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5506616442346912188</id><published>2008-03-28T19:45:00.000-06:00</published><updated>2008-04-02T12:35:08.793-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Drupal'/><title type='text'>Learning the Hard Way: Installing Drupal on XP</title><content type='html'>&lt;span style="font-style: italic;"&gt;Open Source on Closed Source.  Probably a bad idea from the start.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Installing Drupal hearkened back to the old days of computing.  Way too much jargon and far too little push-a-button-and-it-works.  But I'm sold on the Drupal.  If I wasn't, I wouldn't have made it through the past two hours trying to install it (I'm tempted to say her here, which suggests a certain love-hate relationship is already evolving).&lt;br /&gt;&lt;br /&gt;Drupal installations should be straight forward.  Lullbot manages the whole install in &lt;a href="http://www.lullabot.com/videocast/installing_drupal_5"&gt;one five minute video&lt;/a&gt; that I would highly recommend.  My installation took significantly longer.&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;LESSONS LEARNED&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GOTCHA #1&lt;/span&gt;&lt;br /&gt;MySQL - At least in my instance the directions for setting permissions given in INSTALL.mySQL.txt were not sufficient to allow the database creation scripts to run.&lt;br /&gt;&lt;br /&gt;Command provided in INSTALL.mysql.txt:&lt;br /&gt;&lt;pre&gt;  GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE&lt;br /&gt;TEMPORARY TABLES, LOCK TABLES&lt;br /&gt;ON databasename.*&lt;br /&gt;TO 'username'@'localhost' IDENTIFIED BY 'password';&lt;/pre&gt;&lt;br /&gt;Command that fixed it:&lt;br /&gt;&lt;pre&gt;  GRANT ALL PRIVILEGES ON databasename.*&lt;br /&gt;TO 'username'@'localhost' IDENTIFIED BY 'password';&lt;/pre&gt;&lt;br /&gt;Maybe I mistyped, but if I did, I mistyped several times as I repeated the directions more than once.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;GOTCHA #2&lt;/span&gt;&lt;br /&gt;This one was painful.  I use Firefox almost exclusively, but in hoping to find a Windows-specific permissions error messages I switched over to IE in the previous step.  Because when you create the first super-administrator account IE7's firewall blocks Drupal's reply with the default super-administrator password.  As a result I was stuck on this screen for 90 minutes.  I'd enter the information and screen would just postback blank.&lt;br /&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp0.blogger.com/_siWGhB-JGNY/R-2i5HPlROI/AAAAAAAAAME/oQxaQ1cNO9I/s400/04-create-first-account.png" alt="" id="BLOGGER_PHOTO_ID_5182977848253957346" border="0" /&gt;&lt;br /&gt;I googled everything I could think of:&lt;ul&gt;&lt;li&gt;first user account nothing happens drupal&lt;/li&gt;&lt;li&gt;cannot get password for first account drupal&lt;/li&gt;&lt;li&gt;can't get password for administration account drupal 5&lt;/li&gt;&lt;li&gt;can't create first user drupal&lt;/li&gt;&lt;li&gt;show users mysql&lt;/li&gt;&lt;li&gt;http://localhost/drupal/index.php?q=user/register&lt;li&gt;&lt;li&gt;cannot admin account drupal&lt;/li&gt;&lt;/ul&gt;&lt;span class="note"&gt;NOTE: Included here in hope this may lead another lost soul to the light.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And finally I found the answer on the &lt;a href="http://drupal.org/node/62598"&gt;drupal Forums&lt;/a&gt; in one of tens of entries on roughly the same problem.  It wasn't base URLs, it wasn't Apache settings (I'm on IIS)... it was Internet Explorer 7!&lt;br /&gt;&lt;br /&gt;Internet Explorer blocking open source software.  There's some irony in here somewhere I'm sure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5506616442346912188?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5506616442346912188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5506616442346912188' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5506616442346912188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5506616442346912188'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/03/learning-hard-way-installing-drupal-on.html' title='Learning the Hard Way: Installing Drupal on XP'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_siWGhB-JGNY/R-2i5HPlROI/AAAAAAAAAME/oQxaQ1cNO9I/s72-c/04-create-first-account.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-9004703791638196573</id><published>2008-03-19T13:54:00.000-06:00</published><updated>2008-03-21T15:19:26.625-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Printing Folder Contents</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_siWGhB-JGNY/R-QhJHPlRNI/AAAAAAAAALk/XjF2Nc4hz7c/s1600-h/New+Picture.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://bp3.blogger.com/_siWGhB-JGNY/R-QhJHPlRNI/AAAAAAAAALk/XjF2Nc4hz7c/s400/New+Picture.gif" alt="" id="BLOGGER_PHOTO_ID_5180301911829857490" border="0" /&gt;&lt;/a&gt;Sometimes the old ways were a lot simpler.  In DOS and UNIX printing a file directory was as simple as "DIR".  And if you wanted to be really fancy you could add a couple characters to switch the listing format.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;DIR command line switches:&lt;/span&gt;&lt;ul&gt;&lt;li&gt;/B Uses bare format (no heading information or summary)&lt;/li&gt;&lt;li&gt;/L Forces lowercase display of file names&lt;/li&gt;&lt;li&gt;/O List by files in sorted order:&lt;ul&gt;&lt;li&gt;N by name (alphabetical)&lt;/li&gt;&lt;li&gt;S by size (smallest first)&lt;/li&gt;&lt;li&gt;E by extension (alphabetical)&lt;/li&gt;&lt;li&gt;D by date/time (oldest first)&lt;/li&gt;&lt;li&gt;G group directories first&lt;/li&gt;&lt;li&gt;- using this prefix reverses the sort order&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;/P Pauses after each screenful of information&lt;/li&gt;&lt;li&gt;/S Lists files in the specified directory and all subdirectories&lt;/li&gt;&lt;li&gt;/W Uses wide list format&lt;/li&gt;&lt;li&gt;/X Displays 8.3 versions of long file names&lt;/li&gt;&lt;/ul&gt;And if you wanted to put this list in a text file to save, copy, paste or print it was as simple as: &lt;blockquote&gt;dir /b /s &gt; DirectoryListing.txt&lt;/blockquote&gt; &lt;br /&gt;Somewhere in the ease of use of folders and drag and drop what was simple became hard. In DOS and UNIX this was all easy.  It can be again.&lt;br /&gt;&lt;br /&gt;Follow these steps from &lt;a href="http://support.microsoft.com/kb/321379"&gt;Microsoft Support&lt;/a&gt; to add simple right-click "Print Directory Listing" functionality in Windows XP (for Vista see the &lt;a href="http://support.microsoft.com/kb/321379"&gt;support article&lt;/a&gt;).    And stick around for how to customize these directions to print a directory listing to a text file.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 6px; padding: 10px; background-color: rgb(238, 238, 238);"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Step 1: Create the Printdir.bat file&lt;/span&gt;&lt;br /&gt;1.    Click Start, click Run, type notepad, and then click OK.&lt;br /&gt;2.    Paste the following text into Notepad:&lt;br /&gt;&lt;blockquote&gt;@echo off&lt;br /&gt;dir %1 /-p /o:gn &gt; "%temp%\Listing"&lt;br /&gt;start /w notepad /p "%temp%\Listing"&lt;br /&gt;del "%temp%\Listing"&lt;br /&gt;exit&lt;/blockquote&gt;3.    On the File menu, click Exit, and then click Yes to save the changes.&lt;br /&gt;4.    In the Save As dialog box, type the following text, and then click Save:&lt;br /&gt;&lt;blockquote&gt;%windir%\Printdir.bat&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Step 2: Create a new action for file folders&lt;/span&gt;&lt;br /&gt;1.    Click Start, click Control Panel, and then click Folder Options.&lt;br /&gt;Or, click Start, point to Settings, click Control Panel, and then click Folder Options.&lt;br /&gt;2.    On the File Types tab, click File Folder.&lt;br /&gt;3.    Click Advanced, and then click New.&lt;br /&gt;4.    In the Action box, type &lt;span style="font-style: italic;"&gt;Print Directory Listing&lt;/span&gt;.&lt;br /&gt;5.    In the Application used to perform action box, type &lt;span style="font-style: italic;"&gt;printdir.bat&lt;/span&gt;.&lt;br /&gt;6.    Click OK.&lt;br /&gt;7.    Click OK two times, and then click Close.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3: Edit the registry&lt;/span&gt;&lt;br /&gt;After you follow the steps in the previous sections, Search Companion may start when you double-click a folder instead of the folder being opened. Or, if you have associated other actions with file folders, those actions may be performed instead.&lt;br /&gt;&lt;br /&gt;To resolve this issue, follow these steps:&lt;br /&gt;1.    Start Registry Editor.&lt;br /&gt;2.    Locate the Default value under the following registry subkey: &lt;blockquote&gt;HKEY_CLASSES_ROOT\Directory\shell&lt;/blockquote&gt;3.    On the Edit menu, click Modify.&lt;br /&gt;4.    In the Value data box, type none.&lt;br /&gt;5.    Click OK.&lt;br /&gt;6.    Exit Registry Editor.&lt;br /&gt;&lt;/div&gt;&lt;span style="font-size:78%;"&gt;&lt;a href="http://support.microsoft.com/kb/321379"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;That's all well and good.  But what if you actually like trees?&lt;br /&gt;&lt;br /&gt;With minor edits to these directions we may save a directory listing to a text file in the parent directory.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin: 6px; padding: 10px; background-color: rgb(238, 238, 238);"&gt;&lt;span style="font-weight: bold;"&gt;Step 1: Create the Txtfiledir.bat file&lt;/span&gt;&lt;br /&gt;1.    Click Start, click Run, type notepad, and then click OK.&lt;br /&gt;2.    Paste the following text into Notepad:&lt;br /&gt;&lt;blockquote&gt;@echo off&lt;br /&gt;dir %1 /-p /o:gn &gt; "DirectoryListing.txt"&lt;br /&gt;exit&lt;/blockquote&gt;3.    On the File menu, click Exit, and then click Yes to save the changes.&lt;br /&gt;4.    In the Save As dialog box, type the following text, and then click Save:&lt;br /&gt;&lt;blockquote&gt;%windir%\Txtfiledir.bat&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Step 2: Create a new action for file folders&lt;/span&gt;&lt;br /&gt;1.    Click Start, click Control Panel, and then click Folder Options.&lt;br /&gt;Or, click Start, point to Settings, click Control Panel, and then click Folder Options.&lt;br /&gt;2.    On the File Types tab, click File Folder.&lt;br /&gt;3.    Click Advanced, and then click New.&lt;br /&gt;4.    In the Action box, type &lt;span style="font-style: italic;"&gt;Write DirectoryListing.txt&lt;/span&gt;.&lt;br /&gt;5.    In the Application used to perform action box, type &lt;span style="font-style: italic;"&gt;txtfiledir.bat&lt;/span&gt;.&lt;br /&gt;6.    Click OK.&lt;br /&gt;7.    Click OK two times, and then click Close.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Step 3: Edit the registry&lt;/span&gt;&lt;br /&gt;After you follow the steps in the previous sections, Search Companion may start when you double-click a folder instead of the folder being opened. Or, if you have associated other actions with file folders, those actions may be performed instead.&lt;br /&gt;&lt;br /&gt;To resolve this issue, follow these steps:&lt;br /&gt;1.    Start Registry Editor.&lt;br /&gt;2.    Locate the Default value under the following registry subkey: &lt;blockquote&gt;HKEY_CLASSES_ROOT\Directory\shell&lt;/blockquote&gt;3.    On the Edit menu, click Modify.&lt;br /&gt;4.    In the Value data box, type none.&lt;br /&gt;5.    Click OK.&lt;br /&gt;6.    Exit Registry Editor.&lt;/div&gt;&lt;br /&gt;That will get you started, now revisit the command line and DIR switches and roll your own.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-9004703791638196573?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/9004703791638196573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=9004703791638196573' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/9004703791638196573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/9004703791638196573'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/03/printing-folder-contents.html' title='Printing Folder Contents'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_siWGhB-JGNY/R-QhJHPlRNI/AAAAAAAAALk/XjF2Nc4hz7c/s72-c/New+Picture.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5499218328722132827</id><published>2008-03-11T16:37:00.000-06:00</published><updated>2008-04-15T13:23:00.614-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Maintaining Cross-Database Referential Integrity</title><content type='html'>It is often convenient to house your master tables in a separate database from application specific databases so that primary keys are copasetic and multiple databases have access to the same lookups.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Common examples would include employees, counties, regions and other lookup tables.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Once these tables are in a separate database however it is no longer possible to simply drag-and-drop a relationship between them to maintain referential integrity.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Here's a Solution&lt;/strong&gt;&lt;br /&gt;For this example we'll use an Observation table, tied to a master list of Sex, that's right, Sex (we could call it Gender to be all PC, but these are animals, not Pat in the Personnel Department.)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1:&lt;/strong&gt;&lt;br /&gt;We create a new view called &lt;em&gt;PIC_Sex&lt;/em&gt; in our Application Database by querying the table &lt;em&gt;PIC_Sex&lt;/em&gt; in our Master Database:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;CREATE VIEW dbo.PIC_Sex AS&lt;br /&gt;SELECT SexID, Sex, Rank&lt;br /&gt;FROM Master.dbo.PIC_Sex&lt;br /&gt;ORDER BY Rank&lt;/pre&gt;&lt;br /&gt;&lt;img id="BLOGGER_PHOTO_ID_5176627269733563090" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp1.blogger.com/_siWGhB-JGNY/R9cTEysRutI/AAAAAAAAALE/mGMCpyQyQIc/s400/New+Picture.gif" border="0" /&gt;&lt;span style="font-size:0.8em;color:#666;"&gt;Yes, that's right, Male &lt;em&gt;and&lt;/em&gt; Female!  You don't even want to go down that road.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2:&lt;/strong&gt;&lt;br /&gt;We create a new user-defined function &lt;em&gt;xdf_ValidateSex&lt;/em&gt; to validate if a given &lt;em&gt;SexID&lt;/em&gt; exists in the view &lt;em&gt;PIC_Sex&lt;/em&gt;.&lt;br /&gt;&lt;pre&gt;CREATE FUNCTION [dbo].[xdf_ValidateSex] (&lt;br /&gt;        @SexID int&lt;br /&gt;)&lt;br /&gt;RETURNS int AS&lt;br /&gt;BEGIN&lt;br /&gt;  RETURN&lt;br /&gt;        (&lt;br /&gt;        SELECT SexID FROM [dbo].[PIC_Sex] WHERE SexID = @SexID&lt;br /&gt;        )&lt;br /&gt;END&lt;/pre&gt;&lt;span style="font-size:0.8em;color:#666;"&gt;I've found this function really handy at some bars in the Village (see note above).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 3:&lt;/strong&gt;&lt;br /&gt;In our &lt;em&gt;Observation&lt;/em&gt; Table we add a constraint on the field &lt;em&gt;SexID&lt;/em&gt; which tests against the function &lt;em&gt;xdf_ValidateSex&lt;/em&gt; to see if the &lt;em&gt;SexID&lt;/em&gt; exists.&lt;br /&gt;&lt;br /&gt;Enter the following Constraint Expression:&lt;pre&gt;([dbo].[xdf_ValidateSex]([SexID]) is not null)&lt;/pre&gt;&lt;img id="BLOGGER_PHOTO_ID_5176625491617102530" style="DISPLAY: block; MARGIN: 0px auto 10px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://bp3.blogger.com/_siWGhB-JGNY/R9cRdSsRusI/AAAAAAAAAK8/7Jd0SW6gwhM/s400/New+Picture.gif" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;Viola!  You can now validate Sex programmatically!  Just add this constraint to your front door (or back door as the case may be) and no more embarrassing mornings waking up the spoonee instead of the spooner (or the other way around, I'll let you work out the validation details on your own).&lt;br /&gt;&lt;span style="font-size:0.8em;color:#666;"&gt;Hint: Add a WHERE clause to the initial view to match your preferences.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5499218328722132827?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5499218328722132827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5499218328722132827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5499218328722132827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5499218328722132827'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/03/maintaining-cross-database-referential.html' title='Maintaining Cross-Database Referential Integrity'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_siWGhB-JGNY/R9cTEysRutI/AAAAAAAAALE/mGMCpyQyQIc/s72-c/New+Picture.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-4150478647426032576</id><published>2008-02-11T11:33:00.000-07:00</published><updated>2008-02-11T11:35:12.501-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>SQL Illustrated</title><content type='html'>The best illustration of SQL Joins I've stumbled across:&lt;br /&gt;&lt;a href="http://www.codinghorror.com/blog/archives/000976.html"&gt;http://www.codinghorror.com/blog/archives/000976.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-4150478647426032576?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/4150478647426032576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=4150478647426032576' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4150478647426032576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/4150478647426032576'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2008/02/sql-illustrated.html' title='SQL Illustrated'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-1458865503975289745</id><published>2007-06-25T18:03:00.000-06:00</published><updated>2007-06-26T19:23:49.188-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Elaborate Hack for Transparency</title><content type='html'>ArcGIS supports transparency&amp;#42;.&lt;br /&gt;&lt;span style="font-size:12px; color:#ccc;"&gt;&amp;#42 Some restrictions apply.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But if you really want to do anything with transparency you quickly learn that the functionality available is completely inadequate.&lt;br /&gt;&lt;br /&gt;I work with a number of layers that rather than resembling a stain glass window with neatly segmented regions, come closer to resembling the outcome of tossing said window down a flight of stairs.  The smashed bits all laying in a pile overlapping each other sometimes seven or eight layers deep.&lt;br /&gt;&lt;br /&gt;But how to represent this mess?  In ArcGIS you really can't because ArcGIS only draws the top most layer.  Take a yellow piece of stained glass and drop it on top of a blue one and in the overlap you don't get green, but blue.  Even when you set transparency!&lt;br /&gt;&lt;br /&gt;The only way to complete our Glad bag analogy is to make two independent layers with transparency applied.  Not bad when there's only two.  But what if there's 582?  That would take a while.  And what if the layer with 582 is constantly growing so we'd have to make new definition queries or static shapefiles every single time we appended a record.  Not doable.&lt;br /&gt;&lt;br /&gt;However while ArcGIS does not support transparency properly, it occurred to me that ArcIMS does.  &lt;br /&gt;&lt;br /&gt;With that idea, I present: &lt;br /&gt;&lt;br /&gt;&lt;span style="text-align:center; font-weight:bold;"&gt;Hacking ArcGIS - Lesson 1: True Transparency&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_siWGhB-JGNY/RoGvcU9pmKI/AAAAAAAAAJ4/TJSz7_L9cj4/s1600-h/OutfitterLabellingGroups.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_siWGhB-JGNY/RoGvcU9pmKI/AAAAAAAAAJ4/TJSz7_L9cj4/s400/OutfitterLabellingGroups.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5080534755849115810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 1:&lt;/span&gt; Author a new map .AXL in which includes transparency (0.6 works well) and displays by unique value.&lt;br /&gt;&lt;div style="padding-left:18px"&gt;NOTE: I don't use Author at all in more, but it works great for building a unique values display.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 2:&lt;/span&gt; In ArcIMS Administrator create a new image service using the .AXL&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 3:&lt;/span&gt; Add the new image service to your ArcGIS map.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Step 4:&lt;/span&gt; Use a copy of the layer with display set to transparent to label.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;That's it!  You can now print and export a map with true transparency.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-1458865503975289745?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/1458865503975289745/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=1458865503975289745' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1458865503975289745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1458865503975289745'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/elaborate-hack-for-transparency.html' title='Elaborate Hack for Transparency'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_siWGhB-JGNY/RoGvcU9pmKI/AAAAAAAAAJ4/TJSz7_L9cj4/s72-c/OutfitterLabellingGroups.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-7631361818858041593</id><published>2007-06-22T14:26:00.000-06:00</published><updated>2007-06-25T03:02:32.159-06:00</updated><title type='text'>Democracy Player</title><content type='html'>I abhor Windows Media Player.  I've been looking for a solid non-proprietary video player for some time.  VLC is good, but could use some work on the user interface.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_siWGhB-JGNY/Rn-BKq8tstI/AAAAAAAAAJo/uuxqn_q9TCU/s1600-h/02.fullfeature.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_siWGhB-JGNY/Rn-BKq8tstI/AAAAAAAAAJo/uuxqn_q9TCU/s400/02.fullfeature.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5079920925024826066" /&gt;&lt;/a&gt;&lt;br /&gt;Today I downloaded &lt;a href="http://www.getdemocracy.com/"&gt;Democracy Player&lt;/a&gt;, a free, open source, and built by a non-profit organization with the goal of keeping internet video from being dominated by any one source.&lt;br /&gt;&lt;br /&gt;Here's there brief run down of why you should consider &lt;a href="http://www.getdemocracy.com/"&gt;Democracy Player&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color:#eee; padding: 4px;"&gt;&lt;span style="font-weight:bold;"&gt;1. Can't play a video? Try us.&lt;/span&gt;&lt;br /&gt;Play virtually any video-- Quicktime, WMV, MPEG, AVI, XVID, and more. Browse your collection, make playlists, stay organized.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;2. Get Internet TV Shows&lt;/span&gt;&lt;br /&gt;Subscribe to any video RSS feed, podcast, or video blog. Explore over 1,000 free channels with the built-in Channel Guide.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;3. Search YouTube&lt;/span&gt;&lt;br /&gt;Download and save videos from YouTube, Google Video, Yahoo Video, and other sites.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;4. High Definition and Fullscreen&lt;/span&gt;&lt;br /&gt;Your computer screen is a high-def display. Watch free HD videos in gorgeous fullscreen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;5. BitTorrent Animal&lt;/span&gt;&lt;br /&gt;Easily download any BitTorrent file. Fast. Then watch it in the same app. Simple.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I know what you're saying, so what?  Media Player, Quicktime, VLC, whatever it is your using works fine for you... but this is something different that I wasn't expecting.  #2, turns Democracy Player into a TV by integrating smoothly with Video RSS feeds.  You can browse channels, stop videos and return to them days later just where you left them.  You can even build your own channels from other's content.&lt;br /&gt;&lt;br /&gt;And it plays .wmv files, too.&lt;br /&gt;&lt;br /&gt;NOTE: Apparently the next release will be called &lt;a href="http://www.getmiro.com/"&gt;Miro&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-7631361818858041593?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/7631361818858041593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=7631361818858041593' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7631361818858041593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/7631361818858041593'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/democracy-player.html' title='Democracy Player'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_siWGhB-JGNY/Rn-BKq8tstI/AAAAAAAAAJo/uuxqn_q9TCU/s72-c/02.fullfeature.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-62835086632265605</id><published>2007-06-21T12:15:00.000-06:00</published><updated>2007-06-25T02:22:02.242-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>Could AJAX Replace Flash?</title><content type='html'>In at least some applications I think the answer is yes.&lt;br /&gt;&lt;br /&gt;The animation control included with the ASP.Net AJAX Control Toolkit is pretty impressive.  Animate OnMouseOver, OnMouseOut, OnClick, OnDoubleClick and more.  Transition effects, movement, visibility screening and the whole thing is controlled by an XML document.&lt;br /&gt;&lt;br /&gt;Here's &lt;a href="http://www.asp.net/learn/videos/view.aspx?tabid=63&amp;id=117"&gt;a 20 minute video&lt;/a&gt; (unfortunately only available in .wmv) on using the Animation Control packaged with the Toolkit.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.asp.net/learn/videos/view.aspx?tabid=63&amp;id=117"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_siWGhB-JGNY/Rn96Ya8tsrI/AAAAAAAAAJY/h1KAJBE82MA/s400/video-117.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5079913464666632882" /&gt;&lt;/a&gt;&lt;br /&gt;I'm going to try using it in place of Flash in my next application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-62835086632265605?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/62835086632265605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=62835086632265605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/62835086632265605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/62835086632265605'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/could-ajax-replace-flash.html' title='Could AJAX Replace Flash?'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_siWGhB-JGNY/Rn96Ya8tsrI/AAAAAAAAAJY/h1KAJBE82MA/s72-c/video-117.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-820995750881928850</id><published>2007-06-20T01:49:00.000-06:00</published><updated>2007-06-25T02:14:12.799-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>AJAX without the work</title><content type='html'>I've been experimenting this week with ASP.Net's new AJAX Control Toolkit.  I've hard-coded some of my own JavaScript and AJAX... and by comparison this is painfully slick.  It's too easy.  I'm sure I'll discover some serious limitations, but at least for the moment I'm pretty blown away.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ajax.asp.net/ajaxtoolkit/Accordion/Accordion.aspx"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_siWGhB-JGNY/Rn949q8tsqI/AAAAAAAAAJQ/hZ3pVi5ZE_4/s400/ajax.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5079911905593504418" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Take a second to &lt;a href="http://ajax.asp.net/ajaxtoolkit/Default.aspx"&gt;browse all the controls&lt;/a&gt; that are included in the download, which being JavaScript will work in any application not just ASP.Net.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-820995750881928850?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/820995750881928850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=820995750881928850' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/820995750881928850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/820995750881928850'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/ajax-without-work.html' title='AJAX without the work'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_siWGhB-JGNY/Rn949q8tsqI/AAAAAAAAAJQ/hZ3pVi5ZE_4/s72-c/ajax.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-3507486352603703660</id><published>2007-06-19T11:35:00.000-06:00</published><updated>2007-06-25T01:49:47.963-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Saving Label Expressions</title><content type='html'>Using the database querying label expressions I wrote about on Thursday, I got to learn a new "feature" of ArcGIS today: Disappearing label expressions on modification of a definition query&lt;br /&gt;&lt;br /&gt;That's right, spend five minutes building a database query into your label expression, get it working perfectly and then to celebrate try limiting it with a definition query.  Bam!  No more label expression.  Ain't ArcGIS beautiful?&lt;br /&gt;&lt;br /&gt;In dealing with this "feature", I discovered ArcGIS has the ability to Save and Load label expressions.  &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_siWGhB-JGNY/Rn9zDa8tspI/AAAAAAAAAJI/q3vTG1j2AMI/s1600-h/LabelEx.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_siWGhB-JGNY/Rn9zDa8tspI/AAAAAAAAAJI/q3vTG1j2AMI/s400/LabelEx.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5079905407307985554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'm quickly developing a catalog of label expressions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-3507486352603703660?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/3507486352603703660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=3507486352603703660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3507486352603703660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3507486352603703660'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/saving-label-expressions.html' title='Saving Label Expressions'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_siWGhB-JGNY/Rn9zDa8tspI/AAAAAAAAAJI/q3vTG1j2AMI/s72-c/LabelEx.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-246985104145792669</id><published>2007-06-18T07:23:00.000-06:00</published><updated>2007-06-25T01:33:47.009-06:00</updated><title type='text'>Ctrl -Alt -Delete in RDC and VM</title><content type='html'>I'm always bringing up the Task Manager in my machine when I lock up a process on a Remote Desktop Connection(RDC) or Virtual Machine(VM).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp1.blogger.com/_siWGhB-JGNY/Rn9vh68tsoI/AAAAAAAAAJA/2iW6WSnNtp0/s1600-h/TaskManager.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_siWGhB-JGNY/Rn9vh68tsoI/AAAAAAAAAJA/2iW6WSnNtp0/s400/TaskManager.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5079901533247484546" /&gt;&lt;/a&gt;Turns out all you have to do is right click on the Task Bar in the RDC or VM to bring up the Task Manager.  &lt;br /&gt;&lt;br /&gt;We'll file this in the "Who Knew?" section.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-246985104145792669?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/246985104145792669/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=246985104145792669' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/246985104145792669'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/246985104145792669'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/ctrl-alt-delete-in-rdc-and-vm.html' title='Ctrl -Alt -Delete in RDC and VM'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_siWGhB-JGNY/Rn9vh68tsoI/AAAAAAAAAJA/2iW6WSnNtp0/s72-c/TaskManager.gif' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-6004864904681853775</id><published>2007-06-15T14:32:00.000-06:00</published><updated>2007-06-15T15:16:37.093-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>Copy Error Messages to Clipboard</title><content type='html'>Don't you just love the error messages with just one prompt, OK, as if you are agreeable to it?  ArcGIS is full of them.  I'm especially fond of "&lt;span style="font-style:italic;"&gt;Memory at XXXX08008878XXX cannot be found.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;You know them well.  But did you know not only can you copy and paste the error message into a picture editing software such as Office Picture Manager, but you can also use Ctrl-C to copy and paste the contents into Notepad, Word, Outlook or a textbox when updating your blog.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp0.blogger.com/_siWGhB-JGNY/RnL9TTRTIHI/AAAAAAAAAI0/mdcvgm_c-9g/s1600-h/New+Picture+(2).png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_siWGhB-JGNY/RnL9TTRTIHI/AAAAAAAAAI0/mdcvgm_c-9g/s400/New+Picture+(2).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5076398238032142450" /&gt;&lt;/a&gt;&lt;blockquote&gt;---------------------------&lt;br /&gt;License&lt;br /&gt;---------------------------&lt;br /&gt;Provide your license server administrator with the following information:&lt;br /&gt;&lt;br /&gt;Cannot find SERVER hostname in network database&lt;br /&gt; The lookup for the hostname on the SERVER line in the&lt;br /&gt; license file failed.  This often happens when NIS or DNS&lt;br /&gt; or the hosts file is incorrect.  Workaround: Use IP-Address&lt;br /&gt; (e.g., 123.456.789.123) instead of hostname&lt;br /&gt;Feature:       ARC/INFO&lt;br /&gt;Hostname:      Ifwis3b&lt;br /&gt;License path:  @Ifwis3b&lt;br /&gt;FLEXlm error:  -14,7.  System Error: 11001 "WinSock: Host not found (HOST_NOT_FOUND)"&lt;br /&gt;&lt;br /&gt;---------------------------&lt;br /&gt;OK   &lt;br /&gt;---------------------------&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Apparently, this has been available since Windows 2000!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lifehacker.com/software/windows/copy-error-messages-text-to-the-clipboard-268547.php"&gt;Link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-6004864904681853775?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/6004864904681853775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=6004864904681853775' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6004864904681853775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6004864904681853775'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/copy-error-messages-to-clipboard.html' title='Copy Error Messages to Clipboard'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_siWGhB-JGNY/RnL9TTRTIHI/AAAAAAAAAI0/mdcvgm_c-9g/s72-c/New+Picture+(2).png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-1896367389548308926</id><published>2007-06-14T19:50:00.000-06:00</published><updated>2007-06-15T15:01:21.281-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IIS'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>URL Rewriting</title><content type='html'>Recently it came to my attention that google and other major search engines were no longer indexing querystrings.  I'm not sure when the switch took place but on a number of sites I maintain the majority of the content is no longer indexed.&lt;br /&gt;&lt;br /&gt;Enter URL Rewriting which allows us to convert:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;http://foo.com/tools/product/mcleod&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;Into&lt;br /&gt;&lt;span style="font-style:italic;"&gt;http://foo.com/tools.aspx?product=mcleod&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is extremely commonplace in the Apache world, but how do we accomplish it within IIS?&lt;br /&gt;&lt;br /&gt;Today I downloaded Helicon's ISAPI_Rewrite 2.11 Lite.  It's free and best of all it works off regular expressions.  &lt;br /&gt;&lt;br /&gt;Installation and Configuration&lt;br /&gt;1.) &lt;a href="http://www.isapirewrite.com/"&gt;Download&lt;/a&gt; ISAPI_Rewrite&lt;br /&gt;2.) Install&lt;br /&gt;3.) Open the global httpd.ini file&lt;br /&gt;Start &gt; Programs &gt; Helicon &gt; ISAPI_Rewrite &gt; httpd.ini&lt;br /&gt;4.) Add a rule to process querystrings, in this example we'll loop through the querystring of all files ending in .aspx&lt;br /&gt;&lt;blockquote&gt;[ISAPI_Rewrite]&lt;br /&gt;&lt;br /&gt;# Repath .aspx files&lt;br /&gt;RewriteRule (.*?\.aspx)(\?[^/]*)?/([^/]*)/([^/]*)(.*) $1(?2$2&amp;:\?)$3=$4$5 [NS,I]&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This will turn:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;http://foo.com/tools/product/mcleod&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Into:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;http://foo.com/tools.aspx?product=mcleod&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Extra points if you've actually used a &lt;a href="http://en.wikipedia.org/wiki/McLeod_(tool)"&gt;McLeod&lt;/a&gt; (or at least know what one is).&lt;br /&gt;&lt;br /&gt;The Lite version of ISAPI_Rewrite only works at the global level, and cannot be configured to work differently in each virtual directory.  So far it is working really well, and I may be buying a full version in the near future.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.isapirewrite.com/"&gt;Link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-1896367389548308926?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/1896367389548308926/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=1896367389548308926' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1896367389548308926'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/1896367389548308926'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/url-rewriting.html' title='URL Rewriting'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-8928168159912143141</id><published>2007-06-13T14:04:00.001-06:00</published><updated>2010-04-01T12:34:01.694-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL Server'/><title type='text'>Coalesce</title><content type='html'>Building on the vein of representing one-to-many relationships I've always been frustrated trying to display child records in tables and datagrids.  Examples include showing multiple authors of publications, children in a classroom, and fish species observed in a lake.&lt;br /&gt;&lt;br /&gt;Until today the two best methods I had were both hacks.&lt;br /&gt;&lt;und&gt;Method 1&lt;/und&gt;&lt;br /&gt;Use Three Queries&lt;br /&gt;1.) Build a crosstab&lt;br /&gt;2.) Concatenate the output of the crosstab&lt;br /&gt;3.) Join the product back to the parent table&lt;br /&gt;&lt;br /&gt;  - or -&lt;br /&gt;&lt;br /&gt;&lt;und&gt;Method 2&lt;/und&gt;&lt;br /&gt;Loop through child records programmatically to build a comma-delimited list.&lt;br /&gt;&lt;br /&gt;Today I discovered &lt;a href="http://www.4guysfromrolla.com/webtech/092105-1.shtml"&gt;a far more elegant solution&lt;/a&gt; using COALESCE within a User Defined Function to build comma-delimited list in Views and Stored Procedures.&lt;br /&gt;&lt;br /&gt;For this example we'll be building a comma-delimited list of fish species observed in each water (lakes and streams).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create a new User Defined Function(UDF)&lt;br /&gt;&lt;blockquote&gt;CREATE FUNCTION dbo.udf_GetFishByWater(@WaterID int)&lt;br /&gt;RETURNS VARCHAR(1000) AS&lt;br /&gt;&lt;br /&gt;BEGIN&lt;br /&gt;  DECLARE @FishList varchar(1000)&lt;br /&gt;&lt;br /&gt;  SELECT @FishList = COALESCE(@FishList + ', ', '') + SpeciesName&lt;br /&gt;  FROM VU_FishSpeciesByWater&lt;br /&gt;  WHERE WaterID = @WaterID&lt;br /&gt;&lt;br /&gt;  RETURN @FishList&lt;br /&gt;END&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Call the User Defined Function in a View&lt;br /&gt;&lt;blockquote&gt;SELECT WaterName As Stream, Parent,&lt;br /&gt;      dbo.udf_GetFishByWater(WaterID) as FishSurveyed&lt;br /&gt;FROM GIS_Hydrography&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Result:&lt;table width="100%" border=1 padding=0 margin=0 style="font-family:Verdana, Arial, Sans Serif;font-size:0.7em;margin:0; padding:0;"&gt;&lt;tr&gt;&lt;th width="25%"&gt;Stream&lt;/th&gt;&lt;th width="25%"&gt;Parent&lt;/th&gt;&lt;th width="50%"&gt;FishSurveyed&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Abbott Gulch&lt;/td&gt;&lt;td&gt;S. Fk. Boise River&lt;/td&gt;&lt;td&gt;Redbank Trout, Sculpin (Var. Species)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adair Creek&lt;/td&gt;&lt;td&gt;Jungle Creek&lt;/td&gt;&lt;td&gt;Cutthroat Trout, Westslope Cutthroat Trout&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Adams Creek&lt;/td&gt;&lt;td&gt;Mann Creek&lt;/td&gt;&lt;td&gt;Rainbow / Redband Trout (Wild), Rainbow Trout&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Agency Creek&lt;/td&gt;&lt;td&gt;Lemhi River&lt;/td&gt;&lt;td&gt;Bull Trout, Cutthroat Trout, Rainbow Trout, Sculpin (Var. Species)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Ahrs Gulch&lt;/td&gt;&lt;td&gt;Saint Joe River&lt;/td&gt;&lt;td&gt;Brook Trout, Cutthroat Trout&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Airplane Lake&lt;/td&gt;&lt;td&gt;Ship Island Creek&lt;/td&gt;&lt;td&gt;Cutthroat Trout, Rainbow Trout&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alder Creek&lt;/td&gt;&lt;td&gt;Morgan Creek&lt;/td&gt;&lt;td&gt;Cutthroat Trout, Rainbow / Redband Trout (Wild), Rainbow X Cutthroat Trout&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alder Creek&lt;/td&gt;&lt;td&gt;Patterson Creek&lt;/td&gt;&lt;td&gt;Bull Trout, Cutthroat Trout, Rainbow / Redband Trout (Wild), Rainbow X Cutthroat Trout, Unknown Species&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alder Creek&lt;/td&gt;&lt;td&gt;S. Fk. Payette River&lt;/td&gt;&lt;td&gt;Dace (Var. Sp.), Rainbow Trout, Sucker (Var. Sp.)&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.4guysfromrolla.com/webtech/092105-1.shtml"&gt;Link&lt;/a&gt;&lt;p&gt;NOTE: These are now stored as Scalar-valued Functions in SQL Server 2008&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-8928168159912143141?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/8928168159912143141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=8928168159912143141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/8928168159912143141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/8928168159912143141'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/coalesce.html' title='Coalesce'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-5871063726228145859</id><published>2007-06-12T12:58:00.000-06:00</published><updated>2007-06-28T15:21:32.553-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcGIS'/><title type='text'>ArcGIS One-to-Many Labeling</title><content type='html'>ArcGIS is just plain lousy at dealing with any relationship that isn't one-to-one.&lt;br /&gt;&lt;br /&gt;We all have a  slew of hacks just to deal with this limitation.  I for one regularly am creating temporary cross-tab queries so I can represent multiple sample results at a collection point, fish surveyed at a cross-section and a host of other relationships.&lt;br /&gt;&lt;br /&gt;The classic example for mapping comes from the cadastral community and condominium lots.  It's an odd situation where more than one person has title to the same piece of ground.  How do you represent this?&lt;br /&gt;&lt;br /&gt;I've got a new trick thanks to &lt;a href="http://www.esri.com/news/arcuser/0705/files/externaldb.pdf"&gt;Mohammed Hoque's article&lt;/a&gt; in ArcUser Magazine.&lt;br /&gt;&lt;br /&gt;We're going to do a database query &lt;em&gt;inside&lt;/em&gt; a label expression, loop through the results and output the entire list to label.&lt;br /&gt;&lt;br /&gt;For our example we'll use Outfitting Areas in Idaho and we'll label them with the Outfitters and Guide License Numbers and Outfitter Names.&lt;br /&gt;&lt;br /&gt;1.) Open ArcGIS and add your spatial layer with the unique identifier shared with your database.&lt;br /&gt;2.) In the label expression, click &lt;span style="font-weight: bold;"&gt;Advanced&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_siWGhB-JGNY/RnHn_TRTIEI/AAAAAAAAAIc/oVCUGVnWlog/s1600-h/LabelDialog.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_siWGhB-JGNY/RnHn_TRTIEI/AAAAAAAAAIc/oVCUGVnWlog/s400/LabelDialog.png" alt="" id="BLOGGER_PHOTO_ID_5076093329713864770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;3.) Replace the labeling expression with the following:&lt;blockquote&gt;Function FindLabel ([&lt;span style="font-weight: bold;"&gt;ID&lt;/span&gt;])&lt;br /&gt;Dim strQry, strInfo, i&lt;br /&gt;i = 1&lt;br /&gt;strQry = "SELECT &lt;span style="font-weight: bold;"&gt;Outfitter&lt;/span&gt; FROM &lt;span style="font-weight: bold;"&gt;VU_GIS_Labeling&lt;/span&gt; WHERE &lt;span style="font-weight: bold;"&gt;ID&lt;/span&gt; = " &amp; [&lt;span style="font-weight: bold;"&gt;ID&lt;/span&gt;]&lt;br /&gt;Dim Conn&lt;br /&gt;set Conn = createobject("ADODB.Connection")&lt;br /&gt;Dim rs&lt;br /&gt;set rs = createObject("ADODB.Recordset")&lt;br /&gt;Conn.Open "PROVIDER=SQLOLEDB;Integrated Security=SSPI; Persist Security Info=False; Initial Catalog=&lt;span style="font-weight: bold;"&gt;aDatabaseName&lt;/span&gt;; Data Source=&lt;span style="font-weight: bold;"&gt;aServerName&lt;/span&gt;"&lt;br /&gt;Conn.CursorLocation = 3&lt;br /&gt;rs.Open strQry, Conn, 3, 1, 1&lt;br /&gt;'if more than one records are found, append to the existing string.&lt;br /&gt;Select Case rs.RecordCount&lt;br /&gt;Case -1, 0&lt;br /&gt;'If no record is found, return empty string&lt;br /&gt;strInfo = ""&lt;br /&gt;Case 1&lt;br /&gt;'reading only the first record&lt;br /&gt;strInfo = rs.Fields("&lt;span style="font-weight: bold;"&gt;Outfitter&lt;/span&gt;")&lt;br /&gt;Case Else&lt;br /&gt;Do While Not rs.eof&lt;br /&gt;'if multiple records indicate how many using count&lt;br /&gt;   strInfo = strInfo &amp; vbNewLine &amp;amp; rs.Fields("&lt;span style="font-weight: bold;"&gt;Outfitter&lt;/span&gt;") &amp; " (" &amp;amp; i &amp; ")"&lt;br /&gt;i = i + 1&lt;br /&gt;rs.movenext&lt;br /&gt;Loop&lt;br /&gt;&lt;br /&gt;End Select&lt;br /&gt;'closing connections this is a must&lt;br /&gt;rs.Close&lt;br /&gt;Conn.Close&lt;br /&gt;Set rs = Nothing&lt;br /&gt;Set Conn = Nothing&lt;br /&gt;&lt;br /&gt;'returning string for labeling&lt;br /&gt;FindLabel = strInfo&lt;br /&gt;End Function&lt;/blockquote&gt;You'll need to replace the bold values with those appropriate for your situation.&lt;br /&gt;&lt;br /&gt;This example also uses SQL Server, different databases require different database connection strings:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;Oracle&lt;/span&gt;&lt;br /&gt;“PROVIDER=OraOLEDB.Oracle; Data Source=aDatabaseName; User ID=aUserName; Password=aPassword”&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;MySQL&lt;/span&gt;&lt;br /&gt;“driver={MySQL ODBC 3.51 Driver}; Server=aServerName; Database=aDatabaseName; uid=aUserName; PWD=aPassword”&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Microsoft Access&lt;/span&gt;&lt;br /&gt;“PROVIDER=Microsoft.Jet.OLEDB.4.0; Data Source=c:\myDatabase.mdb;”&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Microsoft SQL Server (using Windows NT Integrated security)&lt;/span&gt;&lt;br /&gt;“Provider=SQLOLEDB; Integrated Security=SSPI; Persist Security Info=False; Initial Catalog=aDatabaseName; DataSource=aServerName”&lt;/blockquote&gt;4.) Finally, test your label expression for typos using the &lt;span style="font-weight: bold;"&gt;Verify &lt;/span&gt;button and if successful, OK your way out.&lt;br /&gt;&lt;br /&gt;The final product:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_siWGhB-JGNY/RnHpOTRTIFI/AAAAAAAAAIk/QpEKOw8Dg7c/s1600-h/LabelOutput.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_siWGhB-JGNY/RnHpOTRTIFI/AAAAAAAAAIk/QpEKOw8Dg7c/s400/LabelOutput.png" alt="" id="BLOGGER_PHOTO_ID_5076094686923530322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.esri.com/news/arcuser/0705/files/externaldb.pdf"&gt;Link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-5871063726228145859?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/5871063726228145859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=5871063726228145859' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5871063726228145859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/5871063726228145859'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/arcgis-one-to-many-labeling.html' title='ArcGIS One-to-Many Labeling'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_siWGhB-JGNY/RnHn_TRTIEI/AAAAAAAAAIc/oVCUGVnWlog/s72-c/LabelDialog.png' height='72' width='72'/><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-6789282820074353552</id><published>2007-06-11T10:08:00.001-06:00</published><updated>2010-09-09T20:54:19.632-06:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ArcIMS'/><title type='text'>When ArcIMS Site Restoration Fails</title><content type='html'>Every once in a great while you'll open ArcIMS Administrator and be confronted with &lt;strong&gt;Site Restoration Pending, Would you like to restore?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;At least in my experience, it rarely restores.  You can click &lt;strong&gt;Yes&lt;/strong&gt; and wait all morning and nothing happens.  So what to do?&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Shutdown ArcIMS Services in this order: Tasker, Monitor, Application&lt;/li&gt;&lt;li&gt;Browse to &lt;span style="font-weight: bold;"&gt;C:\Program Files\ArcGIS\ArcIMS\AppServer&lt;/span&gt; and delete &lt;span style="font-weight: bold;"&gt;ArcIMSSite.sez&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Start ArcIMS Services in reverse order: Application, Monitor, Tasker&lt;/li&gt;&lt;li&gt;Open Administrator&lt;/li&gt;&lt;li&gt;Recreate your services from .axl files&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;TIP:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;To speed the recreation process it is helpful to name your .axl files the same as the service names in your applications.&lt;/li&gt;&lt;li&gt;I'd also recommend storing your ArcIMS site settings in an external configuration file (such as web.config in asp.net) to better facilitate recovery and configuration/server changes on the fly.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://support.esri.com/index.cfm?fa=knowledgebase.techarticles.articleShow&amp;d=26237"&gt;Link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-6789282820074353552?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/6789282820074353552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=6789282820074353552' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6789282820074353552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/6789282820074353552'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/when-arcims-site-restoration-fails.html' title='When ArcIMS Site Restoration Fails'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3314324161486095135.post-3672330711477574535</id><published>2007-06-10T23:32:00.000-06:00</published><updated>2007-06-15T15:15:04.608-06:00</updated><title type='text'>One Idea</title><content type='html'>At our bi-annual training recently our boss challenged us to come up with one good idea every day.&lt;br /&gt;&lt;br /&gt;Of course, this immediately became a joke around the office.  By 8:05AM I'd be yelling out, "I've had my idea!  I'm going home!"&lt;br /&gt;&lt;br /&gt;But it got me thinking.&lt;br /&gt;&lt;br /&gt;There is nothing about what I do that is static.  Every single day I am challenged to learn a slew of new information just to keep up with the pace of technology.  What if I documented those ideas?  What would it look like after a month?  A year?&lt;br /&gt;&lt;br /&gt;oneidía - every day I will post one idea.  &lt;br /&gt;&lt;br /&gt;Or maybe, more accurately, &lt;em&gt;What I Learned Today&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;Most of the content will be based off solutions I find on other's websites and will be cited appropriately, but it may prove an interesting read for those of you interested in GIS, programming, the web and databases.&lt;br /&gt;&lt;br /&gt;This is idea 1.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3314324161486095135-3672330711477574535?l=oneidia.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://oneidia.blogspot.com/feeds/3672330711477574535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3314324161486095135&amp;postID=3672330711477574535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3672330711477574535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3314324161486095135/posts/default/3672330711477574535'/><link rel='alternate' type='text/html' href='http://oneidia.blogspot.com/2007/06/one-idea.html' title='One Idea'/><author><name>Brent</name><uri>http://www.blogger.com/profile/11283075340733322700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://farm1.static.flickr.com/208/480738112_1db1426197_o.jpg'/></author><thr:total>0</thr:total></entry></feed>
