<?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>2012-07-31T12:18:00Z</updated><entry><title>Disabling the SalesLogix 8x web server cache</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/05/15/disabling-the-saleslogix-8x-web-server-cache.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/05/15/disabling-the-saleslogix-8x-web-server-cache.aspx</id><published>2013-05-15T19:43:00Z</published><updated>2013-05-15T19:43:00Z</updated><content type="html">&lt;p&gt;When doing development in the SalesLogix web client it is often useful to deploy the website and then open the deployed pages and user controls and edit them directly to try different code or troubleshoot problems.&amp;nbsp; In version 8 of the SalesLogix web client making changes to the deployed files in the web site does not immediately get reflected in the client.&amp;nbsp; This makes development impossible because you dont know if changes you are trying are reflected yet in the client.&lt;/p&gt;&lt;p&gt;This all has to do with the dynamic customization capabilities of quick forms introduced in v8 of SalesLogix.&lt;/p&gt;&lt;p&gt;You can disable this caching by following the following steps &lt;b&gt;(only do this in a development environment)&lt;/b&gt; &lt;/p&gt;&lt;p&gt;1. Open the web.config file. &lt;/p&gt;&lt;p&gt;2. Search for &amp;quot;wfg&amp;quot;&lt;/p&gt;&lt;p&gt;3. You should see the following lines of code:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- WFG: dynamic quick forms enabled; switch following two lines to disable --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&amp;lt;globalization culture=&amp;quot;auto&amp;quot; uiCulture=&amp;quot;auto&amp;quot;/&amp;gt;--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;globalization culture=&amp;quot;auto&amp;quot; uiCulture=&amp;quot;auto&amp;quot; resourceProviderFactoryType=&amp;quot;Sage.Platform.QuickForms.WebFormGen.Web.UpdatableResXResourceProviderFactory, Sage.Platform.QuickForms.WebFormGen&amp;quot;/&amp;gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;4. Change that code so that the second line is not commented out and the third line is instead, like so:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- WFG: dynamic quick forms enabled; switch following two lines to disable --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;globalization culture=&amp;quot;auto&amp;quot; uiCulture=&amp;quot;auto&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&amp;lt;globalization culture=&amp;quot;auto&amp;quot; uiCulture=&amp;quot;auto&amp;quot; resourceProviderFactoryType=&amp;quot;Sage.Platform.QuickForms.WebFormGen.Web.UpdatableResXResourceProviderFactory, Sage.Platform.QuickForms.WebFormGen&amp;quot;/&amp;gt;--&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;5. Save your changes to the web.config file.&lt;/p&gt;&lt;p&gt;6. Under the App_Code folder open the Global.cs file.&lt;/p&gt;&lt;p&gt;7. Comment out the first line, which should be:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;#define EnableDynamicFormSupport&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To be:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;//#define EnableDynamicFormSupport &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;8. Save your changes to the&amp;nbsp; Global.cs file.&lt;/p&gt;&lt;p&gt;9. Deploy your web site if you made these changes in the Application Architect&lt;/p&gt;&lt;p&gt;10. Run an IISReset &lt;/p&gt;&lt;p&gt;Changes now made to the deployed web files should immediately show in your browser. Remember this change should only be made in a development environment.&amp;nbsp; In production you should undo these changes.&lt;/p&gt;&lt;p&gt;Thanks to Alexander Pfingstl for pointing me in this direction! &lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46218" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /></entry><entry><title>How to get sizes for tables in a SQL 2008 database</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/04/18/how-to-get-sizes-for-tables-in-a-sql-2008-database.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/04/18/how-to-get-sizes-for-tables-in-a-sql-2008-database.aspx</id><published>2013-04-18T18:02:00Z</published><updated>2013-04-18T18:02:00Z</updated><content type="html">&lt;p&gt;Under the heading of &amp;quot;often needed and never remembered&amp;quot;, I decided to post a quick T-SQl example of how you can retrieve the space used by the various tables in a SQL 2008 database.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Note, in my select query I am limiting to just the top 20 largest tables.&amp;nbsp; I am also ordering by the space the data is using in the table.&amp;nbsp; These can be easily modified to suit the needs.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;SET NOCOUNT ON &lt;br /&gt;DBCC UPDATEUSAGE(0) &lt;br /&gt;-- Table row counts and sizes.&lt;br /&gt;CREATE TABLE #FXtemp &lt;br /&gt;( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [name] NVARCHAR(128),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [rows] CHAR(11),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; reserved VARCHAR(18), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data VARCHAR(18), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; index_size VARCHAR(18),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unused VARCHAR(18)&lt;br /&gt;) &lt;br /&gt;INSERT #FXtemp EXEC sp_msForEachTable &amp;#39;EXEC sp_spaceused &amp;#39;&amp;#39;?&amp;#39;&amp;#39;&amp;#39; &lt;br /&gt;&lt;br /&gt;SELECT top 20 *&lt;br /&gt;FROM&amp;nbsp;&amp;nbsp; #FXtemp order by cast(replace(data ,&amp;#39;KB&amp;#39;,&amp;#39;&amp;#39;) as int) desc&lt;br /&gt;&amp;nbsp;&lt;br /&gt;DROP TABLE #FXtemp&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46196" 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" /></entry><entry><title>The SLXOLEDB.1 provider is not registered on the local machine</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/04/04/the-slxoledb-1-provider-is-not-registered-on-the-local-machine.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/04/04/the-slxoledb-1-provider-is-not-registered-on-the-local-machine.aspx</id><published>2013-04-04T16:00:00Z</published><updated>2013-04-04T16:00:00Z</updated><content type="html">&lt;p&gt;Ever seen this error before when logging into the SalesLogix web client?&amp;nbsp; &lt;/p&gt;&lt;p&gt;Ofter this is a result of an incorrect configuration within a 64bit IIS environment.&amp;nbsp; However there is a more obscure reason this might be happening we recently discovered.&amp;nbsp; &lt;/p&gt;&lt;p&gt;If you RDP into the web server as the user account running the SalesLogix application pool, once you log out of the RDP you will cause the IIS application pool to crash.&amp;nbsp; This causes the &amp;quot;SLXOLEDB.1 provider is not registered&amp;quot; error.&amp;nbsp; An IISReset will recycle the pools and get rid of the error.&lt;/p&gt;&lt;p&gt;So the short answer is never RDP into the SLX web server as the user account running the Application Pools. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46173" 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>Modifying SLX Mobile 2.0 to deploy customizations on a normal App Architect deployment</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/03/27/modifying-slx-mobile-2-0-to-deploy-customizations-on-a-normal-app-architect-deployment.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/03/27/modifying-slx-mobile-2-0-to-deploy-customizations-on-a-normal-app-architect-deployment.aspx</id><published>2013-03-27T13:06:00Z</published><updated>2013-03-27T13:06:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;In order to have your customizations, that have been added to the SalesLogix Mobile 2.0 client, be deployed to your web site during the normal SalesLogix deployment, you will need to modify a support file used by the Application Architect to determine what gets deployed.&lt;/p&gt;&lt;p&gt;To modify this file perform the following: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;In The Application Architect&amp;#39;s Project Explorer, browse to Portal Manager...Sage SalesLogix Mobile 2.0...Support Files...Source...Products...Argos-SalesLogix...Build.&lt;/li&gt;&lt;li&gt;In this folder you will see a release.jsb2 file.&amp;nbsp; Double click the file to edit it.&lt;/li&gt;&lt;li&gt;If you scroll down to the end of the file you will see a block of Resources.&amp;nbsp; This screen shot shows the standard code highlighted. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/SalesLogix%20release.jsb2%20standard%20code.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SalesLogix%20release.jsb2%20standard%20code.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You will want to add a block of code before the closing ] mark.&amp;nbsp; Right before the closing ] add the following code:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ,{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;quot;src&amp;quot;: &amp;quot;../content/javascript&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;quot;dest&amp;quot;: &amp;quot;content/javascript&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;quot;filters&amp;quot;: &amp;quot;.*\\.js&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;The code should now look like this, with the new code shown highlighted:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/SalesLogix%20release.jsb2%20modified%20code.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SalesLogix%20release.jsb2%20modified%20code.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Save your changes. &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;What this code is doing is telling the deployment we want to take all files in the content/javascript folder that exists one level up in the VFS from the release.jsb2 file.&amp;nbsp; We will then copy those contents into the deployment folder content/javascript.&amp;nbsp; The last parameter is to only include files in this operation with an extension of js.&amp;nbsp; Of course the exact code you may need to add into your deployment may be different depending on where your source files are and where you want them deployed to.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46158" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix dojo Mobile Client" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+dojo+Mobile+Client/default.aspx" /><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>Reading Sales Process details in the SalesLogix LAN client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/03/12/reading-sales-process-details-in-the-saleslogix-lan-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/03/12/reading-sales-process-details-in-the-saleslogix-lan-client.aspx</id><published>2013-03-12T17:04:00Z</published><updated>2013-03-12T17:04:00Z</updated><content type="html">&lt;p&gt;The details about a Sales Process, like Stages and steps are contained in the Sales Process plugin data row in the Data column.&amp;nbsp; The data column is a binary field that stores an XML definition of the sales process.&amp;nbsp; Here is a sample of how you can read the data and do something with it.&amp;nbsp; In my case I am outputting it to a temporary table that can be used for some purpose.&lt;/p&gt;&lt;p&gt;Lets take a look at the main code, invoked from a button click event:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sub Button1Click(Sender)&lt;br /&gt;dim strSQL&lt;br /&gt;dim objRS_SP&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrepTempTable&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSQL = &amp;quot;select pluginid from vFXSalesProcessPlugins&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;#39;create view sysdba.vFXSalesProcessPlugins&lt;br /&gt;&amp;#39;as&lt;br /&gt;&amp;#39;select pluginid from plugin where (type = 1 and basedon is not null)&lt;br /&gt;&amp;#39;union all&lt;br /&gt;&amp;#39;select pluginid from plugin where type = 1 and basedon is null and pluginid not in&lt;br /&gt;&amp;#39;(select basedon from plugin where type = 1 and basedon is not null)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS_SP = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorType = 3 &amp;#39;adOpenStatic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorLocation = 3 &amp;#39;adUseClinet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.LockType = 3 &amp;#39;adLockOptiomistic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Open strSQL, application.GetNewConnection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; with objRS_SP&lt;br /&gt;&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; ReadPlugin .Fields(&amp;quot;PLUGINID&amp;quot;).Value&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; wend&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objRS_SP = nothing&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Msgbox &amp;quot;Table tmp_FXProcess populated&amp;quot;&lt;br /&gt;End Sub &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;First off I am calling a method PrepTempTable.&amp;nbsp; This ensures my SQL temp table is in the database and if not it creates it.&amp;nbsp; If it is there it clears it out.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sub PrepTempTable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.GetNewConnection.Execute &amp;quot;exec sysdba.vFXPrepTempTable&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;#39;create procedure sysdba.vFXPrepTempTable&lt;br /&gt;&amp;#39;as&lt;br /&gt;&amp;#39;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N&amp;#39;[sysdba].[tmp_FXProcess]&amp;#39;) AND type in (N&amp;#39;U&amp;#39;))&lt;br /&gt;&amp;#39;truncate TABLE [sysdba].[tmp_FXProcess]&lt;br /&gt;&amp;#39;else&lt;br /&gt;&amp;#39;create table sysdba.tmp_FXProcess (SPID varchar(12), SPName varchar(96), SPStage varchar(96))&lt;br /&gt;&amp;#39;GO&lt;br /&gt;End Sub &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Next we are getting all the Sales process plugins (These are plugins with a Type=1). With a recordset of the plugins, we need to loop through them and examine them.&amp;nbsp; In my case I wanted to get the released plugin records for all released sales process as well as unreleased processes.&amp;nbsp; Writing a SQL query that would pass though the provider was a little to complex so I handled it with a SQL view called &amp;quot;vFXSalesProcessPlugins&amp;quot;.&lt;/p&gt;&lt;p&gt;Inside the record set looping operation I am calling the ReadPlugin sub.&amp;nbsp; Lets look at this:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sub ReadPlugin(byVal ID)&lt;br /&gt;Dim strSQL, objRS_P&lt;br /&gt;Dim objSTM, objXMLDoc, objCon&lt;br /&gt;Dim strXML, strProcess, strID&lt;br /&gt;Dim objSalesProcessNodes, objSalesProcessNode&lt;br /&gt;Dim objStagesNodes, objStagesNode, objStageNode, objStageNodes, i&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objCon = application.GetNewConnection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSQL&amp;nbsp; = &amp;quot;SELECT PLUGINID,NAME,DATA FROM PLUGIN WHERE PLUGINID=&amp;#39;&amp;quot;&amp;amp; ID &amp;amp; &amp;quot;&amp;#39;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS_P = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.CursorType = 3 &amp;#39;adOpenStatic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.CursorLocation = 3 &amp;#39;adUseClinet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.LockType = 3 &amp;#39;adLockOptiomistic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.Open strSQL, objCon&amp;nbsp; &amp;#39;Provider&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; The Data Field is&amp;nbsp; a blob so we need to stream it in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objSTM = CreateObject(&amp;quot;ADODB.STREAM&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Type = adTypeBinary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Open&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Write objRS_P.Fields(&amp;quot;DATA&amp;quot;).Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strID = objRS_P.Fields(&amp;quot;PLUGINID&amp;quot;).Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strProcess = objRS_P.Fields(&amp;quot;NAME&amp;quot;).Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objRS_P = nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; Create XML Object and Load the Sales Process XML in to XML Object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; ---------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Position = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Type = adTypeText&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Charset =&amp;quot;utf-8&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objXMLDoc = CreateObject(&amp;quot;Msxml2.DOMDocument&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objXMLDoc.async = false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strXML = objSTM.ReadText(objSTM.Size)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If objXMLDoc.loadXML(strXML)= False Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msgbox &amp;quot;Invaild Sales Process XML&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Sub&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objSalesProcessNodes = objXMLDoc.documentElement.selectNodes(&amp;quot;//SalesProcess&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objSalesProcessNode = objSalesProcessNodes.item(0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStagesNodes = objSalesProcessNode.selectNodes(&amp;quot;Stages&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStagesNode = objStagesNodes.item(0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStageNodes = objStagesNode.selectNodes(&amp;quot;Stage&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 0 To objStageNodes.length - 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStageNode = objStageNodes(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteRecord strID, strProcess, objStageNode.selectSingleNode(&amp;quot;Name&amp;quot;).Text, objCon&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next &amp;#39; Stage Loop&lt;br /&gt;End Sub &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;This sub accepts a single parameter, the Plugin ID of the sales process record to read.&amp;nbsp; &lt;/p&gt;&lt;ol&gt;&lt;li&gt;First we open the specific plugin row.&amp;nbsp; &lt;/li&gt;&lt;li&gt;Next we use an ADODB.Stream object to stream out the Data value of the plugin into an object.&lt;/li&gt;&lt;li&gt;Then we create an XML document and load in the streamed plugin data into this.&amp;nbsp; At this point we have a workable XML document we can navigate through and read.&lt;/li&gt;&lt;li&gt;With the XML file we loop through all of the Stage nodes.&lt;/li&gt;&lt;li&gt;Inside the loop we finally call&amp;nbsp; a WriteRecord sub and pass into it values to use.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The WriteRecord sub inserts data into our temp table:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sub WriteRecord(byval id, byval name, byval stage, objCon)&lt;br /&gt;dim objRS_SP, strsql&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS_SP = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorType = 3 &amp;#39;adOpenStatic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorLocation = 3 &amp;#39;adUseClinet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.LockType = 3 &amp;#39;adLockOptiomistic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSQL&amp;nbsp; = &amp;quot;SELECT * FROM tmp_FXProcess WHERE 1=2&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Open strSQL, objCon&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.AddNew&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Fields(&amp;quot;SPID&amp;quot;).Value = id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Fields(&amp;quot;SPNAME&amp;quot;).Value = name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Fields(&amp;quot;SPSTAGE&amp;quot;).Value = stage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Update&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objRS_SP = nothing&lt;br /&gt;End Sub &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;That is it.&amp;nbsp; lets take a look at it all together:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;option explicit&lt;br /&gt;&lt;br /&gt;Sub Button1Click(Sender)&lt;br /&gt;dim strSQL&lt;br /&gt;dim objRS_SP&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PrepTempTable&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSQL = &amp;quot;select pluginid from vFXSalesProcessPlugins&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;#39;create view sysdba.vFXSalesProcessPlugins&lt;br /&gt;&amp;#39;as&lt;br /&gt;&amp;#39;select pluginid from plugin where (type = 1 and basedon is not null)&lt;br /&gt;&amp;#39;union all&lt;br /&gt;&amp;#39;select pluginid from plugin where type = 1 and basedon is null and pluginid not in&lt;br /&gt;&amp;#39;(select basedon from plugin where type = 1 and basedon is not null)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS_SP = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorType = 3 &amp;#39;adOpenStatic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorLocation = 3 &amp;#39;adUseClinet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.LockType = 3 &amp;#39;adLockOptiomistic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Open strSQL, application.GetNewConnection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; with objRS_SP&lt;br /&gt;&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; ReadPlugin .Fields(&amp;quot;PLUGINID&amp;quot;).Value&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; wend&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end with&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objRS_SP = nothing&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Msgbox &amp;quot;Table tmp_FXProcess populated&amp;quot;&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Sub ReadPlugin(byVal ID)&lt;br /&gt;Dim strSQL, objRS_P&lt;br /&gt;Dim objSTM, objXMLDoc, objCon&lt;br /&gt;Dim strXML, strProcess, strID&lt;br /&gt;Dim objSalesProcessNodes, objSalesProcessNode&lt;br /&gt;Dim objStagesNodes, objStagesNode, objStageNode, objStageNodes, i&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objCon = application.GetNewConnection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSQL&amp;nbsp; = &amp;quot;SELECT PLUGINID,NAME,DATA FROM PLUGIN WHERE PLUGINID=&amp;#39;&amp;quot;&amp;amp; ID &amp;amp; &amp;quot;&amp;#39;&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS_P = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.CursorType = 3 &amp;#39;adOpenStatic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.CursorLocation = 3 &amp;#39;adUseClinet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.LockType = 3 &amp;#39;adLockOptiomistic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.Open strSQL, objCon&amp;nbsp; &amp;#39;Provider&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; The Data Field is&amp;nbsp; a blob so we need to stream it in&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objSTM = CreateObject(&amp;quot;ADODB.STREAM&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Type = adTypeBinary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Open&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Write objRS_P.Fields(&amp;quot;DATA&amp;quot;).Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strID = objRS_P.Fields(&amp;quot;PLUGINID&amp;quot;).Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strProcess = objRS_P.Fields(&amp;quot;NAME&amp;quot;).Value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_P.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objRS_P = nothing&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; Create XML Object and Load the Sales Process XML in to XML Object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; ---------------------------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Position = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Type = adTypeText&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objSTM.Charset =&amp;quot;utf-8&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objXMLDoc = CreateObject(&amp;quot;Msxml2.DOMDocument&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objXMLDoc.async = false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strXML = objSTM.ReadText(objSTM.Size)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; If objXMLDoc.loadXML(strXML)= False Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msgbox &amp;quot;Invaild Sales Process XML&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Sub&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objSalesProcessNodes = objXMLDoc.documentElement.selectNodes(&amp;quot;//SalesProcess&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objSalesProcessNode = objSalesProcessNodes.item(0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStagesNodes = objSalesProcessNode.selectNodes(&amp;quot;Stages&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStagesNode = objStagesNodes.item(0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStageNodes = objStagesNode.selectNodes(&amp;quot;Stage&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 0 To objStageNodes.length - 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objStageNode = objStageNodes(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WriteRecord strID, strProcess, objStageNode.selectSingleNode(&amp;quot;Name&amp;quot;).Text, objCon&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next &amp;#39; Stage Loop&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Sub WriteRecord(byval id, byval name, byval stage, objCon)&lt;br /&gt;dim objRS_SP, strsql&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Set objRS_SP = CreateObject(&amp;quot;ADODB.Recordset&amp;quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorType = 3 &amp;#39;adOpenStatic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.CursorLocation = 3 &amp;#39;adUseClinet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.LockType = 3 &amp;#39;adLockOptiomistic&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strSQL&amp;nbsp; = &amp;quot;SELECT * FROM tmp_FXProcess WHERE 1=2&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Open strSQL, objCon&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.AddNew&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Fields(&amp;quot;SPID&amp;quot;).Value = id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Fields(&amp;quot;SPNAME&amp;quot;).Value = name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Fields(&amp;quot;SPSTAGE&amp;quot;).Value = stage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Update&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; objRS_SP.Close&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set objRS_SP = nothing&lt;br /&gt;End Sub&lt;br /&gt;&lt;br /&gt;Sub PrepTempTable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Application.GetNewConnection.Execute &amp;quot;exec sysdba.vFXPrepTempTable&amp;quot;&lt;br /&gt;&lt;br /&gt;&amp;#39;create procedure sysdba.vFXPrepTempTable&lt;br /&gt;&amp;#39;as&lt;br /&gt;&amp;#39;IF&amp;nbsp; EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N&amp;#39;[sysdba].[tmp_FXProcess]&amp;#39;) AND type in (N&amp;#39;U&amp;#39;))&lt;br /&gt;&amp;#39;truncate TABLE [sysdba].[tmp_FXProcess]&lt;br /&gt;&amp;#39;else&lt;br /&gt;&amp;#39;create table sysdba.tmp_FXProcess (SPID varchar(12), SPName varchar(96), SPStage varchar(96))&lt;br /&gt;&amp;#39;GO&lt;br /&gt;End Sub&lt;/font&gt; &lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46135" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix/default.aspx" /></entry><entry><title>Running a report from a button in the SalesLogix web client version 8</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/03/05/running-a-report-from-a-button-in-the-saleslogix-web-client-version-8.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/03/05/running-a-report-from-a-button-in-the-saleslogix-web-client-version-8.aspx</id><published>2013-03-05T19:43:00Z</published><updated>2013-03-05T19:43:00Z</updated><content type="html">&lt;p&gt;In a &lt;a href="http://customerfx.com/pages/integrationblog/2010/03/12/launching-a-report-from-a-button-in-the-saleslogix-web-client.aspx" target="_blank"&gt;previous post&lt;/a&gt; I talked about how to run a Crystal Report from a button in the SalesLogix web client on version 7.5x.&amp;nbsp; The client side reporting functionality has been redone in version 8.&amp;nbsp; It is now included in a client side service. Lets compare the old and new ways of doing things.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Before in version 7.5x you could do something like this to launch a report:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;btnPreview.OnClientClick = &amp;quot;ShowReportByName(&amp;#39;SalesOrder:SalesOrder Detail&amp;#39;); return false;&amp;quot;; //v7.5 code&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In version 8, you need to reference the service and retreive an instance of it like so:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;btnPreview.OnClientClick = &amp;quot;require([&amp;#39;Sage/Reporting/Service&amp;#39;], function (Service) {var oReporting = Sage.Services.getService(&amp;#39;ReportingService&amp;#39;);oReporting.showReportByName(&amp;#39;SalesOrder:SalesOrder Detail&amp;#39;); return false;});&amp;quot;; //v8 code &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;A little more code to make it work, but not bad. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46125" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /></entry><entry><title>Calling refresh from the LinkHandler.cs Class</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/02/01/calling-refresh-from-the-linkhandler-cs-class.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/02/01/calling-refresh-from-the-linkhandler-cs-class.aspx</id><published>2013-02-01T16:42:00Z</published><updated>2013-02-01T16:42:00Z</updated><content type="html">&lt;p&gt;I recently had to figure out how to make the detail view in the SalesLogix 7.5.4 web client refresh after running a common task.&amp;nbsp; The common tasks server side code executed within the LinkHandler.cs file in the App_Code directory.&amp;nbsp; This is how to accomplish that.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Sage.Platform.Application.UI.Web.ApplicationPage s = this.Page as Sage.Platform.Application.UI.Web.ApplicationPage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (s.PageWorkItem != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sage.Platform.WebPortal.Services.IPanelRefreshService refresher = s.PageWorkItem.Services.Get&amp;lt;Sage.Platform.WebPortal.Services.IPanelRefreshService&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (refresher != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; refresher.RefreshAll();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 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; {&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; HttpContext.Current.Response.Redirect(HttpContext.Current.Request.Url.ToString());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46080" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 7.5.2" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.2/default.aspx" /><category term="SalesLogix 7.5.3" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.3/default.aspx" /><category term="SalesLogix 7.5.4" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.4/default.aspx" /><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>Fixing the SalesLogix Phone web control to handle extensions using "ext"</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/01/11/fixing-the-saleslogix-phone-web-control-to-handle-extensions-using-quot-ext-quot.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/01/11/fixing-the-saleslogix-phone-web-control-to-handle-extensions-using-quot-ext-quot.aspx</id><published>2013-01-11T10:20:00Z</published><updated>2013-01-11T10:20:00Z</updated><content type="html">&lt;p&gt;In the SalesLogix web client there is code to handle parsing phone numbers in the SalesLogix phone web control for numbers using &amp;quot;x&amp;quot; to denote the start of an extension (i.e. 6515551111x123).&amp;nbsp; There is also code in place to handle phone numbers using &amp;quot;ext&amp;quot; as the extension designator however this code has a syntax error.&amp;nbsp; The result of this is that phone numbers using this extension designator will throw a client side java script error.&amp;nbsp; That is bad news because it will cause other client side actions (like switching between tabs) to not work.&lt;/p&gt;&lt;p&gt;Luckily the error in the &amp;quot;ext&amp;quot; parsing is available to be fixed.&amp;nbsp; It is in the client side code file that the SalesLogix web controls use, sage-controls.js.&lt;/p&gt;&lt;p&gt;Lets take a look at modifying it.&amp;nbsp; The java script file is located in the VFS under the SLX portal, support files and then under the jscript\sage-controls folder.&amp;nbsp; The deployed file is pushed out to SlxClient\jscript\sage-controls\sage-controls.js:&lt;/p&gt;&lt;p&gt;The code in question is contained in the FormatPhoneNumber function.&amp;nbsp; Lets look at how we need to modify it.&amp;nbsp; Below is the portion of the code that needs to be changed. &lt;/p&gt;&lt;p&gt;The green lines are the commented out original lines.&amp;nbsp; The red lines are the new bits.&amp;nbsp; The highlighted sections are the important new changes. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;function FormatPhoneNumber(val)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;{if((val.length==0)||(val.charAt(0)==&amp;quot;0&amp;quot;))&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;return val;var ext=&amp;quot;&amp;quot;;var temp=val;var vTempExt=&amp;quot;&amp;quot;;var extFound=false;var isInter=false;var extAtBegin=false;var i=-1;if(val.charAt(0)==&amp;quot;+&amp;quot;)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;{isInter=true;}&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;val.replace(&amp;quot;/\D+/g.&amp;quot;,&amp;quot;&amp;quot;);i=val.indexOf(&amp;quot;ext&amp;quot;);if(i&amp;gt;-1)&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;font color="#006600"&gt;//{ext=val.substring(i);temp=val.substring(0,value.length-ext.length)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;font color="#ff0000"&gt;{ext=val.substring(i);temp=val.substring(0,&lt;span&gt;val&lt;/span&gt;.length-ext.length)&lt;span&gt;;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;font color="#006600"&gt;//vTempExt=ext.substring(3,ext.length);ext=val.substring(i,3);extFound=true;if(i==2)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;&lt;font color="#ff0000"&gt;vTempExt=ext.substring(3,ext.length);ext=&lt;span&gt;&amp;quot;ext&amp;quot;&lt;/span&gt;;extFound=true;if(i==&lt;span&gt;0&lt;/span&gt;)&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;{extAtBegin=true;}}&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;else&lt;/font&gt;&lt;br /&gt;&lt;font color="#0000ff"&gt;... &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;This code is only applicable in 7.5x.&amp;nbsp; In the new 8x version this code has all been completely re-done. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46049" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 7.5" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5/default.aspx" /><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>SalesLogix web Customer Portal - Adding conditions to lookups</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/01/09/saleslogix-web-customer-portal-adding-conditions-to-lookups.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/01/09/saleslogix-web-customer-portal-adding-conditions-to-lookups.aspx</id><published>2013-01-09T16:30:00Z</published><updated>2013-01-09T16:30:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;You can add additional global conditions to lookups in the SalesLogix customer ticket portal by modifying the appSettings.config file within the portal.&lt;/p&gt;&lt;p&gt;Within the &amp;lt;appSettings&amp;gt; section you can add a value like:&lt;/p&gt;&lt;p&gt;&amp;lt;add key=&amp;quot;CustomerPortalLookupConditions_TICKET&amp;quot; value=&amp;quot;RECEIVEDDATE &amp;amp;gt; 
&amp;#39;01/01/2012 12:00:00 AM&amp;#39;&amp;quot;/&amp;gt;&lt;/p&gt;&lt;p&gt;This will add a condition to the ticket lookup to only return tickets with a received date greater than 1/1/2012.&amp;nbsp; Note that XML encoding must be used within your expressions so something like &amp;lt;&amp;gt; must be written as &amp;amp;lt;&amp;amp;gt;.&amp;nbsp; You can add multiple conditions together like:&lt;/p&gt;&lt;p&gt;&amp;lt;add key=&amp;quot;CustomerPortalLookupConditions_TICKET&amp;quot; value=&amp;quot;RECEIVEDDATE &amp;amp;gt; 
&amp;#39;01/01/2012 12:00:00 AM&amp;#39; and PUBLICACCESSCODE &amp;amp;lt;&amp;amp;gt; &amp;#39;k6UJ9A0000OW&amp;#39;&amp;quot;/&amp;gt; &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46040" 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>SalesLogix Web Lead Capture Portal Discontinued in Version 8</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2013/01/07/saleslogix-web-lead-capture-portal-discontinued-in-version-8.aspx" /><id>http://customerfx.com/pages/integrationblog/2013/01/07/saleslogix-web-lead-capture-portal-discontinued-in-version-8.aspx</id><published>2013-01-07T16:01:00Z</published><updated>2013-01-07T16:01:00Z</updated><content type="html">&lt;p&gt;The SalesLogix web lead capture portal has been unexpectedly &amp;quot;dropped&amp;quot; from SalesLogix version 8.&amp;nbsp; Sage&amp;#39;s documentation still mentions the lead capture portal however they have said that is a mistake.&amp;nbsp; They also mentioned they may create another new version of the portal sometime in the future but nothing exists at this time in version 8.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46039" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /></entry><entry><title>SalesLogix v8 web client no longer displays curreny symbols</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/12/31/saleslogix-v8-web-client-no-longer-displays-curreny-symbols.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/12/31/saleslogix-v8-web-client-no-longer-displays-curreny-symbols.aspx</id><published>2012-12-31T20:18:00Z</published><updated>2012-12-31T20:18:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;In the SalesLogix web client, there is a SalesLogix currency control that can be used to enter and display currency values in the web client.&amp;nbsp; In 7.5x this control used to display the currency symbol.&amp;nbsp; In v8, the currency symbol no longer displays.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://customerfx.com/blogs/integrationblog/SalesLogix%20v7.5%20Currency.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SalesLogix%20v7.5%20Currency.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Version 7.5x shown above.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/SalesLogix%20v8%20Currency.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SalesLogix%20v8%20Currency.png" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;i&gt;Version 8 shown above.&amp;nbsp; No currency symbol displays. &lt;/i&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46032" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 7.5" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5/default.aspx" /><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /></entry><entry><title>SalesLogix v8 code intellisense takes a step back</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/12/27/saleslogix-v8-code-intellisense-takes-a-step-back.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/12/27/saleslogix-v8-code-intellisense-takes-a-step-back.aspx</id><published>2012-12-27T17:43:00Z</published><updated>2012-12-27T17:43:00Z</updated><content type="html">&lt;p&gt;The SalesLogix code intellisense&amp;nbsp; that is available in Quickforms in SalesLogix v8 has taken a major step back from previous versions of 7.5x.&amp;nbsp; Now the only Intellisense offered under &amp;quot;this&amp;quot; is the controls on the user control and none of the underlying user control&amp;#39;s attributes are present like BindingSource, Controls, DialogService, etc.&lt;/p&gt;&lt;p&gt;Version 8:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://customerfx.com/blogs/integrationblog/SalesLogix%20v8%20Code%20editor.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SalesLogix%20v8%20Code%20editor.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Version 7: &lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/SalesLogix%20v7.5x%20Code%20editor.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SalesLogix%20v7.5x%20Code%20editor.png" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46027" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /></entry><entry><title>SalesLogix v8 What's New Power Point document clarifications</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/12/27/saleslogix-v8-what-s-new-power-point-document-clarifications.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/12/27/saleslogix-v8-what-s-new-power-point-document-clarifications.aspx</id><published>2012-12-27T16:15:00Z</published><updated>2012-12-27T16:15:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;In the official Sage What&amp;#39;s New power point there is a slide that is a little mis-informative and cryptic.&amp;nbsp; I want to clarify a few of these points. Here is the page:&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/integrationblog/SLX%20v8%20Whats%20New%20Slide.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SLX%20v8%20Whats%20New%20Slide.png" border="0" alt="" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;quot;Type head for entity look-ups&amp;quot;&lt;/b&gt;: This is a bit misleading.&amp;nbsp; What this functionality really is that any column marked as &amp;quot;User&amp;quot; formatted in your default group look-up layout will allow you to type ahead to find the user.&amp;nbsp; What this new feature really is the user field look-ups basically have a pre-loaded drop down list of users in the system available for type ahead look-ups.&amp;nbsp; This list of&amp;nbsp; users is not the user values contained in the field you are searching, instead it is just a&amp;nbsp; list of all active (non-retired) users defined for your system.&amp;nbsp; This feature would be better called &amp;quot;Type ahead for entity look-ups on user fields&amp;quot;.&amp;nbsp; There is no type ahead feature on most fields like &amp;quot;Account Name&amp;quot; or &amp;quot;Account Type&amp;quot;, etc.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;quot;Look up&amp;nbsp; another entity using Right Mouse Button from Navigation bar&amp;quot;&lt;/b&gt;: Nothing new here.&amp;nbsp; To look-up an entity you right click on the appropriate entity icon and choose &amp;quot;Lookup X&amp;quot;.&amp;nbsp; This functionality is no different than in SalesLogix version 7.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;quot;User option to set lookup type default such as &amp;quot;contains&amp;quot;&amp;quot;&lt;/b&gt; This is a new feature that lets a user define what conditional operator they want defaulted in all look-ups.&amp;nbsp; This is found under the Groups tab in the Tools..Options of the web client for the user.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&amp;quot;User and Resource Look-up&amp;quot;&lt;/b&gt; In the screen shot this is actually the background image.&amp;nbsp; It is incorrectly labeled as having something to do the &amp;quot;Anticipates character string&amp;quot; which it does not.&amp;nbsp; The Type ahead feature is only on entity look-ups in the list view and is not available anywhere else.&amp;nbsp; What this feature really alludes to is two fold:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;You can now manage resources in the SalesLogix web client under the Administration navigation area.&lt;/li&gt;&lt;li&gt;You can add resources to&amp;nbsp; Phone Call and Meeting activities.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;On the new schedule activity screen, there is a new tab called Availability.&amp;nbsp; On this tab you can click the green + symbol to either add a member (SalesLogix user) or resource to either the Phone call or Meeting activity.&amp;nbsp; When you click the + sign the &amp;quot;Add Members and Resources&amp;quot; dialog shown in the screen shot is presented.&amp;nbsp; There are a couple of glaring problem with this new area:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Resources and members are included in one interface &amp;quot;Availability&amp;quot;.&amp;nbsp; In the LAN client you have 2 tabs, one for &amp;quot;Members&amp;quot; and one for &amp;quot;Resources&amp;quot;.&amp;nbsp; Having one mashed up interface in the web is not intuitive and makes seeing who or what is involved in an activity difficult.&lt;/li&gt;&lt;li&gt;When adding, resources and users are combined in one look-up.&amp;nbsp; Why?&amp;nbsp; &lt;br /&gt;&lt;/li&gt;&lt;li&gt;When adding, resources always show at the top.&amp;nbsp; In my experience it is less likely you schedule resources.&amp;nbsp; It is more likely you schedule other attendees.&amp;nbsp; Now every time you want to add someone you have to scroll past all the resources first.&amp;nbsp; Ditch the combined look-up.&amp;nbsp; Add two buttons, one for Add Resource and one for Add Member.&amp;nbsp; Better yet make 2 tabs like the LAN client.&lt;/li&gt;&lt;li&gt;When scheduling a To-Do, the Availability tab shows. The + sign is not there.&amp;nbsp; This lines up with the LAN behavior in that you can&amp;#39;t add resources or members to a To-Do.&amp;nbsp; However, in the web, this tab should be hidden completely.&amp;nbsp; Showing the tab gives users the false impression they should be able to add Members and Resources when they can not.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46026" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /></entry><entry><title>Sorting a SalesLogix entity collection using Linq</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/12/26/sorting-a-saleslogix-entity-collection-using-linq.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/12/26/sorting-a-saleslogix-entity-collection-using-linq.aspx</id><published>2012-12-26T18:25:00Z</published><updated>2012-12-26T18:25:00Z</updated><content type="html">&lt;p&gt;The SalesLogix entity model offers the ability to access collections of related entities, such as Contacts belonging to an Account.&amp;nbsp; When you access the collection properties there is no sort order defined so the results can be less than desirable.&amp;nbsp; You can use ICriteria and define your Order explicitly but that gets to be a bit of code and you cant work directly with the entity collection.&lt;/p&gt;&lt;p&gt;You can easily add a sort to the built in entity collections by using the power of Linq.&lt;/p&gt;&lt;p&gt;You will need to first make sure you include a using statement for Linq:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;using System.Linq;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Then you can simply retrieve your collection from the entity and add a sort all in one line.&amp;nbsp; To add an ascending sort:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sage.Entity.Interfaces.IAccount account = this.BindingSource.Current as Sage.Entity.Interfaces.IAccount;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;account.Contacts.OrderBy(x =&amp;gt; x.CreateDate); &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;To add a descending sort: &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sage.Entity.Interfaces.IAccount account = this.BindingSource.Current as Sage.Entity.Interfaces.IAccount; &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;account.Contacts.OrderByDescending(x =&amp;gt; x.CreateDate); &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The sort field in my examples is the Contact&amp;#39;s CreateDate property. &lt;/p&gt;&lt;p&gt;There you go.&amp;nbsp; Easy. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46018" 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>SalesLogix version 8- unable to install web manifest items into the SalesLogix web report portal.</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/12/21/saleslogix-version-8-unable-to-install-web-manifest-items-into-the-saleslogix-web-report-portal.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/12/21/saleslogix-version-8-unable-to-install-web-manifest-items-into-the-saleslogix-web-report-portal.aspx</id><published>2012-12-21T19:02:00Z</published><updated>2012-12-21T19:02:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;I have recently discovered that attempting to install a web manifest in SalesLogix v8 that contains items being added to the SalesLogix Web reporting portal will not install properly.&amp;nbsp; During the install you receive an error of:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://customerfx.com/blogs/integrationblog/SalesLogix%20v8%20Manifest%20Error%20installing%20Web%20Reporting.png"&gt;&lt;img src="http://customerfx.com/blogs/integrationblog/SalesLogix%20v8%20Manifest%20Error%20installing%20Web%20Reporting.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You can continue with the install but any items to be added to the Web Reporting portal will not be added to the system.&lt;/p&gt;&lt;p&gt;This problem happens both with manifest created in previous versions (7.5x) or new manifests created on v8x. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46015" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /></entry><entry><title>SalesLogix connection string format has changed within Connection.Config file from 7.5x to 8.x</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/12/20/saleslogix-connection-string-format-has-changed-within-connection-config-file-from-7-5x-to-8-x.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/12/20/saleslogix-connection-string-format-has-changed-within-connection-config-file-from-7-5x-to-8-x.aspx</id><published>2012-12-20T16:16:00Z</published><updated>2012-12-20T16:16:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;Just a heads up on something I ran into that was causing me some problems.&amp;nbsp; The format of the way the connection string is stored in the connection.config file of the SalesLogix deployed slxclient website has changed between versions 7.5 and 8.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;In 7.5x the format of the connection.config file looked like:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&amp;lt;ConString&amp;gt;Provider=SLXOLEDB.1;&lt;b&gt;Persist Security Info=True&lt;/b&gt;;Initial Catalog=SLX;Data Source=SALESLOGIX;Extended Properties=&amp;quot;PORT=1706;LOG=ON;SVRCERT=12345;;ACTIVITYSECURITY=OFF;TIMEZONE=NONE&amp;quot;&lt;b&gt;&amp;lt;RWPass&amp;gt;&amp;lt;![CDATA[]]&amp;gt;&amp;lt;/RWPass&amp;gt;&lt;/b&gt;&amp;lt;/ConString&amp;gt; &lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;In version 8 the connection definition now looks like:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&amp;lt;ConString&amp;gt;Provider=SLXOLEDB.1;Data Source=SALESLOGIX;Initial Catalog=SLX;Extended Properties=&amp;quot;PORT=1706;LOG=ON;&lt;b&gt;CASEINSENSITIVEFIND=ON;AUTOINCBATCHSIZE=1&lt;/b&gt;;SVRCERT=12345;ACTIVITYSECURITY=OFF;TIMEZONE=NONE&amp;quot;&amp;lt;/ConString&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Notice the bold sections which are different. This file is generated based on the current connections established in the Application Architect when the web site is deployed.&amp;nbsp; In both cases the exact same connection settings were used yet it outputs the connection string slightly differently.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46014" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 7.5" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5/default.aspx" /><category term="SalesLogix 8" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+8/default.aspx" /></entry><entry><title>Inability to edit or delete sales order or Opportunity products in the SalesLogix 7.5.4 web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/11/16/inability-to-edit-or-delete-sales-order-or-opportunity-products-in-the-saleslogix-7-5-4-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/11/16/inability-to-edit-or-delete-sales-order-or-opportunity-products-in-the-saleslogix-7-5-4-web-client.aspx</id><published>2012-11-16T16:12:00Z</published><updated>2012-11-16T16:12:00Z</updated><content type="html">&lt;p&gt;If you are running IIS 7 there is an important step you need to do in order to allow the SalesLogix web client to edit or delete products from both the Opportunity and Sales order product&amp;#39;s tabs.&lt;/p&gt;&lt;p&gt;Since the Product&amp;#39;s tab uses client side SData calls,&amp;nbsp; these calls can’t work right if the All Verbs setting isn’t set on the ‘SimpleHandlerFactory-ISAPI-2.0’. &amp;nbsp;&lt;/p&gt;&lt;p&gt;The Implementation guide has you set All Verbs, and create the Wildcard mapping on the SData portal. &amp;nbsp;Apparently this works in IIS6, but in order for the SLXClient portal to work completely in IIS 7, All Verbs needs to be set there too.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45967" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 7.5.4" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.4/default.aspx" /><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SData" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SData/default.aspx" /></entry><entry><title>Field level security restrictions causing errors in the SalesLogix Web Client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/11/15/field-level-security-restrictions-causing-errors-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/11/15/field-level-security-restrictions-causing-errors-in-the-saleslogix-web-client.aspx</id><published>2012-11-15T16:04:00Z</published><updated>2012-11-15T16:04:00Z</updated><content type="html">&lt;p&gt;I recently had a client that was experiencing errors trying to navigate to Account records in the SalesLogix web client.&amp;nbsp; The errors that were displaying were similar to: &amp;quot;Component Parameter name: The argument component cannot be null.&amp;quot;&lt;/p&gt;&lt;p&gt;A search of the event logs on the web server reveled errors like so:&amp;nbsp; Component Parameter name: The argument component cannot be null. at 
Sage.Platform.Exceptions.Guard.ArgumentNotNull(Object argumentValue, String 
argumentName) at Sage.Platform.ComponentModel.ComponentView..ctor(Object 
component, ComponentViewPropertyDescriptor[] extendedProperties) at 
Sage.Platform.ComponentModel.ComponentView..ctor(Object component) at 
Sage.Platform.WebPortal.Binding.WebEntityListBindingSource.convertTypedCollectionToComponentView(Int32 
maximumRows, Int32 startRowIndex, String sortProperty, SortDirection 
sortDirection) at 
Sage.Platform.WebPortal.Binding.WebEntityListBindingSource.getFullCollectionList(Int32 
maximumRows, Int32 startRowIndex, String sortProperty, SortDirection 
sortDirection, Boolean asComponentView) at 
Sage.Platform.WebPortal.Binding.WebEntityListBindingSource.GetData(Int32 
maximumRows, Int32 startRowIndex, String sortProperty, SortDirection 
sortDirection, Boolean asComponentView) at 
Sage.Platform.WebPortal.Binding.WebEntityListBindingSource.GetData(Int32 
maximumRows, Int32 startRowIndex, String sortExpression) &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;After digging what I discovered was the error was coming from the Account Opportunities tab.&amp;nbsp; The user that was experiencing the errors had restricted field level security to the Opportunity table.&amp;nbsp; One of the restrictions was the Status field was set to no access.&amp;nbsp; The Web client has several computed entity fields showing $ per status that is then displayed on the Opportunity tab at the Account.&amp;nbsp; Because of the field level security on the Status field, the entity level formulas were what was causing the errors.&amp;nbsp; Adding Status back as a read-only field in their field level security fixed the issue.&lt;/p&gt;&lt;p&gt;On a related not I also noticed that the Opportunity groups would not work until I added back in field level access to the following Opportunity fields: OpportunityID, AccountID, SeccodeID. &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45966" 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>Inability to query non ACO groups using the SalesLogix SData system groups endpoint</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/11/08/inability-to-query-non-aco-groups-using-the-saleslogix-sdata-system-groups-endpoint.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/11/08/inability-to-query-non-aco-groups-using-the-saleslogix-sdata-system-groups-endpoint.aspx</id><published>2012-11-08T17:05:00Z</published><updated>2012-11-08T17:05:00Z</updated><content type="html">&lt;p&gt;I recently ran into an issue when trying to use SData to retrieve group information for groups other than Account, Contact, or Opportunity groups.&lt;/p&gt;&lt;p&gt;SalesLogix stores non ACO groups as a different plugin type in the SLX Plugin table.&amp;nbsp; They are a type 23 rather that type 8 of the ACO groups.&amp;nbsp; This is the result of back when the support client used to be a separate animal than the sales client. &lt;br /&gt;&lt;/p&gt;&lt;p&gt;The
 problem is that the group endpoint is supposed to allow querying syntax
 to find a group by family and name.&amp;nbsp; It works OK for ACO groups but not
 for any other groups.&amp;nbsp; So something like this works:&lt;/p&gt;&lt;div&gt;&lt;font color="#0000ff"&gt;http://sdatahost/sdata/slx/system/-/groups/$queries/execute?_family=Account&amp;amp;_name=All%20Accounts&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The underlying query for this is&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;i&gt;SELECT
 PLUGINID FROM PLUGIN WHERE TYPE = 8 AND NAME = &amp;#39;All Accounts&amp;#39; AND 
FAMILY = &amp;#39;Account&amp;#39; AND BASEDON IS NULL ORDER BY DEV DESC, MODIFYDATE 
DESC&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;However, a similar query but to Defects does not work:&lt;/div&gt;&lt;div&gt;&lt;font color="#0000ff"&gt;http://sdatahost/sdata/slx/system/-/groups/$queries/execute?_family=Defect&amp;amp;_name=My%20Defects&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The underlying query:&lt;/div&gt;&lt;div&gt;&lt;i&gt;SELECT
 PLUGINID FROM PLUGIN WHERE TYPE = 8 AND NAME = &amp;#39;My Defects&amp;#39; AND FAMILY =
 &amp;#39;Defect&amp;#39; AND BASEDON IS NULL ORDER BY DEV DESC, MODIFYDATE DESC&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Notice it is only looking at type 8 and not 23.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;However a query on ID, like this, does work:&lt;/div&gt;&lt;div&gt;&lt;font color="#0000ff"&gt;http://sdatahost/sdata/slx/system/-/groups(&amp;#39;p6UJ9A0003H2&amp;#39;)&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;The underlying query:&lt;/div&gt;&lt;div&gt;&lt;i&gt;SELECT
 this_.PLUGINID as PLUGINID5_0_, this_.NAME as NAME5_0_, this_.FAMILY as
 FAMILY5_0_, this_.TYPE as TYPE5_0_, this_.USERID as USERID5_0_, 
this_.CREATEDATE as CREATEDATE5_0_, this_.LOCKED as LOCKED5_0_, 
this_.LOCKEDID as LOCKEDID5_0_, this_.VERSION as VERSION5_0_, 
this_.SYSTEM as SYSTEM5_0_, this_.ISPUBLIC as ISPUBLIC5_0_, 
this_.DESCRIPTION as DESCRIP12_5_0_, this_.DATACODE as DATACODE5_0_, 
this_.BASEDON as BASEDON5_0_, this_.TEMPLATE as TEMPLATE5_0_, 
this_.AUTHOR as AUTHOR5_0_, this_.COMPANY as COMPANY5_0_, 
this_.COMPANYVERSION as COMPANY18_5_0_, this_.BASEDONCOMPANY as 
BASEDON19_5_0_, this_.BASEDONCOMPANYVERSION as BASEDON20_5_0_, 
this_.RELEASED as RELEASED5_0_, this_.DEV as DEV5_0_, this_.READONLY as 
READONLY5_0_, this_.INSTALLATIONDATE as INSTALL24_5_0_, 
this_.RELEASEDDATE as RELEASE25_5_0_, this_.DISPLAYNAME as 
DISPLAY26_5_0_, this_.MODIFYDATE as MODIFYDATE5_0_, this_.MODIFYUSER as 
MODIFYUSER5_0_, this_.CREATEUSER as CREATEUSER5_0_&amp;nbsp;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;FROM PLUGIN this_&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;WHERE
 this_.PLUGINID = &amp;#39;p6UJ9A0003H2&amp;#39; and this_.TYPE in (8, 23) and 
this_.BASEDON is null ORDER BY this_.DEV desc, this_.MODIFYDATE desc&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Notice it looks at both type 23 and 8.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Similarly, this query of the entire groups list returns everything:&lt;/div&gt;&lt;div&gt;&lt;font color="#0000ff"&gt;http://sdatahost/sdata/slx/system/-/groups?format=html&lt;/font&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;Underlying query:&lt;/div&gt;&lt;div&gt;&lt;i&gt;SELECT
 * FROM (SELECT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as 
SLXRN,&amp;nbsp; this_.PLUGINID as PLUGINID5_0_, this_.NAME as NAME5_0_, 
this_.FAMILY as FAMILY5_0_, this_.TYPE as TYPE5_0_, this_.USERID as 
USERID5_0_, this_.CREATEDATE as CREATEDATE5_0_, this_.LOCKED as 
LOCKED5_0_, this_.LOCKEDID as LOCKEDID5_0_, this_.VERSION as 
VERSION5_0_, this_.SYSTEM as SYSTEM5_0_, this_.ISPUBLIC as ISPUBLIC5_0_,
 this_.DESCRIPTION as DESCRIP12_5_0_, this_.DATACODE as DATACODE5_0_, 
this_.BASEDON as BASEDON5_0_, this_.TEMPLATE as TEMPLATE5_0_, 
this_.AUTHOR as AUTHOR5_0_, this_.COMPANY as COMPANY5_0_, 
this_.COMPANYVERSION as COMPANY18_5_0_, this_.BASEDONCOMPANY as 
BASEDON19_5_0_, this_.BASEDONCOMPANYVERSION as BASEDON20_5_0_, 
this_.RELEASED as RELEASED5_0_, this_.DEV as DEV5_0_, this_.READONLY as 
READONLY5_0_, this_.INSTALLATIONDATE as INSTALL24_5_0_, 
this_.RELEASEDDATE as RELEASE25_5_0_, this_.DISPLAYNAME as 
DISPLAY26_5_0_, this_.MODIFYDATE as MODIFYDATE5_0_, this_.MODIFYUSER as 
MODIFYUSER5_0_, this_.CREATEUSER as CREATEUSER5_0_ FROM PLUGIN this_&amp;nbsp; 
WHERE this_.TYPE in (8, 23) and this_.BASEDON is null) query WHERE SLXRN
 &amp;gt;= 1 AND SLXRN &amp;lt; 101 ORDER BY SLXRN &lt;/i&gt;&lt;/div&gt;&lt;p&gt;Sage has acknowledged this as a defect but unfortunately they will not address until some point in version 8.&amp;nbsp; No existing versions will receive the fix.&amp;nbsp; So if you need to get the group information through SData you need to do it in 2 parts:&lt;/p&gt;&lt;p&gt;1a) Add the Plugin table as an entity in the SLX entity model and expose it for SData feeds.&lt;/p&gt;&lt;p&gt;1b) Query the Plugin sdata feed in the dynamic endpoint by name, family, and type.&amp;nbsp; From this get the plugin ID.&lt;/p&gt;&lt;p&gt;2) Use the retrieved plugin ID in the system group endpoint like so: &lt;font color="#0000ff"&gt;http://sdatahost/sdata/slx/system/-/groups(&amp;#39;p6UJ9A0003H2&amp;#39;)&lt;/font&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45942" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix/default.aspx" /><category term="SalesLogix Web" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+Web/default.aspx" /><category term="SData" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SData/default.aspx" /></entry><entry><title>Error adding SData feed to a SalesLogix entity</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/11/06/error-adding-sdata-feed-to-a-saleslogix-entity.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/11/06/error-adding-sdata-feed-to-a-saleslogix-entity.aspx</id><published>2012-11-06T16:37:00Z</published><updated>2012-11-06T16:37:00Z</updated><content type="html">&lt;p&gt;I recently ran into an issue with trying to enable an SData feed on a custom entity.&amp;nbsp; I was actually trying to expose the PLUGIN table to SData in order to get around a different bug with SData.&amp;nbsp; I was able to add Plugin as a new SalesLogix entity to the entity model.&amp;nbsp; Building the web platform with this new entity was not a problem, but when I went to enable the &amp;quot;Generate SData feed&amp;quot; on the new entity, the web platform would not build.&lt;/p&gt;&lt;p&gt;I would receive an error like this:&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;&amp;nbsp;C:Documents and Settings\Administrator\Application Data\Sage\Platform\Output\sdata\Plugin.cs(335,22):&amp;nbsp; Cannot implicitly convert type &amp;#39;Sage.Common.Syndication.FeedAuthor&amp;#39; to &amp;#39;string&amp;#39;.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Looking at that line in the PLugin.cs file in my build folder revealed this line of code:&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public PluginEntry()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Author = new FeedAuthor {Name = Constants.FeedAuthor};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt;&lt;/p&gt;&lt;p&gt;Turns out that the problem was the Plugin entity contained a property called Author.&amp;nbsp; This was confusing the sdata build which attempts to create an SData feed property also called Author.&amp;nbsp; I ended up removing the Author property from my entity definition since I did not need it, and presto!&amp;nbsp; The SData feed built successfully.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45941" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix/default.aspx" /><category term="SData" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SData/default.aspx" /></entry><entry><title>Adding a DateTime protperty as a column to the SalesLogix web lookup control</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/10/29/adding-a-datetime-protperty-as-a-column-to-the-saleslogix-web-lookup-control.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/10/29/adding-a-datetime-protperty-as-a-column-to-the-saleslogix-web-lookup-control.aspx</id><published>2012-10-29T20:19:00Z</published><updated>2012-10-29T20:19:00Z</updated><content type="html">&lt;p&gt;In the SalesLogix web client if you want to add a column that is a DateTime column to a lookup control&amp;#39;s lookup dialog you need to define it in a specific way in order to have the lookup make sense for end users.&amp;nbsp; &lt;/p&gt;&lt;p&gt;If you define the lookup column as a PropertyType of System.DateTime, when a user attempts to search, the system will not interpret the user input correctly unless it is entered exactly as YYYYMMDD.&amp;nbsp; If you format it as something like MM/DD/YYYY, the system will convert that to a different value during the search.&lt;/p&gt;&lt;p&gt;The way you want to define things are:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;PropertyType= System.String&lt;/li&gt;&lt;li&gt;PropertyFormat=&amp;quot;DateTime&amp;quot;&lt;/li&gt;&lt;li&gt;PropertyFormatString=&amp;quot;MM/dd/yyyy&amp;quot; &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45932" 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>Determining if a user is in a role in the SalesLogix web client</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/09/25/determining-if-a-user-is-in-a-role-in-the-saleslogix-web-client.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/09/25/determining-if-a-user-is-in-a-role-in-the-saleslogix-web-client.aspx</id><published>2012-09-25T20:44:00Z</published><updated>2012-09-25T20:44:00Z</updated><content type="html">&lt;p&gt;A while back I wrote about &lt;a href="http://customerfx.com/pages/integrationblog/2011/11/22/accessing-a-user-s-secured-actions-to-determine-functionality-in-the-saleslogix-web-client.aspx" target="_blank"&gt;how to determine if a user has a secured action defined&lt;/a&gt; for them in one of their roles.&lt;/p&gt;&lt;p&gt;This is handy but what about if you want to see if a user is in a particular role?&lt;/p&gt;&lt;p&gt;Well the Sage.SalesLogix.API assembly provides this functionlity by using the CurrentUserInRole method in the Security class:&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sage.SalesLogix.API.MySlx.Security.CurrentUserInRole(&amp;quot;A Role&amp;quot;); &lt;/font&gt;&lt;/p&gt;&lt;p&gt;This method accepts a single string parameter of the role to check for. It then returns true or false depending on if the user is a member of the role.&lt;/p&gt;&lt;p&gt;A couple of things to note:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The admin user will always have a return of true.&amp;nbsp;&lt;/li&gt;&lt;li&gt;The method will throw an object reference error if you try to see if the current user is in a role that does not exist (unless you are logged in as admin).&lt;/li&gt;&lt;li&gt;The role name is case sensitive. &lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;To account for the null reference error you should first check to make sure that the role exists.&amp;nbsp; The easiest way to do this is with the EntityFactory&amp;#39;s GetRepository.FindByFirstProperty, like so:&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;Sage.Entity.Interfaces.IRole role = Sage.Platform.EntityFactory.GetRepository&amp;lt;Sage.Entity.Interfaces.IRole&amp;gt;().FindFirstByProperty(&amp;quot;RoleName&amp;quot;, &amp;quot;A Role&amp;quot;);&lt;/font&gt;&lt;/p&gt;&lt;p&gt;Now lets look a a full example.&amp;nbsp; Let&amp;#39;s say we want to have a field be disabled unless the current user is in a role called &amp;quot;Super User&amp;quot;. To do this we can add the following to the smart part&amp;#39;s load action:&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;bool inRole = false;&lt;br /&gt;Sage.Entity.Interfaces.IRole role = Sage.Platform.EntityFactory.GetRepository&amp;lt;Sage.Entity.Interfaces.IRole&amp;gt;().FindFirstByProperty(&amp;quot;RoleName&amp;quot;, &amp;quot;Super User&amp;quot;);&lt;br /&gt;if (role != null)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; inRole = Sage.SalesLogix.API.MySlx.Security.CurrentUserInRole(&amp;quot;Super User&amp;quot;);&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;}&lt;br /&gt;this.myField.Enabled = inRole; &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45886" 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>SalesLogix IntelliSync slowness caused by history scanning</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/09/07/saleslogix-intellisync-slowness-caused-by-history-scanning.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/09/07/saleslogix-intellisync-slowness-caused-by-history-scanning.aspx</id><published>2012-09-07T18:23:00Z</published><updated>2012-09-07T18:23:00Z</updated><content type="html">&lt;p&gt;A co-worker of mine recently complained that his IntelliSync synchronization was failing when trying to sync over 11,000 records when he was syncing his calendar. After looking into the issue I discovered that the IntelliSync engine examines both the activity and history tables in order to determine if the Outlook calendar item is still scheduled or has been completed.&amp;nbsp; The problem is in the query IntelliSync is using to scan the history table.&amp;nbsp; it is essentially this:&lt;/p&gt;&lt;p&gt;select * from history&lt;br /&gt;WHERE ACTIVITYID is not null and &lt;br /&gt;TYPE in (262146, 262145, 262162) and (not (PRIORITY = &amp;#39;ISYNC_DEL&amp;#39;) or PRIORITY is null) and USERID = &amp;#39;THEUSERID&amp;#39;&lt;/p&gt;&lt;p&gt;For a user who has years of history this can be a big problem, since there is no date restriction.&lt;/p&gt;&lt;p&gt;To solve his particular issue, what we ended up doing was clearing out the ACTIVITYID from the history records older than 1 year.&amp;nbsp; This then dropped them out of consideration of IntelliSync and his sync went from hours to a few seconds.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45854" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix/default.aspx" /></entry><entry><title>Allow SalesLogix currency controls in the web client to accept negative values</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/08/16/allow-saleslogix-currency-controls-in-the-web-client-to-accept-negative-values.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/08/16/allow-saleslogix-currency-controls-in-the-web-client-to-accept-negative-values.aspx</id><published>2012-08-16T21:02:00Z</published><updated>2012-08-16T21:02:00Z</updated><content type="html">&lt;p&gt;The SalesLogix currency controls in SalesLogix do not by default allow a negative number to be entered.&amp;nbsp; You can change this by editing the sage-controls-currency.js and sage-control.js file.&amp;nbsp; The sage-controls.js file is the file that is actually used by the web client and is a minified compiled version of all of the other sage-controls files.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;There are two functions that need to be altered.&amp;nbsp; One on the client keypress, and one on the client change event of the control.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The key press code needs to be changed like so (change in yellow):&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;function RestrictToCurrency(e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var code = e.charCode || e.keyCode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (code == this.Symbol.charCodeAt(0) &lt;span&gt;|| code == this.NegativeSign.charCodeAt(0)&lt;/span&gt; || RestrictToNumeric(e, this.GroupSeparator.charCodeAt(0), this.DecimalSeparator.charCodeAt(0)));&lt;br /&gt;}&lt;/font&gt; &lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Then the other client script function to be altered is the on change.&amp;nbsp; There is a function called Currency_FormatCurrency()&amp;nbsp; that is used to format the value.&amp;nbsp; Based on your currency settings you may need to alter it differently.&amp;nbsp; For US regional settings if you look in the case statement and change the first case, it works.&lt;/p&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var currencyValue = &amp;quot;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (isNegative) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (this.NegativePattern) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case 0: // ($n) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currencyValue = String.format(&amp;quot;&lt;span&gt;-{0}{1&lt;/span&gt;}&amp;quot;, this.Symbol, result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break; &lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;Making these 2 changes should allow the currency control to accept a - sign to be entered.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45824" 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>SalesLogix 7.5.4 web client error when Generating Print View and having toolbar buttons with Role Security</title><link rel="alternate" type="text/html" href="http://customerfx.com/pages/integrationblog/2012/07/31/saleslogix-7-5-4-web-client-error-when-generating-print-view-and-having-toolbar-buttons-with-role-security.aspx" /><id>http://customerfx.com/pages/integrationblog/2012/07/31/saleslogix-7-5-4-web-client-error-when-generating-print-view-and-having-toolbar-buttons-with-role-security.aspx</id><published>2012-07-31T17:18:00Z</published><updated>2012-07-31T17:18:00Z</updated><content type="html">&lt;p&gt;&amp;nbsp;I recently ran into an issue looking at the SalesLogix web client&amp;#39;s Ticket detail screen.&amp;nbsp; There is a Print Preview button there that invokes the TicketDetailPrintView.aspx page.&amp;nbsp; When navigating to the page however, I get an error like:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;c:\Inetpub\wwwroot\SlxClient\SmartParts\Ticket\TicketDetails_PrintView.ascx(375):
 error CS0103: The name &amp;#39;cmdSave&amp;#39; does not exist in the current context&amp;nbsp;
				&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Looking at the ascx file that is generated from having the &amp;quot;Generate Print Preview&amp;quot; proprty set on the quick form I can see the following block of code causing the issue:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;if (!_roleSecurityService.HasAccess(&amp;quot;ENTITIES/TICKET/EDIT&amp;quot;))&lt;br /&gt;{&lt;br /&gt;cmdTicketActivities.Visible = false;&lt;br /&gt;}&lt;br /&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;The Save button has applied security set so that it only is visible if the current user has edit rights to the ticket. The only issue is that, on the print preview form that is generated, the toolbar buttons are not rendered on the control, however the code to control visibility based on role security still exists.&amp;nbsp; So we get an error because no control called cmdSave has been created on the print view.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;font color="#0000ff"&gt;&amp;lt;SalesLogix:SmartPartToolsContainer runat=&amp;quot;server&amp;quot; ID=&amp;quot;TicketActivities_PrintView_LTools&amp;quot; ToolbarLocation=&amp;quot;left&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;lt;/SalesLogix:SmartPartToolsContainer&amp;gt;&lt;br /&gt;&amp;lt;SalesLogix:SmartPartToolsContainer runat=&amp;quot;server&amp;quot; ID=&amp;quot;TicketActivities_PrintView_RTools&amp;quot; ToolbarLocation=&amp;quot;right&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;lt;/SalesLogix:SmartPartToolsContainer&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;nbsp;Lame.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45798" width="1" height="1"&gt;</content><author><name>Kris Halsrud</name><uri>http://customerfx.com/members/Kris-Halsrud.aspx</uri></author><category term="SalesLogix 7.5.4" scheme="http://customerfx.com/pages/integrationblog/archive/tags/SalesLogix+7.5.4/default.aspx" /></entry></feed>