<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Excel Do, Dynamic Does : Stored Procedures</title><link>http://msmvps.com/blogs/xldynamic/archive/tags/Stored+Procedures/default.aspx</link><description>Tags: Stored Procedures</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>The XML Is On The Kid</title><link>http://msmvps.com/blogs/xldynamic/archive/2010/03/11/the-xml-is-on-the-kid.aspx</link><pubDate>Thu, 11 Mar 2010 23:08:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1761517</guid><dc:creator>Bob Phillips</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/xldynamic/rsscomments.aspx?PostID=1761517</wfw:commentRss><comments>http://msmvps.com/blogs/xldynamic/archive/2010/03/11/the-xml-is-on-the-kid.aspx#comments</comments><description>&lt;p&gt;



















&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;I recently
wrote about a database tool that I have built to facilitate adding stored
procedures to databases, &lt;span style="color:blue;"&gt;&lt;a href="http://msmvps.com/controlpanel/blogs/xldynamic/archive/2010/03/03/more-sp-autogen.aspx?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+msmvps%2FtUAg+%28Excel+Do%2C+Dynamic+Does%29"&gt;SP
Builder&lt;/a&gt;&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&lt;a href="http://xldennis.wordpress.com/"&gt;XL-Dennis&lt;/a&gt; made a couple of comments,
one of which was with regards to the medium used for the script file. He talked
about XML files, and whilst I had used an INI file when I originally built it I
had thought about using XML but dismissed it at the time as my XML skills and
knowledge were minimal to put it mildly (oddly, I have been aware of and using
XML for over 12 years now, mainly as a consumer of such, but I still feel it
promises far more than it delivers as a technology).&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;XL-Dennis&amp;rsquo;
comment gave me the prod I needed to actually do something about this, so I set
about converting my tool to using XML files.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;This is the structure of the XML I designed, using the same data as my previous posts.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;database type=&amp;quot;Access&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;path=&amp;quot;C:\MyDatabases\&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name=&amp;rdquo;MyDB.mdb&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;category name=&amp;quot;Get&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;procedure name=&amp;quot;spGetCompanyGoals&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;SELECT SUM(RD.SalesGoal) AS &amp;#39;Company Sales Goal&amp;#39;, &amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SUM(RD.BonusGoal) AS &amp;#39;Company Bonus Goal&amp;#39;&amp;nbsp;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;FROM refUsers AS RU&amp;nbsp;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;rdquo;WHERE LoginID = prmLoginId;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/procedure&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;hellip; more procedures &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/category&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;category name=&amp;quot;Delete&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;procedure name=&amp;quot;spDeleteSalesType&amp;quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;parameter name=&amp;quot;prmUpdatedBy&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type=&amp;quot;VarChar (50)&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;parameter name=&amp;quot;prmSalesTypeID&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type=&amp;quot;Integer&amp;quot;
/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;UPDATE&amp;nbsp;&amp;nbsp;refSalesTypes&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;SET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Deleted = TRUE,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedBy = prmUpdatedBy,&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UpdatedOn = Now&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SQL code=&amp;quot;WHERE&amp;nbsp;&amp;nbsp;&amp;nbsp;SalesTypeID = prmSalesTypeID;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/procedure&amp;gt;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;hellip; more procedures &lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;hellip; more categories &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/category&amp;gt;&lt;br /&gt;
&amp;lt;/database&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;There are some distinct advantages to the XML to my mind. These are:&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;it is more readable&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;there is less meta-information, such as the various counts, because the XML parser will provide all of that to the code&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;the XML parser provides a level of validatio&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;tools such as &lt;a href="http://www.altova.com/xml-editor/"&gt;Altova XMLSpy&lt;/a&gt; provide a much better IDE for creating and updating these files than a text editor, as well as validation&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;There are some disadvantages of course, but the only one that really irks me is having to use &lt;b&gt;&amp;amp;amp;&lt;/b&gt; for &lt;b&gt;&amp;amp;&lt;/b&gt; and so on. I understand why I have to, but it still rankles a tad.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;In the XML design, there were a couple of decisions to be made, around the elements and attributes. Before I embarked upon the design I read the chapter on XML in the second edition of the indispensable &lt;a href="http://www.amazon.co.uk/Professional-Excel-Development-Applications-Addison-Wesley/dp/0321508793/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1268226714&amp;amp;sr=8-1"&gt;Professional
Excel Development&lt;/a&gt;, and whilst it suggested encapsulating the data in elements rather than attributes I chose to use attributes as I felt it was more readable that way, attributes still need to be within a parent element which loses clarity. In my mind, this&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;parameter name=&amp;quot;prmSalesTypeID&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type=&amp;quot;Integer&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;is far simpler than this&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;parameter&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;name&amp;gt;prmSalesTypeID&amp;lt;/name&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;type&amp;gt;Integer&amp;lt;/type&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/parameter&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;Changing the addin was trivial once I had worked out the code for reading the XML file, updating the INI file to my XML format took far more time. The XML version ofthe addin can de downloaded &lt;a href="http://www.xldynamic.com/xld/Downloads/SP%20Builder%20XML.zip"&gt;here&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&amp;nbsp;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;SP Builder
is supplied as an Excel 2003 addin, or XLA file, and adds a menu option to the
Tools menu with three options, Build SPs, &lt;/span&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;SP Builder &lt;/span&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;List and About.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/5282.SP-Builder-Menu.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/5282.SP-Builder-Menu.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-align:center;" align="center"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="text-align:center;" align="center"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;As you many know, when Excel 2003 workbooks that create commandbars are opened in Excel 2007 or 2010 the menus are accessed via the &lt;b&gt;&lt;i&gt;Addins&lt;/i&gt;&lt;/b&gt; tab. This is not a satisfactory solution, so the addin tests the Excel version, and if it is 2003 or earlier it builds the commandbars, it is 2007 or 2010 it loads a &amp;lsquo;light&amp;rsquo; 2007/2010 addin that adds a group to the &lt;b&gt;&lt;i&gt;Developer&lt;/i&gt;&lt;/b&gt; tab. &lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&amp;nbsp;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/2158.SP-Builder-Ribbon.png"&gt;&lt;img src="http://msmvps.com/resized-image.ashx/__size/550x0/__key/CommunityServer.Blogs.Components.WeblogFiles/xldynamic/2158.SP-Builder-Ribbon.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;This way, we have a single addin that runs in any version of Excel.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;One thing that I found was that I could not insert comments in my file, the parser failed when I had comments. I used what I believe is the correct format for comments, that is&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:11pt;font-family:Arial;color:green;"&gt;&amp;lt;!&amp;mdash;&lt;br /&gt;
&amp;lsquo;-----------------------&lt;br /&gt;
&amp;#39; Check Stored Procedures&lt;br /&gt;
&amp;#39;-----------------------&lt;br /&gt;
--&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;but it only
worked when I completely stripped out the comments.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;I also
created an XSD file for the XML, which I used to play with reading it into
Excel, but I see no real use for Excel in this process other than hosting the
code, so that is going nowhere. Is there any other use I can use the XSD for?
This also points at the next step, take Excel out of the process completely and
create a standalone VB application; that would make a nice candidate for me to
develop some more .Net skills.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size:11pt;font-family:Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1761517" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/2007/default.aspx">2007</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Excel/default.aspx">Excel</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Autogen/default.aspx">Autogen</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/VBA/default.aspx">VBA</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Stored+Procedures/default.aspx">Stored Procedures</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/2010/default.aspx">2010</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/SPs/default.aspx">SPs</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/2003/default.aspx">2003</category></item><item><title>The Kid Grows Up</title><link>http://msmvps.com/blogs/xldynamic/archive/2010/03/03/more-sp-autogen.aspx</link><pubDate>Wed, 03 Mar 2010 12:41:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1760600</guid><dc:creator>Bob Phillips</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/xldynamic/rsscomments.aspx?PostID=1760600</wfw:commentRss><comments>http://msmvps.com/blogs/xldynamic/archive/2010/03/03/more-sp-autogen.aspx#comments</comments><description>&lt;p&gt;In a &lt;a href="http://msmvps.com/blogs/xldynamic/archive/2010/02/19/sumproduct-isn-t-the-only-sp-kid-in-town.aspx#1760291"&gt;previous post&lt;/a&gt;, I talked about building stored procedures (SPs)in an Access database, and calling the same from Excel using ADO.
&lt;/p&gt;
&lt;p&gt;As I mentioned in that post, I am not a fan of the Access GUI. Whilst GUIs can be okay for doing some simple testing, checking whether something works or, I find it far easier to build a script when I need  to do similar things over and over (such as building all of the SPs for an application). I am an inveterate scripter (see &lt;a href="http://msmvps.com/blogs/xldynamic/archive/2009/08/24/autogen-ed-ribbon-code.aspx"&gt;Autogen&amp;rsquo;ed Ribbon Code&lt;/a&gt; and &lt;a href="http://msmvps.com/blogs/xldynamic/archive/2009/08/18/xml-is-such-a-pain.aspx"&gt;XML Is Such A Pain&lt;/a&gt;); rather than build the stored procedures using the Access GUI, I much prefer to build a script file that can be rerun at any time. This is very much in line with my preferences to autogen as much as possible, and also with me development methodology, where I prefer to allocate design time before ploughing into the functional code.
&lt;/p&gt;
&lt;p&gt;In the post mentioned above, I said that &amp;hellip; &lt;i&gt;you can remove all of the inline SQL from your applications, create a separate SP creator app that creates the SPs, have better structured code, and more maintainable. This post will cover such a creator app&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;In this app, I have a script file that defines all of the SPs, and the application just reads that file and builds the SPs defined therein. I have used an INI  file as my SP definition file; I like the flexibility of INI files, the format does not have to be too rigid, and they are easily segmented, and easily read (via code).
&lt;/p&gt;
&lt;p&gt;The format of my file is as follows&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;1[spb_App]&lt;br /&gt;
&amp;nbsp;2&lt;br /&gt;
&amp;nbsp;3&amp;nbsp;&amp;nbsp;&amp;nbsp;[spb_DB]&lt;br /&gt;
&amp;nbsp;4&lt;br /&gt;
&amp;nbsp;5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DBType=Access ;could be SQL Server or any other DB&lt;br /&gt;
&amp;nbsp;6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DBPath=C:\MyDatabases\&lt;br /&gt;
&amp;nbsp;7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DBName=MyDB.mdb&lt;br /&gt;
&amp;nbsp;8&lt;br /&gt;
&amp;nbsp;9&amp;nbsp;&amp;nbsp;&amp;nbsp;[spb_Stored_Procs]&lt;br /&gt;
10&lt;br /&gt;
11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TypeCount=7&lt;br /&gt;
12&lt;br /&gt;
13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I001=Get&lt;br /&gt;
14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I002=Check&lt;br /&gt;
15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I003=Insert&lt;br /&gt;
16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I004=List&lt;br /&gt;
17&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I005=Query&lt;br /&gt;
18&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I006=Table&lt;br /&gt;
19&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I007=Update&lt;br /&gt;
20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;I008=Delete&lt;br /&gt;
21&lt;br /&gt;
22;-----------------------&lt;br /&gt;
23; Get Stored Procedures&lt;br /&gt;
24;-----------------------&lt;br /&gt;
25&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[spb_SP_Get]&lt;br /&gt;
26&lt;br /&gt;
27&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPCount=7&lt;br /&gt;
28&lt;br /&gt;
29;spGetCompanyGoals&lt;br /&gt;
30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[spb_SP_Get_001]&lt;br /&gt;
31&lt;br /&gt;
32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SPName=spGetCompanyGoals&lt;br /&gt;
33&lt;br /&gt;
34&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[spb_SP_Get_001_Parameters]&lt;br /&gt;
35&lt;br /&gt;
36&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ParameterCount=1&lt;br /&gt;
37&lt;br /&gt;
38&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[spb_SP_Get_003_Parameters_001]&lt;br /&gt;
39&lt;br /&gt;
40&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ParamName=prmLoginID&lt;br /&gt;
41&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ParamDataType=VarChar
(50)&lt;br /&gt;
42&lt;br /&gt;
43&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[spb_SP_Get_001_SQL]&lt;br /&gt;
44&lt;br /&gt;
45&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SQLLineCount=4&lt;br /&gt;
46 &lt;br /&gt;
47&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Line001=SELECT
SUM(SalesGoal) AS &amp;#39;Company Sales Goal&amp;#39;, &lt;br /&gt;
48&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Line002=&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SUM(BonusGoal) AS &amp;#39;Company Bonus Goal&amp;#39;&lt;br /&gt;
49&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Line003=FROM
refUsers &lt;br /&gt;
50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Line004=WHERE LoginID
= prmLoginId;&lt;br /&gt;
51etc.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Line 1 isn&amp;rsquo;t actually used, it is just for completeness.
&lt;/p&gt;
&lt;p&gt;Lines 3-7 define the database, the type and location. Note that the type is to allow for building SPs in different databases, although we will just discuss Access.
&lt;/p&gt;
&lt;p&gt;Lines 9-20 define the SP categories, I do this so as to break up the SPs and keep them grouped, for easier maintenance. The Type (Get, Check, etc.)  is used as part of the section id for the SP details, as in lines 20, 30, 34, and 38.
&lt;/p&gt;
&lt;p&gt;Line 27 defines how many SPs are in that group, used as a loop index in the code.
&lt;/p&gt;
&lt;p&gt;Line 32 is the SP name, used in the code to Drop the SP then Create it anew.
&lt;/p&gt;
&lt;p&gt;Lines 34-41 defines the parameters. As you can see, there is a &lt;i&gt;&lt;b&gt;ParameterCount &lt;/b&gt;&lt;/i&gt;specifying how many parameters the SP uses. A definition for each parameter, if applicable, follows, with an incrementing suffix index so that the app can extract each in turn.
&lt;/p&gt;
&lt;p&gt;Lines 43-50 define the SP code, with a &lt;i&gt;&lt;b&gt;SQLLineCount &lt;/b&gt;&lt;/i&gt;defining how many lines of SQL are within the SP. In the example above, the SP is very simple, but of course SPs of any complexity can be built.
&lt;/p&gt;
&lt;p&gt;Lines 29-50 are repeated for each SP within that category.
&lt;/p&gt;
&lt;p&gt;Lines 22-50 are repeated for each category of SPs.
&lt;/p&gt;
&lt;p&gt;The category names are not relevant, it can be any name and any number, as long as the sections match up.

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Care has to be taken that the definitions are consistent, the category id is correct, the SP index is carried through, the parameter name in the parameter definition is the same as the parameter in the SQL code., and so on.

&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The &lt;b&gt;SP Builder&lt;/b&gt; addin can be downloaded from &lt;a href="http://www.xldynamic.com/downloads/SP%20Builder.zip"&gt;here&lt;/a&gt;. It is unprotected, so the code can be examined, updated as you see fit.
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
I use this technique for all of my databases, so I have a script file for each, and can easily recreate the database code. As I mentioned, by creating a script file it helps in better design, thinking about the code required rather than diving into the GUI and building as required.
This technique could be extended to creating the database, building the tables etc. I have a separate app for this, but have not combined them as I find myself creating the SPs far more often than the database, I find it more convenient to keep as separate applications.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1760600" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Excel/default.aspx">Excel</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Autogen/default.aspx">Autogen</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/VBA/default.aspx">VBA</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Excel+2007/default.aspx">Excel 2007</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/Stored+Procedures/default.aspx">Stored Procedures</category><category domain="http://msmvps.com/blogs/xldynamic/archive/tags/SPs/default.aspx">SPs</category></item></channel></rss>