<?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</title><link>http://customerfx.com/pages/customization/default.aspx</link><description>Jason Buss on SalesLogix development &amp;amp; customization, SQL, and more.</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><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>1</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;br /&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/SQL/default.aspx">SQL</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/User+Defined+Functions/default.aspx">User Defined Functions</category></item><item><title>Using the Reporting API enhancement in SLX 7.5.2 web</title><link>http://customerfx.com/pages/customization/2010/02/17/using-the-reporting-api-enhancement-in-slx-7-5-2-web.aspx</link><pubDate>Wed, 17 Feb 2010 16:17:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41491</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=41491</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/02/17/using-the-reporting-api-enhancement-in-slx-7-5-2-web.aspx#comments</comments><description>&lt;p&gt;Sage has added an API enhancement to facilitate running Crystal reports in the SalesLogix web client.  To get the functionality in 7.5.1, it was necessary to install a reporting update bundle, but the functionality has incorporated into 7.5.2 with no additional installation needed. 

&lt;/p&gt;&lt;p&gt;The enhancement adds a number of functions to facilitate running reports in the web client.  &lt;/p&gt;&lt;p&gt;Functions include:

&lt;/p&gt;&lt;p&gt;ShowReportByName()
ShowDefaultReport(),
SetContactReport(),
ShowReportByID(),
ShowReport()
&lt;/p&gt;&lt;p&gt;Running a report is very easy. &amp;nbsp; Using a button as an example, simply add one of the functions to the onclientclick property of the button, such as:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;ShowReportByName(&amp;#39;Contact:Contacts By Lead Source - Sample&amp;#39;);&lt;/p&gt;&lt;p&gt;ShowDefaultReport();&lt;/p&gt;&lt;p&gt;SetContactReport(&amp;#39;Contact:Contact Summary - Sample&amp;#39;);ShowDefaultReport();&lt;/p&gt;&lt;p&gt;ShowReportByID(&amp;#39;&lt;span class="Apple-style-span" style="border-collapse:separate;font-family:&amp;#39;Times New Roman&amp;#39;;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;font-size:medium;"&gt;&lt;span class="Apple-style-span" style="font-family:Tahoma,sans-serif;font-size:13px;text-align:justify;"&gt;p6UJ9A0004SD&amp;#39;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;ShowReport(&amp;#39;Contact:Contact Address Book - Sample&amp;#39;, &amp;#39;CONTACT&amp;#39;, &amp;#39;&lt;span class="Apple-style-span" style="border-collapse:separate;font-family:&amp;#39;Times New Roman&amp;#39;;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;font-size:medium;"&gt;&lt;span class="Apple-style-span" style="font-family:Tahoma,sans-serif;font-size:13px;text-align:justify;"&gt;CGHEA0002670&amp;#39;);&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;(Thanks to John Perona for posting this info in the Sage partner forums)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41491" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</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+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/customization/archive/tags/scripting/default.aspx">scripting</category><category domain="http://customerfx.com/pages/customization/archive/tags/Reports/default.aspx">Reports</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>1</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;&amp;nbsp; &lt;br /&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/SalesLogix+LAN+Client/default.aspx">SalesLogix LAN Client</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+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/customization/archive/tags/SQL/default.aspx">SQL</category></item><item><title>Message box dialogs in the SalesLogix web client</title><link>http://customerfx.com/pages/customization/2010/01/14/message-box-dialogs-in-the-saleslogix-web-client.aspx</link><pubDate>Thu, 14 Jan 2010 13:58:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41412</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=41412</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/01/14/message-box-dialogs-in-the-saleslogix-web-client.aspx#comments</comments><description>&lt;p&gt;In the web client,&amp;nbsp; there&amp;#39;s not an easy way to present the user with a multiple choice dialog.&amp;nbsp; One quick and dirty way to do this is to create a new form to function as a dialog.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First, I created a basic ticket form.&amp;nbsp; This will be used in the ticket area, so I created a new form under this entity.&amp;nbsp; On this, I added a column and a couple of rows.&amp;nbsp; I dropped a label control on the form and set the Row and Column span properties to 2.&amp;nbsp; In the remaining areas I dropped a button control on each.&amp;nbsp; Finally, set the caption properties for the buttons and the label.&amp;nbsp; You don&amp;#39;t have that much control over the placement of the buttons, so to keep them together, I went to the columns property of the form and set the left column to a width of 90% and the right column to a with of 10%&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/WebDialogBasic.JPG"&gt;f&lt;img src="http://customerfx.com/blogs/customization/WebDialogBasic.JPG" border="0" height="177" width="490" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;We will need to add our new dialog to the list of available smartparts for the Ticket entity.&amp;nbsp; In the portal manager, Under Sage SalesLogix and Pages, open the Ticket Detail page.&amp;nbsp; On the Smartparts tab, add the new dialog and set the&lt;b&gt; Target Workspace&lt;/b&gt; property to &amp;quot;Dialog Workspace&amp;quot;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;To launch the form, we simply need to call the DialogWorkspace Javascript API:&lt;br /&gt;&lt;/p&gt;&lt;p style="font-weight:bold;font-style:italic;"&gt;ScriptManager.RegisterClientScriptBlock(this.Page, GetType(), &amp;quot;InvokeYesNoQuestion&amp;quot;, &amp;quot;DialogWorkspace.show({ id: &amp;#39;TicketYesNoDialog&amp;#39;, width: &amp;#39;400&amp;#39;, height: &amp;#39;100&amp;#39;, top: &amp;#39;300&amp;#39;, left: &amp;#39;300&amp;#39;});&amp;quot;, true); &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://customerfx.com/blogs/customization/WebDialog.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/WebDialog.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;There we have it!&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Using this method has a couple of downsides:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;This dialog is very much &amp;quot;single use&amp;quot;.&amp;nbsp; You would have to create a new form for every dialog you would want to launch.&lt;/li&gt;&lt;li&gt;When launched from a code snippet, the process doesn&amp;#39;t stop when this form is opened.&amp;nbsp; Any logic stemming from a choice on this dialog must be performed on the form itself.&amp;nbsp; There is no way to pass the result of what button is selected to the originating script.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Well, there you go.&amp;nbsp; Not perfect, but a relatively simply method for launching a yes/no dialog in the SalesLogix web client&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks for reading! &amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41412" 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+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/customization/archive/tags/DialogWorkspace/default.aspx">DialogWorkspace</category></item><item><title>Area/Category/Issue headache in SalesLogix Web</title><link>http://customerfx.com/pages/customization/2010/01/06/area-category-issue-headache-in-saleslogix-web.aspx</link><pubDate>Wed, 06 Jan 2010 14:39:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41388</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=41388</wfw:commentRss><comments>http://customerfx.com/pages/customization/2010/01/06/area-category-issue-headache-in-saleslogix-web.aspx#comments</comments><description>&lt;p&gt;Ah, the SalesLogix Web Client...  Having worked with SalesLogix for over a decade, I feel as though there&amp;#39;s not a whole lot I can&amp;#39;t do with the LAN client.  The Web client however....  Well, it seems like I encounter challenges with it every day.&lt;/p&gt;&lt;p&gt;I have a project that I&amp;#39;m currently working on that requires me to revert values from the Ticket-level ACI control if certain conditions are not met (including what ACI values are selected) when the values are modified.  This has proved to be a challenge, to say the least.  Apparently, I can&amp;#39;t seem to get the current values of the individual Area Category and Issue entity objects on the On Change event of the dplArea control.  Instead, it returns the previous values (before the change) making it rather difficult to evaluate what HAS BEEN selected.  Ironically, it would make reverting to the previous values much easier since I wouldn&amp;#39;t have to use the IChangedState interface, but I can&amp;#39;t evaluate things in the first place.&lt;/p&gt;&lt;p&gt;Unfortunately, I don&amp;#39;t have any solutions... no happy endings.  At least, not yet.  I hope to follow this post up with a solution to my little problem in the near future.  In the meantime, I&amp;#39;m going back to working the issue, along with the growing desk-shaped bruse on my forehead.&lt;/p&gt;&lt;p&gt;Thanks for reading!  Please stay tuned!  :)&lt;/p?&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41388" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Controls/default.aspx">Controls</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+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/customization/archive/tags/ACI/default.aspx">ACI</category></item><item><title>Become a Fan of Customer FX on Facebook / Twitter</title><link>http://customerfx.com/pages/customization/2009/11/18/become-a-fan-of-customer-fx-on-facebook-twitter.aspx</link><pubDate>Wed, 18 Nov 2009 06:28:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41118</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=41118</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/11/18/become-a-fan-of-customer-fx-on-facebook-twitter.aspx#comments</comments><description>&lt;p&gt;If you&amp;#39;ve been following our blogs, such as mine or our others written by &lt;a href="http://customerfx.com/controlpanel/blogs/pages/crmdeveloper/default.aspx" target="_blank"&gt;Ryan Farley&lt;/a&gt;, &lt;a href="http://customerfx.com/pages/integrationblog/default.aspx" target="_blank"&gt;Kris Halsrud&lt;/a&gt; and &lt;a href="http://customerfx.com/pages/reporting/default.aspx"&gt;George Jensen&lt;/a&gt; (among others), we now have feeds set up on both &lt;a href="http://twitter.com/customerfx" target="_blank"&gt;Twitter&lt;/a&gt; and &lt;a href="http://www.facebook.com/pages/Saint-Paul-MN/Customer-FX-Corporation/56143046871%20" target="_blank"&gt;Facebook&lt;/a&gt;!&amp;nbsp; These feeds are a great and easy way to stay on top of new information relevant to SalesLogix, SageCRM and all the great content that comes out of Customer FX.&lt;/p&gt;&lt;p&gt;We here at Customer FX strongly believe that information should be shared freely, and our blogs provide tons of useful information regarding a wide array of topics to help you through your own CRM implementation.&amp;nbsp; We are also extremely excited about our new &lt;a href="http://customerfx.com/pages/crmdeveloper/2009/10/14/announcing-git-extensions-for-saleslogix-and-the-customer-fx-open-source-initiative.aspx" target="_blank"&gt;Open Source Initiative&lt;/a&gt; using Git Extensions, which provides a whole new way to share... not just our knowledge, but our source code as well!&lt;br /&gt;&lt;/p&gt;So, please follow our feeds on both &lt;a href="http://twitter.com/customerfx" target="_blank"&gt;Twitter&lt;/a&gt; and &lt;a href="http://www.facebook.com/pages/Saint-Paul-MN/Customer-FX-Corporation/56143046871%20" target="_blank"&gt;Facebook&lt;/a&gt;.&amp;nbsp; Thank you very much for helping us to become one of the best online sources for information on SalesLogix, SageCRM and more!&lt;p&gt;Jason &lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41118" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Sage+CRM/default.aspx">Sage CRM</category><category domain="http://customerfx.com/pages/customization/archive/tags/Twitter/default.aspx">Twitter</category><category domain="http://customerfx.com/pages/customization/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://customerfx.com/pages/customization/archive/tags/Blogs/default.aspx">Blogs</category><category domain="http://customerfx.com/pages/customization/archive/tags/Facebook/default.aspx">Facebook</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customer+FX/default.aspx">Customer FX</category></item><item><title>Type/Subtype issue in SLX Web 7.5.1</title><link>http://customerfx.com/pages/customization/2009/11/11/type-subtype-issue-in-slx-web-7-5-1.aspx</link><pubDate>Wed, 11 Nov 2009 11:33:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41097</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=41097</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/11/11/type-subtype-issue-in-slx-web-7-5-1.aspx#comments</comments><description>&lt;p&gt;Before I get back to Sage CRM topics, I wanted to mention an issue I bumped into an issue in a couple of SLX 7.5.1 databases.&lt;/p&gt;&lt;p&gt;Account Type/Subtype combination are generally pretty easy to set up.&amp;nbsp; You just need to create a picklist and name it using the &amp;quot;Code&amp;quot; value for an item in the Account Type Picklist. (For &amp;quot;Lead&amp;quot; for example, create a picklist named &amp;quot;Account Lead&amp;quot; for example).&amp;nbsp; This works fine in most cases, however I discovered that on the insert contact/account screen, it doesn&amp;#39;t quite work correctly.&lt;/p&gt;&lt;p&gt;When you select a type value on this screen, the correct subtype does not come up.&amp;nbsp; If you change type to a different value at that point, you&amp;#39;ll get the sub type list from the first item you selected.&amp;nbsp; Account Type and Subtype show up in three areas; Account Detail, Insert Account and Insert Contact Account.&amp;nbsp; For all three, a business rule called &amp;quot;GetSubTypePickListName()&amp;quot; is called on the LoadAction of the form.&amp;nbsp; This works fine in Account Detail and Insert Account, but not on Insert Contact/Account.&amp;nbsp; To fix this on this view, I wanted to move that business rule from the load action of the form to the ChangedValue action of the Type Picklist itself.&lt;/p&gt;&lt;p&gt;This would be easy to do on the first two forms if it were necessary, since you have an actual view in Application Architect to work with.&amp;nbsp; On the Insert Contact/Account view, you have to modify code within the smart part itself so it gets a little more complicated.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;First of all, we need to find the smartpart.&amp;nbsp; This can be found in the Project Explorer under Portal Manager-&amp;gt; Sage SalesLogix-&amp;gt; SupportFiles-&amp;gt; Pages.&amp;nbsp; Right-Click Insert Contact/Account in this area, and click &amp;quot;Edit Page&amp;quot;.&lt;/p&gt;&lt;p&gt;Once the code is open, we basically need to make three changes:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In the OnLoad method, comment out or remove the line that reads &lt;b&gt;pklAccountSubType.PickListName = account.GetSubTypePickListName();&lt;/b&gt;&lt;/li&gt;&lt;li&gt;In the OnWireEventHandlers method, we need to add a line to include a change action event to the Type picklist control. I threw in a line &lt;b&gt;pklAccountType.PickListValueChanged += pklAccountType_ChangeAction();&lt;/b&gt; under the first line in that method that reads &lt;b&gt;base.OnWireEventHandlers();&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Finally, we need to create the new method we&amp;#39;ve referenced in Step 2.&amp;nbsp; I basically took the code from the OnLoad event, and stripped out everything except the reference to the business rule, and code to set up the Entity objects within that method:&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; protected void pklAccountType_ChangeAction(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IContact contact = (BindingSource.Current as IContact);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; IAccount account; &lt;br /&gt;&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; if (contact != null)&lt;br /&gt;&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; if (!Page.IsPostBack)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; contact.Account = account;&lt;br /&gt;&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; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; account = contact.Account;&lt;br /&gt;&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; if (account != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountSubType.PickListName = account.GetSubTypePickListName();&lt;br /&gt;&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; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/blockquote&gt;&lt;blockquote&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;p&gt;That should be it.&amp;nbsp; Please note, however; that the code I listed above may require some tweaking.&amp;nbsp; (The DB I originally modified is not currently available to me, and I put the code example here largely from memory.&amp;nbsp; I thought I had run into an issue when defining the Account Entity object, so I&amp;#39;ll update this post with the final code once I get a chance to double check what I had originally done.)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks!&amp;nbsp; I hope you find this post helpful. &amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41097" 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+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/customization/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/customization/archive/tags/Forms/default.aspx">Forms</category><category domain="http://customerfx.com/pages/customization/archive/tags/Type/default.aspx">Type</category><category domain="http://customerfx.com/pages/customization/archive/tags/SubType/default.aspx">SubType</category></item><item><title>SageCRM - Building Workslips Part 1</title><link>http://customerfx.com/pages/customization/2009/10/28/Sage-CRM-_2D00_-Building-Workslips-Part-1.aspx</link><pubDate>Wed, 28 Oct 2009 12:37:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:41056</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=41056</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/10/28/Sage-CRM-_2D00_-Building-Workslips-Part-1.aspx#comments</comments><description>&lt;p&gt;Over the next few weeks, I&amp;#39;ll be posting a walk-through which will outline building a Workslips module for SageCRM. In this part, I&amp;#39;ll cover creating a new table, and defining fields in that table.&lt;br /&gt;&lt;br /&gt;We&amp;#39;re going to start with creating new table structure to hold basic Workslip information.&amp;nbsp; First we have to define the Workslip table. In SageCRM, got to Administration-&amp;gt;Advanced Customization-&amp;gt;Tables and Databases and then click the &amp;quot;Create Table&amp;quot; button&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://customerfx.com/blogs/customization/CRMNewTableButtons.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMNewTableButtons.JPG" border="0" alt="" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;This will open the for where we enter the table details:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMTableDetails2.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMTableDetails2.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We&amp;#39;ll set the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Table Name:&amp;nbsp; Workslip&lt;/li&gt;
&lt;li&gt;ID Field Name:&amp;nbsp; Workslip_WorkslipID (Primary key for table)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Top Level Entity: Yes &lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Company Id Field: Workslip_CompanyID (Foreign key to Company table)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Table Caption: Workslip&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Column Prefix: Workslip (All fields defined in this table will be prefixed by &amp;quot;Workslip_&amp;quot;)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Person Id Field: Workslip_PersonID (Foreign key to Person table)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;User Id Field: Workslip_UserID (Foreign Key to User table)&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Solo Options: Filter by Company/Person&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Click the &amp;quot;Save&amp;quot; button to create the new table. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Now that the table has been created, we have to define the fields in the table.&amp;nbsp; Under Administration-&amp;gt;Customization, we should now see the new Workslip Entity under the Primary Entities.&amp;nbsp; Click &amp;quot;Workslips&amp;quot; and make sure you are on the &amp;quot;Fields&amp;quot; tab.&amp;nbsp; Click the &amp;quot;new&amp;quot; button to add fields.&lt;/p&gt;
&lt;p&gt;In SageCRM,&amp;nbsp; the individual field definitions contain format settings that define which control is used, and how the control will ultimately be rendered in the client.&amp;nbsp; We&amp;#39;re just going to add a couple fields for now.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;The first field we will add is a memo-style, description field:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMDescriptionProperties.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMDescriptionProperties.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The field type of &amp;quot;Multiline Text&amp;quot; will display a multi-line memo field.&amp;nbsp; Set the width and height to define the size of the control once it is added to a form.&lt;/p&gt;
&lt;p&gt;Next, we will add a Workslip Number field:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMWorkslipNumberProperties.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMWorkslipNumberProperties.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This is just a standard text field, with Max Length and Width fields defined as well.&lt;/p&gt;
&lt;p&gt;Additional fields can be added as required.&amp;nbsp; Definitions of other field types can be found &lt;a title="Field types in Sage CRM" href="http://customerfx.com/pages/customization/2009/10/14/FieldTypes-in-Sage-CRM.aspx"&gt;here.&lt;/a&gt;&amp;nbsp; System fields, such as the foreign keys for Company, Person and user numbers have been already created for you.&amp;nbsp; I&amp;#39;ll be adding some additional fields, and in the next post for this walkthrough, we&amp;#39;ll start getting into creating Lists and Screens.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thanks for reading! &amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41056" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</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/Sage+CRM/default.aspx">Sage CRM</category></item><item><title>FieldTypes in Sage CRM</title><link>http://customerfx.com/pages/customization/2009/10/14/FieldTypes-in-Sage-CRM.aspx</link><pubDate>Wed, 14 Oct 2009 12:03:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40986</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=40986</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/10/14/FieldTypes-in-Sage-CRM.aspx#comments</comments><description>&lt;p&gt;I wanted to take this post to outline some of the common field types that are available within Sage CRM, for anyone new to development within Sage CRM.&amp;nbsp; These are defined under the Fields tab under Administration/Customization/{EntityName}.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;*Note - not only to field names need to be unique, field Captions must be unique as well.&amp;nbsp; It&amp;#39;s a bit of a pain, since you cannot have two separate fields on two different views that have the same caption. &lt;/p&gt;&lt;p&gt;Most of these properties are the same, but I&amp;#39;ve noted differences where they exist: &lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Text:&lt;/span&gt;&amp;nbsp; &lt;span style="font-style:italic;"&gt;Standard Text field&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name - &lt;span style="font-style:italic;"&gt;Field name in the Entity Table&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Caption - &lt;span style="font-style:italic;"&gt;Caption Displayed in Sage CRM&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Max Length - &lt;span style="font-style:italic;"&gt;Field Length of within the Entity Table&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Entry Width - &lt;span style="font-style:italic;"&gt;With of the field as it is displayed in Sage CRM&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Default - &lt;span style="font-style:italic;"&gt;(Optional) default value for the control.&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;CheckBox:&lt;/span&gt;&amp;nbsp; &lt;span style="font-style:italic;"&gt;Standard Boolean field&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name&lt;/li&gt;&lt;li&gt;Caption &lt;br /&gt;&lt;/li&gt;&lt;li&gt;Default - &lt;span style="font-style:italic;"&gt;(Optional)&amp;nbsp; Checked or Unchecked&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Phone Number/Email Address/WWW URL:&lt;/span&gt;&amp;nbsp; &lt;span style="font-style:italic;"&gt;Specialized entry fields including formatting for specific data&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name&lt;/li&gt;&lt;li&gt;Caption&lt;/li&gt;&lt;li&gt;Max Length&lt;/li&gt;&lt;li&gt;Entry Width&lt;/li&gt;&lt;li&gt;Default&lt;/li&gt;&lt;/ul&gt;&lt;li style="font-weight:bold;"&gt;MultiLine Text: &lt;span style="font-weight:normal;font-style:italic;"&gt;Memo field&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name&lt;/li&gt;&lt;li&gt;Caption&lt;/li&gt;&lt;li&gt;Entry Width - &lt;span style="font-style:italic;"&gt;Since a memo field does not have a fixed width, the width and Height properties are used to define how the field appears on the form&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Entry Height&lt;/li&gt;&lt;li&gt;Default&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Selection:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;Picklist Items&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name&lt;/li&gt;&lt;li&gt;Caption&lt;/li&gt;&lt;li&gt;Selection Height&lt;/li&gt;&lt;li&gt;Lookup Family - &lt;span style="font-style:italic;"&gt;Used to define the picklist used in the control&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Lookup Width px - (Optional)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Default&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Integer/Numeric:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;Standard field for numeric input&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name&lt;/li&gt;&lt;li&gt;Caption&lt;/li&gt;&lt;li&gt;Entry Width&lt;/li&gt;&lt;li&gt;Default&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Date &amp;amp; Time:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;Field to display date and time information with formatting&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name&lt;/li&gt;&lt;li&gt;Caption&lt;/li&gt;&lt;li&gt;Defaul&lt;span style="font-weight:bold;"&gt;t&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span style="font-weight:bold;"&gt;Team Select/User Select:&lt;/span&gt; &lt;span style="font-style:italic;"&gt;Control allowing selection of Teams or Users in Sage CRM&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Column Name&lt;/li&gt;&lt;li&gt;Caption&lt;/li&gt;&lt;li&gt;Selection Height&lt;/li&gt;&lt;li&gt;Default&lt;/li&gt;&lt;li&gt;Search SQL &lt;span style="font-style:italic;"&gt;(User Select only)&amp;nbsp; This optional property allows you to define a SQL statement to search for particular users&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;That&amp;#39;s all for now, but in my next post, I&amp;#39;m going to go step by step through building a new tab based on these types of fields.&amp;nbsp; Stay Tuned!&amp;nbsp; &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;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40986" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</category><category domain="http://customerfx.com/pages/customization/archive/tags/Sage+CRM/default.aspx">Sage CRM</category></item><item><title>Adding/Modifying system menu items in Sage CRM</title><link>http://customerfx.com/pages/customization/2009/09/30/Adding_2F00_Modifying-system-menu-items-in-Sage-CRM.aspx</link><pubDate>Wed, 30 Sep 2009 11:35:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40904</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=40904</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/09/30/Adding_2F00_Modifying-system-menu-items-in-Sage-CRM.aspx#comments</comments><description>&lt;p&gt;By using the Systems Menu functionality, you have the ability to customize the Administration and Main menus in Sage CRM.&amp;nbsp; As an example, I&amp;#39;m going to add a custom menu item to the main Sage CRM
menu to launch the view to create a new Person record in Sage CRM.&lt;/p&gt;&lt;p&gt;System menus are managed under Administration|Advanced Customization|System Menus.&amp;nbsp; Once there, select &amp;quot;Main Menu&amp;quot;.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Caption - The Text displayed under the menu button&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Action - Set to &amp;quot;other&amp;quot; for this example&lt;br /&gt;&lt;/li&gt;&lt;li&gt;System Act - This is the functionality launched by the button.&amp;nbsp; For this example, I&amp;#39;m using &amp;quot;newperson&amp;quot;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Bitmap - The icon that displays on the button&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMCustomizeMainMenu.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMCustomizeMainMenu.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Click &amp;quot;Add&amp;quot; to add the new menu item to the main menu, and click &amp;quot;Save&amp;quot; to commit the change.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMModifiedMenu.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMModifiedMenu.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That&amp;#39;s all there is to it.&amp;nbsp; You now can directly create a new Person record from the main menu.&amp;nbsp; There are many different functionality options that can be launched via a new main menu item.&amp;nbsp; It&amp;#39;d be worth the time to review the other items under the System Act property to see what else is available.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Hope you find this post helpful.&amp;nbsp; Thanks for Reading! &amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40904" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</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/Sage+CRM/default.aspx">Sage CRM</category></item><item><title>SageCRM Tip - Editing screen definitions - Screen contents missing from screens</title><link>http://customerfx.com/pages/customization/2009/09/17/Sage-CRM-Tip-_2D00_-Editing-screen-definitions-_2D00_-Screen-contents-missing-from-screens.aspx</link><pubDate>Thu, 17 Sep 2009 10:39:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40867</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=40867</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/09/17/Sage-CRM-Tip-_2D00_-Editing-screen-definitions-_2D00_-Screen-contents-missing-from-screens.aspx#comments</comments><description>&lt;p&gt;On the last SageCRM project I worked on, I ran across a little issue with the CRM interface which was causing me a bit of a headache.&amp;nbsp; I was working with a couple of screens I had defined for a custom entity.&amp;nbsp; These screens were similar, so I was doing a lot of comparing one screen to another.&amp;nbsp; Every once and a while, I would notice that the screen contents would disappear from the screen I was reviewing, and I would end up having to rebuild the screen.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;After rebuilding this screen for the Nth time, I figured out what was going on:&amp;nbsp; If you change your mind and do not perform any changes to the screen, you MUST click either &amp;quot;save&amp;quot; or &amp;quot;cancel&amp;quot; to navigate off of the Screen Definition page.&amp;nbsp; Leaving the Screen Definition by simply navigating off the page causes the defined contents to be stripped from the screen.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMEditScreen.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMEditScreen.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Of course, even after I figured that out, I still had to rebuild the view a few more times before leaving the view properly became second nature!&amp;nbsp; Anyway, I hope this brief post saves you some headaches.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Thanks for reading!&amp;nbsp; &lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40867" width="1" height="1"&gt;</description><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/Basics/default.aspx">Basics</category><category domain="http://customerfx.com/pages/customization/archive/tags/Forms/default.aspx">Forms</category><category domain="http://customerfx.com/pages/customization/archive/tags/Sage+CRM/default.aspx">Sage CRM</category></item><item><title>Displaying external data in SageCRM with ASP</title><link>http://customerfx.com/pages/customization/2009/08/26/Displaying-external-data-in-Sage-CRM-with-ASP.aspx</link><pubDate>Wed, 26 Aug 2009 10:30:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40797</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=40797</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/08/26/Displaying-external-data-in-Sage-CRM-with-ASP.aspx#comments</comments><description>&lt;p&gt;In my last blog post, I outlined how to display data from external database in SageCRM 200.&amp;nbsp; This week, I&amp;#39;m going to do the same thing, but instead of connecting to an external datasource through SageCRM, I&amp;#39;m going to display the data using a custom ASP page.&amp;nbsp; If you recall from my last post, we had to create a view so that we could include the required channelID field to be able to display the data in the Team CRM area.&amp;nbsp; One of the benefits of using a custom ASP page is that we can pull directly from the source table without having to add additional data elements.&amp;nbsp; Also, we have the ability to display this view almost anywhere in SageCRM.&amp;nbsp; With the other process, we couldn&amp;#39;t add the page to Companies (for example) without establishing a relationship between the external data and company data.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;First of all, we need to create a simple ASP page displaying the information we wish to see.&amp;nbsp; I&amp;#39;m going to pull in the same data as I did in my last example:&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;set conn=Server.CreateObject(&amp;quot;ADODB.Connection&amp;quot;)&lt;br /&gt;conn.Open&amp;quot;Provider=SQLOLEDB;UID=sa;PWD=CFXPASS;Data Source=crmDev;Initial Catalog=Northwind;&amp;quot;&lt;br /&gt;set rs = Server.CreateObject(&amp;quot;ADODB.recordset&amp;quot;)&lt;br /&gt;sql=&amp;quot;SELECT orderdate, requireddate, shipaddress, shipcity from Orders&amp;quot;&lt;br /&gt;rs.Open sql, conn&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;100%&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;%for each x in rs.Fields&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response.write(&amp;quot;&amp;lt;th&amp;gt;&amp;quot; &amp;amp; x.name &amp;amp; &amp;quot;&amp;lt;/th&amp;gt;&amp;quot;)&lt;br /&gt;next%&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;%do until rs.EOF%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%for each x in rs.Fields%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td&amp;gt;&amp;lt;%Response.Write(x.value)%&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;%next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.MoveNext%&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;%loop&lt;br /&gt;rs.close&lt;br /&gt;conn.close&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Save this file as &amp;quot;Northwind.asp&amp;quot;.&amp;nbsp; Once the file is saved, it needs to reside in the CustomPages folder of the CRM installation.&amp;nbsp; Typically, this is found in &amp;quot;...\CRM\InstallName\WWWRoot\CustomPages&amp;quot;.&lt;/p&gt;
&lt;p&gt;Now that the asp page is saved and in the correct location, go to the same location we added the other Northwind tab.&amp;nbsp; This was under Administration-&amp;gt;Advanced Customization-&amp;gt;System Menus.&amp;nbsp; Once there, edit the &amp;quot;Channel&amp;quot; tab group to add the new tab.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMASPTab.JPG"&gt;&lt;img height="442" src="http://customerfx.com/blogs/customization/CRMASPTab.JPG" width="571" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Set the following properties:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Caption : in this case &amp;quot;Northwind Orders ASP&amp;quot;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Action : Set this to customfile.&amp;nbsp; This will let SageCRM know that this a file in the CustomPages folder&lt;/li&gt;
&lt;li&gt;Custom File : Enter the name of the custom ASP page. (Northwind.asp)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Click Add and then Save to add the new tab.&amp;nbsp; That&amp;#39;s all there is to it!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMNorthWindAsp.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMNorthWindAsp.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This isn&amp;#39;t meant to be an ASP tutorial, so the formatting is pretty simple. However, you can see how simple it is to add a custom ASP page to Sage CRM.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Thanks for reading! &amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40797" width="1" height="1"&gt;</description><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/Basics/default.aspx">Basics</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/ADO/default.aspx">ADO</category><category domain="http://customerfx.com/pages/customization/archive/tags/External+Data/default.aspx">External Data</category><category domain="http://customerfx.com/pages/customization/archive/tags/Sage+CRM/default.aspx">Sage CRM</category><category domain="http://customerfx.com/pages/customization/archive/tags/ASP/default.aspx">ASP</category></item><item><title>Displaying external data in SageCRM 200</title><link>http://customerfx.com/pages/customization/2009/08/19/displaying-external-data-in-sage-crm-200.aspx</link><pubDate>Wed, 19 Aug 2009 08:41:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40775</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=40775</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/08/19/displaying-external-data-in-sage-crm-200.aspx#comments</comments><description>&lt;p&gt;In this post, I will outline a relatively simply process for displaying data in SageCRM from an external data source. &amp;nbsp; To keep this simple, we&amp;#39;re not going to worry about any sort of security, and we&amp;#39;ll save more advanced formatting for another post.&lt;/p&gt;
&lt;p&gt;First of all, we need to create a reference to an external data source.&amp;nbsp; For this example, I&amp;#39;m using the Standard &amp;quot;Northwind&amp;quot; database installed with SQL.&amp;nbsp; To create a connection to an external datasource, click the &amp;quot;Administration&amp;quot;&lt;i&gt; &lt;/i&gt;button, then &amp;quot;Advanced Customization&amp;quot; and finally &amp;quot;Tables and Databases&amp;quot;.&lt;/p&gt;
&lt;p&gt;Once in this area, click the &amp;quot;New Database Connection&amp;quot; button which will presented a Database Details view where you enter your connection information&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMDatabaseDetails.JPG"&gt;&lt;img height="434" src="http://customerfx.com/blogs/customization/CRMDatabaseDetails.JPG" width="551" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve entered the following info:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Database Driver:&amp;nbsp; There are a number of options here, but since I&amp;#39;m connecting to a SQL database, I selected Microsoft SQLServer&lt;/li&gt;
&lt;li&gt;Server Name:&amp;nbsp; The name of the SQL server containing the external database.&lt;/li&gt;
&lt;li&gt;Database Name:&amp;nbsp; The name of the External Database.&lt;/li&gt;
&lt;li&gt;Database Description&lt;/li&gt;
&lt;li&gt;Username/Password:&amp;nbsp; For the sake of this example, I&amp;#39;m simply using the standard sa username/password for this server.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Click &amp;quot;Save&amp;quot; after entering this information.&amp;nbsp; The Northwind database will now display in the list of available Databases, however we still need to include a table.&amp;nbsp; For this example, I&amp;#39;m going to use the &amp;quot;Orders&amp;quot; table in Northwind, but we need to perform a step on the database before we can display information from this table on the Team CRM tab.&lt;/p&gt;
&lt;p&gt;To display on the Team CRM tab, the table needs to contain a field named chan_channelid.&amp;nbsp; This field is used by the Team CRM tab to determine if the current user has access to see this data.&amp;nbsp; For this example, we want all users to see this, so we want this field to contain a value of 5.&amp;nbsp; We could just add a new column and insert that value across the entire table, however to avoid modifying the original source data, I&amp;#39;m going to create a view instead.&lt;/p&gt;
&lt;p&gt;To create the view, I use the following syntax in SQL Query anaylizer:&lt;/p&gt;
&lt;p style="MARGIN-LEFT:40px;"&gt;create view vOrders as select 5 as chan_channelid, * from orders&lt;/p&gt;
&lt;p&gt;I now have a view named &amp;quot;vOrders&amp;quot; which I can use in SageCRM&lt;/p&gt;
&lt;p&gt;Back under Administration|Advanced Customizations|Tables and Databases, click the&amp;nbsp; &amp;quot;New Table Connection&amp;quot; button to bring up the table details view:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMTableDetails.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMTableDetails.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;On this view, we need to fill in the following information:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Table Name:&amp;nbsp; This is the name of the view we created earlier&lt;/li&gt;
&lt;li&gt;Table Caption:&amp;nbsp; This is the caption by which the table (view) will be identified in SageCRM (Note: This value cannot contain spaces)&lt;/li&gt;
&lt;li&gt;Database:&amp;nbsp; This pull-down should contain the Northwind database that we created the connection to earlier. &lt;br /&gt;&lt;/li&gt;
&lt;li&gt;ID Field Name:&amp;nbsp; For this example, we&amp;#39;re going to leave this value blank for now.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Click &amp;quot;Save&amp;quot; on this view.&amp;nbsp; The data from the Northwind Orders table will now be available in SageCRM&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now that we&amp;#39;ve created connections to the Northwind table and Orders database (via a view), we need to create a list view containing Orders data.&amp;nbsp; Go to Administration|Customizations.&amp;nbsp; You should find the entry for &amp;quot;NorthwindOrders&amp;quot; listed in the Secondary entities pull-down.&amp;nbsp; Once that is selected, click the &amp;quot;Lists&amp;quot; tab, and click the &amp;quot;New&amp;quot; Button:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMListDefinition.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMListDefinition.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For the New List Definition, we simply need to enter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Name:&amp;nbsp; This is the descriptive name of the List view&lt;/li&gt;
&lt;li&gt;Table/View:&amp;nbsp; the name of our view (vOrders)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Click Save, and then click the &amp;quot;Customize&amp;quot; button next to the newly created view to define the columns to display:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMListDefinitionColumns.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMListDefinitionColumns.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;On this view, add whichever fields you want to display and click &amp;quot;Save&amp;quot; to finish configuring the new list view.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now that we have our list view created, the only step remaining is to add the list view to the Team CRM area.&amp;nbsp; To add a new tab to Team CRM, go to Administration|Advanced Customization and click on &amp;quot;System Menus&amp;quot;.&amp;nbsp; The tabs under Team CRM are defined in the &amp;quot;Channel&amp;quot; tab group, so click &amp;quot;Customize&amp;quot; next to that entry:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMCustomizeTabsForChannel.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMCustomizeTabsForChannel.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here, we need to set three values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Caption:&amp;nbsp; This will display on the tab under Team CRM&lt;/li&gt;
&lt;li&gt;Action: Run Block&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Block Name:&amp;nbsp; This is the Caption we defined for the list view.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Click Save, and we are done!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/CRMNewTabComplete.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/CRMNewTabComplete.JPG" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;If we wanted to do additional formatting, say on the date fields or column captions, I would make those sort of changes in the view we created.&amp;nbsp; Otherwise, this is a pretty simply method to display external data within SageCRM.&amp;nbsp; In future postings on SageCRM, I&amp;#39;ll try to get into adding data related to existing entites and possibly dig more into user security topics.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I hope you find this helpful, or at least interesting.&amp;nbsp; Thanks for reading! &amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40775" width="1" height="1"&gt;</description><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/How-To/default.aspx">How-To</category><category domain="http://customerfx.com/pages/customization/archive/tags/Forms/default.aspx">Forms</category><category domain="http://customerfx.com/pages/customization/archive/tags/External+Data/default.aspx">External Data</category><category domain="http://customerfx.com/pages/customization/archive/tags/Sage+CRM/default.aspx">Sage CRM</category></item><item><title>Using Picklist data revisited</title><link>http://customerfx.com/pages/customization/2009/08/12/Using-Picklist-data-revisited.aspx</link><pubDate>Wed, 12 Aug 2009 11:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40754</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=40754</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/08/12/Using-Picklist-data-revisited.aspx#comments</comments><description>&lt;p&gt;Back in January, I posted about the SalesLogix picklist data structure, and outlined how to use the data found in the picklist table to populate other controls such as comboboxes and listboxes.&amp;nbsp; You can find that article &lt;a href="http://customerfx.com/pages/customization/2009/01/06/Understanding-SalesLogix-Picklists-data-structure.aspx" title="Understanding SalesLogix Picklists data structure" target="_blank"&gt;here&lt;/a&gt;.)&amp;nbsp; If you are performing customizations to version 7.2 or later of SalesLogx, this processes can be greatly simplified by using Application.Picklist instead of directly querying the database.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;By using Application.Picklist, you no longer need to understand how SalesLogix stores picklist data.&amp;nbsp; This also serves to clean up your code, since you don&amp;#39;t have to look at the picklist table.&lt;/p&gt;&lt;p&gt;As an example, here is code populating a ListBox control with the values from the &amp;quot;Contact Type&amp;quot; picklist. &lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Dim x &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Set objList = Application.PickLists.Item(&amp;quot;Contact Type&amp;quot;)&lt;br /&gt;    ListBox1.Items.Clear&lt;br /&gt;    For x = 0 To objList.Count - 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;        ListBox1.Items.Add(objList.Item(x))&lt;br /&gt;    Next&lt;br /&gt;    Set objList = Nothing&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That&amp;#39;s all there is to it.&amp;nbsp; Much simpler than looking at the picklist data directly via a query.&amp;nbsp; Remember though, Application.picklists is ONLY available on implementations of SalesLogix version 7.2 or greater.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Thanks for reading!&amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40754" width="1" height="1"&gt;</description><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/Controls/default.aspx">Controls</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/Basics/default.aspx">Basics</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/vbscript/default.aspx">vbscript</category><category domain="http://customerfx.com/pages/customization/archive/tags/Picklists/default.aspx">Picklists</category></item><item><title>Using SQL views to incorporate external data into SalesLogix cusomizations</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/SalesLogix+LAN+Client/default.aspx">SalesLogix LAN Client</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</category><category domain="http://customerfx.com/pages/customization/archive/tags/datagrid/default.aspx">datagrid</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/SQL/default.aspx">SQL</category></item><item><title>Events based on history in version 6.x SalesLogix</title><link>http://customerfx.com/pages/customization/2009/07/08/events-based-on-history-in-version-6-x-saleslogix.aspx</link><pubDate>Wed, 08 Jul 2009 10:43:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40664</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=40664</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/07/08/events-based-on-history-in-version-6-x-saleslogix.aspx#comments</comments><description>&lt;p&gt;Prior to version 7, there was limited access to those activity and history areas in SalesLogix.&amp;nbsp; In a recent project, I had to perform a series of tasks upon completing an activity with a particular Type/Category/Result combination.&amp;nbsp; This had to be done in a 6.2.1 system.&amp;nbsp; In order to do this, I had to modify the OnCompletedActivity active script.&amp;nbsp; I wanted to briefly outline the modifications I made to this area for anyone who is running an older version of SalesLogix.&lt;/p&gt;
&lt;p&gt;Basically, I needed to look at a completed todo activity with a certain Category, and then update the associated contact and/or opportunity status values depending on the Result of the completed activity.&amp;nbsp; I created a subroutine named &amp;quot;ToDoActivityOperations&amp;quot; which I call via the Sub Main in the OnCompletedActivity Script&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sub ToDoActivityOperations&lt;br /&gt;Dim strSql, objRS&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS = objSLXDB.GetNewRecordSet&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-WEIGHT:bold;"&gt;(After creating a recordset, I open a sql statement retuning ContactID, OppID, and result from the history table that have the correct activity type)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSql = &amp;quot;SELECT OPPORTUNITYID, CONTACTID, RESULT, TYPE, CATEGORY FROM HISTORY &amp;quot; &amp;amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;WHERE ACTIVITYID = &amp;#39;&amp;quot; &amp;amp; vActivityID &amp;amp; &amp;quot;&amp;#39; and type = &amp;#39;&amp;quot; &amp;amp; &amp;quot;262147&amp;quot; &amp;amp; &amp;quot;&amp;#39;&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS.Open strSql, objSLXDB.Connection&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-WEIGHT:bold;"&gt;(In my next step, I check to see if any records were returned.&amp;nbsp; Then I get the values from the history record) &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If objRS.RecordCount &amp;lt;&amp;gt; 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strOpportunityID = objRS.Fields(&amp;quot;OPPORUNITYID&amp;quot;).Value &amp;amp; &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strContactID = objRS.Fields(&amp;quot;CONTACTID&amp;quot;).Value &amp;amp; &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strResult = objRS.Fields(&amp;quot;RESULT&amp;quot;).Value &amp;amp; &amp;quot;&amp;quot;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="FONT-WEIGHT:bold;"&gt;&amp;nbsp;(Based on the result value, I call additional subroutines I&amp;#39;ve written to update Opportunity and Status record values&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If lcase(result) = &amp;quot;rejected&amp;quot; Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If strOpportunityID &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then UpdateOpportunityStatus &amp;quot;Closed - Rejected&amp;quot;, strOpportunityID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If strContactID &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then UpdateContactStatus &amp;quot;SRL&amp;quot;, strContactID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Elseif lCase(result) = &amp;quot;accepted&amp;quot; Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If strOpportunityID &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then UpdateOpportunityStatus &amp;quot;SAL&amp;quot;, strOpportunityID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If strContactID &amp;lt;&amp;gt; &amp;quot;&amp;quot; Then UpdateContactStatus &amp;quot;SAL&amp;quot;, strContactID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objRS = nothing&lt;br /&gt;&lt;br /&gt;End Sub &lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;That was all there was to it.&amp;nbsp; It would be nice to be able to edit activity and history views, but short of upgrading to the current version of SalesLogix, this at least allows some degree of control whenever activities are completed.&lt;/p&gt;
&lt;p&gt;I hope you find this helpful.&amp;nbsp; Thanks again for reading!&amp;nbsp;&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;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40664" width="1" height="1"&gt;</description><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/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</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/vbscript/default.aspx">vbscript</category></item><item><title>Populating AutoComplete Strings</title><link>http://customerfx.com/pages/customization/2009/07/01/populating-autocomplete-strings.aspx</link><pubDate>Wed, 01 Jul 2009 12:27:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40644</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=40644</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/07/01/populating-autocomplete-strings.aspx#comments</comments><description>&lt;p&gt;I recently had a project which required me to populate the strings collection in an AutoComplete control from data contained in the database.&amp;nbsp; I wanted to take a second to outline how I populate the control&amp;#39;s strings, as well as create a reusable script to simplify the process in the future. &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;The FillAutoCompleteString method I&amp;#39;ve created is pretty simple.&amp;nbsp; It accepts parameters for the control name, as well as Select, from and where clauses to build a SQL statement.&amp;nbsp; (The Where parameter is optional, but you do need to pass at least a blank string.)&lt;/p&gt;
&lt;p&gt;The method simply loops through a recordset based on the SQL parameters provided, and writes each item to the autocomplete control. &lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Sub FillAutoCompleteString(ByRef objControl, ByVal strSelect, ByVal strFrom, ByVal strWhere)&lt;br /&gt;Dim objNames&lt;br /&gt;Dim sSql&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objControl.Strings.Clear&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objNames = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; With objNames&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set .ActiveConnection = Application.GetNewConnection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .LockType = 1 &amp;#39;adLockReadOnly&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorLocation = 3 &amp;#39;adUseClient&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorType = 0 &amp;#39;adOpenForwardOnly&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sSql = &amp;quot;select &amp;quot; &amp;amp; strSelect &amp;amp; &amp;quot; from &amp;quot; &amp;amp; strFrom &amp;amp; &amp;quot; product&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Len(trim(strWhere &amp;amp; &amp;quot;&amp;quot;)) &amp;gt; 0 Then&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; sSql = sSql &amp;amp; &amp;quot; where &amp;quot; &amp;amp; strWhere&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Open sSql&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While Not (.BOF or .EOF)&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; objControl.Strings.Add(.Fields(strSelect).Value &amp;amp; &amp;quot;&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .MoveNext&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wend&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objNames = Nothing&lt;br /&gt;&lt;br /&gt;End Sub &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;I put together a simple test form to check out the functionality.&amp;nbsp; After adding a &amp;quot;Select&amp;quot; and &amp;quot;From&amp;quot; value, clicking the Fill AutoComplete Strings button will add those items to the Autocomplete control.&amp;nbsp; The user will now be presented with a list of potential items, based on the characters they&amp;#39;ve entered.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/autocompletescreen.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/autocompletescreen.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Obvously, querying the database in this way can be slow if dealing with an exceptionaly large database, so keep that in mind.&amp;nbsp; Otherwise, feel free to use this code in your own implementations.&amp;nbsp; Thanks for reading!&amp;nbsp; &lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40644" width="1" height="1"&gt;</description><enclosure url="http://customerfx.com/pages/customization/attachment/40644.ashx" length="3625" type="application/x-zip-compressed" /><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/Basics/default.aspx">Basics</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/Autocomplete/default.aspx">Autocomplete</category></item><item><title>Using the Forms collection in the SalesLogix LAN client</title><link>http://customerfx.com/pages/customization/2009/06/24/using-the-forms-collection-in-the-saleslogix-lan-client.aspx</link><pubDate>Wed, 24 Jun 2009 17:56:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40626</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=40626</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/06/24/using-the-forms-collection-in-the-saleslogix-lan-client.aspx#comments</comments><description>&lt;p&gt;From time to time, you may find that you want to reference a control or script on a form other than the one you are currently on.&amp;nbsp; This can be done easily using the Forms collection in SalesLogix.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;The first thing we need to do is to loop through all open forms, checking for the desired form.&amp;nbsp; For this example, we&amp;#39;ll look for the Contact Detail form.&amp;nbsp; (Note:&amp;nbsp; we&amp;#39;re looking for the value contained within the &amp;quot;Name&amp;quot; property of the form we are looking for.):&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim frm&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim x&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For x = 0 to Application.Forms.Count - 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Application.Forms(x).Name = &amp;quot;frmContactDetail&amp;quot; Then&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; Set frm = Application.Forms(x)&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; Exit For&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next &lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Once this code runs, we should have an object (frm) containing a reference to that form.&amp;nbsp; If the form is not found, the code will return null, which we should look for before trying to manipulate anything&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not frm Is Nothing Then&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If &lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Any references should be done within that IF statement.&amp;nbsp; To access properties, you just need to include the form object (frm.&lt;i&gt;{control}.{property}&lt;/i&gt;).&amp;nbsp; For scripts, you&amp;#39;ll need to access the forms Scripts collection (frm.scripts.&lt;i&gt;{sub or function name}&lt;/i&gt;)&lt;/p&gt;&lt;p&gt;That&amp;#39;s all there is to it.&amp;nbsp; All in all, pretty easy, right? &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Keep in mind,&amp;nbsp; this does require that the form you want to reference actually be open. &amp;nbsp; If you want access to information to information on an uninitiated form, you&amp;#39;ll need to access the appropriate tables directly.&lt;/p&gt;&lt;p&gt;Hope you find this post helpful.&amp;nbsp; Thanks again for reading&amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40626" width="1" height="1"&gt;</description><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/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</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/vbscript/default.aspx">vbscript</category><category domain="http://customerfx.com/pages/customization/archive/tags/scripting/default.aspx">scripting</category><category domain="http://customerfx.com/pages/customization/archive/tags/Forms/default.aspx">Forms</category><category domain="http://customerfx.com/pages/customization/archive/tags/Forms+Collection/default.aspx">Forms Collection</category></item><item><title>Utilizing Spell-Check functionality in SalesLogix 7.5 LAN</title><link>http://customerfx.com/pages/customization/2009/06/11/utilizing-spell-check-functionality-in-saleslogix-7-5-lan.aspx</link><pubDate>Thu, 11 Jun 2009 10:14:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40599</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=40599</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/06/11/utilizing-spell-check-functionality-in-saleslogix-7-5-lan.aspx#comments</comments><description>&lt;p&gt;If you&amp;#39;ve ever wanted to implement some sort of Spell Check functionality within your SalesLogix database, you&amp;#39;re in luck!&amp;nbsp; The Standard Spell Check vbScript makes it simple to add this functionality to your custom forms. &lt;b&gt;*Note: Microsoft Word must be installed on the local machine.&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;For this example, I&amp;#39;ll set up Spell Check functionality in a standard Memo field.&amp;nbsp; There are two ways to implement this sort of functionality:&lt;/p&gt;&lt;p&gt;1: &amp;nbsp; Using the Standard Memo popup.&amp;nbsp; This method will launch an generic edit view for the memo field which includes &amp;quot;Spell Check&amp;quot; as a right-click menu option.&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;First of all, we need to create a form.&amp;nbsp; For this example, we simply need an Account form containing a Memo control, and a button to launch the Standard memo popup.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/MemoSpellCheckView1.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/MemoSpellCheckView1.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;In the code for this form, we will first want to include the System:Spell Check.&amp;nbsp; Once the script is included, add the following code to the Button&amp;#39;s click event: &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Sub Button1Click(Sender)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; InvokeStandardMemoPopup Memo1, &amp;quot;Spell Check This form&amp;quot;, False&lt;br /&gt;End Sub&lt;/b&gt; &lt;/p&gt;&lt;p&gt;This subroutine takes three parameters. The first is the name of the Memo control, followed by a Caption for the form we are launching.&amp;nbsp; The final parameter is a boolean designating if a time/date stamp should be added to the invoked form.&lt;/p&gt;&lt;p&gt;Upon clicking the button, you are now presented with the standard memo popup view.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/MemoPopup.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/MemoPopup.JPG" border="0" width="687" height="365" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;If you right click in the view, you will see a &amp;quot;Spell Check&amp;quot; item included in the menu. &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;That was pretty easy to set up.&amp;nbsp; However, if you don&amp;#39;t want to present an additional view to the end user, you can add the functionality directly into your memo control.&lt;/p&gt;&lt;p&gt;&amp;nbsp;2:&amp;nbsp; Adding spellcheck functionality to a memo control.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;We&amp;#39;ll use the same form as before, but we will need to add A PopupMenu control to the form.&amp;nbsp; We&amp;#39;ll need to set up the PopupMenu items to include &amp;quot;Spell Check&amp;quot; as a menu item.&amp;nbsp; Double click the PopupMenu&amp;#39;s Items property and add these items:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/PopupMenuSettings.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/PopupMenuSettings.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;We&amp;#39;ll also need to add the following code to the PopupMenu control&amp;#39;s &amp;quot;OnClick&amp;quot; event:&lt;/p&gt;&lt;p&gt;&lt;b&gt;Sub PopupMenu1Click(Sender, ByRef MenuItem)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; StandardOnPopUpMemoClick Memo1, MenuItem.MenuIndex&lt;br /&gt;End Sub&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The last step is to add this code to the Memo control&amp;#39;s &amp;quot;MouseDown&amp;quot; event:&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;nbsp;Sub Memo1MouseDown(Sender, Button, X, Y)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not Sender.ReadOnly And Button = 1 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StandardMemoMouseDownEvent Memo1, PopupMenu1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;End Sub&lt;/b&gt; &lt;/p&gt;&lt;p&gt;This code checks to see that the memo control is not read-only, and that the right mouse button has been clicked.&amp;nbsp; Then you just pass the Memo control and PopupMenu control to the StandardMemoMouseDownEvent subroutine.&amp;nbsp; &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;p&gt;There you go!&amp;nbsp; You&amp;#39;ve just used the Spell Check script included in SalesLogix to add Spell Check functionality to your custom form.&amp;nbsp; I hope you find this article helpful!&amp;nbsp; Thanks for reading!&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt; &lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40599" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Controls/default.aspx">Controls</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</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/spellcheck/default.aspx">spellcheck</category></item><item><title>Setting conditions for Crystal Reports in SalesLogix LAN</title><link>http://customerfx.com/pages/customization/2009/05/27/setting-conditions-for-crystal-reports-in-saleslogix-lan.aspx</link><pubDate>Wed, 27 May 2009 11:08:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40562</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=40562</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/05/27/setting-conditions-for-crystal-reports-in-saleslogix-lan.aspx#comments</comments><description>&lt;p&gt;I wanted to quickly outline a process for passing a condition to a Crystal report in two simple steps.&amp;nbsp; Say you&amp;#39;ve created an account report that you want to launch via a button on the account detail, limited to the current account record.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Step 1, Setting up the button:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;The button is going to do two things:&amp;nbsp; Set the current accountid to a global variable, and launch the report. &lt;/p&gt;&lt;p&gt;&lt;i&gt;Sub Button1Click(Sender)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.BasicFunctions.GlobalInfoSet &amp;quot;gAccountID&amp;quot;, Application.BasicFunctions.CurrentAccountID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.BasicFunctions.DoInvoke &amp;quot;CrystalReportPreview&amp;quot;, &amp;quot;Account:New Account Report&amp;quot;&lt;br /&gt;End Sub&lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Step 2, pass the current ID to the launched report:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In order to pass the ID to the report, we need to create a VB Script which grabs the Global Variable, then passes it to the report using the ReportAddCondition function found under Application.BasicFunctions.&amp;nbsp; This script is attached to the report via the report properties set under manage|Crystal Reports.&lt;/p&gt;&lt;p&gt;The new script is named Account Report Add Condition, and contains: &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Sub Main&lt;br /&gt;Dim AccID&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; AccID = Application.BasicFunctions.GlobalInfoFor(&amp;quot;gAccountID&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.BasicFunctions.ReportAddCondition &amp;quot;AccountID&amp;quot;, &amp;quot;=&amp;quot;, AccID, &amp;quot;String&amp;quot;, &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.BasicFunctions.GlobalInfoClear &amp;quot;gAccountID&amp;quot;)&lt;br /&gt;&lt;br /&gt;end sub&lt;/i&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Three things are happening here.&amp;nbsp; First of all, we&amp;#39;re assigning a local variable to the ID contained in the Global Variable.&amp;nbsp; Next, we add the condition to the report, and finally, we clear the global variable.&amp;nbsp; Once the script is saved, go to the menu item &amp;quot;Manage|Reports&amp;quot;, select the report you want to add the condition to and view the properties of the report.&amp;nbsp; On the Execution tab, add the script to the When Open event.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/ReportProperties.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/ReportProperties.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;That&amp;#39;s all there is to it!&amp;nbsp; You now have a button on account detail which launches your new report for the current opportunity record.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40562" width="1" height="1"&gt;</description><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/Basics/default.aspx">Basics</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/Conditions/default.aspx">Conditions</category><category domain="http://customerfx.com/pages/customization/archive/tags/Reports/default.aspx">Reports</category></item><item><title>User feedback using the Animate Control</title><link>http://customerfx.com/pages/customization/2009/05/13/user-feedback-using-the-animate-control.aspx</link><pubDate>Wed, 13 May 2009 09:52:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40523</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=40523</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/05/13/user-feedback-using-the-animate-control.aspx#comments</comments><description>&lt;p&gt;In my last blog post, I described how to use the Progress Bar control to provide feedback to a user when running time intensive processes.&amp;nbsp; In addition to the Progress Bar control, the Animate control can also be used.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;u&gt;&lt;b&gt;Animate Control&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;The Animate control is very simple to use.&amp;nbsp; A number of&amp;nbsp;animations are inlcuded to cover standard operations such as moving or coping and deleteing items, and some other additional animations.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/AnimateMove.JPG"&gt;&lt;img style="WIDTH:379px;HEIGHT:196px;" height="167" src="http://customerfx.com/blogs/customization/AnimateMove.JPG" width="336" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;After adding the control to the form,&amp;nbsp;choose one of the standard animations from the &amp;quot;CommonAVI&amp;quot; property of the form.&amp;nbsp; I also set the visble property, and the Active property to false at design-time, so that I can turn both properties on in code to make visible and start the animation.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve used my code example from last week, and included a call to a control named &amp;quot;Animate1&amp;quot; on the form.&lt;br /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="1"&gt;Sub UpdateAccounts&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="1"&gt;Dim rs&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;Set rs = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;With rs, pos&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = 0&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set .ActiveConnection = Application.GetNewConnection&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorLocation = adUseClient&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorType = adOpenStatic&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .LockType = adLockOptimistic&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Open &amp;quot;select * from Account where status &amp;lt;&amp;gt; &amp;#39;Open&amp;#39;&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProgressBar1.Max = .RecordCount&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProgressBar1.Position = pos&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .MoveFirst&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Animate1.Visible =&amp;nbsp;True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Animate1.Position =&amp;nbsp;True&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While Not (.Bof or .Eof)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;modifyuser&amp;quot;).Value = Application.BasicFunctions.CurrentUserID&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;modifydate&amp;quot;).Value = Now&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;status&amp;quot;).Value = &amp;quot;Open&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Update&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = pos + 1&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProgressBar1.Position = pos&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .MoveNext&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wend&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Close&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Animate1.Visible =&amp;nbsp;False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Animate1.Active =&amp;nbsp;False&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;End With&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;Set rs = Nothing&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;font size="1"&gt;End Sub&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In addition to the&amp;nbsp;available preset animations, you can also use the&amp;nbsp;Animate control to disaply an AVI file instead.&amp;nbsp; To do this, you&amp;#39;ll want to&amp;nbsp;set the &amp;quot;CommonAVI&amp;quot; to aviNone, and then enter the path and file name for the AVI file you would like to display.&amp;nbsp; The Animate and Visible properties will function the same regardless of the animation source.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/AnimateCustom.JPG"&gt;&lt;img height="265" src="http://customerfx.com/blogs/customization/AnimateCustom.JPG" width="254" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(the clock.avi under c:\windows is a simple avi displaying a running count from 1 to 10.&lt;/p&gt;
&lt;p&gt;That&amp;#39;s all there is to it.&amp;nbsp;The Animate control is a very simple way to spruse up your views when performing time-consuming updates.&amp;nbsp; Thanks for reading!&amp;nbsp;&lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40523" width="1" height="1"&gt;</description><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/Controls/default.aspx">Controls</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</category><category domain="http://customerfx.com/pages/customization/archive/tags/How-To/default.aspx">How-To</category></item><item><title>Providing interface feedback - Progress Bars</title><link>http://customerfx.com/pages/customization/2009/05/07/providing-interface-feedback-progress-bar.aspx</link><pubDate>Thu, 07 May 2009 11:14:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40507</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=40507</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/05/07/providing-interface-feedback-progress-bar.aspx#comments</comments><description>&lt;p&gt;When performing lengthy updates in the SalesLogix client, it&amp;#39;s a good idea to provide the user with some degree of feedback so that it doesn&amp;#39;t appear as though SalesLogix has locked up.&amp;nbsp; The Progress Bar control, can be used for this purpose:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;u&gt;&lt;b&gt;Progress Bar&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;The main properties in this control you will want to set are the &amp;quot;Max&amp;quot; and &amp;quot;Position&amp;quot; properties.&amp;nbsp; &amp;quot;Max&amp;quot; defines the upper limit of the bars position.&amp;nbsp; &amp;quot;Position&amp;quot; defines the current position of the bar.&amp;nbsp; Basically, we just need to set &amp;quot;Max&amp;quot; to the count of records modified, and then need to increment the &amp;quot;Position&amp;quot; value by one for each record we update.&lt;/p&gt;&lt;p&gt;In this simple example, I&amp;#39;m simply running through the Account table, and setting the status value from each record to &amp;quot;Open&amp;quot; when it doesn&amp;#39;t already have that status.&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font size="1"&gt;Sub UpdateAccounts&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;font size="1"&gt;Dim rs&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;Set rs = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;With rs, pos&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = 0&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set .ActiveConnection = Application.GetNewConnection&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorLocation = adUseClient&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorType = adOpenStatic&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .LockType = adLockOptimistic&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Open &amp;quot;select * from Account where status &amp;lt;&amp;gt; &amp;#39;Open&amp;#39;&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProgressBar1.Max = .RecordCount&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProgressBar1.Position = pos&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .MoveFirst&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; While Not (.Bof or .Eof)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;modifyuser&amp;quot;).Value = Application.BasicFunctions.CurrentUserID&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;modifydate&amp;quot;).Value = Now&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;status&amp;quot;).Value = &amp;quot;Open&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Update&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pos = pos + 1&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProgressBar1.Position = pos&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .MoveNext&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wend&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Close&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font size="1"&gt;End With&lt;/font&gt;&lt;br /&gt;&lt;font size="1"&gt;Set rs = Nothing&lt;/font&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;font size="1"&gt;End Sub&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That&amp;#39;s all there is to it. Users will now be able to visually follow the progress of the update.&amp;nbsp; I hope you found this code sample helpful! &lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40507" width="1" height="1"&gt;</description><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/Controls/default.aspx">Controls</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</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/vbscript/default.aspx">vbscript</category><category domain="http://customerfx.com/pages/customization/archive/tags/ADO/default.aspx">ADO</category><category domain="http://customerfx.com/pages/customization/archive/tags/Progress+Bar/default.aspx">Progress Bar</category></item><item><title>Adding items to the Opportunity Snapshot (LAN)</title><link>http://customerfx.com/pages/customization/2009/04/29/deconstructing-the-opportunity-snapshot.aspx</link><pubDate>Wed, 29 Apr 2009 12:51:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40490</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=40490</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/04/29/deconstructing-the-opportunity-snapshot.aspx#comments</comments><description>&lt;p&gt;The opportunity snapshot on the Opportunity Detail view is a handy place to display summary information, but customizing it can be a bit confusing.&amp;nbsp; The Snapshot is simply a browser control, displaying HTML which is being generated by a method on the Opportunity detail screen.&amp;nbsp; You can see the HTML code in that method (LoadSnapShot), but it is so broken up and pieced back togther to add variable data, that it can be a little tough to navigate.&amp;nbsp; Hopefully this basic rundown helps explain how the snapshot is put together, and how simple it can be to add new information.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;First, let&amp;#39;s take a look at the conditions involved in generating the snapshot (Opportunity Detail view, LoadSnapshot method).&amp;nbsp; Primarily, the Opportunity status is checked&amp;nbsp; to determine which version of the snapshot is to be displayed.&amp;nbsp; I&amp;#39;ve cleared out the html in this code, so we can see how things are setup based on status.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;The first thing checked is to see if the current status is either Open or Inactive (I&amp;#39;ve cleared out localization code as well to make this more readable):&lt;/span&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-style:italic;"&gt;If strStatus = &amp;quot;Open&amp;quot; Or pklStatus.Text = &amp;quot;Inactive&amp;quot; Then&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;In this area, they set up the header information for the HTML&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not blnMCEnabled Then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Here they display pricing information, depending if Multi Currency is enabled or not.&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;Finally, they show summary information for the opportunity which is not reliant on currency.&amp;nbsp; This is usually fields like Days Open, Current Stage, etc...&amp;nbsp; This is repeated for both Closed statuses as well as a catch all for any other status value.&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;ElseIf strStatus = &amp;quot;Closed - Won&amp;quot; Then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;#39;Header Info&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not blnMCEnabled Then&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;#39;MultiCurrentcy enabled&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;#39;MultiCurrentcy disabled&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;#39;Summary Information&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;ElseIf strStatus = &amp;quot;Closed - Lost&amp;quot; Then&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not blnMCEnabled Then&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;Else &amp;#39;The code below is a &amp;quot;default&amp;quot; if the user addes a picklist value that doesn&amp;#39;t equal the above conditions out of box.&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not blnMCEnabled Then&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/span&gt;&lt;br style="font-style:italic;" /&gt;&lt;span style="font-style:italic;"&gt;End If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;That&amp;#39;s all there is to the code in terms of WHERE you want to edit, but there is a lot of broken up HTML to navigate at that point; However, If you search for label values in the Snapshot code, and do a little copying/pasting, it&amp;#39;s not do difficult to add some additional information to this area.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I&amp;#39;m going to add a &amp;quot;Total Margin&amp;quot; field in the Value section of the snapshot.&amp;nbsp; Total Margin will be defined as (TotalSales - TotalFixedCost) / TotalSales.&amp;nbsp; We&amp;#39;ll want to calculate margin based off of both SalesPotential for Open Opportunities, and ActualAmount for Closed Opportunities.&lt;/p&gt;&lt;p&gt;First of all, we need to get the total cost value.&amp;nbsp; I&amp;#39;m going to add this code near the top of the LoadSnapShot method on Opportunity Detail.&amp;nbsp; This will give me a variable name dTotalCost containing the total cost value for all products on the current opportunity:&lt;br /&gt;&lt;/p&gt;
&lt;p style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim dTotalCost&lt;/p&gt;
&lt;p style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objCostRS = objSLXDB.GetNewRecordSet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSql = &amp;quot;select sum(p.fixedcost) as totalcost from opportunity_product o inner join product p on o.productid = p.productid&amp;quot; &amp;amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;Where o.opportunityid = &amp;#39;&amp;quot; &amp;amp; strCrntOppID &amp;amp; &amp;quot;&amp;#39;&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objCostRS.Open strSql, objSLXDB.Connection&lt;/p&gt;
&lt;p style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If&amp;nbsp; objCostRS.RecordCount &amp;lt;&amp;gt; 0 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dTotalCost = objCostRS.Fields(&amp;quot;totalcost&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dTotalCost = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/p&gt;
&lt;p style="font-style:italic;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objCostRS.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objCostRS = Nothing&lt;/p&gt;&lt;p&gt;Now&lt;span style="font-style:italic;"&gt; &lt;/span&gt;that we have cost, we have to calculate the margin.&amp;nbsp; I do this in two places actually.&amp;nbsp; First right outside the first If statement that checks the opp status, and I also set it inside the If statement if status is &amp;quot;Open&amp;quot;.&amp;nbsp; I do this because margin will be based off of the Actual Close Amount if the Opp has any closed status, and off of Sales Potential if the status is Open or Inactive.&lt;/p&gt;&lt;p&gt;(My added code is in bold, you will probably find this right around line 370 on the Opp detail form code) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If IsNull(objRS.Fields(&amp;quot;WSALE&amp;quot;).Value) Then&amp;nbsp; &amp;#39;DNL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lngWeighted = 0&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; Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lngWeighted = objRS.Fields(&amp;quot;WSALE&amp;quot;).Value&amp;nbsp; &amp;#39;DNL&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; End If &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If cDbl(intActualAmount) = 0 Then&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dMargin = 0&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dMargin = (cDbl(intActualAmount) - cDbl(dTotalCost)) / cDbl(intActualAmount)&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.BasicFunctions.GlobalInfoSet &amp;quot;CurrentStatus&amp;quot;, strStatus&amp;nbsp; &amp;#39;DNL&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; If Application.Translator.Localize(strStatus) = Application.Translator.Localize(&amp;quot;Open&amp;quot;) Or Application.Translator.Localize(pklStatus.Text) = Application.Translator.Localize(&amp;quot;Inactive&amp;quot;) Then&amp;nbsp; &amp;#39;DNL&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If lngSalesPotential = 0 Then&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dMargin = 0&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dMargin = (cDbl(lngSalesPotential) - cDbl(dTotalCost)) / cDbl(lngSalesPotential)&lt;/span&gt;&lt;br style="font-weight:bold;" /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/span&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;Now that we&amp;#39;ve calculated the Margin value, we need to insert it into the snapshot.&amp;nbsp; Because of how the snapshot is being built, we&amp;#39;ll need to add it in eight different places, twice for each Opportunity Status (Open or Inactive, Closed Won, Closed Lost, other).&amp;nbsp; If you know that multicurrency functionality is not an important aspect of your database, you can add it only once for each status).&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vHTML = vHTML + &amp;quot;&amp;lt;td class=indent&amp;gt;&amp;quot; &amp;amp; Application.Translator.Localize(&amp;quot;Sales Potential = &amp;quot;) &amp;amp; FormatCurrency(lngSalesPotential, 2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vHTML = vHTML + &amp;quot;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vHTML = vHTML + &amp;quot;&amp;lt;td class=indent&amp;gt;&amp;quot; &amp;amp; Application.Translator.Localize(&amp;quot;Weighted = &amp;quot;) &amp;amp; FormatCurrency(lngWeighted, 2) &amp;#39;Calculated Field&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vHTML = vHTML + &amp;quot;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;quot; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;You can justcopy the last two lines here, and change the copied line to use our new margin values to add it to the snapshot.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vHTML = vHTML + &amp;quot;&amp;lt;td class=indent&amp;gt;&amp;quot; &amp;amp; Application.Translator.Localize(&amp;quot;Margin = &amp;quot;) &amp;amp; FormatCurrency(dMargin, 2) &amp;#39;Calculated Field&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vHTML = vHTML + &amp;quot;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;quot; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;You&amp;#39;ll then want to go through the code and add this new line in each of the MultiCurrency sections for each status.&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Adding a single new value is simple enough, but if you try to get more complicated with it, keep a close eye on &amp;lt;td&amp;gt; and &amp;lt;tr&amp;gt; tags before and after any code you enter to avoid breaking the Snapshot all together.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I hope this post is helpful in explaining the basics of how the snapshot is put together, and encourages people to experiment with modifications to this area.&amp;nbsp; Thanks for reading! &amp;nbsp;&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;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40490" width="1" height="1"&gt;</description><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/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/Basics/default.aspx">Basics</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/vbscript/default.aspx">vbscript</category><category domain="http://customerfx.com/pages/customization/archive/tags/scripting/default.aspx">scripting</category><category domain="http://customerfx.com/pages/customization/archive/tags/snapshot/default.aspx">snapshot</category></item><item><title>Building new Main Views in SalesLogix LAN - Part 3</title><link>http://customerfx.com/pages/customization/2009/04/22/building-new-main-views-in-saleslogix-lan-part-3.aspx</link><pubDate>Wed, 22 Apr 2009 19:11:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40473</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=40473</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/04/22/building-new-main-views-in-saleslogix-lan-part-3.aspx#comments</comments><description>&lt;p&gt;In my last couple blog posts about creating main views, we built our Insert and Detail views, as well as the Mainview container.&amp;nbsp; We also covered creating New menu and Navbar items.&amp;nbsp; The last thing we need to do to make our new main area usable is to create our first group.&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;b&gt;Groups:&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;Each main area of SalesLogix (Account, Contact, Opportunity, etc..), has defined a number of default groups.&amp;nbsp; At least one group must be created for each area in order to view any new data that has been added to our new main table.&lt;/p&gt;&lt;p&gt;Groups must be created in the SalesLogix client.&amp;nbsp; To create our first group for SLXProjects, first go to the List view for SLXProjects.&amp;nbsp;&lt;a href="http://customerfx.com/blogs/customization/ListViewIcon.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/ListViewIcon.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp; Right click somewhere in the list area, and select new group to launch the SLX Query Builder.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/SLXProjectsQueryBuilder.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/SLXProjectsQueryBuilder.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I name the group and set visible fields in the Layout tab.&amp;nbsp; Since I want this group to display all records in the SLXProjectTable, I don&amp;#39;t have to bother setting options in the &amp;quot;Conditions&amp;quot; tab, since all records will be shown by default.&amp;nbsp; I created new global joins from SLXProject to Account and Userinfo so that I can display username and associated account values as well.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/SLXProjectsAllGroup.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/SLXProjectsAllGroup.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;With our group created,&amp;nbsp; we can now view new SLXProject records.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;b&gt;Adding additional tab views&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;Now that we have the main areas set up, we&amp;#39;ll probably want to add additional tabs to SLXProject as well.&amp;nbsp; To create a new tab, simply create a new data view using the new SLXProject table as the base table of the form.&amp;nbsp; &lt;/p&gt;&lt;p&gt;To add a SLXProject family to save our new views, simply add a &amp;quot;SLXProject&amp;quot; picklist item to the Active Form Types picklist found in manage:picklists in SalesLogix Architect. &lt;/p&gt;&lt;p&gt;Once saved, the new views shows up under &amp;quot;More Tabs&amp;quot;. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/SLXProjectTabs.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/SLXProjectTabs.JPG" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;This should give you the basics of creating a new Main View in the SalesLogix LAN client.&amp;nbsp; Hopefully, this demonstrates how simple it can be to expand the functionality of SalesLogix to meet your own specific business needs.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Thanks or reading!&amp;nbsp;&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;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40473" width="1" height="1"&gt;</description></item><item><title>Building new Main Views in SalesLogix LAN - Part 2</title><link>http://customerfx.com/pages/customization/2009/04/15/building-new-main-views-in-saleslogix-lan-part-2.aspx</link><pubDate>Wed, 15 Apr 2009 12:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:40439</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=40439</wfw:commentRss><comments>http://customerfx.com/pages/customization/2009/04/15/building-new-main-views-in-saleslogix-lan-part-2.aspx#comments</comments><description>&lt;p&gt;In my last Main Views article, I created the detail view as well as the mainview.&amp;nbsp; For this next part, I&amp;#39;ll go through creating an insert view, as well as toolbar and menu items for the new SLXProject entity.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;b&gt;Creating the Insert View:&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;The insert view for this new area will be created as a manage view, and the data will be written to the database using ADO.&amp;nbsp; We will start by creating a launch script for this view.&amp;nbsp; After creating a new active script in architect, I added the following code:&lt;/p&gt;&lt;p&gt;&lt;i&gt;Option Explicit&lt;br /&gt;&lt;br /&gt;Sub Main&lt;br /&gt;Dim objMv&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.BasicFunctions.DoInvoke &amp;quot;Form&amp;quot;, &amp;quot;System:Insert SLXProject&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objMv = Application.MainViews.Add(&amp;quot;System:Quote Details&amp;quot;, 1, True)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; With objMv&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Refresh&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Show&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;br /&gt;&lt;br /&gt;End Sub&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The Insert view itself is a simplified version of the detail view we already created.&amp;nbsp; Being a manage view, the controls on the insert view are not mapped to fields in the new SLXProject table.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/NewInsertView.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/NewInsertView.JPG" border="0" width="530" height="371" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I&amp;#39;ve also added code to two events on the insert view. &amp;nbsp;&lt;/p&gt;&lt;p&gt;The WhenOpen event is being used to set defualts on the form.&amp;nbsp; In this case, creating the ID for the new record, and defaulting the leader field to the currently logged in user:&lt;/p&gt;&lt;p&gt;&lt;i&gt;Sub AXFormOpen(Sender)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Form.CurrentID = Application.BasicFunctions.GetIDFor(&amp;quot;SLXProject&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lkeLeader.LookupID = Application.BasicFunctions.CurrentUserID&lt;br /&gt;End Sub&lt;/i&gt;&lt;/p&gt;&lt;p&gt;On the WhenClick Event of the OK button on the form, I am creating a new ADO recordset and saving the data entered on the form:&lt;/p&gt;&lt;p&gt;&lt;i&gt;Sub Button1Click(Sender)&lt;br /&gt;Dim objRS&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS = Application.CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; With objRS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set .ActiveConnection = Application.GetNewConnection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorLocation = adUseClient&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .CursorType = adOpenStatic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .LockType = adLockOptimistic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Open &amp;quot;select * from slxproject where 1=2&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .AddNew&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;slxprojectid&amp;quot;).Value = Application.BasicFunctions.GetIDFor(&amp;quot;c_test&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;accountid&amp;quot;).Value = CurrentID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;createuser&amp;quot;).Value = Application.BasicFunctions.CurrentUserID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;createdate&amp;quot;).Value = Now&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;modifyuser&amp;quot;).Value = Application.BasicFunctions.CurrentUserID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;modifydate&amp;quot;).Value = Now&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;name&amp;quot;).Value = txtProjectName.Text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;description&amp;quot;).Value = memDescription.Text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;leader&amp;quot;).Value = lkeLeader.LookupID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;isactive&amp;quot;).Value = &amp;quot;T&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Fields(&amp;quot;accountid&amp;quot;).Value = &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Update&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End With&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS = Nothing&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Form.ModalResult = mrOK&lt;br /&gt;End Sub&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;u&gt;&lt;b&gt;Creating Menu/Toolbars:&lt;/b&gt;&lt;/u&gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;I also have created menu and toolbar plugins to view SLXProject data, as well as launching the insert view.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/NewMenuPlugin.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/NewMenuPlugin.JPG" border="0" width="568" height="453" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The menu plugin contains two menus.&amp;nbsp; The SLXProject NavMenu is referenced in the toolbar plugin below to allow for right-click functionality to insert a new record from the navbar. Both menus launch the Active script, which in turn loads the insert view.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/customization/NewToolbarPlugin.JPG"&gt;&lt;img src="http://customerfx.com/blogs/customization/NewToolbarPlugin.JPG" border="0" width="566" height="466" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(Note the popup menu property, referencing the SLXProject NavMenu.)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;We&amp;#39;re not quite fully functional yet.&amp;nbsp; In the next article, I&amp;#39;ll go through finalizing the plugins we&amp;#39;ve created so far, and setting up groups and other suplimental views.&lt;/p&gt;&lt;p&gt;Thanks for reading! &amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=40439" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/customization/archive/tags/Controls/default.aspx">Controls</category><category domain="http://customerfx.com/pages/customization/archive/tags/Customizations/default.aspx">Customizations</category><category domain="http://customerfx.com/pages/customization/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/customization/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/customization/archive/tags/mainview+objects/default.aspx">mainview objects</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/vbscript/default.aspx">vbscript</category><category domain="http://customerfx.com/pages/customization/archive/tags/ADO/default.aspx">ADO</category><category domain="http://customerfx.com/pages/customization/archive/tags/scripting/default.aspx">scripting</category></item></channel></rss>