<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://customerfx.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Kris Halsrud&amp;#39;s Blog</title><subtitle type="html">Kris Halsrud on development and Integration with CRM and Development</subtitle><id>http://customerfx.com/pages/integrationblog/atom.aspx</id><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/default.aspx" /><link rel="self" type="application/atom+xml" href="http://customerfx.com/pages/integrationblog/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20611.960">Community Server</generator><updated>2009-11-20T05:29:00Z</updated><entry><title>Creating Pretty Prefixes and Suffixes in the SalesLogix web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/03/17/creating-pretty-prefixes-and-suffixes-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/03/17/creating-pretty-prefixes-and-suffixes-in-the-saleslogix-web-client.aspx</id><published>2010-03-17T10:16:00Z</published><updated>2010-03-17T10:16:00Z</updated><content type="html">&lt;p&gt;In the SalesLogix web client you may run across a reason you need to generate a “Pretty Key”.&amp;nbsp; This is what the SalesLogix Ticket Number is.&amp;nbsp; This key is a combination of a Pretty Prefix and a Pretty Suffix.&amp;nbsp; The Prefix is an equivalent to a system’s site code and the Suffix is a numerical equivalent to a primary table ID.&lt;/p&gt;  &lt;p&gt;To generate these you can simply call the functions in the Sage.SalesLogix.System.dll for each.&amp;nbsp; Each function expects an input of the Primary ID of the record to generate a key based on, like this:&lt;/p&gt;    &lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sage.SalesLogix.PrettyKey.GetPrettyKeyPrefix(account.Id.ToString());&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sage.SalesLogix.PrettyKey.GetPrettyKeySuffix(account.Id.ToString());&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;Be aware that the Sage.SalesLogix.System.dll is not a default assembly for C# Code Snippets so you may need to add it as a reference.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41561" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.1" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.1/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>Editing tables in SQL 2008</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/03/16/editing-tables-in-sql-2008.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/03/16/editing-tables-in-sql-2008.aspx</id><published>2010-03-16T10:58:00Z</published><updated>2010-03-16T10:58:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I recently ran into an issue when trying to edit a SalesLogix table in the SQL Management Studio 2008.&amp;nbsp; I was trying to increase the length of a field while in a table’s design mode.&amp;nbsp; When I went to save my change I received this error:&lt;/p&gt;   &lt;i&gt;Saving changes is not permitted.&amp;nbsp; The changes you have made require the following tables to be dropped and re-created.&amp;nbsp; You have either made changes to a table that can’t be re-created or enabled the option Prevent saving changes that require the table to be re-created.&lt;/i&gt;  &lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/TableSaveError_40E1C658.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/TableSaveError_thumb_52BE5A25.png" style="border:0px none;display:inline;" title="Table Save Error" alt="Table Save Error" width="606" border="0" height="484" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now I have done this countless times in the past and wasnt sure what was going on but the last part of the error message pointed me in the direction I needed.&amp;nbsp; Turns out that a default option for the SQL 2008 management console prevents edits to tables like I wanted.&amp;nbsp; After a little digging I found where to turn this off.&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In the Management Console, click the Tools drop down menu, then Options.&lt;/p&gt;      &lt;p&gt;This will open a dialog.&amp;nbsp; Expand out the Designers node in the left side tree, then click the Table and Database Designers.&amp;nbsp; That will show options to the right.&amp;nbsp; Clear the checkbox “Prevent saving changes that require table re-creation”.&lt;/p&gt;      &lt;p&gt;&amp;nbsp;&lt;img src="http://customerfx.com/blogs/integrationblog/TableChnagePoroperty._thumb_40759363.png" style="border:0px none;display:inline;" title="Table Chnage Poroperty." alt="Table Chnage Poroperty." width="644" border="0" height="379" /&gt;&lt;/p&gt;&amp;nbsp;&lt;p&gt;Click OK and that is it!&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41560" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SQL Server" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SQL+Server/default.aspx" /><category term="SalesLogix" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix/default.aspx" /></entry><entry><title>Adding an assembly reference to code files in the SalesLogix Application Architect</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/03/15/adding-an-assembly-reference-to-code-files-in-the-saleslogix-application-architect.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/03/15/adding-an-assembly-reference-to-code-files-in-the-saleslogix-application-architect.aspx</id><published>2010-03-15T18:22:00Z</published><updated>2010-03-15T18:22:00Z</updated><content type="html">&lt;p&gt;Often when adding custom code to SalesLogix you need to reference Assemblies that are not included by default in Code Snippets or action items.&amp;nbsp; This problem will often manifest itself with an error when building like “The type or namespace name &amp;#39;Data&amp;#39; does not exist in the namespace &amp;#39;System&amp;#39; (are you missing an assembly reference)”&lt;/p&gt;  &lt;p&gt;&amp;nbsp;This article will show you how to add an assembly reference to your code.&amp;nbsp; If you look at either a Business Rule/Event or a Code Snippet Action item, both have a Reference Assemblies property.&amp;nbsp; In the code editor within Application Architect you will see comments at the top of the code that show the included referenced assemblies like so:&lt;/p&gt;  &lt;p&gt;&amp;nbsp; &lt;/p&gt; &lt;a href="http://customerfx.com/blogs/integrationblog/ReferenceAssemblies_416FC923.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/ReferenceAssemblies_thumb_3A508CAB.png" style="border:0px none;display:inline;" title="Reference Assemblies" alt="Reference Assemblies" width="644" border="0" height="363" /&gt;&lt;/a&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;So how does one add a referenced assembly?&amp;nbsp; Well it is fairly easy, though do to a glitch in the interface the actual process is kind of hidden. With the code page visible, open the properties window.&amp;nbsp; In the drop down at the top of the property window you should see Sage.Platform.Entities.Orm.Entities.CodeSnippetHeader.&amp;nbsp; If you choose this then you should see an AssembliesReference collection.&amp;nbsp; This is the avenue for adding assembly references.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;On some version of the Application Architect, the Sage.Platform.Entities.Orm.Entities.CodeSnippetHeader is not visible to be selected in the drop down.&amp;nbsp; To get it to appear, you need to do the following:&lt;/p&gt;  &lt;ol&gt;&lt;li&gt;&amp;nbsp;Click the CodeSnippet property in the properties window (should be the first one)&lt;/li&gt;&lt;li&gt;&amp;nbsp;Click into the Code itself.&lt;/li&gt;&lt;li&gt;&amp;nbsp;Click on the drop down in the properties window.&amp;nbsp; You should now see the choice Sage.Platform.Entities.Orm.Entities.CodeSnippetHeader.&lt;/li&gt;&lt;/ol&gt;      &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Once you can correctly see the property window, click the Assembly References Collection property. (There should be an ellipse to choose.)&lt;/p&gt;   &lt;a href="http://customerfx.com/blogs/integrationblog/ReferenceAssembliesProperty_00CD7CB4.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/ReferenceAssembliesProperty_thumb_4B54BA8E.png" style="border:0px none;display:inline;" title="Reference Assemblies Property" alt="Reference Assemblies Property" width="603" border="0" height="116" /&gt;&lt;/a&gt;     &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt; This will open up the Assembly Reference dialog.&amp;nbsp; It should show you what the default assemblies that are included in every event/snippet are.&lt;/p&gt;      &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/ReferenceAssembliesDialog_11D1AA97.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/ReferenceAssembliesDialog_thumb_3F52CA5A.png" style="border:0px none;display:inline;" title="Reference Assemblies Dialog" alt="Reference Assemblies Dialog" width="515" border="0" height="376" /&gt;&lt;/a&gt; &lt;/p&gt;        &lt;p&gt;If you click Add, you can add a new reference.&amp;nbsp; You will need to enter the AssemblyName at a minimum.&amp;nbsp; This should be the full file name of the assembly (i.e. System.Data.dll).&amp;nbsp; If the assembly is part of the .Net global assembly cache you should not need to enter a hint path.&amp;nbsp; If the assembly is not in the GAC, you will need to add the hint path which is the location the assembly is physically located so it can be accessed to validate during the build.&amp;nbsp; I would recommend using the base build path’s assemblies sub folder.&amp;nbsp; This requires copying your assembly into that location so it is available.&amp;nbsp; See &lt;a href="http://customerfx.com/pages/integrationblog/2009/12/17/sage-saleslogix-web-build-error-the-name-xxx-does-not-exist-in-the-current-context.aspx" target="_blank"&gt;this post&lt;/a&gt; for some more info on where assemblies need to be to build successfully. The HintPath should be the full path, plus the full file name.&amp;nbsp; &lt;/p&gt;        &lt;p&gt;While you are defining your assembly reference you may receive errors.&amp;nbsp; Just click OK.&amp;nbsp; They are basically just a warning that the assmbly reference isn’t fully defined (which it won’t be until you are done defining).&amp;nbsp; As long as you can build successfully after you add your reference you should be fine.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41563" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="Application Architect" scheme="http://customerfx.com/pages/integrationblog/archive/tags/Application+Architect/default.aspx" /><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>Launching a report from a button in the SalesLogix web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/03/12/launching-a-report-from-a-button-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/03/12/launching-a-report-from-a-button-in-the-saleslogix-web-client.aspx</id><published>2010-03-12T12:49:00Z</published><updated>2010-03-12T12:49:00Z</updated><content type="html">&lt;p&gt;As Jason mentioned in his article &lt;a href="http://customerfx.com/pages/customization/2010/02/17/using-the-reporting-api-enhancement-in-slx-7-5-2-web.aspx" target="_blank"&gt;here&lt;/a&gt;, starting in SalesLogix 7.5.1, Sage released an undocumented Reporting enhancement that allowed for interacting with the SalesLogix web reporting Server.&amp;nbsp; The SalesLogix 7.5.2 release had this API enhancement built in, however little documentation exists and now standard samples are used in the web client.&lt;/p&gt;  &lt;p&gt;Hopefully this article will help out those who are trying to figure this out.&lt;/p&gt;     &lt;p&gt;The core of the reporting functionality is contained in a standard javascript file “ShowReportUtil.js” that interacts with the built in SalesLogix web reporting functionality.&amp;nbsp; In order to use any of the functions in the above mentioned java script files you can just add a client click event to a control (like a button), a single line of code like:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="margin-left:40px;"&gt;&lt;span&gt;ShowReportByName(&amp;#39;Contact:Contact Detail&amp;#39;);     &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/OnCLientClick_49C1BF48.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/OnCLientClick_thumb_22877613.png" style="border:0px none;display:inline;" title="On CLient Click" alt="On CLient Click" width="644" border="0" height="337" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now lets look at the javascript file.&amp;nbsp; The file can be found in the Application Architect under Portal Manager…Sage SalesLogix…Support Files…jscript.&lt;/p&gt;       &lt;a href="http://customerfx.com/blogs/integrationblog/ShowReportUtilJSFile_3059BC0E.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/ShowReportUtilJSFile_thumb_7B4D2CDD.png" style="border:0px none;display:inline;" title="ShowReportUtil JS File" alt="ShowReportUtil JS File" width="302" border="0" height="484" /&gt;&lt;/a&gt;     &lt;p&gt;If you examine the java script file you can see the various exposed methods available they include:   &lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;ShowReport(ReportNameOrId, EntityTableName, EntityId) - Shows the report defined by ReportNameOrId using the EntityTableName and EntityId values.    &lt;/li&gt;&lt;li&gt;ShowReportByName(ReportName) - Displays a report by FAMILY:NAME. The report should be based on the main table associated with the current view.    &lt;/li&gt;&lt;li&gt;ShowReportById(ReportId) - Displays a report by PLUGIN.PLUGINID. The report should be based on the main table associated with the current view.    &lt;/li&gt;&lt;li&gt;GetReportId(S) - Returns the PLUGIN.PLUGINID associated with the report defined by the S parameter (In the FAMILY:NAME format).    &lt;/li&gt;&lt;li&gt;GetCurrentReport() - Returns the report associated with the current view, if any (Outputs in the FAMILY:NAME format).    &lt;/li&gt;&lt;li&gt;PopulateGlobals(ReportId, EntityTableName, EntityId) - Populates the global report variables used in ShowReport.ascx (in Sage.SalesLogix.Client.Reports.Helper.dll).    &lt;/li&gt;&lt;li&gt;ShowDefaultReport() -&amp;nbsp; Displays the default report for the current view and entity, if a report has been associated with the view.&amp;nbsp; Defaults are defined at the top of the java script file.&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41558" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /><category term="Reporting" scheme="http://customerfx.com/pages/integrationblog/archive/tags/Reporting/default.aspx" /></entry><entry><title>Hiding Opportunities in the SalesLogix web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/03/10/hiding-opportunities-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/03/10/hiding-opportunities-in-the-saleslogix-web-client.aspx</id><published>2010-03-10T23:38:00Z</published><updated>2010-03-10T23:38:00Z</updated><content type="html">&lt;p&gt;Occasionally we have clients who do not use the Opportunity components of the SalesLogix web client.&amp;nbsp; They have asked us to remove the Opportunity visibility within the web client.&amp;nbsp; Since this is not a common occurrence, I usually end up having to go back and remember where all the places are I need to touch.&amp;nbsp; I decided to write this article for my own reference and to help others who may be looking to do this.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;The SalesLogix web architecture makes hiding opportunities pretty easy.&amp;nbsp; most of the configuration involves simply removing web parts from various portal pages, however there are a couple of smart parts you need to touch.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;Lets start with the easy ones, the portal items to remove:&lt;/p&gt;   &lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;img src="http://customerfx.com/blogs/integrationblog/AccountDetails_thumb_33787952.png" style="border:0px none;display:inline;" title="Account Details" alt="Account Details" width="585" border="0" height="484" /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;On the Account Detail Page, remove the web parts “AccountOpportunities” and “AccountResellerOpportunities (Custom)” &lt;/p&gt;&lt;blockquote&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/ContactDetails_7E6BEA21.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/ContactDetails_thumb_73425FD7.png" style="border:0px none;display:inline;" title="Contact Details" alt="Contact Details" width="619" border="0" height="484" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;On the Contact Detail Page, remove the web part “ContactOpportunities”&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;    &lt;blockquote&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/MainPortal_5327531A.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/MainPortal_thumb_051EF3A5.png" style="border:0px none;display:inline;" title="Main Portal" alt="Main Portal" width="644" border="0" height="393" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt; On the main Sage SalesLogix portal, click the Navigation tab and under Navigation Bar, remove the item under “Sales” called “Opportunities” &lt;/p&gt;&lt;blockquote&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/MainPortalMenu_6503E6E7.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/MainPortalMenu_thumb_2BED09E5.png" style="border:0px none;display:inline;" title="Main Portal Menu" alt="Main Portal Menu" width="644" border="0" height="376" /&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;On the main Sage SalesLogix portal, click the Navigation tab and under Toolbar Menus, remove the item under “New” called “Opportunity…” &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;     &lt;blockquote&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/Options_36AA613A.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/Options_thumb_2B80D6F0.png" style="border:0px none;display:inline;" title="Options" alt="Options" width="644" border="0" height="326" /&gt;&lt;/a&gt;&lt;/blockquote&gt;              &lt;p&gt;On the Options Page, remove the web parts “OpportunitiesOptionsPage (Custom)” and “DefaultOpportunityProduct (Custom)”&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;    &lt;p&gt;Next we need to modify a few Activity and History forms.&amp;nbsp; Most of the forms are custom smart parts but there is one History Quickform.&lt;/p&gt;        &lt;ul&gt;&lt;li&gt;Under Entity Model…Packages…SalesLogix Activity Support…History…Forms, open History Details. Bring up the Properties for the Opportunity Lookup and set the Visible property = false.&amp;nbsp; Save the Quick form.&lt;/li&gt;&lt;li&gt;Under the Portal Manager…Sage SalesLogix…Support Files…Smart Parts…Activity open ActivityDetails.ascx.&amp;nbsp; Look for both the Opportunity label control and the Opportunity lookup control in the markup.&amp;nbsp; Add the attribute &lt;font color="#0000ff"&gt;Visible=”false”&lt;/font&gt; to both of these controls.&lt;/li&gt;&lt;li&gt;Under the Portal Manager…Sage SalesLogix…Support Files…Smart Parts…Activity open CompleteActivity.ascx.&amp;nbsp; Look for both the Opportunity label control and the Opportunity lookup control in the markup.&amp;nbsp; Add the attribute &lt;font color="#0000ff"&gt;Visible=”false”&lt;/font&gt; to both of these controls.&lt;/li&gt;&lt;li&gt;Under the Portal Manager…Sage SalesLogix…Support Files…Smart Parts…Activity open ScheduleCompleteActivity.ascx.&amp;nbsp; Look for both the Opportunity label control and the Opportunity lookup control in the markup.&amp;nbsp; Add the attribute &lt;font color="#0000ff"&gt;Visible=”false”&lt;/font&gt; to both of these controls.&lt;/li&gt;&lt;/ul&gt;                            &lt;br /&gt;That is all there is to it.&amp;nbsp; Opportunities no longer visible in the web client.  &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;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;     &lt;li&gt;       &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;            &lt;/li&gt;   &lt;/ul&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41556" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>Using ICriteria and Not to exclude records in SalesLogix</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/03/04/using-icriteria-and-not-to-exclude-records-in-saleslogix.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/03/04/using-icriteria-and-not-to-exclude-records-in-saleslogix.aspx</id><published>2010-03-04T16:39:00Z</published><updated>2010-03-04T16:39:00Z</updated><content type="html">
&lt;p&gt;In SalesLogix you can use the Sage.Platform.Repository.ICriteria class to query the entity model using standard ICriteria.&amp;nbsp; One thing I have been asked in the past is how do you exclude certain conditions?&amp;nbsp; A common example might be show me all of the non-closed tickets for a contact, where being closed is denoted by a status=”Closed”.&amp;nbsp; In this scenario you only want a condition similar to status&amp;lt;&amp;gt;’closed’.&amp;nbsp; This can be done using the .Not method which accepts as an input a standard parameter to exclude.&amp;nbsp; Lets take a look at the code:&lt;/p&gt;

&lt;table style="table-layout:fixed;width:600px;" cellpadding="0" cellspacing="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;RepositoryHelper&amp;lt;Sage.Entity.Interfaces.ITicket&amp;gt; repository &lt;span style="color:Navy;"&gt;=&lt;/span&gt; EntityFactory.GetRepositoryHelper&amp;lt;Sage.Entity.Interfaces.ITicket&amp;gt;();

Sage.Platform.Repository.ICriteria criteria &lt;span style="color:Navy;"&gt;=&lt;/span&gt; repository.CreateCriteria();
criteria.Add(repository.EF.Eq(&lt;span&gt;&amp;quot;Contact.Id&amp;quot;&lt;/span&gt;, contact.Id.ToString()));
criteria.Add(repository.EF.Not(repository.EF.Eq(&lt;span&gt;&amp;quot;StatusCode&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;Closed&amp;quot;&lt;/span&gt;)));
criteria.AddOrder(repository.EF.Desc(&lt;span&gt;&amp;quot;CreateDate&amp;quot;&lt;/span&gt;));

result &lt;span style="color:Navy;"&gt;=&lt;/span&gt; criteria.List&amp;lt;Sage.Entity.Interfaces.ITicket&amp;gt;();&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;You can see the entity factory EF.Not used above which has passed in a EF.Eq condition looking for “Closed“ statuses.&amp;nbsp; Now in this scenario I am using it assumes that StatusCode is storing “Closed” as text and not as the corresponding picklistid, which is not the standard OOTB SalesLogix behavior, but it should never the less demonstrate how to use the Not method to exclude a condition from your query result.&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41516" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="IRepository" scheme="http://customerfx.com/pages/integrationblog/archive/tags/IRepository/default.aspx" /></entry><entry><title>SalesLogix web client error: System.IndexOutOfRangeException: Index was outside the bounds of the array</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/02/24/saleslogix-web-client-error-system-indexoutofrangeexception-index-was-outside-the-bounds-of-the-array.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/02/24/saleslogix-web-client-error-system-indexoutofrangeexception-index-was-outside-the-bounds-of-the-array.aspx</id><published>2010-02-24T11:06:00Z</published><updated>2010-02-24T11:06:00Z</updated><content type="html">&lt;p&gt;I recently ran into this error on a client’s system when users logged into the SalesLogix client and navigated to a recently updated page.&amp;nbsp; The administrator did not encounter the same issue when navigating to the same page.&amp;nbsp; Since I knew no log-in specific customizations were in play, I knew it had to be an issue beyond the web site.&amp;nbsp; The SalesLogix provider acts differently for users than it does for the admin.&amp;nbsp; Specifically when a user connects through the provider the provider adds on record level and field level security.&amp;nbsp; Knowing this I figured that the field level security was messed up.&lt;/p&gt;        &lt;p&gt;When you install a new database field into an existing table through a SalesLogix bundle, SalesLogix does not always correctly update the field level security information of the table to include the new field.&amp;nbsp; This results in a mismatch between the number of fields the system sees in the database versus the number of fields the system detects for field security.&amp;nbsp; This mismatch was the root cause of the specific error mentioned in this post title.&amp;nbsp; Now it is very easy to fix the mismatch of database and field level security.&lt;/p&gt;        &lt;p&gt;To fix the mismatch simply log into the SalesLogix Administrator as admin.&amp;nbsp; Go to Manage…Field Level Security.&amp;nbsp; When the Manage dialog comes up you just need to click the OK button.&amp;nbsp; When this is clicked the Field Level Security information is re-written using the current database level definitions.&amp;nbsp; You do not even need to actually modify a field level profile.&amp;nbsp; Of course, it is a good idea to ensure that the new fields have the proper field level security levels inside each security profile.&lt;/p&gt;     I always recommend that after installing a bundle the database changes you open and close the Manage Field Level Security dialog to avoid these kinds of problems.&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41495" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>Properly adding child records using the SalesLogix entity model</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/02/17/properly-adding-child-records-using-the-saleslogix-entity-model.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/02/17/properly-adding-child-records-using-the-saleslogix-entity-model.aspx</id><published>2010-02-17T11:54:00Z</published><updated>2010-02-17T11:54:00Z</updated><content type="html">&lt;p&gt;The SalesLogix entity model offers a really great way of working with data in SalesLogix and letting the system establish all of the links for you- as long as you know what you are doing.&lt;/p&gt;    &lt;p&gt;One of the really great things that you can do is to add child entities to a parent, even if the parent is not yet in the database.&amp;nbsp; This is especially helpful if you need to create child records while still on an insert screen, like when inserting a contact being able to add multiple history records for the contact, even before the contact is created.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If we were working in the LAN you would have the problem of not having the contact in the database and available for you to get its ID so that you could use the ID when inserting child records.&amp;nbsp; Normally in the LAN client you would need to generate an ID and then set the ContactID value with that before saving the record.&amp;nbsp; In this way you forced the system to use your record ID rather than wait for the record to be committed. Each child record you added you would need to pass the ContactID and properly set the foreign key field so that the child records were linked to the opportunity.&amp;nbsp; And if the user later decided not to actually insert the contact, you had to remember to go in and delete any child records you may have inserted already.&amp;nbsp; In short, a big headache.&lt;/p&gt; &lt;p&gt;With the entity model you simple tell the system you want to add a new child entity into the parent entity’s collection.&amp;nbsp; The system automatically worries about if it exists yet and how to actually do the linking for you.&lt;/p&gt;    &lt;p&gt;Lets take look at the proper way of doing this.&lt;/p&gt;&lt;p&gt; First of all, lets talk about one way of doing it that should not be used.&amp;nbsp; Using the entity Save() method.&amp;nbsp; The reason that this should not be used is because calling Save() on a child record will actually roll-up and save all parent entities and all child entities of the parent.&amp;nbsp; This could lead to premature saving that could bypass important business validation logic.&amp;nbsp; Lets look at one example.&amp;nbsp;&lt;/p&gt;&lt;p&gt; Say we have the insert Contact screen and when the Contact Status is set to a certain value we want to create some activity record. To do so we could use code like:&lt;br /&gt;&lt;/p&gt;&lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000cc"&gt;Sage.Entity.Interfaces.IContact contact = this.BindingSource.Current as Sage.Entity.Interfaces.IContact     &lt;br /&gt;Sage.Entity.Interfaces.IActivity act = Sage.Platform.EntityFactory.Create&amp;lt;Sage.Entity.Interfaces.IActivity&amp;gt;();      &lt;br /&gt;act.AccountId =&amp;nbsp; contact.Account.Id.ToString();      &lt;br /&gt;act.AccountName = contact.Account.AccountName;      &lt;br /&gt;act.ContactId =&amp;nbsp; contact.Id.ToString();      &lt;br /&gt;act.Description = &amp;quot;Something&amp;quot;      &lt;br /&gt;...      &lt;br /&gt;act.Save()&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now the problem with this code is three fold.&lt;/p&gt;  &lt;ol&gt;&lt;li&gt;We do not yet have the contact.Id property filled in.&amp;nbsp; This is only generated after the Contact entity has been saved and not during the insertion process.&amp;nbsp; If the Activity entity had a entity relationship property called Contact which represented Sage.Entity.Interfaces.IContact, we could instead pass in act.Contact = contact, but again this is not the best approach because of the next point.&lt;/li&gt;&lt;li&gt;Calling the act.Save() will actually save the new Activity record but also save it’s parent, the new Contact we are inserting.&amp;nbsp; At this point maybe the contact is not fully completed.&amp;nbsp; We do not want to trigger the parent Save method prematurely.&amp;nbsp; For this reason, lets look at the right way of doing it&lt;/li&gt;&lt;li&gt;Using the Save() method like this also means you would need to remove this saved record, should the user decide to not complete the insertion of the new contact.&amp;nbsp; However that would also be complicated since by calling the child’s Save() method you have already actually saved the Contact record!&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;The proper way of adding children to an entity is by inserting records into the parents collection.&amp;nbsp; So instead of the code above having&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;     &lt;p&gt;&lt;font color="#0000cc"&gt;act.Save() &lt;/font&gt;&lt;/p&gt;   &lt;/blockquote&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;at the end, we would instead want to add the new Activity record to the Contacts, Activity collection like so:&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;       &lt;p&gt;&lt;font color="#0000cc"&gt;contact.Activities.Add(act);&lt;/font&gt;&lt;/p&gt;     &lt;/blockquote&gt;           &lt;p&gt;Using this method simply adds the Activity into a temporary collection that will be actually added to the database once the user chooses to insert the contact.&amp;nbsp; When the contact.Save() method is eventually called it will save all of the parent data and any data residing in child collections.&amp;nbsp; Conversely if the user cancels the insertion all of the pending child collections are flushed automatically.&lt;/p&gt;    &lt;p&gt;Again, the Entity Model, if understood, simplifies how you do things in the SalesLogix web client.&amp;nbsp; You no longer need to worry about if your parent record exists, or how to correctly bind records together.&amp;nbsp; Using the Entity Model correctly takes care of these things for you.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41489" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>Setting both the Text and Value properties of Items in the SalesLogix ComboBox control</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/02/11/setting-both-the-text-and-value-fields-of-the-saleslogix-combobox-control.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/02/11/setting-both-the-text-and-value-fields-of-the-saleslogix-combobox-control.aspx</id><published>2010-02-11T17:21:00Z</published><updated>2010-02-11T17:21:00Z</updated><content type="html">  &lt;p&gt;SalesLogix web has a “ComboBox” control which is actually rendered on the deployed page as an ASP ListBox control.&amp;nbsp; In the Application Architect you can see the control has two properties for Value and Text.&amp;nbsp; The value &lt;/p&gt; &lt;a href="http://customerfx.com/blogs/integrationblog/ComboBoxProperties_6077CF7A.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/ComboBoxProperties_thumb_2B6B404A.png" style="border:0px none;display:inline;" title="ComboBox Properties" alt="ComboBox Properties" width="439" border="0" height="484" /&gt;&lt;/a&gt;     &lt;p&gt;One would assume SalesLogix would have a built in property exposed to allow you to add items to the ComboBox and to set the Text and Value portions of said items, and they do, sort of.&amp;nbsp; If you go to a code editor in the Application Architect and start looking at the attributes and methods exposed for the ComboBox you will see an Items collection with an Add method.&amp;nbsp; Looks like we have it.&lt;/p&gt; &lt;a href="http://customerfx.com/blogs/integrationblog/CodeHelp_0B50338D.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/CodeHelp_thumb_0026A943.png" style="border:0px none;display:inline;" title="CodeHelp" alt="CodeHelp" width="449" border="0" height="56" /&gt;&lt;/a&gt;     &lt;p&gt;As the code help shows the add method takes two parameters on for the text string and one for the value string. The only problem with this is if you do so, something like:&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;     &lt;p&gt;&lt;font color="#0000ff"&gt;cboProblem.Items.Add(“Some text”,”ID123”);&lt;/font&gt;&lt;/p&gt;   &lt;/blockquote&gt;     &lt;p&gt;You will get an error when you visit the page on the web site along the lines of:&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;     &lt;p&gt;&lt;font color="#0000ff"&gt;A smart part associated with this page has failed to load: c:\Inetpub\wwwroot\site\SLXClient\SmartParts\Ticket\TicketCall.ascx(124): error CS1501: No overload for method &amp;#39;Add&amp;#39; takes &amp;#39;2&amp;#39; arguments&lt;/font&gt;&lt;/p&gt;   &lt;/blockquote&gt;   &lt;p&gt;If you pass in instead just:&lt;/p&gt;  &lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;cboProblem.Items.Add(“some text”);&lt;/font&gt;&lt;/p&gt;   &lt;/blockquote&gt;   &lt;p&gt;&amp;nbsp;This will work, however both the text and value properties of the list item will be “Some Text”.&amp;nbsp; Not good if you need to know a specific ID value of a list item chosen.  &lt;/p&gt;&lt;p&gt;&amp;nbsp;So what gives?&amp;nbsp; Well it turns out what you actually need to pass into the Add method is a ListItem.&amp;nbsp; The list item can then have two values, one for text and one for value.&amp;nbsp; So the proper format of the add command would be:&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;     &lt;p&gt;&lt;font color="#0000ff"&gt;cboProblem.Items.Add( new System.Web.UI.WebControls.ListItem(“Some text”,”ID123”));&lt;/font&gt;&lt;/p&gt;   &lt;/blockquote&gt;     &lt;p&gt;Now that you have populated the list with your various entries and defined the text and value portions of the items you can retrieve them like so:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;       &lt;p&gt;&lt;font color="#0000ff"&gt;//get selected item&amp;#39;s&amp;nbsp; value           &lt;br /&gt;string val = cboProblem.Items[cboProblem.SelectedIndex].Value            &lt;br /&gt;//get selected item&amp;#39;s text            &lt;br /&gt;string disp = cboProblem.Items[cboProblem.SelectedIndex].Text&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41485" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>Getting a user time stamp in the SalesLogix Web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/02/10/getting-a-user-time-stamp-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/02/10/getting-a-user-time-stamp-in-the-saleslogix-web-client.aspx</id><published>2010-02-10T12:07:00Z</published><updated>2010-02-10T12:07:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The SalesLogix web client has a couple of locations that they have a button to add a user time stamp within a memo field.&amp;nbsp; For instance, on the standard Ticket Extended Details, on the Problem and Solution fields.&amp;nbsp; If you look at these buttons they are actually executing a Sage Business rule called “AddTicketSolutionTimeStamp” or “AddTicketProblemTimeStamp”.&amp;nbsp; These business rules actually prefixes the data already in the solution or problem with a user and date time stamp in the format of “Lee Hogan 2/9/2010 12:40:18 PM (Central Standard Time)”.&lt;/p&gt;    &lt;p&gt;This time stamp would be a useful feature to use elsewhere but since this is built into a standard Sage business rule on the Ticket you can’t simply call these business rules.&amp;nbsp; However, if we dig into one of the business rule using reflector we can see that if utilizes the Sage.SalesLogix.BusinessRule class in the Business Rule assembly to actually get the time stamp:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/TicketBusinessRule_7DE5FD6A.jpg"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/TicketBusinessRule_thumb_5DCAF0AD.jpg" style="border:0px none;display:inline;" title="Ticket Business Rule" alt="Ticket Business Rule" width="644" border="0" height="93" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The fully qualified path to the rule is “Sage.SalesLogix.BusinessRules.BusinessRuleHelper.AddUserDateTimeStamp()”&lt;/p&gt;        &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Luckily this Business Rule Helper is an exposed method.&amp;nbsp; Sage has a bad habit of not publically exposing some helpful rules but in this case we have lucked out. So with this method available to us we can use it somewhere to add our own user time stamp like:&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;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;                   &lt;p&gt;&lt;font color="#0000ff"&gt;Sage.Entity.Interfaces.IWidget widget = this.BindingSounrce.Current as Sage.Entity.Interfaces.IWidget;                       &lt;br /&gt;if(widget.Notes != null) widget.Notes = Sage.SalesLogix.BusinessRule.BusinessRulesHelper.AddUserDateTimeStamp() + System.Environment.NewLine + widget.Notes;&lt;/font&gt;&lt;/p&gt;                 &lt;/blockquote&gt;                                                   &lt;p&gt;Simple&lt;/p&gt;            &lt;p&gt;&amp;nbsp;&lt;/p&gt;                   &lt;p&gt;&amp;nbsp;&lt;/p&gt; x          &lt;img src="http://customerfx.com/aggbug.aspx?PostID=41471" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>SalesLogix 7.5.2 Hot Fix 1 – the Dependency Lookup is still broken</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/01/27/saleslogix-7-5-2-hot-fix-1-the-dependency-lookup-is-still-broken.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/01/27/saleslogix-7-5-2-hot-fix-1-the-dependency-lookup-is-still-broken.aspx</id><published>2010-01-27T22:04:05Z</published><updated>2010-01-27T22:04:05Z</updated><content type="html">SalesLogix released hotfix 1 for SalesLogix 7.5.2.&amp;#160; One of the published resolutions of the hot fix was a modification to the dependency lookup  &lt;p&gt;   &lt;p&gt;to fix defect 1-72412 “Editing ACI values on the ticket causes the ACI view to freeze”.&amp;#160; This fix entailed a new version of the SalesLogix web control assembly.&amp;#160; I had been hoping that Sage would also sneak in a serious design flaw with the dependency lookup that prevents you from seeing what the user has set the value to.&amp;#160; For instance on a ticket If a ticket has an Area=A Category=B and Issue=C and the user changes this so the Area=A the Category=Y and the Issue=Z, you would expect the exposed OnChange event of the dependency lookup to return that the new values are A, Y, and Z respectively.&amp;#160; However the on change event apparently runs too soon and still returns A, B, and C.&amp;#160; This is really lame and makes the dependency lookups unusable for logic evaluation purposes .&lt;/p&gt;    &lt;p&gt;I guess I will keep my fingers crossed for Hot Fix 2.&lt;/p&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41449" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>Clearing user default settings in the SalesLogix web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/01/13/clearing-user-default-settings-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/01/13/clearing-user-default-settings-in-the-saleslogix-web-client.aspx</id><published>2010-01-13T11:12:00Z</published><updated>2010-01-13T11:12:00Z</updated><content type="html">&lt;p&gt;Each user of the SalesLogix web client can define various user based&amp;nbsp; settings while they are using the SalesLogix web client.&amp;nbsp; Things such as splitter height, visible tabs, open tabs, etc are all stored per user.&amp;nbsp; Sometimes these settings block other changes that you would like to force out administratively.&amp;nbsp; For instance what if you decide you want to set the tab order on the account page to be a particular order?&amp;nbsp; Well for users who have never logged in, the next time they log in they will see this change.&amp;nbsp; however, users who have already used the system will not see the change.&amp;nbsp; This is because the user’s previous tab definitions have already been defined and stored.&amp;nbsp; These individual user preferences take precedence over the default settings.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;The settings are actually stored in the SalesLogix database in the VIRTUALFILESYSTEM table.&amp;nbsp; This is so that regardless of what computer the user logs into the web client with, the settings will carry across.&amp;nbsp; Now the VIRTUALFILESYSTEM actually contains pretty much everything that is the SalesLogix web client, including all of the entity definitions, screens, code, etc.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;Because of this and because it is just smart, I need to pause here and say: “PROCEED AT YOUR OWN RISK.&amp;nbsp; MODIFYING THE DATABASE AS DERSCRIBED BELOW CAN BE POTENTIALLY HARMFUL IF YOU DO NOT KNOW WHAT YOU ARE DOING.&amp;nbsp; PROCEED ONLY IF YOU UNDERSTAND WHAT YOU ARE DOING AND ALWAYS TRY THIS SORT OF THING IN A TEST SYSTEM FIRST”.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;OK Now that this disclaimer is out of the way, you can find all of your users default settings stored in the VirtualFileSystem by running a query similar to:&lt;/p&gt;  &lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Select * from VIRTUALFILESYSTEM where modifyuser = ‘{USERNAME}’ and itemname&amp;lt;&amp;gt;’{USERNAME}’&lt;/font&gt;&lt;/p&gt;   &lt;/blockquote&gt;   &lt;p&gt;&amp;nbsp;The query above needs to be updated to have {USERNAME} changed to the SalesLogix username like “lee” for Lee Hogan.  &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now to clear all of the user settings you can run a query like:&lt;/p&gt;    &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;       &lt;p&gt;&lt;font color="#0000ff"&gt;Delete from VIRTUALFILESYSTEM where modifyuser = ‘{USERNAME}’ and itemname&amp;lt;&amp;gt;’{USERNAME}’&lt;/font&gt;&lt;/p&gt;     &lt;/blockquote&gt; After executing the script you would need to do an IIS reset to clear the old settings from the IIS cache.      &lt;img src="http://customerfx.com/aggbug.aspx?PostID=41407" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>How to make the SalesLogix web insert Contact/Account screen work like the LAN version for Account fields being editable</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/01/07/how-to-make-the-saleslogix-web-insert-contact-account-screen-work-like-the-lan-version-for-account-fields-being-editable.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/01/07/how-to-make-the-saleslogix-web-insert-contact-account-screen-work-like-the-lan-version-for-account-fields-being-editable.aspx</id><published>2010-01-07T17:04:00Z</published><updated>2010-01-07T17:04:00Z</updated><content type="html">&lt;p&gt;In the SalesLogix web client the insert Account Contact screen behaves differently than the LAN version in that you can modify the Account level fields when you select an existing Account to use.&amp;nbsp; I was recently asked how to make it work like the LAN client so that the Account fields are not editable.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;When I looked at the form (which is a custom Contact smart part called InsertContact.aspx) I noticed that on the Account lookup control there is code in there to do this, however it does not appear to work correctly.&amp;nbsp; In the code you can see it has something like this:&lt;/p&gt;  &lt;p&gt;if ((account != null) &amp;amp;&amp;amp; (contact != null))   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtContactAccountName.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; adrAccountAddress.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; phnAccountMainPhone.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; phnAccountFax.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountType.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountSubType.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountStatus.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountIndustry.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtAccountBusinessDescription.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; usrAccountManager.Enabled = false;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ownAccountOwner.Enabled = false;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;I found that by changing it to read like this instead, it worked:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;if ((account != null) &amp;amp;&amp;amp; (contact != null))   &lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtContactAccountName.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; adrAccountAddress.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; phnAccountMainPhone.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; phnAccountFax.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountType.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountSubType.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountStatus.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pklAccountIndustry.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; txtAccountBusinessDescription.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usrAccountManager.ReadOnly = true;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ownAccountOwner.ReadOnly = true;&lt;/p&gt;  &lt;p&gt;Go figure.&amp;nbsp; I guess the enable property is not quite functional.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41396" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>SalesLogix 7.5.2 Web - Invalid Index X for this OleDBParameterCollection Error</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2010/01/06/saleslogix-7-5-2-web-invalid-index-x-for-this-oledbparametercollection-error.aspx" /><id>http://customerfx.com/pages/integrationblog/2010/01/06/saleslogix-7-5-2-web-invalid-index-x-for-this-oledbparametercollection-error.aspx</id><published>2010-01-06T15:32:00Z</published><updated>2010-01-06T15:32:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I recently ran into an error on an upgraded SalesLogix 7.5.2 web client when attempting to save changes to an entity using the standard entity.Save() method.&amp;nbsp; The error looked like:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/SavingError_4ED32C06.jpg"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SavingError_thumb_0A92C4BA.jpg" style="border:0px none;display:inline;" title="Saving Error" alt="Saving Error" width="394" border="0" height="104" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;I found that the cause of the problem was that for some business logic reasoning we had been setting an entity property’s relationship ID via code on the result of a lookup control’s change action.&amp;nbsp; Let me explain that a little better.&amp;nbsp; The entity ( I will call Widgets) has a relationship to another entity.&amp;nbsp; That relationship is expressed with a property called Widget.Role.&amp;nbsp; The entity itself has a property called Widget.RoleId which is the field where the ID is stored that actually creates the relationship to the other entity.&amp;nbsp; Hopefully that makes sense.&lt;/p&gt;    &lt;p&gt;&amp;nbsp;Now when you use a lookup control, what happens when you perform a lookup to an entity, SalesLogix automatically creates the relationship (Widget.Role) but does not populate the ID field (Widget.RoleId) until after the save event.&lt;/p&gt;    &lt;p&gt;&amp;nbsp;Back to my scenario, we had been using in code calls to Widget.RoleId to get values.&amp;nbsp; Now this worked fine for existing entities with the relationships established but when inserting a new Widget the RoleId property was empty, even after using the lookup control to populate it.&amp;nbsp; For this reason we had mistakenly added code to the lookup change event to set Widget.RoleID = Widget.Role.Id.&lt;/p&gt;    &lt;p&gt;&amp;nbsp;I say mistakenly, because this led to the error I mentioned above.&amp;nbsp; Apparently SalesLogix, when saving a record attempts to identify how many fields have changed on the entity in order to issue the underlying database commands.&amp;nbsp; By us having manually updated both the Widget.Role (via the lookup) and Widget.RoleID (via the code) the system saw 2 fields having been updated even though it was in fact an update to really only one field.&amp;nbsp; This caused the creation of the array used by the underlying database update to have an invalid array.&amp;nbsp; &lt;/p&gt;    &lt;p&gt;&amp;nbsp;We resolved this by changing our code from checking the Widget.RoleId property to checking the SalesLogix generated Widget.Role.Id property and all was back to blissfulness.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41389" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>KnowledgeSync has updated their user manual</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/22/knowledgesync-has-updated-their-user-manual.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/22/knowledgesync-has-updated-their-user-manual.aspx</id><published>2009-12-22T13:08:39Z</published><updated>2009-12-22T13:08:39Z</updated><content type="html">&lt;p&gt;Anyone that has worked with the KnowledgeSync manual in the past knows that it is a massive document of over 500 pages.&amp;#160; Well, VineyardSoft has decided to do a re-write of the manual and has condensed it down while at the same time updating documentation with newer operating systems.&amp;#160; You can download the new document &lt;a href="http://01ec032.netsolhost.com/lit/ks_manual.zip" target="_blank"&gt;here.&lt;/a&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41343" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="KnowledgeSync" scheme="http://customerfx.com/pages/integrationblog/archive/tags/KnowledgeSync/default.aspx" /></entry><entry><title>Error deploying a SalesLogix 7.5.2 web client portal</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/21/error-deploying-a-saleslogix-7-5-2-web-client-portal.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/21/error-deploying-a-saleslogix-7-5-2-web-client-portal.aspx</id><published>2009-12-21T11:29:00Z</published><updated>2009-12-21T11:29:00Z</updated><content type="html">&lt;p&gt;Recently I upgraded a SalesLogix web environment from 7.5.1 to 7.5.2.&amp;nbsp; Once I had done so when I tried to deploy I received the following error:&lt;/p&gt;  &lt;p&gt;ERROR - The following project item, &amp;#39;\Portal\SlxClient\ChildPages\Access\Access.page.xml&amp;#39; failed validation.&lt;/p&gt;  &lt;p&gt;The error referenced a custom page called Access in the system.&amp;nbsp; I opened up that page and everything looked fine.&amp;nbsp; I have had experiences like this where if something errors in 7.5.2, simply modifying it trivially (like adding a space to a code file) and re-saving fixed the problem.&amp;nbsp; When I tried that on this scenario I received an error when attempting to save:&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;a href="http://customerfx.com/blogs/integrationblog/image_3FCD4FB2.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/image_thumb_1173CA05.png" style="border:0px none;display:inline;" title="image" alt="image" width="244" border="0" height="114" /&gt;&lt;/a&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Apparently the 7.5.2 does some additional validations that 7.5.1 does not.&amp;nbsp; This particular page it turns out did not have an Entity defined for it under the Page’s Page Property collection.&amp;nbsp; Once I added that, I could save it.&amp;nbsp; After saving I was able to deploy.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; If you run into an error during deployment, check out the page it references.&amp;nbsp; Make sure it is properly configured.&amp;nbsp; Again this kind of validation in new in SalesLogix 7.5.2 web.&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41318" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>Sage SalesLogix web Build error: The name 'XXX' does not exist in the current context</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/17/sage-saleslogix-web-build-error-the-name-xxx-does-not-exist-in-the-current-context.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/17/sage-saleslogix-web-build-error-the-name-xxx-does-not-exist-in-the-current-context.aspx</id><published>2009-12-17T19:08:28Z</published><updated>2009-12-17T19:08:28Z</updated><content type="html">&lt;p&gt;&lt;/p&gt;  &lt;p&gt;I have found what appears to be a bug in 7.5.2 and the handling of external assemblies referenced for use in SalesLogix code, like business rules, events, custom properties, etc.&amp;#160; I had a system that had multiple external assemblies handling some global business rules that were shared across multiple entities in the SalesLogix web portal.&amp;#160; After upgrading to 7.5.2 I could no longer do a full build on the system.&amp;#160; I would get the following error: &lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;ERROR - C:\Users\bobo\AppData\Roaming\Sage\Platform\Output\Sage.SnippetLibrary.CSharp\src\Sage.SnippetLibrary.CSharp.@.296d53c4-46bb-4baa-a4f5-44f57dec9720.codesnippet.cs(47,13):The name &amp;#39;XXX&amp;#39; does not exist in the current context&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;   &lt;p&gt;The rule that uses the assembly does have a reference to the assembly and worked fine in 7.5.1.&amp;#160; I tried removing the reference and re-adding in the business rule.&amp;#160; In the actual code file, the intellisense in the Application Architect code editor detects the assembly and its various classes and methods. However every rule, event, custom property, etc. that uses this external assembly failed with the same error. &lt;/p&gt;   &lt;a href="http://customerfx.com/blogs/integrationblog/CodeFile_590D1320.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;border-top:0px;border-right:0px;" title="CodeFile" border="0" alt="CodeFile" src="http://customerfx.com/blogs/integrationblog/CodeFile_thumb_38F20663.jpg" width="447" height="484" /&gt;&lt;/a&gt;     &lt;p&gt;&lt;/p&gt; &lt;/p&gt;  &lt;p&gt;I initially realized my external assemblies all had references to the old 7.5.1 Sage references. I recompiled the assembly using the new 7.5.2 Sage dlls as references within it.&amp;#160; This did not help but is an important thing to remember you have to do. &lt;/p&gt;  &lt;p&gt;I also tried adding a reference in the codesnippet.xml file (On Win7 this is @ C:\ProgramData\Sage\Platform\Configuration\Global) which I understand is supposed to act like a global assembly reference for all files on the site.&amp;#160; This didn&amp;#39;t work either. &lt;/p&gt;  &lt;p&gt;I was at my wits end.&amp;#160; By chance I happened to see a warning message that had occurred way up in my build.&amp;#160; That led me to the solution I needed. &lt;/p&gt;  &lt;p&gt;As I mentioned,&amp;#160; I think this should be considered a bug. It is really stupid but easy to remedy. &lt;/p&gt;  &lt;p&gt;I think that before 7.5.2 when you had external assemblies referenced in code snippets, or whatnot, that when you built, it used the specified reference path to do the build (logical).&amp;#160; Apparently in 7.5.2, while you still need to add the reference to the assemblies in the code files, it apparently does not use that path during the build, or at least all parts of the build. &lt;/p&gt;  &lt;p&gt;The simple fix is: any external assemblies need to exist in the SalesLogix\SalesLogix directory (C:\Program Files\SalesLogix\SalesLogix&amp;quot;), regardless of where each code file says the reference location is.&amp;#160; I figured this out because I had a warning message earlier on that said: &lt;/p&gt;  &lt;p&gt;&lt;font color="#0000ff"&gt;Unable to locate assembly reference FX.Gen.dll in assemblies or C:\Program Files\SalesLogix\. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Now, I don&amp;#39;t know why this message says this because my assembly is in my output folder&amp;#39;s &amp;quot;assemblies&amp;quot; directory (that is where I specified it was in my code file references).&amp;#160; Regardless, simply copy the file to the directory makes it all sing. &lt;/p&gt;  &lt;p&gt;This whole assembly reference area seems REALLY kludge to me.&amp;#160; It gets exponentially harder to manage when you are talking about multiple assemblies being added by multiple developers on different computers with different OS and centrally shared using Git.&amp;#160; I hope Sage does something to help with this because I can see that this will be a nightmare for system maintenance and upgrades.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41317" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>SalesLogix 7.5.2 change to the IOwner interface</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/17/saleslogix-7-5-2-change-to-the-iowner-interface.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/17/saleslogix-7-5-2-change-to-the-iowner-interface.aspx</id><published>2009-12-17T15:09:43Z</published><updated>2009-12-17T15:09:43Z</updated><content type="html">I have not found any official reference to this change anyplace: prior to 7.5.2 the Sage.Entity.Interfaces.IOwner entity contained a RightsCollection collection of user rights (Sage.Entity.Interfaces.IOwnerRights which represents the database table SECRIGHTS).&amp;#160; In 7.5.2 this has changed to now just be called Rights.&amp;#160; If you have any code that was using the previous property name “RightsCollection” you will need to update them when you upgrade to 7.5.2.  &lt;img src="http://customerfx.com/aggbug.aspx?PostID=41315" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>The SalesLogix bundlediff.exe utility for SalesLogix 7.5.2</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/16/the-saleslogix-bundlediff-exe-utility-for-saleslogix-7-5-2.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/16/the-saleslogix-bundlediff-exe-utility-for-saleslogix-7-5-2.aspx</id><published>2009-12-16T19:52:00Z</published><updated>2009-12-16T19:52:00Z</updated><content type="html">&lt;p&gt;During the SalesLogix upgrade from a previous version of the SalesLogix web client ot 7.5.2 one of the procedures is to create a manifest bundle of all of you customizations.&amp;nbsp; SalesLogix has now provided a utility to help compare what from your custom manifest has changed in SalesLogix 7.5.2.&lt;/p&gt;    &lt;p&gt;Lest say that I am on 7.5.1 and want to bundle up all of my changes.&amp;nbsp; The first step would be to create a workspace VFS that contained the base 7.5.1 VFS.&amp;nbsp; Make sure this base VFS also consists of any hot fixes matching your current version.&amp;nbsp; From within Application Architect you can then go to your custom VFS and create a bundle based on project differences.&amp;nbsp; Select to compare to the base 7.5.1 workspace you set up and the resulting bundle should be a comprehensive list of all the items that have changed from the base 7.5.1 system.&lt;/p&gt;    &lt;p&gt;In the SalesLogix 7.5.2 service pack, when you extract it you will find a “Project&amp;nbsp; Differences” folder.&amp;nbsp; In this folder are bundle manifests showing what has changed from one level to the next.&amp;nbsp; Since my example I am upgrading from 7.5.1 to 7.5.2 I would be interested in the file “Sage SalesLogix 7.5.1 to 7.5.2 Model Changes.zip”.&lt;/p&gt;    &lt;p&gt;Now armed with these two manifests, the first thing to do is copy them to a short path on a computer that is on the 7.5.2 level.&amp;nbsp; I would recommend something simple like C:\SLX752.&amp;nbsp; For ease of use I would copy these manifest into this directory.&amp;nbsp; To make it even easier to work with I would also rename the manifest to something short like “Custom.zip” and “SLX.zip”. The reason for this is because we need to type this into a command prompt coming up and working with short names is nice.&amp;nbsp; You can keep a copy of these files with their original names to be used for later purposes.&lt;/p&gt;      &lt;p&gt;Now with the files here you can run the bundlediff.exe that is part of the SalesLogix 7.5.2 installation.&amp;nbsp; This is a command line based utility that requires you to pass in the parameters you need.&amp;nbsp; In typical Sage-like fashion there is not a lot of documentation but basically this utility lets you compare two bundle manifests and see what common elements are contained in them.&lt;/p&gt;        &lt;p&gt;The first thing you need to do is open a command line prompt (Start…Run “cmd”).&amp;nbsp; Then you will need to navigate the prompt to the SalesLogix installation directory or type out the full path to the utility.&amp;nbsp; Once you are in the SalesLogix directory you can then execute the bundlediff.exe.&amp;nbsp; This utility requires you specify two bundles and a compare option switch.&amp;nbsp; By default the utility outputs to the console but you can add a switch to output it to a file.&lt;/p&gt;        &lt;p&gt;Lets take a look at the command line:&lt;/p&gt;        &lt;blockquote&gt;           &lt;p&gt;&lt;font color="#0000cc"&gt;bundlediff.exe /Bundle1:&amp;quot;C:\SLX752\Custom.zip&amp;quot; /Bundle2:&amp;quot;C:\SLX752\SLX.zip&amp;quot; /DiffOption:Common &amp;gt;&amp;quot;C:\SLX752\Log.txt&amp;quot;&lt;/font&gt;&lt;/p&gt;         &lt;/blockquote&gt;                                   &lt;p&gt;You must specify each bundle by calling /Bundle1 or /Bundle2 followed by a colon and then the path to the manifest.&amp;nbsp; The other switch is /DiffOption which also follows the format of the switch, a colon, and then the option to choose.&amp;nbsp; Here are your choices: &lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;AllItems&lt;/b&gt; - lists every item in both bundles. This is a flat list of bundle contents without differencing. You can use this to see a complete list of what items Sage changed in the release.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Common&lt;/b&gt; - lists the bundle items that exist in both bundles. These are the items that you will have to act on (ignore or merge) when you apply your customization bundle.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Bundle1OnlyItems&lt;/b&gt; - lists items that exist in bundle 1 but not in bundle 2.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Bundle2OnlyItems&lt;/b&gt; - lists items that exist in bundle 2 but not in bundle 1.&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;b&gt;CommonAndExclusive&lt;/b&gt; - lists all items using the Common, Bundle1OnlyItems, and Bundle2OnlyItems parameters.&lt;/li&gt;&lt;/ul&gt; The last part of the command line is the switch to output the contents from the console window to a file.&amp;nbsp; This requires the &amp;gt; symbol followed by the path to the file to log to.&amp;nbsp; I believe the log file must already exist, the utility will not create one so you will need to create an empty text file to use.By aware that all of the command line switches and options are case-sensitive&lt;br /&gt;&lt;p&gt;The end result is a log that looks something like this:&lt;/p&gt;                   &lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000cc"&gt;Validating command line arguments.           &lt;br /&gt;The following are bundle items that exist in both bundles.            &lt;br /&gt;\Entity Model\SalesLogix Application Entities\Account\QuickForms\AccountContacts.main.quickform.xml            &lt;br /&gt;\Entity Model\SalesLogix Application Entities\Account\QuickForms\AccountTickets.main.quickform.xml&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;          Hopefully this helps explain the SalesLogix bundlediff utility a little bit.&amp;nbsp; While this is a nice little feature to have the same type of comparison could be done using other file and directory comparison tools that are widely available for free, like &lt;a href="http://www.sourcegear.com/diffmerge/" target="_blank"&gt;DiffMerge&lt;/a&gt; or commercial products like &lt;a href="http://www.scootersoftware.com/" target="_blank"&gt;Beyond Compare&lt;/a&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41308" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /></entry><entry><title>Unable to open 7.5.2 Application Architect after upgrading from 7.5.1</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/15/unable-to-open-7-5-2-application-architect-after-upgrading-from-7-5-1.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/15/unable-to-open-7-5-2-application-architect-after-upgrading-from-7-5-1.aspx</id><published>2009-12-15T22:45:00Z</published><updated>2009-12-15T22:45:00Z</updated><content type="html">&lt;p&gt;Not sure under what circumstances this will occur but I just ran into this on a Windows 7 64bit computer and thought I would post.&amp;nbsp; After upgrading the computer from a 7.5.1 installation to 7.5.2 I was unable to open the Application architect.&amp;nbsp; An error was displayed: &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#0000cc"&gt;A module declared a dependency on another module which is not declared to be loaded; Missing module(s): &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#0000cc"&gt;Sage.Platform.Extensibility.PlatformModule, &lt;/font&gt;&lt;/p&gt;   &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#0000cc"&gt;Sage.Platform.Orm.CodeGen.CodeGenerationModule (Sage.Platform.Application)&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;The solution to this problem was to uninstall the SalesLogix Admin tools and then reinstall them again (7.5.0) and then re-apply the service pack 7.5.2.&amp;nbsp; After doing this everything seemed to work fine.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41233" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.1" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.1/default.aspx" /><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /><category term="SalesLogix Upgrade" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Upgrade/default.aspx" /></entry><entry><title>Follow up to selecting a SalesLogix gridview Row ID</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/04/follow-up-to-selecting-a-saleslogix-gridview-row-id.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/04/follow-up-to-selecting-a-saleslogix-gridview-row-id.aspx</id><published>2009-12-04T19:38:37Z</published><updated>2009-12-04T19:38:37Z</updated><content type="html">&lt;p&gt;In my &lt;a href="http://customerfx.com/pages/integrationblog/2009/11/18/retrieving-the-current-grid-row-id-in-the-saleslogix-web-control.aspx" target="_blank"&gt;previous post&lt;/a&gt;, I mentioned how to get the selected ID of a gridview’s row when you click the row.&amp;#160; Since then I have found that sometimes SalesLogix will implement an extra DataKey in the grid when it is deployed as a quick form.&amp;#160; (For instance, if you specify the grid’s DataKeyNames = “Id”, when it deploys you will actually see the grids DataKeyNames are “InstanceId, Id” When you call the code I had mentioned before:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;string historyid = grdSystemNotes.SelectedDataKey.Value.ToString();&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The system would actually return the InstanceId DataKey since that is the first specified.&amp;#160; The InstanceId is a GUID based Id for the rendered HTML grid and does no good for us wanting to get the row’s ID.&amp;#160; The more sure-fire way of getting our desired DataKey “Id” is by using code like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;string noteid = grdActivities.DataKeys[grdActivities.SelectedIndex].Values[&amp;quot;Id&amp;quot;].ToString();&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41192" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.1" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.1/default.aspx" /></entry><entry><title>Enforcing numeric input on a SalesLogix 7.5.1 quick form text control</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/12/02/enforcing-numeric-input-on-a-saleslogix-7-5-1-quick-form-text-control.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/12/02/enforcing-numeric-input-on-a-saleslogix-7-5-1-quick-form-text-control.aspx</id><published>2009-12-02T19:39:40Z</published><updated>2009-12-02T19:39:40Z</updated><content type="html">&lt;p&gt;SalesLogix has a couple of numeric based custom text controls including currency, and numeric.&amp;#160; One of the things you will find is that using these controls gives the user a slightly different experience based on the custom control chosen.&amp;#160; One of the big differences is that the currency control enforces numeric input once the user leaves the field where the numeric control has no such validation.&lt;/p&gt;  &lt;p&gt;Typically you would control this type of client side behavior in JavaScript or jQuery.&amp;#160; Unfortunately SalesLogix does not allow direct access to specifying client side events on most controls at design-time.&amp;#160; There is a way of doing this however by adding attributes to the control when the page loads using the Control’s Attribute.Add method.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now before I get to how to do that lets look at a sample of JavaScript that would restrict user input to only numeric values (and delete and backspace)&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;var key = window.event.keyCode;        &lt;br /&gt;if ( (key &amp;gt; 47 &amp;amp;&amp;amp; key &amp;lt; 58) || key == 8 || key == 127)         &lt;br /&gt;&amp;#160;&amp;#160; return; //It is valid so don&amp;#39;t do anything        &lt;br /&gt;else         &lt;br /&gt;&amp;#160;&amp;#160; window.event.returnValue = null; //Don&amp;#39;t allow the input&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Now how to add this so that the quick form binds our JavaScript to our control? As mentioned, using the Attribute.Add method.&amp;#160; Shown here is how you could do this using a C# Snippet Action Item “(Obsolete)” on a form Load event:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;myTextBox.Attributes.Add(&amp;quot;onkeypress&amp;quot;,       &lt;br /&gt;&amp;quot;BLOCKED SCRIPT var key = window.event.keyCode; if ( (key &amp;gt; 47 &amp;amp;&amp;amp; key &amp;lt; 58) || key == 8 || key == 127) return; else window.event.returnValue = null;&amp;quot;);&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The Attributes.Add is called for your user control.&amp;#160; The first parameter is to identify what attribute you are adding.&amp;#160; In our case we want to add code to the key press event.&amp;#160; The second attribute is the actual JavaScript code.&amp;#160; Add this to an OnLoad event for you page and you have numeric input validation.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41181" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.1" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.1/default.aspx" /></entry><entry><title>How to invoke a web lookup control’s popup event in the SalesLogix web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/11/27/how-to-invoke-a-web-lookup-control-s-popup-event-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/11/27/how-to-invoke-a-web-lookup-control-s-popup-event-in-the-saleslogix-web-client.aspx</id><published>2009-11-27T21:44:12Z</published><updated>2009-11-27T21:44:12Z</updated><content type="html">&lt;p&gt;One of the things that is often asked is how can you call a certain lookup’s “Popup event” from code in the SalesLogix web client.&amp;#160; The SalesLogix web uses JavaScript to launch these lookups.&amp;#160; You can see the invoke code of the JavaScript by putting your cursor over the lookup’s button.&amp;#160; Once you know that syntax you can determine the server side code you would use to invoke the client side code.&amp;#160; The code will typically look like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#0000ff"&gt;ScriptManager.RegisterClientScriptBlock(this, GetType(), &amp;quot;ShowLookup&amp;quot;,&amp;quot;$(document).ready(function() { setTimeout(function() { &amp;quot; + &lt;font color="#ff0000"&gt;&lt;strong&gt;AssignTo&lt;/strong&gt;&lt;/font&gt;.ClientID + &amp;quot;_luobj.show() }, 500) })&amp;quot;,true);&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The important thing here is to change the red part of the code to be the server side control ID of the lookup you wish to pop.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41173" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.1" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.1/default.aspx" /></entry><entry><title>A heads up: The SalesLogix web Lookup Control is session cached</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/11/20/a-heads-up-the-saleslogix-web-lookup-control-is-session-cached.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/11/20/a-heads-up-the-saleslogix-web-lookup-control-is-session-cached.aspx</id><published>2009-11-20T13:03:40Z</published><updated>2009-11-20T13:03:40Z</updated><content type="html">&lt;p&gt;I recently was having problems seeing changes I was making to a deployed ASP.Net SalesLogix web page.&amp;#160; Specifically, the changes I was making to a Lookup control.&amp;#160; What I discovered is that the changes to my page were not reflected in my lookup until after I logged out of the SalesLogix web client and logged back in.&amp;#160; Simply refreshing my page in the browser had no affect.&amp;#160; Apparently some information is being cached in session state.&amp;#160; Just a heads up that if you are not seeing something work as you would expect in the SalesLogix web client, try logging out.&lt;/p&gt;  &lt;p&gt;There are other things like changes to user security or information that I have also found are cached at log in so in general this is a good practice when testing out your pages.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41147" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>Error attempting to sort a SalesLogix web grid control</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2009/11/20/error-attempting-to-sort-a-saleslogix-web-grid-control.aspx" /><id>http://customerfx.com/pages/integrationblog/2009/11/20/error-attempting-to-sort-a-saleslogix-web-grid-control.aspx</id><published>2009-11-20T11:29:00Z</published><updated>2009-11-20T11:29:00Z</updated><content type="html">&lt;p&gt;If you have ever added code similar to:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;&lt;font color="#0000ff"&gt;mygrid.Sort(&amp;quot;CreateDate&amp;quot;, SortDirection.Descending);&lt;/font&gt;&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;p&gt;You may have seen an error similar to this:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font color="#0000ff"&gt;System.Web.HttpException: The GridView &amp;#39;mygrid&amp;#39; fired event Sorting which wasn&amp;#39;t handled.&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is caused by attempting to call the sort method on a grid that does not have it&amp;#39;s EnableSorting property set to True.&amp;nbsp; Also, the column you are sorting should also have it&amp;#39;s IsSortable and SortField properties defined.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=41090" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SalesLogix 7.5.1" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.1/default.aspx" /></entry></feed>