<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://customerfx.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>Jason Buss&amp;#39; Blog : SQL</title><link>http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx</link><description>Tags: SQL</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Updating text within Textblob fields in SalesLogix</title><link>http://customerfx.com/pages/customization/2012/04/19/updating-text-within-textblob-fields-in-saleslogix.aspx</link><pubDate>Thu, 19 Apr 2012 15:16:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45600</guid><dc:creator>Jason Buss</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=45600</wfw:commentRss><comments>http://customerfx.com/pages/customization/2012/04/19/updating-text-within-textblob-fields-in-saleslogix.aspx#comments</comments><description>&lt;p&gt;I had a request to post on how you could replace characters within a Blob field in the SalesLogix database.  Blob fields are database fields that hold any sort of binary information (such as text, images, audio, etc..), but SalesLogix uses them primarily for holding large amounts of text, since you don&amp;#39;t have to define a field length.  The Longnotes field in the History table is a good example.
&lt;/p&gt;

&lt;p&gt;Updating these types of fields is simple.  You can perform a SQL update statement like you would on any other type of field in the database.  The only caveat is that you need to perform a cast on the blob field so that it is evaluated as a VarChar, otherwise you will get an error regarding the Blob datatype.
&lt;/p&gt;

&lt;p&gt;The update will only be performed for the length you specify in your cast, therefore you&amp;#39;ll need to cast it large enough to encompass the largest amount of data you may have in that field.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;If you wanted to replace any instance of the &amp;quot;pipe&amp;quot; symbol ( | ) with the &amp;quot;at&amp;quot; symbol ( @ ) for example, you could perform the following update:
&lt;/p&gt;

&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt; &lt;span style="color:Blue;"&gt;update&lt;/span&gt; HISTORY &lt;span style="color:Blue;"&gt;set&lt;/span&gt; LONGNOTES = REPLACE(&lt;span style="color:Blue;"&gt;cast&lt;/span&gt;(LONGNOTES &lt;span style="color:Blue;"&gt;as&lt;/span&gt; &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(5000)), &lt;span style="color:Navy;"&gt;&amp;#39;|&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;@&amp;#39;&lt;/span&gt;)&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  
  
&lt;p&gt;Note that I am casting the Longnotes field to a VarChar with a length of 5000.&amp;nbsp; In most cases, that should be plenty of space to include all text, but your situation may require a larger cast.&lt;/p&gt;
&lt;p&gt;This statement can be ran directly in the SQL Server Management Studio or Query Analyzer, or if you have a LAN system and need to consider synchronization, you can run this in the Execute SQL functionality under the &lt;i&gt;Tools&lt;/i&gt; menu in the SalesLogix Workgroup Administrator.&amp;nbsp; Since the data is being updated directly in the SQL database, this will work for both LAN and Web implementations.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Keep in mind that the History.Notes field contains the first 255 characters of the History.Longnotes field for display purposes, so you would want to perform the same update on both fields. &lt;/p&gt;
&lt;p&gt;Thanks for reading! &lt;br /&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45600" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Simple Insert Trigger Example</title><link>http://customerfx.com/pages/customization/2011/03/01/simple-insert-trigger-example.aspx</link><pubDate>Tue, 01 Mar 2011 19:01:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44598</guid><dc:creator>Jason Buss</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=44598</wfw:commentRss><comments>http://customerfx.com/pages/customization/2011/03/01/simple-insert-trigger-example.aspx#comments</comments><description>&lt;p&gt;I previously posted about using an &lt;a href="http://customerfx.com/pages/customization/2010/02/05/using-sql-triggers-to-enforce-data-rules-in-saleslogix.aspx" title="UpdateTriggers" target="_blank"&gt;update trigger&lt;/a&gt; to enforce data rules in SalesLogix.&amp;nbsp; Since I was working on another trigger now, I also wanted to post a simple example of an Insert Trigger.&lt;/p&gt;

&lt;p&gt;Basically, I have a table called TriggerTest containing a State and also three of Manager fields.&amp;nbsp; When inserting a record for a particular state, I needed to also populate the Manager fields with the current managers defined for each state.&amp;nbsp;&amp;nbsp; I&amp;#39;m using a table called CRMManagers to store a list of each state and the three manager values for that state: (State, Manager1, Manager2, Manager3)&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s how I created the trigger: &lt;br /&gt;&lt;/p&gt;
&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt; &lt;span style="color:Green;"&gt;--First, I create the trigger, naming it trUpdateManagers against the &lt;br /&gt;--TriggerTest Table.&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Create&lt;/span&gt; &lt;span style="color:Blue;"&gt;Trigger&lt;/span&gt; dbo.trUpdateManagers &lt;span style="color:Blue;"&gt;on&lt;/span&gt; dbo.TriggerTest&lt;br /&gt;&lt;span style="color:Green;"&gt;--The trigger is created for Insert, which will fire whenever a row is &lt;br /&gt;--inserted to the TriggerTest table.&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;for&lt;/span&gt; &lt;span style="color:Blue;"&gt;Insert&lt;/span&gt; &lt;br /&gt;&lt;span style="color:Blue;"&gt;as&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Now I Declare an ID and State variable and populate them with the new&lt;br /&gt;--values inserted into the TriggerTest table.&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @ID &lt;span style="color:Blue;"&gt;nchar&lt;/span&gt;(10)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @STATE &lt;span style="color:Blue;"&gt;nvarchar&lt;/span&gt;(50)&lt;br /&gt;&lt;span style="color:Green;"&gt;--When setting the ID and State variables, I&amp;#39;m referencing &amp;quot;Inserted&amp;quot; &lt;br /&gt;--which is an internal SQL table which basically contains a copy of &lt;br /&gt;--the currently inserted row.&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;select&lt;/span&gt; @ID = [ID], @STATE = STATE &lt;span style="color:Blue;"&gt;from&lt;/span&gt; inserted&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Next I Declare variables for each of the Manager Values&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @MGR1 &lt;span style="color:Blue;"&gt;nvarchar&lt;/span&gt;(50)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @MGR2 &lt;span style="color:Blue;"&gt;nvarchar&lt;/span&gt;(50)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @MGR3 &lt;span style="color:Blue;"&gt;nvarchar&lt;/span&gt;(50)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--And now set the Manager variables with the appropreate values &lt;br /&gt;--based on the State inserted to TriggerTest&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;Select&lt;/span&gt; &lt;br /&gt;    @MGR1 = [Manager1]&lt;br /&gt;,    @MGR2 = [Manager2]&lt;br /&gt;,    @MGR3 = [Manager3]&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;from&lt;/span&gt; dbo.CRMManagers &lt;span style="color:Blue;"&gt;where&lt;/span&gt; STATE = @STATE&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Finally, I run an update statement to udpate the newly inserted&lt;br /&gt;--TriggerTest record with the Manager values.&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;update&lt;/span&gt; dbo.TriggerTest &lt;span style="color:Blue;"&gt;set&lt;/span&gt; Manager1 = @MGR1, &lt;br /&gt;Manager2 = @MGR2, Manager3 = @MGR3 &lt;span style="color:Blue;"&gt;where&lt;/span&gt; ID = @ID&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  
  
&lt;p&gt;&amp;nbsp;That&amp;#39;s about it.&amp;nbsp; Pretty simple!&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44598" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL+Functions/default.aspx">SQL Functions</category><category domain="http://customerfx.com/pages/customization/archive/tags/Trigger/default.aspx">Trigger</category></item><item><title>Running Sql Server Integration services package from a C Sharp application</title><link>http://customerfx.com/pages/customization/2011/01/19/running-sql-server-integration-services-package-from-a-c-application.aspx</link><pubDate>Wed, 19 Jan 2011 16:04:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44480</guid><dc:creator>Jason Buss</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=44480</wfw:commentRss><comments>http://customerfx.com/pages/customization/2011/01/19/running-sql-server-integration-services-package-from-a-c-application.aspx#comments</comments><description>&lt;p&gt;If you&amp;#39;ve ever created a SSIS package and wanted to provide a way for end users to run that package without having to run the Business Intelligence Development studio, you can compile the package into a dtsx file for them to run.&amp;nbsp; This would require them to manually alter connections and variables, which can get complicated for an average end user. Alternatively, it is pretty simple to put together an application which can be used to run the package.&amp;nbsp; This would allow you to handle modifications to package variables in a much more user-friendly manner.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I have a relatively simple SSIS package which queries data from a view based on a date range, and exports the returned data to a CSV file. &lt;/p&gt;&lt;p&gt;First of all, you will need to add a reference to the Microsoft.SQLServer.ManagedDTS.dll as well as a reference to the Microsoft.SqlServer.DTS.Runtime namespace.&amp;nbsp; Once that is done, you can reference the namespace to create objects referencing the package, and any other items you need to reference such as connections and variables.&lt;br /&gt;&lt;/p&gt;This is a simple method I created in Visual Studio 2010 which calls the provided compiled DTS package and updates the connections and variables. (see the attached ZIP file to see the full application)&lt;br /&gt;&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt; &lt;br /&gt;&lt;span style="color:Blue;"&gt;using&lt;/span&gt; Microsoft.SqlServer.Dts.Runtime;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;namespace&lt;/span&gt; CFX_ExportPortalEmailLeads&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:Blue;"&gt;public&lt;/span&gt; partial &lt;span style="color:Blue;"&gt;class&lt;/span&gt; frmExportData : Form&lt;br /&gt;    {&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;private&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; cmdRun_Click(object sender, EventArgs e)&lt;br /&gt;        {&lt;br /&gt;            Execute_Package(String.Format(&lt;span&gt;&amp;quot;{0:yyyy-MM-dd}&amp;quot;&lt;/span&gt;, dtpStartDate.Value), String.Format(&lt;span&gt;&amp;quot;{0:yyyy-MM-dd}&amp;quot;&lt;/span&gt;, dtpEndDate.Value));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;private&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; Execute_Package(&lt;span style="color:Blue;"&gt;string&lt;/span&gt; StartDate, &lt;span style="color:Blue;"&gt;string&lt;/span&gt; EndDate)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color:Blue;"&gt;string&lt;/span&gt; pkgLocation &lt;span style="color:Navy;"&gt;=&lt;/span&gt; txtUsePackage.Text;&lt;br /&gt;&lt;br /&gt;            Package pkg;&lt;br /&gt;            Microsoft.SqlServer.Dts.Runtime.Application app;&lt;br /&gt;            DTSExecResult pkgResults;&lt;br /&gt;            Variables vars;&lt;br /&gt;            Connections conns;&lt;br /&gt;            &lt;br /&gt;            app &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Microsoft.SqlServer.Dts.Runtime.Application();&lt;br /&gt;            pkg &lt;span style="color:Navy;"&gt;=&lt;/span&gt; app.LoadPackage(pkgLocation, &lt;span style="color:Blue;"&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:Green;"&gt;//Set Connection Settings&lt;br /&gt;&lt;/span&gt;            conns &lt;span style="color:Navy;"&gt;=&lt;/span&gt; pkg.Connections;&lt;br /&gt;            conns[&lt;span&gt;&amp;quot;DestinationConnectionFlatFile&amp;quot;&lt;/span&gt;].ConnectionString &lt;span style="color:Navy;"&gt;=&lt;/span&gt; txtOutputFolder.Text &lt;span style="color:Navy;"&gt;+&lt;/span&gt; &lt;span&gt;&amp;quot;\\ExportFile.csv&amp;quot;&lt;/span&gt;;&lt;br /&gt;            conns[&lt;span&gt;&amp;quot;SourceConnectionOLEDB&amp;quot;&lt;/span&gt;].ConnectionString &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;Data Source=DataServer;User ID=sa;Password=1234567;Initial Catalog=DTSDatabase;Provider=SQLOLEDB;Auto Translate=false;&amp;quot;&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color:Green;"&gt;//Set SSIS Variables&lt;br /&gt;&lt;/span&gt;            &lt;span style="color:Green;"&gt;//**Note** - Variables MUST be package level variables in the SSIS package, otherwise an error will result when trying to set the variable  &lt;br /&gt;&lt;/span&gt;            vars &lt;span style="color:Navy;"&gt;=&lt;/span&gt; pkg.Variables;&lt;br /&gt;            vars[&lt;span&gt;&amp;quot;StartDate&amp;quot;&lt;/span&gt;].Value &lt;span style="color:Navy;"&gt;=&lt;/span&gt; StartDate;&lt;br /&gt;            vars[&lt;span&gt;&amp;quot;EndDate&amp;quot;&lt;/span&gt;].Value &lt;span style="color:Navy;"&gt;=&lt;/span&gt; EndDate;&lt;br /&gt;            &lt;br /&gt;            pkgResults &lt;span style="color:Navy;"&gt;=&lt;/span&gt; pkg.Execute(&lt;span style="color:Blue;"&gt;null&lt;/span&gt;, vars, &lt;span style="color:Blue;"&gt;null&lt;/span&gt;, &lt;span style="color:Blue;"&gt;null&lt;/span&gt;, &lt;span style="color:Blue;"&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (pkgResults == DTSExecResult.Success)&lt;br /&gt;                MessageBox.Show(&lt;span&gt;&amp;quot;Package Ran Successfully&amp;quot;&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt;&lt;br /&gt;                MessageBox.Show(&lt;span&gt;&amp;quot;Package Failed&amp;quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;             &lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  
&lt;p&gt;As you can see, this method is pretty simple, but provides a much simpler user interface than the compiled SSIS package.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks for reading!&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44480" width="1" height="1"&gt;</description><enclosure url="http://customerfx.com/pages/customization/attachment/44480.ashx" length="49184" type="application/x-zip-compressed" /><category domain="http://customerfx.com/pages/customization/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category><category domain="http://customerfx.com/pages/customization/archive/tags/SSIS/default.aspx">SSIS</category></item><item><title>Advanced Pivoting in MSSQL</title><link>http://customerfx.com/pages/customization/2011/01/06/advanced-pivoting-in-mssql.aspx</link><pubDate>Thu, 06 Jan 2011 15:13:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44439</guid><dc:creator>Jason Buss</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=44439</wfw:commentRss><comments>http://customerfx.com/pages/customization/2011/01/06/advanced-pivoting-in-mssql.aspx#comments</comments><description>&lt;p&gt;Using pivot queries in SQL is a great tool for rotating data, but what if you need to do something more complicated with multiple data sources and multiple columns?&amp;nbsp; Recently, I had a request to pivot some data from multiple similar tables and to rotate that data into a columnar format.&lt;/p&gt;

&lt;p&gt;I hadn&amp;#39;t played much with pivot queries in MSSQL, so initially I thought I could accomplish it simply using that type of query.&amp;nbsp; However, with the number of columns to include in the pivot, and the potential for an unknown number of columns, I found that I had to create a couple of stored procedures to process the data.&amp;nbsp; Here&amp;#39;s a simplified version of what I did:&lt;/p&gt;

&lt;p&gt;I started out with three different tables&amp;nbsp; Test1, Test2 and Test3.&amp;nbsp; Each table contains the same number of fields:&lt;/p&gt;

&lt;p&gt;PrimaryKey&lt;br /&gt;ForeignKey&lt;br /&gt;Description&lt;br /&gt;Amount&lt;br /&gt;&lt;br /&gt;The goal was to rotate and combine the values so that we would end up with a dataset containing a column for each Description and Amount row in each table.&amp;nbsp; This becomes complicated because you have no way of knowing just how many columns you would eventually end up with.&lt;/p&gt;

&lt;p&gt;As a first step, I created a view to join the data from all three tables:&lt;/p&gt;

&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt; &lt;span style="color:Blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:Blue;"&gt;VIEW&lt;/span&gt; [dbo].[vUnionTestTables]&lt;br /&gt;&lt;span style="color:Blue;"&gt;AS&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt;     PrimaryKey, ForeignKey, &lt;span style="color:Navy;"&gt;&amp;#39;Test1&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; FromTable, description, amount&lt;br /&gt;&lt;span style="color:Blue;"&gt;FROM&lt;/span&gt;         dbo.Test1&lt;br /&gt;&lt;span style="color:Blue;"&gt;UNION&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt;     PrimaryKey, ForeignKey, &lt;span style="color:Navy;"&gt;&amp;#39;Test2&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; FromTable, description, amount&lt;br /&gt;&lt;span style="color:Blue;"&gt;FROM&lt;/span&gt;         dbo.Test2&lt;br /&gt;&lt;span style="color:Blue;"&gt;UNION&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt;     PrimaryKey, ForeignKey, &lt;span style="color:Navy;"&gt;&amp;#39;Test3&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; FromTable, description, amount&lt;br /&gt;&lt;span style="color:Blue;"&gt;FROM&lt;/span&gt;         dbo.Test3&lt;br /&gt;&lt;span style="color:Blue;"&gt;GO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
  


&lt;p&gt;After the view is created, I created a stored Procedure that does that uses temporary tables to process the current data and stuff the data into additional tables created by the procedure:&lt;br /&gt;&lt;/p&gt;
 
&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt; &lt;span style="color:Blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:Blue;"&gt;procedure&lt;/span&gt; [dbo].[sp_TablesSnapshot] @DataPart &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30) &lt;span style="color:Blue;"&gt;as&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;DECLARE&lt;/span&gt; @FromShort &lt;span style="color:Blue;"&gt;char&lt;/span&gt;(3)&lt;br /&gt;&lt;span style="color:Blue;"&gt;If&lt;/span&gt; @DataPart = &lt;span style="color:Navy;"&gt;&amp;#39;Test1&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @FromShort = &lt;span style="color:Navy;"&gt;&amp;#39;T1&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;If&lt;/span&gt; @DataPart = &lt;span style="color:Navy;"&gt;&amp;#39;Test2&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @FromShort = &lt;span style="color:Navy;"&gt;&amp;#39;T2&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;If&lt;/span&gt; @DataPart = &lt;span style="color:Navy;"&gt;&amp;#39;Test3&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @FromShort = &lt;span style="color:Navy;"&gt;&amp;#39;T3&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;declare&lt;/span&gt; @PivotTableX &lt;span style="color:Blue;"&gt;TABLE&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;    ID &lt;span style="color:Blue;"&gt;Int&lt;/span&gt;,&lt;br /&gt;    RECORDID &lt;span style="color:Blue;"&gt;VARCHAR&lt;/span&gt;(30),&lt;br /&gt;    FROMTABLE &lt;span style="color:Blue;"&gt;VARCHAR&lt;/span&gt;(50),&lt;br /&gt;    DESCRIPTION &lt;span style="color:Blue;"&gt;NCHAR&lt;/span&gt;(100),&lt;br /&gt;    AMOUNT &lt;span style="color:Blue;"&gt;NVARCHAR&lt;/span&gt;(4000),&lt;br /&gt;    Processed &lt;span style="color:Blue;"&gt;NCHAR&lt;/span&gt;(1)&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;declare&lt;/span&gt; @&lt;span style="color:Blue;"&gt;RowCount&lt;/span&gt; &lt;span style="color:Blue;"&gt;Int&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @&lt;span style="color:Blue;"&gt;RowCount&lt;/span&gt; = (&lt;span style="color:Blue;"&gt;Select&lt;/span&gt; &lt;span style="color:Blue;"&gt;Count&lt;/span&gt;(ForeignKey) &lt;span style="color:Blue;"&gt;from&lt;/span&gt; dbo.vUnionTestTables)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @I &lt;span style="color:Blue;"&gt;INT&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @I = 1&lt;br /&gt;&lt;span style="color:Blue;"&gt;WHILE&lt;/span&gt; (@I &amp;lt;= @&lt;span style="color:Blue;"&gt;RowCount&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;BEGIN&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;DECLARE&lt;/span&gt; @PrimaryKey &lt;span style="color:Blue;"&gt;INT&lt;/span&gt;, @ForeignKey &lt;span style="color:Blue;"&gt;INT&lt;/span&gt;, @FromTable &lt;span style="color:Blue;"&gt;VARCHAR&lt;/span&gt;(3), @Description &lt;span style="color:Blue;"&gt;VARCHAR&lt;/span&gt;(100), @Amount &lt;span style="color:Blue;"&gt;NVARCHAR&lt;/span&gt;(4000)&lt;br /&gt;    &lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt;    @PrimaryKey = PrimaryKey&lt;br /&gt;            , @ForeignKey = ForeignKey&lt;br /&gt;            , @FromTable =&lt;br /&gt;                &lt;span style="color:Blue;"&gt;Case&lt;/span&gt; FromTable&lt;br /&gt;                &lt;span style="color:Blue;"&gt;WHEN&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Test1&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;Then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;T1&amp;#39;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:Blue;"&gt;WHEN&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Test2&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;Then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;T2&amp;#39;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:Blue;"&gt;WHEN&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Test3&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;Then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;T3&amp;#39;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color:Blue;"&gt;END&lt;/span&gt;&lt;br /&gt;            , @Description = description&lt;br /&gt;            , @Amount = Amount&lt;br /&gt;            &lt;br /&gt;    &lt;span style="color:Blue;"&gt;FROM&lt;/span&gt; (&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt; *, ROW_NUMBER() &lt;span style="color:Blue;"&gt;OVER&lt;/span&gt;(&lt;span style="color:Blue;"&gt;ORDER&lt;/span&gt; &lt;span style="color:Blue;"&gt;BY&lt;/span&gt; ForeignKey) &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; [RowNo] &lt;span style="color:Blue;"&gt;FROM&lt;/span&gt; dbo.vUnionTestTables) t1&lt;br /&gt;    &lt;span style="color:Blue;"&gt;WHERE&lt;/span&gt; t1.RowNo = @I&lt;br /&gt;    &lt;span style="color:Blue;"&gt;And&lt;/span&gt;&lt;br /&gt;    FromTable = @DataPart&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Insert&lt;/span&gt; &lt;span style="color:Blue;"&gt;into&lt;/span&gt; @PivotTableX (ID, RECORDID, FROMTABLE, DESCRIPTION, AMOUNT, Processed)&lt;br /&gt;    &lt;span style="color:Blue;"&gt;values&lt;/span&gt; (@PrimaryKey, @ForeignKey, @FromTable, @Description, @Amount, &lt;span style="color:Navy;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;)&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @I = @I + 1&lt;br /&gt;&lt;span style="color:Blue;"&gt;END&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;declare&lt;/span&gt; @PivotTable &lt;span style="color:Blue;"&gt;TABLE&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;    ID &lt;span style="color:Blue;"&gt;Int&lt;/span&gt;,&lt;br /&gt;    RECORDID &lt;span style="color:Blue;"&gt;VARCHAR&lt;/span&gt;(30),&lt;br /&gt;    FROMTABLE &lt;span style="color:Blue;"&gt;VARCHAR&lt;/span&gt;(50),&lt;br /&gt;    DESCRIPTION &lt;span style="color:Blue;"&gt;NCHAR&lt;/span&gt;(100),&lt;br /&gt;    AMOUNT &lt;span style="color:Blue;"&gt;NVARCHAR&lt;/span&gt;(4000),&lt;br /&gt;    Processed &lt;span style="color:Blue;"&gt;NCHAR&lt;/span&gt;(1)&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;insert&lt;/span&gt; &lt;span style="color:Blue;"&gt;into&lt;/span&gt; @PivotTable (ID,RECORDID,FROMTABLE,DESCRIPTION,AMOUNT,PROCESSED) &lt;span style="color:Blue;"&gt;select&lt;/span&gt; &lt;span style="color:Blue;"&gt;distinct&lt;/span&gt; * &lt;span style="color:Blue;"&gt;from&lt;/span&gt; @PivotTableX &lt;span style="color:Blue;"&gt;where&lt;/span&gt; ID &lt;span style="color:Blue;"&gt;is&lt;/span&gt; &lt;span style="color:Blue;"&gt;not&lt;/span&gt; &lt;span style="color:Blue;"&gt;null&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @MaxCount &lt;span style="color:Blue;"&gt;int&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;declare&lt;/span&gt; @CountTable &lt;span style="color:Blue;"&gt;table&lt;/span&gt;&lt;br /&gt;(&lt;br /&gt;    RecordID &lt;span style="color:Blue;"&gt;int&lt;/span&gt;,&lt;br /&gt;    FromTable &lt;span style="color:Blue;"&gt;nchar&lt;/span&gt;(3),&lt;br /&gt;    idCount &lt;span style="color:Blue;"&gt;int&lt;/span&gt;&lt;br /&gt;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;insert&lt;/span&gt; &lt;span style="color:Blue;"&gt;into&lt;/span&gt; @CountTable&lt;br /&gt;(RecordID,FromTable,idCount)&lt;br /&gt;&lt;span style="color:Blue;"&gt;select&lt;/span&gt; RECORDID, FromTable, &lt;span style="color:Blue;"&gt;COUNT&lt;/span&gt;(ID) &lt;span style="color:Blue;"&gt;from&lt;/span&gt; @PivotTable&lt;br /&gt;&lt;span style="color:Blue;"&gt;GROUP&lt;/span&gt; &lt;span style="color:Blue;"&gt;by&lt;/span&gt; RECORDID, FromTable &lt;span style="color:Blue;"&gt;order&lt;/span&gt; &lt;span style="color:Blue;"&gt;by&lt;/span&gt; RECORDID&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @MaxCount = (&lt;span style="color:Blue;"&gt;select&lt;/span&gt; &lt;span style="color:Blue;"&gt;MAX&lt;/span&gt;(idcount) &lt;span style="color:Blue;"&gt;from&lt;/span&gt; @CountTable &lt;span style="color:Blue;"&gt;where&lt;/span&gt; FromTable = @FromShort &lt;span style="color:Blue;"&gt;and&lt;/span&gt; RecordID &lt;span style="color:Blue;"&gt;is&lt;/span&gt; &lt;span style="color:Blue;"&gt;not&lt;/span&gt; &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @ColumnsErString &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(5000)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @ColumnsMeString &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(5000)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @ColumnsQmrString &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(5000)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @BuildColumnsString &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(5000)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @BuildColumnsString = &lt;span style="color:Navy;"&gt;&amp;#39;CREATE table &amp;#39;&lt;/span&gt; + rtrim(@FromShort) + &lt;span style="color:Navy;"&gt;&amp;#39;Temp (&amp;#39;&lt;/span&gt; + ltrim(rtrim(@FromShort)) + &lt;span style="color:Navy;"&gt;&amp;#39;_ForeignKey varchar(30), &amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @I = 1&lt;br /&gt;&lt;span style="color:Blue;"&gt;WHILE&lt;/span&gt; (@I &amp;lt;= @MaxCount)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Begin&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;If&lt;/span&gt; @I &amp;lt;&amp;gt; 1 &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @BuildColumnsString = @BuildColumnsString + &lt;span style="color:Navy;"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @BuildColumnsString = @BuildColumnsString + rtrim(@FromShort) + &lt;span style="color:Navy;"&gt;&amp;#39;Desc&amp;#39;&lt;/span&gt; + ltrim(str(@I)) + &lt;span style="color:Navy;"&gt;&amp;#39; nchar(100), &amp;#39;&lt;/span&gt; + rtrim(@FromShort) + &lt;span style="color:Navy;"&gt;&amp;#39;Amt&amp;#39;&lt;/span&gt; + ltrim(str(@I)) + &lt;span style="color:Navy;"&gt;&amp;#39; nvarchar(4000)&amp;#39;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @I = @I + 1&lt;br /&gt;&lt;span style="color:Blue;"&gt;End&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @BuildColumnsString = @BuildColumnsString + &lt;span style="color:Navy;"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Exec&lt;/span&gt;(@BuildColumnsString)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @TableIDStep &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30), @RecIDStep &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30), @RecID &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @CurrentFrom &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(3), @CurrentDesc &lt;span style="color:Blue;"&gt;nchar&lt;/span&gt;(100), @CurrentAmt &lt;span style="color:Blue;"&gt;nvarchar&lt;/span&gt;(4000)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @InsertStr &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(5000), @InsertStep &lt;span style="color:Blue;"&gt;int&lt;/span&gt;, @CurrentStep &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Select&lt;/span&gt; @RecIDStep = &lt;span style="color:Blue;"&gt;min&lt;/span&gt;(ID) &lt;span style="color:Blue;"&gt;from&lt;/span&gt; @PivotTable &lt;span style="color:Blue;"&gt;where&lt;/span&gt; FROMTABLE = @FromShort&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @TableIDStep = 1&lt;br /&gt;&lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @InsertStep = 1&lt;br /&gt;&lt;span style="color:Blue;"&gt;while&lt;/span&gt; @TableIDStep &amp;lt;= @MaxCount&lt;br /&gt;&lt;span style="color:Blue;"&gt;begin&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;while&lt;/span&gt; @RecIDStep &lt;span style="color:Blue;"&gt;is&lt;/span&gt; &lt;span style="color:Blue;"&gt;not&lt;/span&gt; &lt;span style="color:Blue;"&gt;null&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Begin&lt;/span&gt;    &lt;br /&gt;        &lt;span style="color:Blue;"&gt;select&lt;/span&gt;&lt;br /&gt;            @RecID = RECORDID,&lt;br /&gt;            @CurrentFrom = Fromtable,&lt;br /&gt;            @CurrentDesc = replace(DESCRIPTION,&lt;span style="color:Blue;"&gt;char&lt;/span&gt;(39),&lt;span style="color:Blue;"&gt;char&lt;/span&gt;(39)+&lt;span style="color:Blue;"&gt;char&lt;/span&gt;(39)),&lt;br /&gt;            @CurrentAmt = AMOUNT&lt;br /&gt;        &lt;span style="color:Blue;"&gt;from&lt;/span&gt; @PivotTable &lt;span style="color:Blue;"&gt;where&lt;/span&gt; FromTable = @FromShort &lt;span style="color:Blue;"&gt;and&lt;/span&gt; ID = @RecIDStep&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color:Blue;"&gt;If&lt;/span&gt; @CurrentStep &amp;lt;&amp;gt; @RecID &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @InsertStep = 1&lt;br /&gt;        &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @CurrentStep = @RecID&lt;br /&gt;        &lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @CheckInsertStr &lt;span style="color:Blue;"&gt;nvarchar&lt;/span&gt;(100)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @CheckInsertParam &lt;span style="color:Blue;"&gt;nvarchar&lt;/span&gt;(100)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;Declare&lt;/span&gt; @ReturnCount &lt;span style="color:Blue;"&gt;int&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;select&lt;/span&gt; @CheckInsertStr = &lt;span style="color:Navy;"&gt;&amp;#39;select @ReturnCount = count (*) from &amp;#39;&lt;/span&gt; + ltrim(rtrim(@FromShort)) + &lt;span style="color:Navy;"&gt;&amp;#39;Temp where &amp;#39;&lt;/span&gt; + ltrim(rtrim(@FromShort)) + &lt;span style="color:Navy;"&gt;&amp;#39;_ForeignKey = &amp;#39;&lt;/span&gt; + @RecID&lt;br /&gt;        &lt;span style="color:Blue;"&gt;select&lt;/span&gt; @CheckInsertParam = &lt;span style="color:Navy;"&gt;&amp;#39;@ReturnCount int OUTPUT&amp;#39;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;exec&lt;/span&gt; sp_ExecuteSql @CheckInsertStr, @CheckInsertParam, @ReturnCount &lt;span style="color:Blue;"&gt;output&lt;/span&gt;&lt;br /&gt;            &lt;br /&gt;        &lt;span style="color:Blue;"&gt;If&lt;/span&gt; @ReturnCount = 0                         &lt;br /&gt;            &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @InsertStr = &lt;span style="color:Navy;"&gt;&amp;#39;insert into &amp;#39;&lt;/span&gt; + @CurrentFrom + &lt;span style="color:Navy;"&gt;&amp;#39;Temp (&amp;#39;&lt;/span&gt; + ltrim(rtrim(@FromShort)) + &lt;span style="color:Navy;"&gt;&amp;#39;_ForeignKey,&amp;#39;&lt;/span&gt; + @CurrentFrom + &lt;span style="color:Navy;"&gt;&amp;#39;Desc&amp;#39;&lt;/span&gt; + ltrim(STR(@InsertStep)) + &lt;span style="color:Navy;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; + @CurrentFrom + &lt;span style="color:Navy;"&gt;&amp;#39;Amt&amp;#39;&lt;/span&gt; + ltrim(STR(@InsertStep)) + &lt;span style="color:Navy;"&gt;&amp;#39;) values (&amp;#39;&lt;/span&gt; + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + @RecID + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + &lt;span style="color:Navy;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + ltrim(rtrim(@CurrentDesc)) + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + &lt;span style="color:Navy;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; + &lt;span style="color:Blue;"&gt;char&lt;/span&gt;(39) + ltrim(rtrim(isnull(@CurrentAmt, 0.00))) + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + &lt;span style="color:Navy;"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;Else&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @InsertStr = &lt;span style="color:Navy;"&gt;&amp;#39;update &amp;#39;&lt;/span&gt; + @CurrentFrom + &lt;span style="color:Navy;"&gt;&amp;#39;Temp set &amp;#39;&lt;/span&gt; + @CurrentFrom + &lt;span style="color:Navy;"&gt;&amp;#39;Desc&amp;#39;&lt;/span&gt; + ltrim(STR(@InsertStep)) + &lt;span style="color:Navy;"&gt;&amp;#39; = &amp;#39;&lt;/span&gt; + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + ltrim(rtrim(@CurrentDesc)) + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + &lt;span style="color:Navy;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt; + @CurrentFrom + &lt;span style="color:Navy;"&gt;&amp;#39;Amt&amp;#39;&lt;/span&gt; + ltrim(STR(@InsertStep)) + &lt;span style="color:Navy;"&gt;&amp;#39; = &amp;#39;&lt;/span&gt; + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + ltrim(rtrim(@CurrentAmt)) + &lt;span style="color:Blue;"&gt;CHAR&lt;/span&gt;(39) + &lt;span style="color:Navy;"&gt;&amp;#39; where &amp;#39;&lt;/span&gt; + ltrim(rtrim(@FromShort)) + &lt;span style="color:Navy;"&gt;&amp;#39;_ForeignKey = &amp;#39;&lt;/span&gt; + @RecID&lt;br /&gt;    &lt;br /&gt;        &lt;br /&gt;        &lt;span style="color:Blue;"&gt;exec&lt;/span&gt;(@InsertStr)&lt;br /&gt;        &lt;br /&gt;        &lt;span style="color:Blue;"&gt;update&lt;/span&gt; @PivotTable &lt;span style="color:Blue;"&gt;set&lt;/span&gt; Processed = &lt;span style="color:Navy;"&gt;&amp;#39;T&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;where&lt;/span&gt; ID = @RecIDStep&lt;br /&gt;        &lt;span style="color:Blue;"&gt;Select&lt;/span&gt; @RecIDStep = &lt;span style="color:Blue;"&gt;MIN&lt;/span&gt;(ID) &lt;span style="color:Blue;"&gt;from&lt;/span&gt; @PivotTable &lt;span style="color:Blue;"&gt;where&lt;/span&gt; FROMTABLE = @CurrentFrom &lt;span style="color:Blue;"&gt;and&lt;/span&gt; ID &amp;lt;&amp;gt; @RecIDStep &lt;span style="color:Blue;"&gt;and&lt;/span&gt; Processed &amp;lt;&amp;gt; &lt;span style="color:Navy;"&gt;&amp;#39;T&amp;#39;&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @InsertStep = @InsertStep + 1&lt;br /&gt;    &lt;span style="color:Blue;"&gt;End&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Set&lt;/span&gt; @TableIDStep = @TableIDStep + 1&lt;br /&gt;&lt;span style="color:Blue;"&gt;End&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;br /&gt;&lt;p&gt;Finally, a second stored procedure is used to drop the temp tables if they already exist, and fill them with values derived from the previous stored procedure:&lt;/p&gt;
 &lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt; &lt;span style="color:Blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:Blue;"&gt;procedure&lt;/span&gt; [dbo].[sp_BuildRotatedTempData] &lt;span style="color:Blue;"&gt;as&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;DECLARE&lt;/span&gt; @RC &lt;span style="color:Blue;"&gt;int&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;DECLARE&lt;/span&gt; @DataPart &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;IF&lt;/span&gt;  &lt;span style="color:Blue;"&gt;EXISTS&lt;/span&gt; (&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt; * &lt;span style="color:Blue;"&gt;FROM&lt;/span&gt; sys.objects &lt;span style="color:Blue;"&gt;WHERE&lt;/span&gt; object_id = OBJECT_ID(N&lt;span style="color:Navy;"&gt;&amp;#39;[dbo].[T1Temp]&amp;#39;&lt;/span&gt;) &lt;span style="color:Blue;"&gt;AND&lt;/span&gt; type &lt;span style="color:Blue;"&gt;in&lt;/span&gt; (N&lt;span style="color:Navy;"&gt;&amp;#39;U&amp;#39;&lt;/span&gt;))&lt;br /&gt;&lt;span style="color:Blue;"&gt;DROP&lt;/span&gt; &lt;span style="color:Blue;"&gt;TABLE&lt;/span&gt; [dbo].[T1Temp]&lt;br /&gt;&lt;span style="color:Blue;"&gt;EXECUTE&lt;/span&gt; @RC = [dbo].[sp_TablesSnapshot]&lt;br /&gt;   &lt;span style="color:Navy;"&gt;&amp;#39;Test1&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;IF&lt;/span&gt;  &lt;span style="color:Blue;"&gt;EXISTS&lt;/span&gt; (&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt; * &lt;span style="color:Blue;"&gt;FROM&lt;/span&gt; sys.objects &lt;span style="color:Blue;"&gt;WHERE&lt;/span&gt; object_id = OBJECT_ID(N&lt;span style="color:Navy;"&gt;&amp;#39;[dbo].[T2Temp]&amp;#39;&lt;/span&gt;) &lt;span style="color:Blue;"&gt;AND&lt;/span&gt; type &lt;span style="color:Blue;"&gt;in&lt;/span&gt; (N&lt;span style="color:Navy;"&gt;&amp;#39;U&amp;#39;&lt;/span&gt;))&lt;br /&gt;&lt;span style="color:Blue;"&gt;DROP&lt;/span&gt; &lt;span style="color:Blue;"&gt;TABLE&lt;/span&gt; [dbo].[T2Temp]&lt;br /&gt;&lt;span style="color:Blue;"&gt;EXECUTE&lt;/span&gt; @RC = [dbo].[sp_TablesSnapshot]&lt;br /&gt;   &lt;span style="color:Navy;"&gt;&amp;#39;Test2&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;IF&lt;/span&gt;  &lt;span style="color:Blue;"&gt;EXISTS&lt;/span&gt; (&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt; * &lt;span style="color:Blue;"&gt;FROM&lt;/span&gt; sys.objects &lt;span style="color:Blue;"&gt;WHERE&lt;/span&gt; object_id = OBJECT_ID(N&lt;span style="color:Navy;"&gt;&amp;#39;[dbo].[T3Temp]&amp;#39;&lt;/span&gt;) &lt;span style="color:Blue;"&gt;AND&lt;/span&gt; type &lt;span style="color:Blue;"&gt;in&lt;/span&gt; (N&lt;span style="color:Navy;"&gt;&amp;#39;U&amp;#39;&lt;/span&gt;))&lt;br /&gt;&lt;span style="color:Blue;"&gt;DROP&lt;/span&gt; &lt;span style="color:Blue;"&gt;TABLE&lt;/span&gt; [dbo].[T3Temp]&lt;br /&gt;&lt;span style="color:Blue;"&gt;EXECUTE&lt;/span&gt; @RC = [dbo].[sp_TablesSnapshot]&lt;br /&gt;   &lt;span style="color:Navy;"&gt;&amp;#39;Test3&amp;#39;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  


&lt;p&gt;Now it&amp;#39;s just a matter of running the second procedure each time the data changes to get a current snapshot of the data in the current format.&amp;nbsp; It is then a simple matter of creating a view joining the each of the newly created temp tables to their parent table to return everything in a columnar format.&lt;/p&gt;&lt;p&gt;I hope you find this helpful.&amp;nbsp; I&amp;#39;ve attached the scripts to create the Stored Procedures so that you can modify them for your own purposes.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks for reading! &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44439" width="1" height="1"&gt;</description><enclosure url="http://customerfx.com/pages/customization/attachment/44439.ashx" length="5917" type="application/octet-stream" /><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/scripting/default.aspx">scripting</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Building a query-based lookup in SalesLogix Lan / Using SLX_Common to build query strings</title><link>http://customerfx.com/pages/customization/2010/09/20/using-slx-common-to-build-query-strings.aspx</link><pubDate>Mon, 20 Sep 2010 16:12:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:43810</guid><dc:creator>Jason Buss</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=43810</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/09/20/using-slx-common-to-build-query-strings.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve &lt;a href="http://customerfx.com/pages/customization/2010/07/19/Useful-Functions-from-the-SLX_5F00_Common-script-_2800_SalesLogix-LAN_2900_.aspx" target="_blank"&gt;previously posed&lt;/a&gt; about a number of useful functions available to you within the SLX_Common script in the LAN version of SalesLogix.&amp;nbsp; I&amp;#39;d like to go a little further in-depth about a couple of functions which are helpful for creating new SQL Query strings.&lt;/p&gt;

&lt;p&gt;In a recent project, I needed to build a query interface similar to what you find in standard opportunity products view.&amp;nbsp; The SLX_Common script holds a couple of functions that I used in building this interface.&amp;nbsp; In this posting, I&amp;#39;m going to go through building a simple account lookup view using this functionality.&lt;/p&gt;

&lt;p&gt;Before I get to any code, we need to build a view containing our search fields and a grid to hold the search results. This view will not be bound in anyway, so I&amp;#39;m going to create this as a manage view.&amp;nbsp; &lt;/p&gt;

&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/SalesLogix%20LAN%20-%20New%20Manage%20View.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/SalesLogix%20LAN%20-%20New%20Manage%20View.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;First of all, I&amp;#39;m going to get rid of the right panel and the associated buttons.&amp;nbsp; In addition, I&amp;#39;m going to add a datagrid as well as three textboxes to hold search values, and three combo boxes to hold operators for each field.&amp;nbsp; For the purposes of this post, I&amp;#39;ll use the Account, Type and Status fields as the lookup fields.&amp;nbsp; Finally, I&amp;#39;ve added a Search button.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;a href="http://customerfx.com/blogs/customization/SalesLogix%20LAN%20-%20Test%20Account%20Lookup.JPG"&gt;&lt;/a&gt;&lt;a href="http://customerfx.com/blogs/customization/SalesLogix%20LAN%20-%20Test%20Account%20Lookup2.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/SalesLogix%20LAN%20-%20Test%20Account%20Lookup2.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;For Type and Status, I actually set them up as picklists, with their corresponding lists attached.&amp;nbsp; The comboboxes have had their &lt;i&gt;Items&lt;/i&gt; property populated with standard operator values (Starts With, Contains, Equal To, Not Equal To, Less Than or Equal To, Greater Than or Equal To, Less Than, Greater Than).&amp;nbsp; While some of these operators don&amp;#39;t really make sense for a Alpha-numeric comparison, I&amp;#39;ve included them in this example.&amp;nbsp; The available operators and their order are important, which you will see a little later.&lt;/p&gt;

&lt;p&gt;For the Grid itself, we need to include some columns.&amp;nbsp; Since this grid will not actually be bound, it doesn&amp;#39;t really matter which fields we use, but we do need to provide fields so that we can apply formatting for fields that would need it, such as dates, boolean values, phone numbers, etc...&amp;nbsp; I&amp;#39;ve used the userfield 1-6 fields in the account table, setting the caption property of each column to what I would like to display in the datagrid, along with any necessary formatting.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/SalesLogix%20LAN%20-%20New%20Columns%20Added.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/SalesLogix%20LAN%20-%20New%20Columns%20Added.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;As you can see, the accountid field is included as well.&amp;nbsp; I don&amp;#39;t want to actually show this field, so it will be necessary to go into the columns collection for the grid and make that column invisible.&amp;nbsp; While I am in there, I&amp;#39;m also going to set the other columns to read-only, as well as disabling the editor.&lt;/p&gt;

&lt;p&gt;Now that our view is set up, we can start adding in come code to make this lookup work!&lt;/p&gt;

&lt;p&gt;&amp;nbsp;The first bit of code I&amp;#39;m adding is to define a global variable for each search parameter, which will tell us which fields to include in the search.&amp;nbsp; To populate these global varables, I created a subroutine call &lt;i&gt;ApplyFilterOption&lt;/i&gt; which I attach to the OnExit event of each of the parameter fields:&lt;/p&gt;

&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;  option explicit&lt;br /&gt;&lt;span style="color:Blue;"&gt;Dim&lt;/span&gt; bIncludeAccount&lt;br /&gt;&lt;span style="color:Blue;"&gt;Dim&lt;/span&gt; bIncludeType&lt;br /&gt;&lt;span style="color:Blue;"&gt;Dim&lt;/span&gt; bIncludeStats&lt;br /&gt;&lt;span style="color:Blue;"&gt;Sub&lt;/span&gt; ApplyFilterOption(Sender)&lt;br /&gt;    bIncludeAccount &lt;span style="color:Navy;"&gt;=&lt;/span&gt; (Trim(txtAccount.Text) &amp;lt;&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;    bIncludeType &lt;span style="color:Navy;"&gt;=&lt;/span&gt; (Trim(pklType.Text) &amp;lt;&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;    bIncludeStatus &lt;span style="color:Navy;"&gt;=&lt;/span&gt; (Trim(pklStatus.Text) &amp;lt;&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
   

&lt;p&gt;With this code, if a user enters a value in &amp;quot;Account&amp;quot;, for example, we&amp;#39;ll know to include &amp;quot;Account&amp;quot; in the where clause of our SQL Statement.&lt;/p&gt;

&lt;p&gt;Now we&amp;#39;re ready to do the actual query.&amp;nbsp; I&amp;#39;ve added another couple of functions, to build the actual query string that will search the database.&amp;nbsp; First, I created a function called &lt;i&gt;SearchAccount&lt;/i&gt;.&amp;nbsp; This function is simply a string consisting of a SQL Statement for querying the Account table. &lt;/p&gt;

 
&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:Blue;"&gt;Function&lt;/span&gt; SearchAccount&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Dim&lt;/span&gt; sSql&lt;br /&gt;    sSql &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &amp;quot;&lt;span style="color:Blue;"&gt;SELECT&lt;/span&gt; ACCOUNTID &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; USERFIELD1, ACCOUNT &lt;span style="color:Blue;"&gt;AND&lt;/span&gt; USERFIELD2, &amp;quot; &amp;amp; _&lt;br /&gt;           &amp;quot;TYPE &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; USERFIELD3, STATUS &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; USERFIELD4, &amp;quot; &amp;amp; _&lt;br /&gt;           &amp;quot;MAINPHONE &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; USERFIELD5, WEBADDRESS &lt;span style="color:Blue;"&gt;AS&lt;/span&gt; USERFIELD6 &amp;quot; &amp;amp; BuildFilter&lt;br /&gt;&lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
  

&lt;p&gt;As you can see, there is no where clause yet.&amp;nbsp; This will be built by another function I added called &lt;i&gt;BuildFilter&lt;/i&gt;.&lt;/p&gt;

 
&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:Blue;"&gt;Function&lt;/span&gt; BuildFilter&lt;br /&gt;    &lt;span style="color:Blue;"&gt;Dim&lt;/span&gt; sWhere&lt;br /&gt;    sWhere &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &amp;quot;&amp;quot;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;If&lt;/span&gt; bIncludeAccount &lt;span style="color:Blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        sWhere &lt;span style="color:Navy;"&gt;=&lt;/span&gt; AddToWhereClause(&amp;quot;ACCOUNT&amp;quot;, GetSQLConditionClause(cmbAccount.ItemIndex, txtAccount.Text), sWhere)&lt;br /&gt;    &lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;If&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;If&lt;/span&gt; bIncludeType &lt;span style="color:Blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        sWhere &lt;span style="color:Navy;"&gt;=&lt;/span&gt; AddToWhereClause(&amp;quot;TYPE&amp;quot;, GetSqlConditionClause(cmbType.ItemIndex, pklType.Text), sWhere)&lt;br /&gt;    &lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;If&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;If&lt;/span&gt; bInlcudeStatus &lt;span style="color:Blue;"&gt;Then&lt;/span&gt;&lt;br /&gt;        sWhere &lt;span style="color:Navy;"&gt;=&lt;/span&gt; AddToWhereClause(&amp;quot;STATUS&amp;quot;, GetSqlConditionClause(cmbStatus.ItemIndex, pklStatus.Text), sWhere)&lt;br /&gt;    &lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;If&lt;/span&gt;&lt;br /&gt;    BuildFilter &lt;span style="color:Navy;"&gt;=&lt;/span&gt; sWhere&lt;br /&gt;&lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
  

&lt;p&gt;In the BuildFilter Function, I am using two different functions from the SLX_Common Script; AddToWhereClause and GetSqlConditionClause. &amp;nbsp; The GetSqlCondition function takes two parameters; The index from the combo box (this is why the order of the operators within the items property of the combobox control is so important) and the value to search for.&amp;nbsp; This is called from within the AddToWhereClause function to append any search parameters from my view into the SQL statement I built.&lt;/p&gt;

&lt;p&gt;All we need to do now is set the SQL property of the results grid to the results of the SearchAccount function.&amp;nbsp; Since we aliased the returned values in that statement with the same fields we used to define the grid, any formatting we set in the grid will carry forward.&amp;nbsp;
&lt;/p&gt;

&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:Blue;"&gt;Sub&lt;/span&gt; cmdSearchClick(Sender)&lt;br /&gt;    dgSearchResults.SQL &lt;span style="color:Navy;"&gt;=&lt;/span&gt; SearchAccount&lt;br /&gt;    dgSearchResults.Refresh&lt;br /&gt;&lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;&amp;nbsp;We should now be getting a result set in our grid.&amp;nbsp; The final step will be to navigate to whichever record from the results the user double-clicks, and to close the search view.&amp;nbsp; This can be done very easily in a doubleclick event on the grid: &lt;br /&gt;&lt;/p&gt;&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span style="color:Blue;"&gt;Sub&lt;/span&gt; dgSearchResultsDblClick(Sender)&lt;br /&gt;    Application.BasicFunctions.ShowDetails &amp;quot;Account&amp;quot;, dgSearchResults.GetCurrentField(&amp;quot;UserField1&amp;quot;)&lt;br /&gt;    frmTestAccountLookup.ModalResult &lt;span style="color:Navy;"&gt;=&lt;/span&gt; mrOK&lt;br /&gt;&lt;span style="color:Blue;"&gt;End&lt;/span&gt; &lt;span style="color:Blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  

&lt;p&gt;So There we go! We&amp;#39;ve just created a simple Account lookup view using a Manage view, and functionality from the SLX_Common script.&amp;#39;&lt;/p&gt;&lt;p&gt;I hope you found this informative.&amp;nbsp; There&amp;#39;s a lot more we could do with this view.&amp;nbsp; Right-click functionality would be nice to have, and you&amp;#39;ll probably need to disable the navigation functionality if there are no results returned. If you are implementing functionality similar to this, I&amp;#39;d encourage you to play with my code an try to figure out what else you can do to make this more complete of a solution.&amp;nbsp;&amp;nbsp; Thanks for reading!&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=43810" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Useful Functions from the SLX_Common script (SalesLogix LAN)</title><link>http://customerfx.com/pages/customization/2010/07/19/Useful-Functions-from-the-SLX_5F00_Common-script-_2800_SalesLogix-LAN_2900_.aspx</link><pubDate>Mon, 19 Jul 2010 11:58:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:43637</guid><dc:creator>Jason Buss</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=43637</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/07/19/Useful-Functions-from-the-SLX_5F00_Common-script-_2800_SalesLogix-LAN_2900_.aspx#comments</comments><description>&lt;p&gt;The SLX_Common script included in SalesLogix contains a number of simple, yet useful, functions that you can use within your own functionality to save yourself some time by not having to reinvent the wheel each time you need some simple functionality.&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;GetItemIndex(&lt;/b&gt;&lt;i&gt;Control, Value&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;This function returns the index for an item within a control such as a ComboBox, CheckListBox, ListView, ect.&amp;nbsp; Basically, any control with an &amp;quot;Items&amp;quot; property.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;SLXIsNumeric(&lt;/b&gt;&lt;i&gt;Value&lt;/i&gt;&lt;b&gt;), NulltoZero(&lt;/b&gt;&lt;i&gt;Value&lt;/i&gt;&lt;b&gt;), CheckForNull(&lt;/b&gt;&lt;i&gt;Value&lt;/i&gt;&lt;b&gt;), CheckForNullDate(&lt;/b&gt;&lt;i&gt;Value&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;This series of functions can be used to evaluate a number of different datatype for null or blank values.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;There are a number of functions to provide some basic calulations commonly performed against currency values:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;CalculateAdjustedPrice(&lt;/b&gt;&lt;i&gt;Price, Discount&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;CalculateDiscountPercentage(&lt;/b&gt;&lt;i&gt;AdjustedPrice, PriceBase&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;CalculateExtendedPrice(&lt;/b&gt;&lt;i&gt;AdjustedPrice, ExchangeRate&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;CalculateLocalPrice(&lt;/b&gt;&lt;i&gt;AdjustedPrice, ExchangeRate&lt;b&gt;)&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;CalculateExtendedPriceLocal(&lt;/b&gt;Quantity, PriceLocal&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;ExtendedPricetotal(&lt;/b&gt;&lt;i&gt;objRS&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;ExtendedPriceTotal will total up all records from the passed recordset, where the fieldname is &amp;quot;Extended&amp;quot;)&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;There are also a couple of scripts to help with SQL statements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;&lt;b&gt;GetSQLConditionClause(&lt;/b&gt;&lt;i&gt;Index, strFltText&lt;/i&gt;&lt;b&gt;), GetSLXConditionClauseEx(&lt;/b&gt;&lt;i&gt;Index, strFltText, strField&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The Index number passed corresponds with the type of query to run... (0 = Like &lt;i&gt;with wildcards&lt;/i&gt;, 1 = Like, 2 = Equals To, 3 = Not Equal To, etc...)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;b&gt;AddToWhereClause(&lt;/b&gt;&lt;i&gt;Field, Clause, Where&lt;/i&gt;&lt;b&gt;), AddToWhereClauseEx(&lt;/b&gt;&lt;i&gt;Field, Clause, Where, Condition&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;AddCommaDelimatedTextToWhereClause(&lt;/b&gt;&lt;i&gt;intCauseIndex, strWhere, strText, strField&lt;/i&gt;&lt;b&gt;)&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;etc...&lt;br /&gt;&lt;p&gt;This is just a short list of some of the functionality available in this particular script.&amp;nbsp; Other useful functionality is available in this, as well as many other scripts which are included within SalesLogix.&amp;nbsp; In addition, if you&amp;#39;re relatively new to VB scripting, these scripts provide some invaluable examples for how Subroutines and Functions can be built within the SalesLogix client.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; Jason &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=43637" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix+LAN+Client/default.aspx">SalesLogix LAN Client</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>SQL Function for parsing name values</title><link>http://customerfx.com/pages/customization/2010/05/25/sql-function-for-parsing-name-values.aspx</link><pubDate>Tue, 25 May 2010 15:13:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:42955</guid><dc:creator>Jason Buss</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=42955</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/05/25/sql-function-for-parsing-name-values.aspx#comments</comments><description>&lt;p&gt;&amp;nbsp;In a recent project, I had to create a SQL Server Integration Services package to basically copy contact information (which was being stored in the Account.Account field) from the Account table into the Contact table.&amp;nbsp; Since the Contact name was being stored in it&amp;#39;s entirety within the account field, I needed a way to parse the Contact information to populate the individual contact name fields in the contact table.&lt;/p&gt;

&lt;p&gt;I created a scalar function called ParseName to accomplish this: (I&amp;#39;ve attached a zip containing the .sql file as well)&lt;br /&gt;&lt;/p&gt;

&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt; &lt;span style="color:Blue;"&gt;CREATE&lt;/span&gt; &lt;span style="color:Blue;"&gt;function&lt;/span&gt; [dbo].[ParseName](@NameString &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(100), @NameFormat &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(20))&lt;br /&gt;&lt;span style="color:Blue;"&gt;returns&lt;/span&gt; &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(100) &lt;span style="color:Blue;"&gt;as&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--ParseName parses a Name String into its component parts &lt;br /&gt;--and returns it as requested.&lt;br /&gt;--This function assumes the data source maintains a standard format of &lt;br /&gt;--&amp;#39;Prefix Firstname Middlename Lastname Suffix&amp;#39;&lt;br /&gt;--&lt;br /&gt;--@NameString is the raw value to be parsed.&lt;br /&gt;--@NameFormat is a string that defines the output format.  Each letter in the string&lt;br /&gt;--represents a component of the name in the order that it is to be returned.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--    P = Full prefix&lt;br /&gt;--    p = Abbreviated prefix&lt;br /&gt;--    F = First name&lt;br /&gt;--    f = First initial&lt;br /&gt;--    M = Middle name&lt;br /&gt;--    m = Middle initial&lt;br /&gt;--    L = Last name&lt;br /&gt;--    l = Last initial&lt;br /&gt;--    S = Full suffix&lt;br /&gt;--    s = Abbreviated suffix&lt;br /&gt;--    . = Period&lt;br /&gt;--    , = Comma&lt;br /&gt;--    [ ] = Space&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Example1: select dbo.Parsename(&amp;#39;Doctor Bobo Lee Brown Esquire&amp;#39;, &amp;#39;L, p. F m. s.&amp;#39;)&lt;br /&gt;--Result: &amp;#39;Brown, Dr. Bobo L. Esq.&amp;#39;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Example2:    (Full contact name stored in SLX Account table)&lt;br /&gt;--                select &lt;br /&gt;--                    dbo.Parsename(ACCOUNT, &amp;#39;F&amp;#39;) as FIRSTNAME&lt;br /&gt;--                ,    dbo.Parsename(ACCOUNT, &amp;#39;L&amp;#39;) as LASTNAME&lt;br /&gt;--                from ACCOUNT&lt;br /&gt;--&lt;br /&gt;--Returns:      FIRSTNAME, LASTNAME&lt;br /&gt;--                --------------------&lt;br /&gt;--                &amp;#39;Bobo&amp;#39;, &amp;#39;Brown&amp;#39;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt;    @Prefix &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(20)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt;    @FirstName &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(20)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt;    @MiddleName &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt;    @LastName &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(30)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt;    @Suffix &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(20)&lt;br /&gt;&lt;span style="color:Blue;"&gt;Declare&lt;/span&gt;    @TempString &lt;span style="color:Blue;"&gt;varchar&lt;/span&gt;(100)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--String Prep - We want to remove any periods, double spaces and commas&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;    @NameString = rtrim(ltrim(replace(@NameString, &lt;span style="color:Navy;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;. &amp;#39;&lt;/span&gt;)))&lt;br /&gt;&lt;span style="color:Blue;"&gt;while&lt;/span&gt;  charindex(&lt;span style="color:Navy;"&gt;&amp;#39;  &amp;#39;&lt;/span&gt;, @NameString) &amp;gt; 0 &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @NameString = replace(@NameString, &lt;span style="color:Navy;"&gt;&amp;#39;  &amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;while&lt;/span&gt;  charindex(&lt;span style="color:Navy;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, @NameString) &amp;gt; 0 &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @NameString = replace(@NameString, &lt;span style="color:Navy;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;&lt;span style="color:Blue;"&gt;while&lt;/span&gt;  charindex(&lt;span style="color:Navy;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;, @NameString) &amp;gt; 0 &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @NameString = replace(@NameString, &lt;span style="color:Navy;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Get Prefix and strip it out of the string...  Add additional prefixes as needed&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;  @TempString = rtrim(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@NameString, charindex(&lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, @NameString + &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;)))&lt;br /&gt;&lt;span style="color:Blue;"&gt;if&lt;/span&gt;   @TempString &lt;span style="color:Blue;"&gt;in&lt;/span&gt; (&lt;span style="color:Navy;"&gt;&amp;#39;MR&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;MRS&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;MS&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;DR&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;Doctor&amp;#39;&lt;/span&gt;) &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @Prefix = @TempString&lt;br /&gt;&lt;span style="color:Blue;"&gt;if&lt;/span&gt;   len(@Prefix) &amp;gt; 0 &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @NameString = ltrim(&lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@NameString, len(@NameString) - len(@TempString)))&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Get Suffix and strip it out of the string... Add additional suffixes as needed&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;  @TempString = ltrim(&lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@NameString, charindex(&lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, Reverse(@NameString) + &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;)))&lt;br /&gt;&lt;span style="color:Blue;"&gt;if&lt;/span&gt;   @TempString &lt;span style="color:Blue;"&gt;in&lt;/span&gt; (&lt;span style="color:Navy;"&gt;&amp;#39;Jr&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;Sr&amp;#39;&lt;/span&gt;,  &lt;span style="color:Navy;"&gt;&amp;#39;II&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;III&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;Esq&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;Junior&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;Senior&amp;#39;&lt;/span&gt;) &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @Suffix = @TempString&lt;br /&gt;&lt;span style="color:Blue;"&gt;if&lt;/span&gt;   len(@Suffix) &amp;gt; 0 &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @NameString = rtrim(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@NameString, len(@NameString) - len(@TempString)))&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Strip Lastname out of the string&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;  @LastName = ltrim(&lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@NameString, charindex(&lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, Reverse(@NameString) + &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;)))&lt;br /&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;  @NameString = rtrim(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@NameString, len(@NameString) - len(@LastName)))&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Check Last name to see if it has two parts...  Add additional values as needed&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;  @TempString = ltrim(&lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@NameString, charindex(&lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, Reverse(@NameString) + &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;)))&lt;br /&gt;&lt;span style="color:Blue;"&gt;if&lt;/span&gt;   @TempString &lt;span style="color:Blue;"&gt;in&lt;/span&gt; (&lt;span style="color:Navy;"&gt;&amp;#39;VAN&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;VON&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;MC&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;Mac&amp;#39;&lt;/span&gt;, &lt;span style="color:Navy;"&gt;&amp;#39;DE&amp;#39;&lt;/span&gt;)&lt;br /&gt;     &lt;span style="color:Blue;"&gt;begin&lt;/span&gt;&lt;br /&gt;     &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @LastName = @TempString + &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt; + @LastName&lt;br /&gt;     &lt;span style="color:Blue;"&gt;set&lt;/span&gt; @NameString = rtrim(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@NameString, len(@NameString) - len(@TempString)))&lt;br /&gt;     &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Get FirstName and strip it out of the string&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;    @FirstName = rtrim(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@NameString, charindex(&lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, @NameString + &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;)))&lt;br /&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;    @NameString = ltrim(&lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@NameString, len(@NameString) - len(@FirstName)))&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Anything left is MiddleName&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;    @MiddleName = @NameString&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Green;"&gt;--Build output string&lt;br /&gt;--You will need to add Long/Short versions of Prefixes and Suffixes to the appropreate section&lt;br /&gt;&lt;/span&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt;    @TempString = &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;while&lt;/span&gt; len(@NameFormat) &amp;gt; 0&lt;br /&gt;&lt;span style="color:Blue;"&gt;begin&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt; @TempString = @TempString +&lt;br /&gt;    &lt;span style="color:Blue;"&gt;case&lt;/span&gt; ascii(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@NameFormat, 1))&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;80&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Blue;"&gt;case&lt;/span&gt; @Prefix&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Dr&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Doctor&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Rev&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Reverend&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt; isnull(@Prefix, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;70&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; isnull(@FirstName, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;77&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; isnull(@MiddleName, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;76&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; isnull(@LastName, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;83&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Blue;"&gt;case&lt;/span&gt; @Suffix&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Jr&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Junior&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Sr&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Senior&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Esq&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Esquire&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt; isnull(@Suffix, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;112&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Blue;"&gt;case&lt;/span&gt; @Prefix&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Doctor&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Dr&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Reverend&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Rev&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt; isnull(@Prefix, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;102&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; isnull(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@FirstName, 1), &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;109&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; isnull(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@MiddleName, 1), &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;108&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; isnull(&lt;span style="color:Blue;"&gt;left&lt;/span&gt;(@LastName, 1), &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;115&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Blue;"&gt;case&lt;/span&gt; @Suffix&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Junior&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Jr&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Senior&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Sr&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Esquire&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;Esq&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt; isnull(@Suffix, &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;46&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Blue;"&gt;case&lt;/span&gt; &lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@TempString, 1)&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;44&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Blue;"&gt;case&lt;/span&gt; &lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@TempString, 1)&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;32&amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Blue;"&gt;case&lt;/span&gt; &lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@TempString, 1)&lt;br /&gt;            &lt;span style="color:Blue;"&gt;when&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span style="color:Blue;"&gt;then&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;else&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;br /&gt;            &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;        &lt;span style="color:Blue;"&gt;else&lt;/span&gt; &lt;span style="color:Navy;"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;set&lt;/span&gt; @NameFormat = &lt;span style="color:Blue;"&gt;right&lt;/span&gt;(@NameFormat, len(@NameFormat) - 1)&lt;br /&gt;&lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;Return&lt;/span&gt; @TempString&lt;br /&gt;&lt;span style="color:Blue;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:Blue;"&gt;GO&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;This function will allow you to parse contact values and return them in any way you would like.&amp;nbsp; It&amp;#39;s not all inclusive in terms of available prefixes/suffixes, etc.&amp;nbsp; so, please feel free to use/modify this function as needed for your situation.&lt;/p&gt;
&lt;p&gt;Thanks for reading! &lt;br /&gt;&lt;/p&gt;
  &lt;img src="http://customerfx.com/aggbug.aspx?PostID=42955" width="1" height="1"&gt;</description><enclosure url="http://customerfx.com/pages/customization/attachment/42955.ashx" length="1602" type="application/x-zip-compressed" /><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/Parsing+Data/default.aspx">Parsing Data</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Recombining Parsed data in SQL</title><link>http://customerfx.com/pages/customization/2010/03/30/recombing-parsed-data-in-sql.aspx</link><pubDate>Tue, 30 Mar 2010 13:10:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41604</guid><dc:creator>Jason Buss</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=41604</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/03/30/recombing-parsed-data-in-sql.aspx#comments</comments><description>
&lt;p&gt;A couple of weeks ago, I posted about &lt;a href="http://customerfx.com/pages/customization/2010/03/08/using-sql-user-defined-functions-and-cross-apply-to-parse-sql-data.aspx" title="Parsing data in SQL Server" target="_blank"&gt;using User Defined functions and Cross Apply to parse data in SQL server&lt;/a&gt;.&amp;nbsp; The second part of the import I was working on required me to take that parsed data, perform some manipulations, and then recombine that data.&amp;nbsp; Surprisingly, I found that putting that data together was much more difficult then pulling it apart in the first place.&amp;nbsp; After much experimentation, this is what I came up with...&lt;/p&gt;

&lt;p&gt;As you may recall from my previous post, I created a Table-Valued function called &lt;b&gt;Parsedata&lt;/b&gt; to pull apart the data from a field.&amp;nbsp; The next step was to join each parsed data value, and join it to another table holding those values as well as an ID for each value.&amp;nbsp; I then needed to combine the ID&amp;#39;s from that second table.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;My Original Data Looked Like:&lt;/p&gt;

&lt;p&gt;&amp;nbsp;ID&amp;nbsp; Value&lt;br /&gt;---------------&lt;br /&gt;1&amp;nbsp;&amp;nbsp; ABC, DEF&lt;br /&gt;2&amp;nbsp;&amp;nbsp; HIJ, KLM&lt;br /&gt;3&amp;nbsp;&amp;nbsp; NOP, QRS&lt;/p&gt;

&lt;p&gt;First, I created a view using the ParseData function:&amp;nbsp; (This is what I did in my previous blog post)&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;Create View [dbo].[vDataSplitSource] as&lt;br /&gt;select &lt;i&gt;Table&lt;/i&gt;.ID, s.Value from &lt;i&gt;Table&lt;/i&gt;&lt;br /&gt;cross apply&lt;br /&gt;dbo.ParseData(&lt;i&gt;Table&lt;/i&gt;.Value, &amp;#39;,&amp;#39;) s&lt;/blockquote&gt;

&lt;p&gt;After parsing the data, I get a view containing:&lt;/p&gt;

&lt;p&gt;ID&amp;nbsp;&amp;nbsp;&amp;nbsp; Value&lt;br /&gt;--------------&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ABC&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEF&lt;br /&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HIJ&lt;br /&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; KLM&lt;br /&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOP&lt;br /&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QRS&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;That view functions as my source.&amp;nbsp; My target is a hash table which contains IDs for each value, similar to:&lt;/p&gt;

&lt;p&gt;ItemID&amp;nbsp;&amp;nbsp; Value&lt;br /&gt;----------------&lt;br /&gt;11&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ABC&lt;br /&gt;12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DEF&lt;br /&gt;13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HIJ&lt;br /&gt;14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; KLM&lt;br /&gt;15&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NOP&lt;br /&gt;16&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QRS&lt;/p&gt;

&lt;p&gt;I create a simple view joining my parsed data to the hash table data:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create View [dbo].[vJoinedData2] as&lt;br /&gt;select distinct a.ID, b.Value&lt;br /&gt;from vDataSplitSource a inner join HashTable b&lt;br /&gt;on a.Value = b.Value&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&amp;nbsp;Now I have a view containing values from both the view and the table. &lt;/p&gt;

&lt;p&gt;For the next step, I created a new Scalar-Valued Function to actually put the data back together.&amp;nbsp; In this particular case, my result set needed to not only have commas as delimiters, but also needed commas at the beginning and the end of the string as well.&amp;nbsp; The function requires that you pass the ID for each row as well:&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;nbsp;Create FUNCTION [dbo].[CombineData] ( @c INT )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURNS VARCHAR(MAX) AS&lt;br /&gt;BEGIN&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DECLARE @p VARCHAR(MAX) ;&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; SET @p = &amp;#39;,&amp;#39; ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT @p = @p + rtrim(ltrim(Value)) + &amp;#39;,&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM vJoinedData2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE Id = @c ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RETURN @p&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; END&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finally, It was just a matter of calling the function to return the data as I needed it:&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;select id, cast(dbo.CombineData(id) as nchar(40)) as RetValue &lt;br /&gt;from vJoinedData2&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This last data returns:&lt;/p&gt;

&lt;p&gt;&amp;nbsp;ID&amp;nbsp;&amp;nbsp;&amp;nbsp; RetValue&lt;br /&gt;--------------&lt;br /&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,11,12,&lt;br /&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,13,14,&lt;br /&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,15,16,&lt;/p&gt;

&lt;p&gt;Unfortunately, I found that the whole process runs very slowly.&amp;nbsp; I actually used the final statement here as a view, and then joined that view to another view by IDs which proved to be unmanageable when working with larger datasets.&amp;nbsp; Ultimately, I ended up stuffing the final returned data into a temporary table and joining to that instead. &lt;/p&gt;

&lt;p&gt;Anyway...&amp;nbsp; It look me a while to figure out this whole processes, and most examples I found didn&amp;#39;t exactly conform to my particular requirements, so I hope that someone out there can find this useful.&lt;/p&gt;

&lt;p&gt;Thanks for reading! &lt;/p&gt;
&lt;p&gt;Jason&lt;br /&gt;&lt;a href="http://www.twitter.com/JasonBussCFX"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-b.png" alt="Follow JasonBussCFX on Twitter" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41604" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL+Functions/default.aspx">SQL Functions</category></item><item><title>Using SQL User defined functions and Cross Apply to parse SQL data</title><link>http://customerfx.com/pages/customization/2010/03/08/using-sql-user-defined-functions-and-cross-apply-to-parse-sql-data.aspx</link><pubDate>Mon, 08 Mar 2010 09:40:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41527</guid><dc:creator>Jason Buss</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=41527</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/03/08/using-sql-user-defined-functions-and-cross-apply-to-parse-sql-data.aspx#comments</comments><description>
&lt;p&gt;Recently, I worked on an import where I spent a considerable amount of time working out how to effectively parse data from a SQL table, for insertion into another table.
&lt;/p&gt;

&lt;p&gt;The table I was evaluating basically looked like this:
&lt;/p&gt;
ID, Value&lt;br /&gt;------------------------------&lt;br /&gt;&amp;quot;1&amp;quot;, &amp;quot;ABC, DEF, HIJ&amp;quot;&lt;br /&gt;&amp;quot;2&amp;quot;, &amp;quot;KLM, NOP, QRS&amp;quot;&lt;br /&gt;&amp;quot;3&amp;quot;, &amp;quot;TUV, WXYZ&amp;quot; &lt;br /&gt;
&lt;p&gt;I needed a row for each distinct value.  To parse the data, I created a user defined function with the following code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CREATE FUNCTION dbo.ParseData&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@RowData nvarchar(2000),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;@SplitOn nvarchar(5)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;) &amp;nbsp;&lt;br /&gt;RETURNS @RtnValue table &lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Id int identity(1,1),&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Data nvarchar(100)&lt;br /&gt;) &lt;br /&gt;AS &amp;nbsp;&lt;br /&gt;BEGIN &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Declare @Cnt int&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Set @Cnt = 1&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;While (Charindex(@SplitOn,@RowData)&amp;gt;0)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Begin&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Insert Into @RtnValue (data)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Select &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Set @Cnt = @Cnt + 1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;End&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Insert Into @RtnValue (data)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Select Data = ltrim(rtrim(@RowData))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Return&lt;br /&gt;END&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, this function works great when manually defining the values to parse, such as&amp;nbsp; &lt;b&gt;select * from dbo.ParseData(&amp;#39;123,456,123,456&amp;#39;, &amp;#39;,&amp;#39;)&lt;/b&gt;.&amp;nbsp; This would return&lt;/p&gt;

&lt;p&gt;Id, Data&lt;br /&gt;-------------&lt;br /&gt;&amp;quot;1&amp;quot;, &amp;quot;123&amp;quot;&lt;br /&gt;&amp;quot;2&amp;quot;, &amp;quot;456&amp;quot;&lt;br /&gt;&amp;quot;3&amp;quot;, &amp;quot;123&amp;quot;&lt;br /&gt;&amp;quot;4&amp;quot;, &amp;quot;456&amp;quot;&lt;/p&gt;

&lt;p&gt;as I expected, but when I try to use the function with my original table, I was getting an error:&amp;nbsp; &lt;b&gt;Cannot find either column &amp;quot;dbo&amp;quot; or the user-defined function or aggregate &amp;quot;dbo.Split&amp;quot;, or the name is ambiguous.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;To get around this, I was able to use &amp;quot;Cross Apply&amp;quot; in my sql statement, to run the UDF against each row in my table.&amp;nbsp; Using Cross Apply result in this statement:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;select ID, s.data from [table]&lt;br /&gt;cross apply&lt;br /&gt;dbo.ParseData([Table].Value, &amp;#39;,&amp;#39;) s&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Which Returns:&lt;/p&gt;

&lt;p&gt;Id, Data&lt;br /&gt;-------------&lt;br /&gt;&amp;quot;1&amp;quot;, &amp;quot;ABC&amp;quot;&lt;br /&gt;&amp;quot;1&amp;quot;, &amp;quot;DEF&amp;quot;&lt;br /&gt;&amp;quot;1&amp;quot;, &amp;quot;HIJ&amp;quot;&lt;br /&gt;&amp;quot;2&amp;quot;, &amp;quot;KLM&amp;quot;&lt;br /&gt;&amp;quot;2&amp;quot;, &amp;quot;NOP&amp;quot;&lt;br /&gt;&amp;quot;2&amp;quot;, &amp;quot;QRS&amp;quot;&lt;br /&gt;&amp;quot;3&amp;quot;, &amp;quot;TUV&amp;quot;&lt;br /&gt;&amp;quot;3&amp;quot;, &amp;quot;WXYZ&amp;quot; &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Now I have my data parsed with the table ID, ready to be joined to my source data for import.&lt;/p&gt;
&lt;p&gt;-Jason&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a href="http://www.twitter.com/JasonBussCFX"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-b.png" alt="Follow JasonBussCFX on Twitter" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41527" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/Parsing+Data/default.aspx">Parsing Data</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category><category domain="http://customerfx.com/pages/customization/archive/tags/User+Defined+Functions/default.aspx">User Defined Functions</category></item><item><title>Using SQL triggers to enforce data rules in SalesLogix.</title><link>http://customerfx.com/pages/customization/2010/02/05/using-sql-triggers-to-enforce-data-rules-in-saleslogix.aspx</link><pubDate>Fri, 05 Feb 2010 13:20:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41468</guid><dc:creator>Jason Buss</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=41468</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/02/05/using-sql-triggers-to-enforce-data-rules-in-saleslogix.aspx#comments</comments><description>
&lt;p&gt;In a recent project, I used triggers to enforce some data rules in the Ticket area of SalesLogix.&amp;nbsp; We did this because our client was using both the LAN as well as the Web clients.&amp;nbsp; We were having some difficulty seeing changes in the LAN client when values were set in the Web, and vice-versa.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re not familiar with them, triggers are code that are executed automatically in response to an event occurring on a SQL table.&amp;nbsp; SQL supports triggers for insert, update and delete operations.&amp;nbsp; In this case, I only had to deal with update triggers, since I needed to set certain fields based on a user either checking a checkbox, or setting a particular ticket status.&lt;/p&gt;

&lt;p&gt;I have a extended table off of Ticket (Ticket_Ext), which contained a boolean (ProblemClear) and a date field (ProblemClearDate).&amp;nbsp; I had to do the following, based on if the ProblemClear field was checked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If True and ProblemClearDate is Empty, set ProblemClearDate to the current date.&lt;/li&gt;

&lt;li&gt;If True and ProblemClearDate is NOT empty, do nothing.&lt;/li&gt;

&lt;li&gt;If False, clear the ProblemClearDate field. &lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;In addition, I had a couple rules for when the Ticket Status value was changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the value is &amp;#39;Closed&amp;#39;, and ProblemClear was not checked, set ProblemClear to &amp;#39;T&amp;#39; and set ProblemClearDate to the current date&lt;/li&gt;

&lt;li&gt;If the value is not &amp;#39;Closed&amp;#39; and ProblemClearDate is not empty, clear ProblemClearDate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;For the most part, the syntax creating the triggers is pretty simple.&amp;nbsp; Basically, we&amp;#39;re just writing a standard Update query.&amp;nbsp; The thing you have to keep in mind, however; is that triggers are defined at the table level and not for specific fields.&amp;nbsp; In order to evaluate specific fields, you have to utilize specialized system tables &amp;#39;Inserted&amp;#39; and &amp;#39;Deleted&amp;#39; that are in SQL.&amp;nbsp; Whenever a field is updated, a temporary record in the &amp;#39;Inserted&amp;#39; table is created, and &amp;#39;Deleted&amp;#39; is populated when a field value is deleted.&amp;nbsp; There is no corresponding &amp;#39;Updated&amp;#39; table, so if a field value is updated, then an entry is added to &amp;#39;Deleted&amp;#39; and then to &amp;#39;Inserted&amp;#39;.&amp;nbsp; There is an update function which returns a true value if the field passed to the function had indeed been updated.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;Here&amp;#39;s the code I wrote to build these triggers based on the rules listed above:&lt;br /&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create TRIGGER uptClearFlag&lt;br /&gt;ON TICKET_EXT&lt;br /&gt;FOR UPDATE AS&lt;br /&gt;If update (ProblemClear)&lt;br /&gt;Begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Update ticket_ext set ProblemClearDate = GetDate()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where ticketid in (select ticketid from inserted)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and (ProblemClear = &amp;#39;T&amp;#39;) and ((ProblemClearDate = &amp;#39;&amp;#39; or ProblemClearDate is null))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Update ticket_ext set ProblemClearDate = Null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where ticketid in (select ticketid from inserted)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and (ProblemClear = &amp;#39;F&amp;#39;) and (ProblemClearTime is not null)&lt;br /&gt;End&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;Create TRIGGER uptTicketStatus&lt;br /&gt;ON Ticket&lt;br /&gt;FOR UPDATE AS&lt;br /&gt;If update (StatusCode)&lt;br /&gt;Begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Update a set a.ProblemClear = &amp;#39;T&amp;#39;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from ticket_ext a &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inner join ticket b on a.ticketid = b.ticketid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inner join picklist c on b.statuscode = c.itemid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where a.ticketid in (select ticketid from inserted)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and (c.text = &amp;#39;Closed&amp;#39;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Update a set a.ProblemClearDate = null&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from ticket_ext a &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inner join ticket b on a.ticketid = b.ticketid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; inner join picklist c on b.statuscode = c.itemid&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where a.ticketid in (select ticketid from inserted)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; and (c.text &amp;lt;&amp;gt; &amp;#39;Closed&amp;#39;)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;End&lt;br /&gt;&lt;br /&gt;go &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you can see, I join my SLX Tables to the &amp;#39;Inserted&amp;#39; system table so that I can find the correct record that I want to update.&amp;nbsp;&amp;nbsp; It also bears mentioning that triggers would not Sync to remotes, so they are not really an option in that case unless you created the same triggers on each remote database as well.&lt;/p&gt;
&lt;p&gt;-Jason &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp; &lt;br /&gt;&lt;a href="http://www.twitter.com/JasonBussCFX"&gt;&lt;img src="http://twitter-badges.s3.amazonaws.com/follow_me-b.png" alt="Follow JasonBussCFX on Twitter" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41468" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix+LAN+Client/default.aspx">SalesLogix LAN Client</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Using SQL views to incorporate external data into SalesLogix customizations</title><link>http://customerfx.com/pages/customization/2009/08/05/using-sql-views-to-incorporate-external-data-into-the-saleslogix-database.aspx</link><pubDate>Wed, 05 Aug 2009 11:17:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40734</guid><dc:creator>Jason Buss</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=40734</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/08/05/using-sql-views-to-incorporate-external-data-into-the-saleslogix-database.aspx#comments</comments><description>&lt;p&gt;Did you know that you can include SQL views in SalesLogix?&amp;nbsp; This can be a very handy method to include data that is not normally part of SalesLogix. It is important to note, that these changes are not sync-aware.&amp;nbsp; However if you are running SalesLogix LAN in a network only environment, this can be a helpful way to include data from external sources.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First of all, we need a view.&amp;nbsp; This could be anything, as long as the view is created in your SalesLogix database and is owned by the SYSDBA user.&amp;nbsp; For this example, I&amp;#39;ll add a simple view of accounts/primary contacts from another SLX database in Query analyzer:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;create view vAccountViewTest as &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; select &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a.accountid, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; a.account, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; c.lastname, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; c.firstname from&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SalesLogix2.sysdba.account a &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; inner join &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; SalesLogix2.sysdba.contact c&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; on a.accountid = c.accountid &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where c.isprimary = &amp;#39;T&amp;#39; &lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;Once this view is created, it will show up in the database manager:&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/DBManagerCustomView.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/DBManagerCustomView.JPG" border="0" width="570" height="341" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you get the properties of that view, you simply need to &amp;quot;Enable&amp;quot; the view for use in SalesLogix:&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CustomViewTableProps.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CustomViewTableProps.JPG" border="0" width="269" height="279" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now that the view has been enabled, you can use it in SalesLogix, just as you would use any other table in the system, for example, in a datagrid:&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CustomViewInGrid.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CustomViewInGrid.JPG" border="0" width="530" height="419" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That&amp;#39;s basically it!&amp;nbsp;&amp;nbsp; I hope you found this post helpful. &lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40734" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/datagrid/default.aspx">datagrid</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix+LAN+Client/default.aspx">SalesLogix LAN Client</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Understanding SalesLogix Picklists data structure</title><link>http://customerfx.com/pages/customization/2009/01/06/Understanding-SalesLogix-Picklists-data-structure.aspx</link><pubDate>Tue, 06 Jan 2009 22:08:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39825</guid><dc:creator>Jason Buss</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/customization/rsscomments.aspx?PostID=39825</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/01/06/Understanding-SalesLogix-Picklists-data-structure.aspx#comments</comments><description>&lt;p&gt;Picklists in SalesLogix are a very useful tool, but did you know you could also you values from an existing picklist to populate other list-based controls such as ComboBoxes, CheckListBoxes, ListViews... even Radio groups?&amp;nbsp; You simply need an understanding of the structure of picklists in SalesLogix:&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;There is a table named &amp;quot;Picklist&amp;quot; within the salesLogix database. There are a number of fields in that table, but the most important fields in this table are TEXT, ITEMID, and PICKLISTID.&amp;nbsp; SalesLogix stores both the individual picklist items in this table, along with the definition for the picklist itself.&amp;nbsp; The TEXT field contains the name of both the Picklist as well as each picklist item, however; a list item&amp;#39;s picklistid value will equel the itemid of the picklist name record.&amp;nbsp; Instead of an ID in picklistid, the main record of the list contains the value &amp;#39;PICKLISTLIST&amp;#39;.&lt;/p&gt;So, say you wanted to return the results of the Contact Type picklist, you could run the query:&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
&lt;p&gt;&lt;b&gt;select text as [Contact Type] from picklist &lt;br /&gt;where picklistid in &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (select itemid as picklistid from picklist &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; where text = &amp;#39;Contact Type&amp;#39; and picklistid = &amp;#39;PICKLISTLIST&amp;#39;)&lt;br /&gt;order By text&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Then using that as the SQL in the process I defined in my last post (&lt;a href="http://customerfx.com/pages/customization/2009/01/02/programmatically-populating-combobox-in-saleslogix-lan.aspx"&gt;Here&lt;/a&gt;) you can populate the control of your choice with those values.&amp;nbsp; This would also be very helpful if you wanted to use SLX Picklist data in an external application which has access to the SalesLogix data.&lt;/p&gt;
&lt;p&gt;Pretty neat! &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39825" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix+LAN+Client/default.aspx">SalesLogix LAN Client</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category><category domain="http://customerfx.com/pages/customization/archive/tags/vbscript/default.aspx">vbscript</category></item></channel></rss>