<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://customerfx.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>CRM Developer</title><link>http://customerfx.com/pages/crmdeveloper/default.aspx</link><description>Ryan Farley on CRM Development for SalesLogix, SageCRM, MSCRM, .NET - and all things geek</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>Public SalesLogix Developer Classes Revamped</title><link>http://customerfx.com/pages/crmdeveloper/2008/10/27/public-saleslogix-developer-classes-revamped.aspx</link><pubDate>Mon, 27 Oct 2008 23:51:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39683</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39683</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39683</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/10/27/public-saleslogix-developer-classes-revamped.aspx#comments</comments><description>
&lt;p&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/2008/09/02/public-saleslogix-web-developer-classes-on-the-way.aspx"&gt;I announced&lt;/a&gt; a while ago that we will be offering some public developer training classes for SalesLogix Web. We will be making some changes to the class outline I posted earlier. &lt;/p&gt;&lt;p&gt;The new classes we will be offering will be as follows:&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;Building Solutions for SalesLogix Web&lt;/b&gt;&lt;br /&gt;This is the all-inclusive web developer class that uses the concept of building a complete solution to train around. We will go from start to finish in building a solution that covers all typical development scenarios when developing for SalesLogix Web.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Process Orchestration&lt;/b&gt;&lt;br /&gt;This is a full class that will focus on working with and developing for process orchestration (Windows Workflow) with SalesLogix 7.5 (Web or LAN).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;SData &amp;amp; Integration&lt;/b&gt;&lt;br /&gt;This class will focus on building solutions using the SalesLogix SData &amp;amp; REST services layer for both reading SalesLogix data and writing to SalesLogix (creating new records, updating, &amp;amp; deleting), focusing on integration and external application scenarios.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;SalesLogix .NET Extensions&lt;/b&gt;&lt;br /&gt;This class will focus on developing .NET Extensions for the SalesLogix v7 and higher LAN client. We will take an in-depth look at building, debugging, &amp;amp; managing .NET Extensions as well as look at cases when to use .NET Extensions vs. standard SalesLogix customizations. &lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Beginning C# &amp;amp; .NET Development for SalesLogix&lt;/b&gt;&lt;br /&gt;We are also considering a &amp;quot;Beginning C# for SalesLogix&amp;quot; class that will cover the basics of C# and the .NET Framework from the perspective of working with SalesLogix.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;I will be posting the complete class outlines and schedules to this site &amp;amp; RSS feed shortly. Stay tuned.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39683" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/.NET+Extensions/default.aspx">.NET Extensions</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/REST/default.aspx">REST</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Training/default.aspx">Training</category></item><item><title>SalesLogix Group Explorer Added to Labs</title><link>http://customerfx.com/pages/crmdeveloper/2008/09/13/saleslogix-group-explorer-added-to-labs.aspx</link><pubDate>Sat, 13 Sep 2008 08:06:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39624</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39624</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39624</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/09/13/saleslogix-group-explorer-added-to-labs.aspx#comments</comments><description>
&lt;p&gt;I added a new utility to the Customer FX Labs tonight, the SalesLogix Group Explorer. This utility allows you to dig deeper into the definition of SalesLogix groups than you ever thought possible. You can see the group&amp;#39;s layout, included columns, conditions, sort order, and way more. Not only that, but you can also see the SQL query behind the group and view the data that makes up the group, all from outside of SalesLogix. The Group Explorer also gives you the ability to quickly export group data, exporting 100,000 records in a fraction of a second.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Take a look at the SalesLogix Group Explorer (more images in the &lt;a href="http://customerfx.com/pages/beta/2008/09/13/saleslogix-group-explorer.aspx"&gt;Labs page&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;a href="http://customerfx.com/blogs/beta/GroupExplorer/GroupExplorer2.jpg" target="_blank"&gt;&lt;img src="http://customerfx.com/blogs/beta/GroupExplorer/th_GroupExplorer2.jpg" border="0" alt="" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;i&gt;&lt;font color="#606060" size="1"&gt;(click for larger view)&lt;/font&gt;&lt;/i&gt; &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;The Group Explorer is currently in beta, but a free utility and downloadable in the labs. I&amp;#39;ve only tested this on versions 7.2 and higher so far (might or might not work with earlier versions).&lt;/p&gt;
&lt;p&gt;Download it and give it a whirl.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/pages/beta/2008/09/13/saleslogix-group-explorer.aspx"&gt;&lt;font size="4"&gt;&lt;span style="font-weight:bold;"&gt;Visit the SalesLogix Group Explorer in the Labs&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39624" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/New+Finds/default.aspx">New Finds</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/General/default.aspx">General</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Tools/default.aspx">Tools</category></item><item><title>Custom Format Columns in SalesLogix Web (and Linking to External Sites in a DataGrid)</title><link>http://customerfx.com/pages/crmdeveloper/2008/09/11/Custom-Format-Columns-in-SalesLogix-Web-and-Linking-to-External-Sites-in-a-DataGrid.aspx</link><pubDate>Thu, 11 Sep 2008 23:12:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39616</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39616</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39616</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/09/11/Custom-Format-Columns-in-SalesLogix-Web-and-Linking-to-External-Sites-in-a-DataGrid.aspx#comments</comments><description>&lt;p&gt;There might be times when you need to do some custom formatting in SalesLogix DataGrids that goes way beyond just simple formatting. A perfect example of this is taking a simple value, such as an indentifier from another external system where you want the value in the DataGrid to be a part of a hyperlink to this other system. In this scenario, you might have a value like &amp;quot;12345&amp;quot;, which identifies a matching record in another system and you want this to become a value like the following in the grid:&lt;br /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;font color="#000099" face="courier new,courier"&gt;&amp;lt;a href=&amp;quot;http://theothersystem.com/something?id=12345&amp;quot;&amp;gt;12345&amp;lt;/a&amp;gt;&lt;/font&gt;&lt;/pre&gt;
&lt;p&gt;This is where the CustomFormatColumn column type comes in. The problem is that this column type can be a little confusing and not well documented.&lt;/p&gt;

&lt;p&gt;In this scenario, we&amp;#39;ll just use a sample of adding a hyperlink into the Account Contacts grid to do a Google search on the contact&amp;#39;s full name. Not really useful, I know, but it will serve the purpose of demonstrating how to use a CustomFormatColumn.&lt;/p&gt;

&lt;p&gt;Basically, the way that a CustomFormatColumn works is you create your own custom C# function. The value, from each row, in the grid is passed into your function. You do whatever you need to do with the value in your code and then return the result, which is what will appear in the grid. &lt;br /&gt;&lt;/p&gt;

&lt;p&gt;In the DataGrid on the AccountContacts QuickForm, add a CustomFormatColumn. There are four properties we&amp;#39;ll need to make sure we set. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;b&gt;ColumnHeading&lt;/b&gt; = The title or caption for the column.&lt;/li&gt;

&lt;li&gt;&lt;b&gt;DataField&lt;/b&gt; = This is field/property on the entity that you want passed into your function. For our example, we&amp;#39;ll pass in the contact&amp;#39;s FullName property.&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;FormatMethodName&lt;/b&gt; = This is the name that you&amp;#39;ll be calling your function. For our example, we&amp;#39;ll call our function &amp;quot;GoogleLink&amp;quot;&lt;/li&gt;

&lt;li&gt;&lt;b&gt;FormatCode&lt;/b&gt; = This is the C# code to do what is needed to the value so it displays the way you want in the grid. See the code for our example below:&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;span style="color:Blue;"&gt;protected&lt;/span&gt; &lt;span style="color:Blue;"&gt;string&lt;/span&gt; GoogleLink(&lt;span style="color:Blue;"&gt;object&lt;/span&gt; name)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:Blue;"&gt;return&lt;/span&gt; &lt;span style="color:Blue;"&gt;string&lt;/span&gt;.Format(&lt;span&gt;&amp;quot;&amp;lt;a href=\&amp;quot;http://www.google.com/search?q={0}\&amp;quot; target=_blank&amp;gt;{0}&amp;lt;/a&amp;gt;&amp;quot;&lt;/span&gt;, name);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;One thing to point out here, the parameter getting passed in will need to be an object and you&amp;#39;ll be returning a string. Also, you &lt;b&gt;must&lt;/b&gt; include the complete function signature with the method name matching (case-sensitive) the name you have in the FunctionMethodName property. The properties for our CustomFormatColumn will look as follows:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/CustomFormatColumn1.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;The thing that will look weird, is the code in the Format Code property. As I mentioned before, you must include the complete signature of the function. The code window, however, will try to tell you that the code is not valid and it will appear as if you&amp;#39;re adding a function into a function, but you&amp;#39;re not. The code you type into this window will get added to the SmartPart and the grid column will wrap itself in the function call. You can see the weirdness I am referring to in the screenshot:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/CustomFormatColumn2.jpg" border="0" alt="" /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Notice the red squigglies and the apparent method signature at the top of the window. Ignore those. You&amp;#39;re doing just fine. After deploying, you can see the final result. A link in our grid that will launch a new window and take you to a search results page on Google. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/CustomFormatColumn3.jpg" border="0" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;A bit more real world, this would be another web app showing some details for that contact, like maybe products purchased or something from an accounting system. You can go far beyond simple formatting with this. If we wanted, we could pass in some identifier from the other system and then grab a value from that system&amp;#39;s database or via a web service call to get some value to show in the grid. However, beware, that while that is possible, keep in mind that this will execute for each row in the grid, delaying the load time for the grid and SmartPart so use discretion when moving beyond simple formatting.&lt;br /&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39616" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Application+Architect/default.aspx">Application Architect</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Quick+Forms/default.aspx">Quick Forms</category></item><item><title>Public SalesLogix Web Developer Classes On The Way</title><link>http://customerfx.com/pages/crmdeveloper/2008/09/02/public-saleslogix-web-developer-classes-on-the-way.aspx</link><pubDate>Tue, 02 Sep 2008 22:08:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39608</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>10</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39608</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39608</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/09/02/public-saleslogix-web-developer-classes-on-the-way.aspx#comments</comments><description>&lt;p&gt;Ever since the new SalesLogix 7.2 Web client and platform was released, I&amp;#39;ve had numerous requests for development training. Until now, I&amp;#39;ve done that on a very individualized basis, providing web training to single companies at a time. I&amp;#39;ve decided that it is time to make my web development training classes public, and I&amp;#39;d like your feedback.&lt;/p&gt;&lt;p&gt;The training classes will be done online, in short easy to digest chunks. The class will basically consist of 3 full days of training, spread out across three weeks. There will be approximately three sessions per week, each session lasting around 2+ hours each. To get the most out of the class, it will be expected that you spend some time working on the assigned practice examples in-between sessions. &lt;/p&gt;&lt;p&gt;The basic outline, for now, will consist of the following:&lt;/p&gt;&lt;p style="font-weight:bold;"&gt;&lt;font size="4"&gt;Beginner Track&lt;/font&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;Application Architect walk-through and terminology&lt;/li&gt;&lt;ol&gt;&lt;li&gt;QuickForms&lt;/li&gt;&lt;li&gt;SmartParts&lt;/li&gt;&lt;li&gt;Entity model and relationships&lt;/li&gt;&lt;li&gt;Interfaces&lt;/li&gt;&lt;li&gt;Portals and pages&lt;/li&gt;&lt;li&gt;Looking under the hood and understanding how it all comes together&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Setting up new portals and development environments&lt;/li&gt;&lt;ol&gt;&lt;li&gt;IIS configuration&lt;/li&gt;&lt;li&gt;Deployment configuration &amp;amp; process&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;QuickForm customization&lt;/li&gt;&lt;li&gt;Creating new 1:1 QuickForms &amp;amp; entity level tabs&lt;/li&gt;&lt;li&gt;Creating new 1:Many QuickForms with grids and edit/detail forms&lt;/li&gt;&lt;li&gt;Creating and installing bundles&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-weight:bold;"&gt;&lt;font size="4"&gt;Intermediate Track&lt;/font&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Creating new entities&lt;/li&gt;&lt;li&gt;Creating new MainView pages&lt;/li&gt;&lt;li&gt;Creating entity insert screens&lt;/li&gt;&lt;li&gt;Creating simple business rules&lt;/li&gt;&lt;li&gt;Creating simple entity event handlers&lt;/li&gt;&lt;li&gt;Troubleshooting &amp;amp; debugging&lt;/li&gt;&lt;ol&gt;&lt;li&gt;A look at troubleshooting both out of the box issues and your own customizations&lt;/li&gt;&lt;li&gt;Best practices for optimal development debugging and testing&lt;/li&gt;&lt;li&gt;Using tools such as Visual Studio, Reflector, Firebug, etc&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;font size="4"&gt;&lt;span style="font-weight:bold;"&gt;Advanced Track&lt;/span&gt;&lt;/font&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Creating complex business rules&lt;/li&gt;&lt;li&gt;Writing code for the entity model, repositories, &amp;amp; NHibernate queries&lt;/li&gt;&lt;li&gt;Creating business rules in Visual Studio&lt;/li&gt;&lt;li&gt;Creating custom SmartParts (visual UI elements) in Visual Studio&lt;/li&gt;&lt;li&gt;Creating and using mashups&lt;/li&gt;&lt;li&gt;Using mashups in custom SmartParts&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;The expert track below will likely be a completely separate class (or classes) that will not be a part of the timeline mentioned for the developer class above.&lt;br /&gt;&lt;p style="font-weight:bold;"&gt;&lt;font size="4"&gt;Expert Track&lt;/font&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;SData &amp;amp; REST&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Consuming SData feeds from external applications&lt;/li&gt;&lt;li&gt;Creating and updating entity data via REST&lt;/li&gt;&lt;li&gt;Integrating SalesLogix with other systems using SData/REST&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Process Orchestration (workflow)&lt;br /&gt;&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Using process orchestration&lt;/li&gt;&lt;ol&gt;&lt;li&gt;Sequential, event driven processes&lt;/li&gt;&lt;li&gt;Goal driven processes&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Creating new process orchestration tasks in Visual Studio&lt;/li&gt;&lt;li&gt;Integrating SalesLogix with other systems using process orchestration&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;Cost of the classes to follow at a later date. Obviously, we can&amp;#39;t offer Sage certification, the training is meant to provide an inexpensive, easy to attend, and &lt;span style="font-style:italic;"&gt;quick&lt;/span&gt; way to get developing for SalesLogix web &lt;span style="font-style:italic;"&gt;now&lt;/span&gt;. The class will also focus on 7.5. Attendees will be given access to forums where discussions from class can continue, code shared, etc, to help while working through practice examples.&lt;br /&gt;&lt;/p&gt;&lt;p style="font-weight:bold;font-style:italic;"&gt;&lt;font size="5"&gt;I&amp;#39;d love to hear your feedback &lt;/font&gt;&lt;/p&gt;&lt;p&gt;What topics would &lt;span style="font-style:italic;"&gt;you&lt;/span&gt; like to see covered? What things have caused you frustration when working with SalesLogix Web that would be helpful in a training class? Let me know in the comments below or via the &amp;quot;Contact&amp;quot; link to the right.&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39608" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+7.5/default.aspx">SalesLogix 7.5</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Training/default.aspx">Training</category></item><item><title>Building Interfaces, Building Web Platform, and Deployment Explained</title><link>http://customerfx.com/pages/crmdeveloper/2008/08/22/building-interfaces-building-web-platform-and-deployment-explained.aspx</link><pubDate>Fri, 22 Aug 2008 16:03:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39594</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39594</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39594</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/08/22/building-interfaces-building-web-platform-and-deployment-explained.aspx#comments</comments><description>&lt;p&gt;When you&amp;#39;re developing for SalesLogix Web in the Application Architect, there are three actions that a developer must use during the process: building interfaces, building the web platform, and deployment. For someone starting out with the Application Architect, the reasons behind each of these actions can be confusing. Even more confusing can be when one is used vs another. This post will attempt to explain these three actions and when/why they are used.&lt;br /&gt;&lt;/p&gt;
&lt;p style="font-weight:bold;"&gt;&lt;font size="5"&gt;Building Interfaces&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;If you think about how the entities are used in code, you&amp;#39;ll know that it is always via it&amp;#39;s interface. Basically, an interface is a sort of &amp;quot;contract&amp;quot; that another class that implements the interface must abide by. The interface has no implementation code, it only defines what the implementing class must have. The reason why the entities in SalesLogix all implement an interface, and also why these interfaces are used to reference the entities in the AA and in code, is to provide a level of abstraction from the actual implementation of the entities. This way, when &amp;quot;future&amp;quot; SalesLogix can be deployed to web, windows, or mobile, the implementation of the entities can differ if needed yet all still implement the same interface, and the code that uses them via the interfaces will still work.&lt;/p&gt;
&lt;p&gt;So, what does that have to do with using the Application Architect? Just as your own code will use the entities via their interface, the QuickForms and other areas in the AA will use the interface as well. When you make a change to an entity, such as add a new entity, or add/change a property or relationship on and entity, the rest of the Application Architect will not know about this change until you&amp;#39;ve built the interfaces - which will cause the interface to show the change you&amp;#39;ve made. If you add a new property to an entity and then want to add it to a QuickForm, the QuickForm designer won&amp;#39;t know about the new property unless you&amp;#39;ve rebuilt the interfaces.&lt;/p&gt;
&lt;p&gt;As a rule of thumb, you should rebuild interfaces after doing the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a new entity&lt;/li&gt;
&lt;li&gt;Add or change properties on an entity&lt;/li&gt;
&lt;li&gt;Add or change relationships for entities&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, remember this: &lt;span style="font-weight:bold;font-style:italic;"&gt;building interfaces is only needed if you want to immediately use an entity you&amp;#39;ve added or changed in the Application Architect&lt;/span&gt;. The whole purpose of building interfaces is to make an entity change immediately available for use in the Application Architect. If you&amp;#39;re not going to use that change in a QuickForm or something right away, then you don&amp;#39;t need to build the interfaces. As you&amp;#39;ll learn in the next section, &lt;span style="font-weight:bold;font-style:italic;"&gt;building the web platform also builds the interfaces&lt;/span&gt; (so if you&amp;#39;re going to be doing that anyway, no need to take this step).&lt;/p&gt;
&lt;p&gt;In newer versions of SalesLogix (I think this came in 7.2.1 or 7.2.2) the Application Architect will attempt to recognize when a build is required for the interfaces and will run the build for you. I don&amp;#39;t really like this since you&amp;#39;ll attempt something like open up a QuickForm, it looks like the AA has locked up, but what it is really doing is running the build interfaces step in the background, when it&amp;#39;s done it will open up the form. Instead, I like to do my own build of the interfaces when it is required.&lt;br /&gt;&lt;/p&gt;
&lt;p style="font-weight:bold;"&gt;&lt;font size="5"&gt;Building Web Platform&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;When you build the web platform, what you&amp;#39;re essentially doing is getting the entity model ready for a web environment. All of the business rules and event code is compiled so it is usable by the entities, the QuickForms are converted to SmartParts (ASP.NET UserControls, ascx files), and so forth. This is a required step if you&amp;#39;ve made any changes at all in the entity model, that means entities, QuickForms, relationships, business rules, etc. &lt;span style="font-weight:bold;font-style:italic;"&gt;Remember, this step also builds interfaces, so no need to do that too&lt;/span&gt;. Before a deployment can happen, this must occur first to prepare the entity model by getting it into a web usable format.&lt;/p&gt;
&lt;p&gt;As a rule, you must build the web platform after you&amp;#39;ve done the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Anything listed above in the building interfaces section&lt;/li&gt;
&lt;li&gt;Created/modified a QuickForm&lt;/li&gt;
&lt;li&gt;Created/modified a business rule, event code, or code snippet. &lt;br /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you&amp;#39;ve changed anything in the entity model then you must do this step. Be clear about this, however, &lt;span style="font-weight:bold;font-style:italic;"&gt;this is only needed with changes to the &lt;span style="text-decoration:underline;"&gt;entity model&lt;/span&gt; only&lt;/span&gt;. Making changes in the portal manager, such as adding a SmartPart to a page, adding a new page, adding navigation menus, etc, are not part of the entity model, so there&amp;#39;s no need to build the web platform, only deployment.&lt;br /&gt;&lt;/p&gt;
&lt;p style="font-weight:bold;"&gt;&lt;font size="5"&gt;Deployment&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;The deployment is the step that pushes everything out to the website itself. The deployment process will check for the files that have changed and will push out accordingly. The deployment is needed after you do basically &lt;span style="font-style:italic;"&gt;anything&lt;/span&gt; in the Application Architect to get the changes out to the website. There are some things you can do in the AA which only require a deployment with no builds or anything else. If the only changes you&amp;#39;ve are in the portal manager, such as adding a SmartPart to a page, changing where a SmartPart loads on a page or anything like that, then all you need to do is a deployment. No builds are needed. Make sense?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Yes, a lot to take in. Remember this:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Make changes to entity model and want to use the changes right away, build interfaces (unless you&amp;#39;ll also be building web platform for other reasons)&lt;/li&gt;&lt;li&gt;Any change to the entity model, build the web platform&lt;/li&gt;&lt;li&gt;Any change mentioned in 1 or 2, deploy.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Any change to the portal manager, deploy.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;Worse case, it doesn&amp;#39;t hurt to to more than what is necessary. If a build ins&amp;#39;t needed and you do it anyway, it won&amp;#39;t hurt anything. However, you&amp;#39;ve realized by now that the build and deployment for SalesLogix web takes a &lt;span style="font-style:italic;"&gt;long time&lt;/span&gt;. Anything to cut down on that time, and only perform exactly what is necessary is always helpful.&lt;br /&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39594" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Application+Architect/default.aspx">Application Architect</category></item><item><title>Error Opening InsertOpportunity.aspx in SalesLogix 7.2 Web</title><link>http://customerfx.com/pages/crmdeveloper/2008/07/28/error-opening-insertopportunity-aspx-in-saleslogix-7-2-web.aspx</link><pubDate>Mon, 28 Jul 2008 23:54:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39531</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39531</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39531</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/07/28/error-opening-insertopportunity-aspx-in-saleslogix-7-2-web.aspx#comments</comments><description>
&lt;p&gt;I posted this a while back in the SalesLogix Business Partner newsgroups, but it has recently just helped a few others who came across it there, so I thought it would be a worthwhile public post. Not everyone will get the error mentioned in this post, but if you are then this should help. This post also describes my troubleshooting process to locate this issue and determine the fix for it.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;I have a customer who could not bring up the Insert New Opportunity Screen. After stepping through things with VS I determined that I was getting an error in the GetOppProductDefaults business rule on the Opportunity entity. The GetOppProductDefaults method looks like this (&lt;a href="http://customerfx.com/pages/crmdeveloper/2008/01/15/Documenting-SalesLogix-Web-with-Reflector.aspx"&gt;as seen through reflector&lt;/a&gt;): &lt;/p&gt;

&lt;pre&gt;&lt;span style="color:Blue;"&gt;public&lt;/span&gt; &lt;span style="color:Blue;"&gt;static&lt;/span&gt; &lt;span style="color:Blue;"&gt;void&lt;/span&gt; GetOppProductDefaults(IOpportunity opportunity)&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:Blue;"&gt;string&lt;/span&gt; commonOption &lt;span style="color:Navy;"&gt;=&lt;/span&gt; ApplicationContext.Current.Services.Get&amp;lt;IUserOptionsService&amp;gt;().GetCommonOption(&lt;span&gt;&amp;quot;Products&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;OpportunityDefaults&amp;quot;&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (commonOption !&lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;quot;&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        commonOption &lt;span style="color:Navy;"&gt;=&lt;/span&gt; commonOption.Substring(commonOption.IndexOf(&lt;span&gt;&amp;quot;&amp;lt;rs:data&amp;gt;&amp;quot;&lt;/span&gt;)).Replace(&lt;span&gt;&amp;quot;rs:data&amp;gt;&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;rsdata&amp;gt;&amp;quot;&lt;/span&gt;).Replace(&lt;span&gt;&amp;quot;z:row&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;zrow&amp;quot;&lt;/span&gt;).Replace(&lt;span&gt;&amp;quot;&amp;lt;/xml&amp;gt;&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;&amp;quot;&lt;/span&gt;);&lt;br /&gt;        XmlDocument document &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; XmlDocument();&lt;br /&gt;        &lt;span style="color:Blue;"&gt;try&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            document.LoadXml(commonOption);&lt;br /&gt;            &lt;span style="color:Blue;"&gt;foreach&lt;/span&gt; (XmlNode node &lt;span style="color:Blue;"&gt;in&lt;/span&gt; document.SelectSingleNode(&lt;span&gt;&amp;quot;rsdata&amp;quot;&lt;/span&gt;).ChildNodes)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color:Blue;"&gt;if&lt;/span&gt; (node.Attributes[&lt;span&gt;&amp;quot;PRODUCTID&amp;quot;&lt;/span&gt;].Value !&lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;null&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    IOpportunityProduct item &lt;span style="color:Navy;"&gt;=&lt;/span&gt; EntityFactory.Create&amp;lt;IOpportunityProduct&amp;gt;();&lt;br /&gt;                    item.Opportunity &lt;span style="color:Navy;"&gt;=&lt;/span&gt; opportunity;&lt;br /&gt;                    item.Product &lt;span style="color:Navy;"&gt;=&lt;/span&gt; EntityFactory.GetById&amp;lt;IProduct&amp;gt;(node.Attributes[&lt;span&gt;&amp;quot;PRODUCTID&amp;quot;&lt;/span&gt;].Value);&lt;br /&gt;                    item.Sort &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; &lt;span style="color:Blue;"&gt;int&lt;/span&gt;?(Convert.ToInt32(node.Attributes[&lt;span&gt;&amp;quot;SORT&amp;quot;&lt;/span&gt;].Value));&lt;br /&gt;                    item.Program &lt;span style="color:Navy;"&gt;=&lt;/span&gt; node.Attributes[&lt;span&gt;&amp;quot;PRICELEVEL&amp;quot;&lt;/span&gt;].Value;&lt;br /&gt;                    item.Price &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; decimal?(Convert.ToDecimal(node.Attributes[&lt;span&gt;&amp;quot;PRICE&amp;quot;&lt;/span&gt;].Value));&lt;br /&gt;                    item.Discount &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; double?(Convert.ToDouble(node.Attributes[&lt;span&gt;&amp;quot;DISCOUNT&amp;quot;&lt;/span&gt;].Value));&lt;br /&gt;                    item.Quantity &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; double?(Convert.ToDouble(node.Attributes[&lt;span&gt;&amp;quot;QUANTITY&amp;quot;&lt;/span&gt;].Value));&lt;br /&gt;                    item.ExtendedPrice &lt;span style="color:Navy;"&gt;=&lt;/span&gt; &lt;span style="color:Blue;"&gt;new&lt;/span&gt; decimal?(Convert.ToDecimal(node.Attributes[&lt;span&gt;&amp;quot;EXTENDED&amp;quot;&lt;/span&gt;].Value));&lt;br /&gt;                    opportunity.Products.Add(item);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color:Blue;"&gt;catch&lt;/span&gt; (Exception)&lt;br /&gt;        {&lt;br /&gt;            throw &lt;span style="color:Blue;"&gt;new&lt;/span&gt; Exception(&lt;span&gt;&amp;quot;Invalid xml for default Opportunity Products&amp;quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;The stack trace from the exception showed the following:&lt;/p&gt;

&lt;pre&gt;   at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)&lt;br /&gt;   at System.String.Substring(Int32 startIndex)&lt;br /&gt;   at Sage.SalesLogix.Opportunity.Rules.GetOppProductDefaults(IOpportunity opportunity)&lt;br /&gt;   at Sage.SalesLogix.Opportunity.Rules.CheckOppAccount(IOpportunity opportunity, Boolean&amp;amp; result)&lt;br /&gt;   at (Object )&lt;br /&gt;   at Sage.Platform.DynamicMethod.DynamicMethodLibrary.Execute(String methodName, Object[] args)&lt;/pre&gt;
&lt;p&gt;You&amp;#39;ll notice that the exception was thrown from the attempt to use Substring on a string within the GetOppProductDefaults method. The Substring is used to get only the XML between the &amp;lt;rs:data&amp;gt;&amp;lt;/rs:data&amp;gt; tags from the serialized XML from the Recordset stored there, ignoring the schema data from the beginning section of the XML. So, I looked and this is what this customer has stored there for *all* users for the Products in the OpportunityDefaults user option:&lt;/p&gt;

&lt;pre&gt;&amp;lt;xml xmlns:z=&lt;span&gt;&amp;quot;#RowsetSchema&amp;quot;&lt;/span&gt; xmlns:rs=&lt;span&gt;&amp;quot;urn:schemas-microsoft-com:rowset&amp;quot;&lt;/span&gt; xmlns:dt=&lt;span&gt;&amp;quot;uuid:C2F41010-65B3-11d1-A29F-00AA00C14882&amp;quot;&lt;/span&gt; xmlns:s=&lt;span&gt;&amp;quot;uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;lt;s:Schema id=&lt;span&gt;&amp;quot;RowsetSchema&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt; &amp;lt;s:ElementType name=&lt;span&gt;&amp;quot;row&amp;quot;&lt;/span&gt; content=&lt;span&gt;&amp;quot;eltOnly&amp;quot;&lt;/span&gt; rs:updatable=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;SORT&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;1&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;int&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;4&amp;quot;&lt;/span&gt; rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;PRODUCTID&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;2&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;string&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;str&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;12&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;KEYFIELDID&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;3&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;string&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;str&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;16&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;PRODUCT&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;4&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;string&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;str&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;64&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;FAMILY&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;5&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;string&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;str&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;64&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;PRICELEVEL&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;6&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;string&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;str&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;32&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;PRICE&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;7&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;number&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;currency&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;DISCOUNT&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;float&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt; rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;ADJPRICE&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;9&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;number&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;currency&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;PRICELOCAL&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;10&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;number&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;currency&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;QUANTITY&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;11&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;float&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt; rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;EXTENDED&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;12&amp;quot;&lt;/span&gt; rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;number&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;currency&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:AttributeType name=&lt;span&gt;&amp;quot;EXTENDEDLOCAL&amp;quot;&lt;/span&gt; rs:number=&lt;span&gt;&amp;quot;13&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:write=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;   &amp;lt;s:datatype dt:type=&lt;span&gt;&amp;quot;number&amp;quot;&lt;/span&gt; rs:dbtype=&lt;span&gt;&amp;quot;currency&amp;quot;&lt;/span&gt; dt:maxLength=&lt;span&gt;&amp;quot;8&amp;quot;&lt;/span&gt;&lt;br /&gt;    rs:precision=&lt;span&gt;&amp;quot;0&amp;quot;&lt;/span&gt; rs:fixedlength=&lt;span&gt;&amp;quot;true&amp;quot;&lt;/span&gt; rs:maybenull=&lt;span&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;/s:AttributeType&amp;gt;&lt;br /&gt;  &amp;lt;s:extends type=&lt;span&gt;&amp;quot;rs:rowbase&amp;quot;&lt;/span&gt;&lt;span style="color:Navy;"&gt;/&lt;/span&gt;&amp;gt;&lt;br /&gt; &amp;lt;/s:ElementType&amp;gt;&lt;br /&gt;&amp;lt;/s:Schema&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/xml&amp;gt;&lt;/pre&gt;
&lt;p&gt;There is no &amp;lt;rs:data&amp;gt; section in this XML, so obviously, that is why the use of Substring is failing, because the IndexOf is returning an invalid integer for a start position. Normally, in any other system I&amp;#39;ve checked so far, this XML is completely blank for users that have never set any defaults. For a user that goes into the dialog to set the defaults and clicks OK without selecting any default products they will have the XML, but an empty &amp;lt;rs:data&amp;gt; section. Empty is OK, because at least it exists and the code above will not fail. &lt;/p&gt;
&lt;p&gt;So, I have no idea what caused the XML to get saved this way in the first place. I will continue to look for this in other systems, but I wanted to mention all this here in case others run into this. This is all fixed by having these users simply go into the Opportunity Defaults dialog (in the fat client) and just clicking OK. This will cause the empty &amp;lt;rs:data&amp;gt; section to be added to the XML for the serialized recordset and then all wil work fine.&lt;/p&gt;
&lt;p&gt;I was originally going to suggest that the code for the GetOppProductDefaults be changed to check the IndexOf the &amp;quot;&amp;lt;rd:data&amp;gt;&amp;quot; section frst before proceeding to get the Substring. This certainly would have saved me some headache since the code would not have completely crapped out for this customer - but I have no idea how this got stored this way for this customer in the first place, so no telling how common this scenario would be. The weird thing is that the XML is like this for *all* users for my customer. This was an upgrade BTW, but so was my own internal database and it doesn&amp;#39;t have this problem.&lt;/p&gt;
&lt;p&gt;&lt;font size="4"&gt;&lt;b&gt;The Solution&lt;/b&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;For now, just have your users go to the Set Opportunity Defaults screen in the Windows client and just open and close (by clicking OK) the opportunity products default screen (they don&amp;#39;t actually have to select any product defaults). This will cause the proper XML string to be saved for that user. Optionally, you could programatically store the corrected XML for them. &lt;/p&gt;
&lt;p&gt;I&amp;#39;ve not checked yet to see if this business rule has been fixed for 7.5 or not. &lt;br /&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39531" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Issues+and+Bugs/default.aspx">Issues and Bugs</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Troubleshooting/default.aspx">Troubleshooting</category></item><item><title>SalesLogix 7.5 Beta Testing Has Begun!</title><link>http://customerfx.com/pages/crmdeveloper/2008/07/11/saleslogix-7-5-beta-testing-has-begun.aspx</link><pubDate>Fri, 11 Jul 2008 20:55:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39488</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39488</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39488</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/07/11/saleslogix-7-5-beta-testing-has-begun.aspx#comments</comments><description>&lt;p&gt;The beta tesing for SalesLogix 7.5 has begun! Completely exciting. This is &lt;b&gt;&lt;i&gt;THE&lt;/i&gt;&lt;/b&gt; release for SalesLogix web, and one that IMO puts SalesLogix in the front of all other web-based CRM applications.&amp;nbsp; If you&amp;#39;re using SalesLogix Web and not yet planning on moving to 7.5 it&amp;#39;s time to start planning that upgrade. &lt;/p&gt;
&lt;p&gt;There will be plenty of things coming to show all the new features of 7.5 (like the upcoming &lt;a href="http://customerfx.com/pages/events/2008/06/19/Jul-15_2C00_-2008-_2D00_-SalesLogix-v7.5-Sneak-Peek-Live-_2D00_-A-Customer-FX-Exclusive.aspx"&gt;Customer FX 7.5 Sneak Peek live workshop&lt;/a&gt;) , but I wanted to point out a few small and less talked about things that I&amp;#39;ve liked so far in this release.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New Look &amp;amp; Feel&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The new &amp;quot;polished&amp;quot; look of the web client is completely impressive. I stuggled with the look of the original 7.2 client, had a hard time liking how it looked. Not the case any more. This looks awesome. Here&amp;#39;s a few examples:&lt;/p&gt;
&lt;p&gt;The new menus:&lt;br /&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/SalesLogix75/slx75-1.jpg" border="0" alt="" /&gt; &lt;/p&gt;
&lt;p&gt;The new group viewer:&lt;br /&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/SalesLogix75/slx75-2.jpg" border="0" alt="" /&gt; &lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Collapsible navbar:&lt;br /&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/SalesLogix75/slx75-3.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Awesome looking dialogs, especially lookups - wow those were really needed and I just can&amp;#39;t get over how great they look!&lt;br /&gt; &lt;img src="http://customerfx.com/blogs/crmdeveloper/SalesLogix75/slx75-4.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Session Timeout Indicator&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;In the bottom-right corner. And you get bumped out to the login screen as soon as it expires. Small change, yes, but a nice one to have. Also, you get a count down to when you are going to get automatically logged off too - &amp;quot;auto logoff in 1 minute&amp;quot;:&lt;br /&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/SalesLogix75/slx75-5.jpg"&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/SalesLogix75/slx75-5.jpg" border="0" alt="" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Performance&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;One completely great addition in 7.5 is that you no longer have such a long wait time when clicking between tabs. In previous versions, each time you clicked a tab you&amp;#39;d get the progress bar while it was retrieved and loaded. You still have the for the first time you click it, but then it stays loaded so you can go to other tabs and then back to it and it displays &lt;i&gt;&lt;b&gt;immediately&lt;/b&gt;&lt;/i&gt;.&amp;nbsp; The result is a huge and noticeable performance increase in just moving around the client. Cool!&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Deployment&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t know if this was an intended &amp;quot;feature&amp;quot; or not, but I love it. The deployment status window is no longer modal to the Application Architect. You can deploy and then click around in the AA while the deployment is happening. No more frustrating waits just to look at some things while it is deploying.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Forms&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#39;s a new addition of non-entity related forms! There will be plenty more to come on this one.&lt;/p&gt;
&lt;p&gt;Anyway, off the top of my head, those are some of the smaller things that hit me as I moved around and played with the first SalesLogix 7.5 beta. Plenty more will follow.&lt;br /&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39488" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/New+Finds/default.aspx">New Finds</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+7.5/default.aspx">SalesLogix 7.5</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Beta/default.aspx">Beta</category></item><item><title>Running SalesLogix Web on IIS7</title><link>http://customerfx.com/pages/crmdeveloper/2008/06/24/running-saleslogix-web-on-iis7.aspx</link><pubDate>Tue, 24 Jun 2008 21:31:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39463</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39463</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39463</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/06/24/running-saleslogix-web-on-iis7.aspx#comments</comments><description>&lt;p&gt;I &lt;a href="http://customerfx.com/pages/crmdeveloper/2008/05/02/saleslogix-7-2-web-on-vista.aspx"&gt;blogged a while back about using Vista&lt;/a&gt; for developing for SalesLogix 7.2 Web without using IIS but instead using the ASP.NET Dev Server. I wanted to outline some additional tweaks you can make to get the SalesLogix portals running on full-blown IIS7 on Vista as well. &lt;/p&gt;&lt;p&gt;While it is not &lt;i&gt;officially&lt;/i&gt; supported to run SalesLogix 7.2 Web on IIS7, you can make some tweaks to get things running. The first thing you&amp;#39;ll need to do is turn on (install) the IIS6 compatibility for IIS7. Don&amp;#39;t bother looking for that in the IIS console, you add that by going to Add/Remove in Control Panel.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/WindowsFeatures_IISCompat.jpg"&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/WindowsFeatures_IISCompat.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;You need to add the IIS 6 Management Compatibility, at a minimum. To be honest, while trying to get SalesLogix working on IIS7 I tried all sorts of combinations of settings, so there may be others to add as well (leave a comment and I can check my settings to compare). &lt;/p&gt;&lt;p&gt;Once everything is installed, the second item has to do with the application pool for the deployed SalesLogix portal. In IIS, create an app pool for your SalesLogix Web portals. Make sure it is set to use .NET 2.0, but &lt;b&gt;the important thing to set here is to use a Classic pipeline&lt;/b&gt;, not integrated.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/IIS7_ClassicAppPool.jpg"&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/IIS7_ClassicAppPool.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Of course, also make sure your deployed SalesLogix portals are using this new app pool as well. So that is really it. You should now have it working. One more thing to note, if you&amp;#39;re running 64-bit Vista, make sure you also read &lt;a href="http://codesnap.wordpress.com/2008/05/04/saleslogix-web-client-working-on-vista-64/" target="_blank"&gt;Mark Dykun&amp;#39;s post&lt;/a&gt; on the additional necessary tweaks you&amp;#39;ll have to make there as well. Good luck!&lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39463" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Vista/default.aspx">Vista</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/IIS/default.aspx">IIS</category></item><item><title>Integrating the SalesLogix Lead Capture Portal with an Existing Website</title><link>http://customerfx.com/pages/crmdeveloper/2008/06/10/integrating-the-saleslogix-lead-capture-portal-with-an-existing-website.aspx</link><pubDate>Tue, 10 Jun 2008 21:35:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39433</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39433</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39433</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/06/10/integrating-the-saleslogix-lead-capture-portal-with-an-existing-website.aspx#comments</comments><description>&lt;p&gt;It&amp;#39;s much easier than many might think to fully integrate the SalesLogix 7.2 Lead Capture portal into an existing website. For a sample of this, I grabbed a free online website template and put it up as a website and &lt;b&gt;&lt;i&gt;within 5 minutes&lt;/i&gt;&lt;/b&gt; (seriously, 5 minutes) I had the Lead Capture portal fully integrated into the site. Brain-dead easy. Best of all, no frames. &lt;/p&gt;
&lt;p&gt;So, I&amp;#39;ve created a free workshop on June 24th (Tuesday) at 2:00PM Central to cover this topic and demonstrate how to integrate the lead capture portal with an existing website. If you&amp;#39;d like to attend you can register here: &lt;a href="http://customerfx.com/pages/events/2008/06/10/Jun-24_2C00_-2008-_2D00_-Integrating-the-SalesLogix-7.2-Lead-Capture-Portal-with-an-Existing-Website.aspx"&gt;Click to Register&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Join me on the workshop (it&amp;#39;s free) and we can take a look at this together and discuss different scenarios for websites built on different technologies (doesn&amp;#39;t need to be an ASP.NET site).&lt;/p&gt;&lt;p&gt;See you there.&amp;nbsp; &lt;br /&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39433" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Integration/default.aspx">Integration</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Workshop/default.aspx">Workshop</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Lead+Capture+Portal/default.aspx">Lead Capture Portal</category></item><item><title>Using the EntityHistoryService to Retrieve Previously Accessed Entities</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/30/using-the-entityhistoryservice-to-retrieve-previously-accessed-entities.aspx</link><pubDate>Fri, 30 May 2008 23:16:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39380</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39380</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39380</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/30/using-the-entityhistoryservice-to-retrieve-previously-accessed-entities.aspx#comments</comments><description>&lt;p&gt;There are many ways to get the &amp;quot;current&amp;quot; account in SalesLogix Web. For those coming from developing for the SalesLogix Windows client, you&amp;#39;ll likely&amp;nbsp;want the same capabilities that the BasicFunctions CurrentAccountID provides. In the web platform, however, there is all of that, plus more.&lt;/p&gt;
&lt;p&gt;If your QuickForm or SmartPart is a child of the Account entity, you can reference the parent account instance using GetParentEntity:&lt;/p&gt;&lt;pre&gt;Sage.Entity.Interfaces.IAccount account &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; 
    (Sage.Entity.Interfaces.IAccount)&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.GetParentEntity();&lt;/pre&gt;
&lt;p&gt;If the parent of your SmartPart is an account (meaning your SmartPart is on an&amp;nbsp;entity page for type IAccount), then that will get it for you just fine.&lt;/p&gt;
&lt;p&gt;Another option, which is a bit more limited, is to get the parent account for the current entity instance. This will, of course, only work if your current entity instance has a parent account. For example, let&amp;#39;s say your on a Contact-level SmartPart and you want to get the parent account:&lt;/p&gt;&lt;pre&gt;Sage.Entity.Interfaces.IContact contact &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; 
    &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.BindingSource.Current as Sage.Entity.Interfaces.IContact;

&lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (contact !&lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)
{
    Sage.Entity.Interfaces.IAccount account &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; contact.Account;
    &lt;span style="COLOR:green;"&gt;//...
&lt;/span&gt;}&lt;/pre&gt;
&lt;p&gt;This works great if you &lt;em&gt;have&lt;/em&gt; a parent account for the current entity instance. Let&amp;#39;s say that you create an entirely new area for the client and you&amp;#39;d like to default the account to the current account (or really the last account the user visited) when creating new instances of your entity. The Sage Platform provides an Entity History Service for just this purpose. In the sample code below let&amp;#39;s grab a reference to the last account visited:&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:green;"&gt;// First access the EntityHistory service 
&lt;/span&gt;Sage.Platform.Application.IEntityHistoryService entityHistoryService &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; 
    Sage.Platform.Application.ApplicationContext.Current.Services.Get&amp;lt;IEntityHistoryService&amp;gt;();

&lt;span style="COLOR:green;"&gt;// Now let&amp;#39;s use it to get the ID of the last Account accessed 
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; accountId &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; entityHistoryService.GetLastIdForType&amp;lt;IAccount&amp;gt;().ToString();

&lt;span style="COLOR:green;"&gt;// And get a reference to the entity 
&lt;/span&gt;IAccount account &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; Sage.Platform.EntityFactory.GetById&amp;lt;IAccount&amp;gt;(accountId);&lt;/pre&gt;
&lt;p&gt;You can also use that service to to back much further, beyond just the last entity accessed, but all the past ones accessed. Let&amp;#39;s say you want to get a list of all previously accessed accounts:&lt;/p&gt;&lt;pre&gt;List&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt; accountlist &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; List&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt;();
&lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (EntityHistory entity &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; entityHistoryService)
{
    &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (entity.EntityType == typeof(IAccount))
    {
        accountlist.Add(&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR:#008080;"&gt;&amp;quot;Accessed {0} ({1})&amp;quot;&lt;/span&gt;, entity.Description, entity.EntityId));
    }
}&lt;/pre&gt;
&lt;p&gt;Let&amp;#39;s see you do that in the Windows client. Do I have to keep saying that I love this new platform, or can we all just agree that it rocks? Hehe.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39380" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Entity+Model/default.aspx">Entity Model</category></item><item><title>Binding a Grid to a List Returning Business Rule using GetByMethod</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/27/binding-a-grid-to-a-list-returning-business-rule-using-getbymethod.aspx</link><pubDate>Tue, 27 May 2008 22:15:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39371</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39371</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39371</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/27/binding-a-grid-to-a-list-returning-business-rule-using-getbymethod.aspx#comments</comments><description>&lt;p&gt;&lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2008/05/22/creating-a-business-rule-to-return-a-list-of-objects.aspx"&gt;I last posted&lt;/a&gt; about creating a business rule to return a list of objects. Today, I will take that a step further and bind the List&amp;lt;IAccount&amp;gt; to a DataGrid using the built-in GetByMethod for binding the list. &lt;/p&gt;
&lt;p&gt;In&amp;nbsp;&lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2008/05/22/creating-a-business-rule-to-return-a-list-of-objects.aspx"&gt;my last post&lt;/a&gt; I created a business rule that returned a list of child accounts for the current account named GetChildAccounts. Now, we will create a new account level tab to display this data. Let&amp;#39;s start with the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Create a new form under the account entity (I don&amp;#39;t typically use the wizards)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Add a DataSource to the form and set the following properties on it:&lt;/div&gt;&lt;/li&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Entity Type&lt;/strong&gt; = Account&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Get By Method&lt;/strong&gt; = GetChildAccounts&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Is Collection&lt;/strong&gt; = True&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Source&lt;/strong&gt; = Account&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;li&gt;
&lt;div&gt;Now add a DataGrid and select the DataSource and add your columns as usual.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;You&amp;#39;ll end up with the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/AccountChildTab.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Quite nice and an easy peice of work. I just love the new platform.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39371" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Application+Architect/default.aspx">Application Architect</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Quick+Forms/default.aspx">Quick Forms</category></item><item><title>Creating a Business Rule to Return a List of Objects</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/22/creating-a-business-rule-to-return-a-list-of-objects.aspx</link><pubDate>Thu, 22 May 2008 18:05:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39355</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39355</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39355</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/22/creating-a-business-rule-to-return-a-list-of-objects.aspx#comments</comments><description>&lt;p&gt;One of the best things about working with the SalesLogix 7.2 Web application is how great the entity model is. You have this single place to put all your rules and logic, the UI is really just an afterthought. Something that I do quite often is create business rules to return data specific to an entity instance. For example, &lt;a href="http://customerfx.com/pages/crmdeveloper/2008/04/18/displaying-the-primary-contact-on-the-account-detail-form-revisited-and-custom-properties-in-7-2-2.aspx" class=""&gt;a rule to return the primary contact for an account&lt;/a&gt;. Let&amp;#39;s take that a step further and return a list of objects from an business rule. For this scenario, we&amp;#39;ll create a business rule that will return a list of child accounts for the current account instance. &lt;/p&gt;
&lt;p&gt;To do this, go to the Account entity in the Application Architect and create a new business rule. Give the rule a name of GetChildAccounts. What we will be returning from this rule is a List&amp;lt;IAccount&amp;gt;. However, you&amp;#39;ll get problems if you try to add that as the return type for the rule in some versions. That&amp;#39;s fine, we can specify that we&amp;#39;ll be returning an object and all will be OK (otherwise, add &lt;font face="courier new,courier"&gt;System.Collections.Generic.IList&amp;lt;Sage.Entity.Interfaces.IAccount&amp;gt;&lt;/font&gt; as the return type). Add a step for the rule and it will end up looking like the following:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/AccountChildRule.jpg"&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/AccountChildRule.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Click the Edit Code Snippet and we&amp;#39;ll enter the following code:&lt;/p&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;#region&lt;/span&gt; Usings&lt;br /&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.Entity.Interfaces;&lt;br /&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.Platform;&lt;br /&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.Platform.Repository;&lt;br /&gt;&lt;span style="color:blue;"&gt;#endregion&lt;/span&gt; Usings&lt;br /&gt;&lt;br /&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; Sage.BusinessRules.CodeSnippets&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; partial &lt;span style="color:blue;"&gt;class&lt;/span&gt; AccountBusinessRules&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; GetChildAccountsStep1( IAccount account, out object result)&lt;br /&gt;        {&lt;br /&gt;            IRepository&amp;lt;IAccount&amp;gt; repository &lt;span style="color:navy;"&gt;=&lt;/span&gt; EntityFactory.GetRepository&amp;lt;IAccount&amp;gt;();&lt;br /&gt;            IQueryable qry &lt;span style="color:navy;"&gt;=&lt;/span&gt; (IQueryable)repository;&lt;br /&gt;            IExpressionFactory ef &lt;span style="color:navy;"&gt;=&lt;/span&gt; qry.GetExpressionFactory();&lt;br /&gt;            &lt;br /&gt;            ICriteria criteria &lt;span style="color:navy;"&gt;=&lt;/span&gt; qry.CreateCriteria();&lt;br /&gt;            criteria.Add(ef.Eq(&lt;span&gt;&amp;quot;ParentId&amp;quot;&lt;/span&gt;, account.Id.ToString()));&lt;br /&gt;            &lt;br /&gt;            result &lt;span style="color:navy;"&gt;=&lt;/span&gt; criteria.List&amp;lt;IAccount&amp;gt;();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Let&amp;#39;s talk about what that code is alll about for a sec. We first create a repository for IAccount. This is basically the &amp;quot;place&amp;quot; and &amp;quot;type&amp;quot; where we will be getting our data. We next create an IQueryable object which represents our query. We add an ICriteria, via the ExpressionFactory of our IQueryable object, which specifies that we want anything from our repository that meets the criteria that the entity&amp;#39;s &amp;quot;ParentId&amp;quot; property equals the current account instance&amp;#39;s Id value. From there we simply get a List of the results. I&amp;#39;ll be posting a lot more about how to use and understand this syntax in the future, but I wanted to point out that it is all NHibernate under the covers. This means you can use HQL queries as well, which might make for more readable syntax for some. Either way, there is plenty of good info online already. See &lt;a href="http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html_single/#querycriteria"&gt;http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html_single/#querycriteria&lt;/a&gt;&amp;nbsp;for starters. &lt;/p&gt;
&lt;p&gt;Tomorrow we&amp;#39;ll look at binding those results to a grid using the GetByMethod option for the datasoruce. &lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39355" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Entity+Model/default.aspx">Entity Model</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Application+Architect/default.aspx">Application Architect</category></item><item><title>Ping a Remote Server Using C#</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/21/ping-a-remote-server-using-c.aspx</link><pubDate>Thu, 22 May 2008 04:30:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39350</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39350</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39350</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/21/ping-a-remote-server-using-c.aspx#comments</comments><description>&lt;p&gt;In my &lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2008/05/19/ping-a-remote-server-using-vbscript.aspx"&gt;last post&lt;/a&gt;, I shared some code in VBScript to PING a remote server to check for availability before attempting to use a resource on that remote server. This wouldn&amp;#39;t be my blog if I didn&amp;#39;t also share this code in C# as well. IMO, this sort of thing is a far better suited for a .NET Extension if for the SalesLogix Windows client. &lt;/p&gt;
&lt;p&gt;To perform a PING using C#, the code is far more straight forward than the &lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2008/05/19/ping-a-remote-server-using-vbscript.aspx"&gt;VBScript version&lt;/a&gt;. No need for shelling the command out and reading back the StdOut. This version reads much nicer:&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; System;
&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; System.Management;

&lt;span style="COLOR:blue;"&gt;namespace&lt;/span&gt; FX.Network.Utility
{
    &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; NetworkDiscovery
    {
        &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; NetworkDiscovery() { }

        &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;bool&lt;/span&gt; Ping(&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Target)
        {
            SelectQuery query &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; SelectQuery(&lt;span style="COLOR:#008080;"&gt;&amp;quot;Win32_PingStatus&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR:#008080;"&gt;&amp;quot;Address=&amp;#39;{0}&amp;#39;&amp;quot;&lt;/span&gt;, Target));
            ManagementObjectSearcher searcher &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; ManagementObjectSearcher(query);

            &lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (ManagementObject result &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; searcher.Get())
            {
                &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; (result[&lt;span style="COLOR:#008080;"&gt;&amp;quot;StatusCode&amp;quot;&lt;/span&gt;] !&lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; (0 == (UInt32)result[&lt;span style="COLOR:#008080;"&gt;&amp;quot;StatusCode&amp;quot;&lt;/span&gt;]));
            }
            &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;;
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39350" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/General/default.aspx">General</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/.NET+Extensions/default.aspx">.NET Extensions</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Ping a Remote Server Using VBScript</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/19/ping-a-remote-server-using-vbscript.aspx</link><pubDate>Mon, 19 May 2008 15:55:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39332</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39332</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39332</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/19/ping-a-remote-server-using-vbscript.aspx#comments</comments><description>&lt;p&gt;At times you might build a customization in the SalesLogix LAN client that relies on networked resources. For example, you might consume a web service or other resource that is available to LAN users and remote users via VPN. In this scenario, and many others like it, you have the potential to have remote users that do not currently have access to this networked resource. Even worse, you might have remote users that may not even be online at the time. A quick PING can check for availability.&lt;/p&gt;
&lt;p&gt;You can perform a PING by executing the PING command-line via the Shell. Here is a reusable function to do just this:&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt; Ping(Target)
&lt;span style="COLOR:blue;"&gt;Dim&lt;/span&gt; results

    On Error Resume &lt;span style="COLOR:blue;"&gt;Next&lt;/span&gt;

    &lt;span style="COLOR:blue;"&gt;Set&lt;/span&gt; shell &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; CreateObject(&amp;quot;WScript.Shell&amp;quot;)
    
    &lt;span style="COLOR:green;"&gt;&amp;#39; Send 1 echo request, waiting 2 seconds for result 
&lt;/span&gt;    &lt;span style="COLOR:blue;"&gt;Set&lt;/span&gt; exec &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; shell.Exec(&amp;quot;ping -n 1 -w 2000 &amp;quot; &amp;amp; Target)
    results &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; LCase(exec.StdOut.ReadAll)
    
    Ping &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; (InStr(results, &amp;quot;reply from&amp;quot;) &amp;gt; 0)
&lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Now to use that code you simply pass the IP address or hostname to the Ping function and check the boolean result&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;If&lt;/span&gt; Ping(&amp;quot;192.168.1.100&amp;quot;) &lt;span style="COLOR:blue;"&gt;Then&lt;/span&gt;
    &lt;span style="COLOR:green;"&gt;&amp;#39; Do something to access the resource
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;End&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;If&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;You can optionally adjust the number of times the ping request is sent and the timeout interval to wait for the result.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39332" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/General/default.aspx">General</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Client+Scripting/default.aspx">Client Scripting</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/VBScript/default.aspx">VBScript</category></item><item><title>RESTful Web Services Coming in SalesLogix 7.5</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/14/restful-web-services-coming-in-saleslogix-7-5.aspx</link><pubDate>Wed, 14 May 2008 15:38:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39316</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39316</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39316</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/14/restful-web-services-coming-in-saleslogix-7-5.aspx#comments</comments><description>&lt;p&gt;This week I&amp;#39;ve been in Washington DC attending the Sage Insights Business Partner conference. It&amp;#39;s been great meeting up with friends in the business partner community and the guys from Sage. There&amp;#39;s been a lot of discussion about things coming in the next release, version 7.5&amp;nbsp;(codenamed &amp;quot;Sahara&amp;quot;) and in the release beyond that (codenamed &amp;quot;Tanami&amp;quot;). The focus for SalesLogix is definitely shifting to web, not that the windows side is being neglected, but it reflects the shift in the industry to web-based applications, which I think is awesome. Of all the new details that have been shared about the Sahara release (See my &lt;a class="" href="http://customerfx.com/pages/saleslogix/2008/05/02/new-features-coming-in-saleslogix-7-5-quot-sahara-quot-release.aspx"&gt;previous post on new features coming in 7.5&lt;/a&gt;),&amp;nbsp;by far, one of the more exciting is the introduction of the RESTful web services layer.&lt;/p&gt;
&lt;p&gt;This is just huge and introduces a whole new level of capabilities for SalesLogix. For those who might not be familiar with REST (See &lt;a class="" href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank"&gt;Wikipedia&lt;/a&gt;), it basically comes down to URL addressable resources and simplifies the use of these resources while&amp;nbsp;taking the programmable web to the level of functionality contained within the browsable web - in a way that is far superior (IMO) to SOAP.&lt;/p&gt;
&lt;p&gt;OK. For SalesLogix, the REST services all use an SData protocol to define the structure of the URL for accessing resources. As an aside, the great thing is that this SData protocol is meant to eventually be common accross all Sage products, providing a unified way to integrate Sage applications. Maybe that&amp;#39;s a pipe dream, time will tell. I&amp;#39;m just thrilled to have it coming in SalesLogix. These services will be able to read data, such as groups, named &lt;a class="" href="http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html" target="_blank"&gt;NHibernate HQL queries&lt;/a&gt;, and even perform CRUD functions (&lt;strong&gt;CR&lt;/strong&gt;eate, &lt;strong&gt;U&lt;/strong&gt;pdate, &lt;strong&gt;D&lt;/strong&gt;elete)! Business rules won&amp;#39;t be accessible via the REST layer for the initial version, but the entity level eventing will. This is where the real power comes from. You&amp;#39;ll have a common place to implement business rules for entity events that is made available to any/all SalesLogix applications, addons, external applications, etc. BTW, these entity level events are available in this way due to a move to the provider level. The SalesLogix OLEDB Provider will raise entity level events, executing the code you&amp;#39;ve defined there - so these events will basically apply throughout SalesLogix. Woot!&lt;/p&gt;
&lt;p&gt;For data returning&amp;nbsp;RESTful GET&amp;nbsp;calls, the data can be returned in one of three formats:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;XML&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;JSON&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;ATOM (current default)&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;So what do these URL addressable resources look like? Well, for example, let&amp;#39;s say you want to return all accounts, your URL would look like the following:&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;http://&amp;lt;server:port&amp;gt;/sdata/slx/accounts&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;How about a specific account:&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;http://&amp;lt;server:port&amp;gt;/sdata/slx/accounts(AXXXX0000001)&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;List all contacts for a specific account:&lt;/p&gt;
&lt;p&gt;&lt;font color="#0000ff"&gt;http://&amp;lt;server:port&amp;gt;/sdata/slx/accounts(AXXXX0000001)/Contacts&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;You get the idea. The SData protocol/scheme is very well thought out and I could not be more pleased with how this has been implemented. It goes much deeper than what I&amp;#39;ve covered here, the ability to perform HQL queries via REST is so completely powerful. The fact that we&amp;#39;ll be able to perform basic CRUD operations as well was a &lt;strong&gt;VERY&lt;/strong&gt; welcome surprise. For sure, there will be much more to come from me on this subject in the future. &lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39316" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/New+Finds/default.aspx">New Finds</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/REST/default.aspx">REST</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Web+Services/default.aspx">Web Services</category></item><item><title>Account Hierarchy for SalesLogix 7.2 Web Released</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/09/account-hierarchy-for-saleslogix-7-2-web-released.aspx</link><pubDate>Fri, 09 May 2008 23:15:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39299</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39299</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39299</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/09/account-hierarchy-for-saleslogix-7-2-web-released.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve released a free addon for SalesLogix 7.2 Web for account relationships in the &lt;a class="" href="http://customerfx.com/labs/default.aspx"&gt;Customer FX Labs&lt;/a&gt;. The account hierarchy screens that exist in the SalesLogix Windows client is missing for the SalesLogix 7.2 Web Client. This bundle will bring this functionality into the web client. The addon works exactly the same as this functionality in the windows client. &lt;strong&gt;Full source included.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://customerfx.com/blogs/graduates/AccountHierarchy/AccountHierarchy.jpg" target="_blank"&gt;&lt;img src="http://customerfx.com/blogs/graduates/AccountHierarchy/th_AccountHierarchy.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;Click for larger view&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="" href="http://customerfx.com/pages/graduates/2008/05/08/account-hierarchy-for-saleslogix-web.aspx"&gt;&lt;font size="3"&gt;&lt;strong&gt;Download the Account Hierarchy bundle&amp;nbsp;for SalesLogix Web&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Download and enjoy!&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39299" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/New+Finds/default.aspx">New Finds</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SmartParts/default.aspx">SmartParts</category></item><item><title>Elegant SalesLogix Table ID Class in C#</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/07/elegant-saleslogix-table-id-class-in-c.aspx</link><pubDate>Wed, 07 May 2008 18:21:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39282</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39282</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39282</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/07/elegant-saleslogix-table-id-class-in-c.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve been using the following C# class for creating SalesLogix table ID values lately and I just love the elegant syntax it provides. It&amp;#39;s really been growing on me.&lt;/p&gt;
&lt;p&gt;Here is the class:&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; System;
&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; System.Data.OleDb;

&lt;span style="COLOR:blue;"&gt;namespace&lt;/span&gt; SalesLogix.Utility
{
    &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; TableID
    {
        &lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Empty;

        &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; TableID(&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; TableName)
        {
            &lt;span style="COLOR:blue;"&gt;switch&lt;/span&gt; (TableName.ToUpper())
            {
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;ATTACHMENT&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;FILEATTACH&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;USERNOTIFICATION&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;USERNOTIFY&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;AGENTS&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;HOSTTASK&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;RESOURCELIST&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;RESOURCE&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;USEROPTION&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;USERVIEW&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;JOINDATA&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;JOIN&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;PROCEDURES&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;PROCEDURE&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;SEC_FUNCTIONOWNER&amp;quot;&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;FUNCTIONHANDLER&amp;quot;&lt;/span&gt;; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                &lt;span style="COLOR:blue;"&gt;default&lt;/span&gt;: _table &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; TableName; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
            }
        }

        &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;override&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; ToString()
        {
            &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Value;
        }

        &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Value
        {
            &lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;
            {
                &lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; (OleDbConnection conn &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; OleDbConnection(Globals.ConnectionString))
                {
                    conn.Open();
                    &lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; (OleDbCommand cmd &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; OleDbCommand(&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR:#008080;"&gt;&amp;quot;slx_dbids(&amp;#39;{0}&amp;#39;, 1)&amp;quot;&lt;/span&gt;, _table), conn))
                    {
                        &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; cmd.ExecuteScalar().ToString();
                    }
                }
            }
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Nothing out of the ordinary there, but the really nice part comes from it&amp;#39;s usage:&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; ticketid &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; TableID(&lt;span style="COLOR:#008080;"&gt;&amp;quot;ticket&amp;quot;&lt;/span&gt;).Value;&lt;/pre&gt;
&lt;p&gt;I like it :-)&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39282" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Development/default.aspx">Development</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Provider/default.aspx">SalesLogix Provider</category></item><item><title>SalesLogix 7.2 Web on Vista</title><link>http://customerfx.com/pages/crmdeveloper/2008/05/02/saleslogix-7-2-web-on-vista.aspx</link><pubDate>Fri, 02 May 2008 19:59:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39258</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39258</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39258</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/05/02/saleslogix-7-2-web-on-vista.aspx#comments</comments><description>&lt;p&gt;In a recent conversation in the business partner newsgroups, it was brought to my attention by Mark Dykun that either due to changes from SalesLogix v7.2 SP2 or from Vista SP1 that the SalesLogix Web client will work on Vista (in&amp;nbsp;a limited capacity). It still won&amp;#39;t work on IIS7, but it will work when running through the ASP.NET Web Development Server. The Development Server is included with the .NET Framework 2.0 and works by running a small web server to host a local ASP.NET site for development or testing purposes, similar to Cassini. The last I tried this was with SalesLogix v 7.2.0 and it &lt;strong&gt;&lt;em&gt;definitely&lt;/em&gt;&lt;/strong&gt; didn&amp;#39;t work then. But it does now (huge hooray!).&lt;/p&gt;
&lt;p&gt;Mark followed this conversation up with a &lt;a class="" href="http://codesnap.wordpress.com/2008/05/02/saleslogix-web-on-vista/trackback/" target="_blank"&gt;post on his blog&lt;/a&gt; where he outlines how to create a batch file to launch the Development Web Server on the command-line and point to the deployed SalesLogix Web site. This is a great approach, however, I wanted to point out an alernative as well that is built right into the Application Architect. When you right click on a Portal in the Application Architect, you have a menu option available called &amp;quot;Test Portal&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/TestPortal.jpg"&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/TestPortal.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;That this option does is deploy the portal to a temporary location and then launches the site in the ASP.NET Development Web Server automatically. Both steps in one action. The complete steps that this Test Portal option does are as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Deploys the site to the following location:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;C:\ProgramData\Sage\Platform\WebPortal\Design\SlxClient_TEST&lt;/pre&gt;where &amp;quot;SlxClient&amp;quot; is the name of the Portal. BTW, this is the same location that the site will get copied to when you use the &amp;quot;Pre-Compile&amp;quot; option in the deployment. The AA will copy the site here, precompile it using the aspnet_compiler.exe in the .NET Framework and then deploy the compiled result to the actual deployment location (unless you have the &amp;quot;In-Place Compile&amp;quot; option checked)&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The AA will then launch the .NET Development Web Server pointed to that&amp;nbsp;location on port 8080. &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;A browser window will then automatically open pointing to the server running on port 8080. &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;So, you save the step of deploying, running your batch file, then launching the browser to that location. It does it all in one step, and best of all, right from within the Application Architect. You can also still open Visual Studio and point to the deployment directory (the &amp;quot;actual&amp;quot; deployment directory or to the &amp;quot;TEST&amp;quot; location where the files were copied to from the &amp;quot;Test Portal&amp;quot; option) and run the site from VS as well.&lt;/p&gt;
&lt;p&gt;Anyway, I was completely excited to find that this works now. I don&amp;#39;t know if it was a change in SP or Vista, but I don&amp;#39;t really care. I&amp;#39;m just excited to be able to test/develop a local site on Vista, even if it is in a limited capacity. It would be nice to be able to run the site right on IIS7, and that support will eventually come, but for now, this new find was much needed! Goes to show you have to keep trying the stuff that didn&amp;#39;t work before with each new version, because you&amp;#39;ll never know what sneaks it way in! A HUGE thanks for Mark for getting me to try it again.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39258" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/New+Finds/default.aspx">New Finds</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Application+Architect/default.aspx">Application Architect</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Vista/default.aspx">Vista</category></item><item><title>GetField Equaivalent for C# using Generics</title><link>http://customerfx.com/pages/crmdeveloper/2008/04/28/getfield-equaivalent-for-c-using-generics.aspx</link><pubDate>Mon, 28 Apr 2008 22:08:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39248</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39248</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39248</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/04/28/getfield-equaivalent-for-c-using-generics.aspx#comments</comments><description>&lt;p&gt;Many people who customize SalesLogix have become accustomed to using the built in &amp;quot;SLX Database Support&amp;quot; script to provide things like the quick and easy GetField function to return a single database value. If you&amp;#39;ve ventured into the .NET Extensions realm, you might want an easy equivalent. The following is a repost of something I posted around a year ago in the Sage Business Partner newsgroups:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;QUESTION:&lt;/strong&gt;&lt;br /&gt;&lt;em&gt;Does anyone have a generic GetField function for C# .Net? One that can handle N DataTypes, Nulls, DbNull, etc.? I am playing with the SLX VB script function, and it doesn&amp;#39;t adapt well to the strongly typed fields of C# .NET. Specifically the ExecuteScalar() blows up on 1) TheValue has no type 2) can&amp;#39;t handle nulls 3) can&amp;#39;t handle int....Any ideas or do I need specific GetFieldInt, GetFieldDateTime, GetFieldString stuff?&lt;/em&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is why we have generics! You could implement the GetField method as method that returns a generic type. That would be the best way to do it! Here&amp;#39;s a quick sample:&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; T GetField&amp;lt;T&amp;gt;(&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Field, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Table, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Where)
{
    &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; sql &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="COLOR:#008080;"&gt;&amp;quot;select {0} from {1} where {2}&amp;quot;&lt;/span&gt;, Field, Table, (Where.Equals(&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Empty) ? &lt;span style="COLOR:#008080;"&gt;&amp;quot;1=1&amp;quot;&lt;/span&gt; : Where));
 
    &lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; (OleDbConnection conn &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; OleDbConnection(SlxConnectionString))
    {
        conn.Open();
        &lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; (OleDbCommand cmd &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; OleDbCommand(sql, conn))
        {
            object fieldval &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; cmd.ExecuteScalar();
            &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; fieldval == DBNull.Value ? &lt;span style="COLOR:blue;"&gt;default&lt;/span&gt;(T) : (T)fieldval;
        }
    }
}&lt;/pre&gt;
&lt;p&gt;Now to use it, you&amp;#39;ll specify the type like this:&lt;/p&gt;&lt;pre&gt;&lt;span style="COLOR:green;"&gt;// for a string field
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; accname &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; GetField&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#008080;"&gt;&amp;quot;account&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#008080;"&gt;&amp;quot;account&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#008080;"&gt;&amp;quot;accountid = &amp;#39;&amp;quot;&lt;/span&gt; &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; accid &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;);
 
&lt;span style="COLOR:green;"&gt;// or for an int field
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;int&lt;/span&gt; numemp &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; GetField&amp;lt;&lt;span style="COLOR:blue;"&gt;int&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#008080;"&gt;&amp;quot;employees&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#008080;"&gt;&amp;quot;account&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#008080;"&gt;&amp;quot;accountid = &amp;#39;&amp;quot;&lt;/span&gt; &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; accid &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;);
 
&lt;span style="COLOR:green;"&gt;//or for a datetime field
&lt;/span&gt;DateTime createdon &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; GetField&amp;lt;&lt;span style="COLOR:blue;"&gt;DateTime&lt;/span&gt;&amp;gt;(&lt;span style="COLOR:#008080;"&gt;&amp;quot;createdate&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#008080;"&gt;&amp;quot;account&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:#008080;"&gt;&amp;quot;accountid = &amp;#39;&amp;quot;&lt;/span&gt; &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; accid &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; &lt;span style="COLOR:#008080;"&gt;&amp;quot;&amp;#39;&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;p&gt;Get the idea? How&amp;#39;s that for cool?! &lt;img src="http://customerfx.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39248" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/.NET+Extensions/default.aspx">.NET Extensions</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Generics/default.aspx">Generics</category></item><item><title>Creating Sections for Controls on SalesLogix Web QuickForms</title><link>http://customerfx.com/pages/crmdeveloper/2008/04/23/creating-sections-for-controls-on-saleslogix-web-quickforms.aspx</link><pubDate>Wed, 23 Apr 2008 17:50:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39192</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39192</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39192</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/04/23/creating-sections-for-controls-on-saleslogix-web-quickforms.aspx#comments</comments><description>&lt;p&gt;A common thing that any developer will do when creating a form for an application is to create sections for controls to group similar controls in a panel or other container, making it easy for the user to see that the values are related. There isn&amp;#39;t exactly support for creating these &amp;quot;sections&amp;quot; in the SalesLogix Web QuickForms. With a quick bit of tweaks we can easily&amp;nbsp;accomplish this result.&lt;/p&gt;
&lt;p&gt;A new control was introduced in 7.2.2 in the Application Architect. This new control is called a &amp;quot;Control Container&amp;quot;. This control is a non-visible container that&amp;nbsp;is most commonly&amp;nbsp;used to show or hide a group of controls at runtime on a QuickForm. If we look at what happens with this control when we build the web platform and deploy, we&amp;#39;ll see that it ends up as an &amp;lt;asp:Panel&amp;gt;. Not only that, it actually has a CssClass attribute set. Cool. What this means is that we can create a style for this panel to give it a visual border by just adding the style to one of the SalesLogix style sheets. The style class used is &amp;quot;controlslist&amp;quot;. This class is not currently defined in the 7.2.2 style sheets so we will add it ourselves in a bit. &lt;/p&gt;
&lt;p&gt;To start, open your QuickForm in the Application Architect and add a Control Container to it. Add your controls to the container. What I like to do is also add a Horizontal Separator above the Control Container and set a Caption for the Horizontal Separator as well so it looks like a header for my section. My form in AA will look like the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/slx722_section_AA.jpg" border="0" alt="" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I have my Horizontal Separator with a Caption of &amp;quot;Test Section&amp;quot; and a Control Container with 2 controls in it, a TextBox and a Button. Now, when I build and deploy the form, the Control Container will get created on the SmartPart as an &amp;lt;asp:Pane&amp;gt;, which at runtime will render as a &amp;lt;div&amp;gt;. Before deploying, we&amp;#39;ll still need to add our style attributes to give this a visual look. In the Portal, go to the Support Files\CSS and open &amp;quot;SlxBase.css&amp;quot;. Add to it the following:&lt;/p&gt;
&lt;p&gt;&lt;pre&gt;.controlslist
{
    border: solid 1px #B5CBE0;
    padding: 5px; 
    margin: 7px;
}&lt;/pre&gt;
&lt;p&gt;Now we can deploy the site and the end result will look like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/slx722_section_withheader.jpg" border="0" alt="" /&gt;&amp;nbsp;&lt;br /&gt;&lt;em&gt;(With Horizontal Separator above the Control Container)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/slx722_section.jpg" border="0" alt="" /&gt;&amp;nbsp;&lt;br /&gt;&lt;em&gt;(Without the Horizontal Separator)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;That is it. While that isn&amp;#39;t quite as nice as using a FIELDSET or other section with a heading, I think that turned out plenty nice. If you need more flexibility than that for creating visible sections, you&amp;#39;d have to resort to building it as a custom SmartPart, instead of as a QuickForm. Another downside to this approach is that you&amp;#39;ve defined the border for &lt;strong&gt;all&lt;/strong&gt; Control Containers. So, other Control Containers in the system will get this same look, whether you want it to have it or not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Edit&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I was thinking that it would be pretty easy to have this style and not have it apply to all Control Containers. A new property in 7.2.2 for most controls is one called StyleScheme. This property has been confusing for most since it has a drop-down and the only thing that appears in it is &amp;quot;NegativeNumber&amp;quot;. However, you *can* just type in a value there and the value will get rendered out as the CssClass. If the selected control already renders a CssClass value then yours will get add to it (like this CssClass=&amp;quot;controlslist MyCustomStyleClass&amp;quot;, so both will still apply. For our solution, we could add the style class to SlxBase.css for &amp;quot;ControlSection&amp;quot; instead of &amp;quot;controlslist&amp;quot;. Then, for any Control Containers we want to have this look we could just enter &amp;quot;ControlSection&amp;quot; in the Control Container&amp;#39;s StyleScheme property. Then only those with this StyleScheme will have the &amp;quot;bordered&amp;quot; look to it instead of all Control Containers.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39192" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Application+Architect/default.aspx">Application Architect</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Quick+Forms/default.aspx">Quick Forms</category></item><item><title>Adding a Parent Lookup to the AccountDetails Form in SalesLogix Web</title><link>http://customerfx.com/pages/crmdeveloper/2008/04/21/adding-a-parent-lookup-to-the-accountdetails-form-in-saleslogix-web.aspx</link><pubDate>Mon, 21 Apr 2008 17:25:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39180</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39180</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39180</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/04/21/adding-a-parent-lookup-to-the-accountdetails-form-in-saleslogix-web.aspx#comments</comments><description>&lt;p&gt;&lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2007/12/19/Customizing-SalesLogix-7.2-Web-and-Missing-Client-Functionality.aspx"&gt;I posted&lt;/a&gt; a while back about creating missing client functionality in the SalesLogix Web Client. In &lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2007/12/19/Customizing-SalesLogix-7.2-Web-and-Missing-Client-Functionality.aspx"&gt;that post&lt;/a&gt;, I shared a screenshot of a custom &amp;quot;Account Hierarchy&amp;quot; screen I built for the SalesLogix Web Client. I&amp;#39;ll be sharing that screen in the &lt;a class="" href="http://customerfx.com/labs/default.aspx"&gt;Customer FX Labs&lt;/a&gt; in the future. For now, I&amp;#39;ll cover how to add the lookup for &amp;quot;Parent Account&amp;quot; on the Account Details form.&lt;/p&gt;
&lt;p&gt;To add the Account Parent Lookup to the AccountDetails form, add the Lookup and then set the following properties:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Caption&lt;/strong&gt; = &amp;quot;Parent:&amp;quot;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Allow Clearing Result&lt;/strong&gt; = True&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;DataBindings&lt;/strong&gt; = Map ParentId to LookupResultValue&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Lookup Entity Name&lt;/strong&gt; = Account&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Lookup Binding Mode&lt;/strong&gt; = String&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Return Primary Key&lt;/strong&gt; = True&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Enable Hyperlinking&lt;/strong&gt; = True&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;LookupProperties&lt;/strong&gt; = Select the columns you want available in the Lookup&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;The result will look like this (after building the web platform and redeploying):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/AccountParent.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;For these steps I am linking it as a string instead of using a relationship for an object property. I wanted to avoid the circular relationship from account back to account. Stay tuned for my Account Hierarchy Form to be available soon in the &lt;a class="" href="http://customerfx.com/labs/default.aspx"&gt;Customer FX Labs&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39180" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category></item><item><title>Displaying the Primary Contact on the Account Detail Form Revisited and Custom Properties in 7.2.2</title><link>http://customerfx.com/pages/crmdeveloper/2008/04/18/displaying-the-primary-contact-on-the-account-detail-form-revisited-and-custom-properties-in-7-2-2.aspx</link><pubDate>Fri, 18 Apr 2008 20:29:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39178</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39178</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39178</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/04/18/displaying-the-primary-contact-on-the-account-detail-form-revisited-and-custom-properties-in-7-2-2.aspx#comments</comments><description>&lt;p&gt;&lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2008/01/08/Custom-Entity-Properties-and-Displaying-the-Primary-Contact-on-the-Account-Detail-Form.aspx"&gt;I posted before&lt;/a&gt; about adding the primary contact to the Account Details form in the SalesLogix 7.2 Web Client. This solution made use of &amp;quot;Custom Properties&amp;quot; which was a feature available in 7.2.1. However, since that time, a change was introduced to how custom properties are built in 7.2.2 and later. Custom Properties are no longer available (although custom properties built prior to 7.2.2 will still work when you upgrade without change). &lt;/p&gt;
&lt;p&gt;Let&amp;#39;s take a look at how this changes things using the same example as before (placing the account&amp;#39;s primary contact on the account details form). As I mentioned, Custom Properties are gone. We now have &amp;quot;Code Snippet Properties&amp;quot;. The major difference between a 7.2.1 Custom Property and a 7.2.2 Code Snippet Property is that a Code Snippet Property is the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Code Snippet Properties are read-only. That is, they have a getter only, no setter.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The code in a Code Snippet property is no longer exactly a part of the entity. This measn that before, you could reference properties/methods of the entity using &amp;quot;this&amp;quot;, while now, you are passed in a reference of the entity as a parameter.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The implementation of the&amp;nbsp;actual code for the Code Snippet Property is a void method. That&amp;#39;s right. It doesn&amp;#39;t actually &amp;quot;return&amp;quot; anything. Instead, there is an out parameter (of type &amp;quot;object&amp;quot;) that you set as the return value.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;While the implementation code is a void method with an out param for the result, you still use it as a property. There is a property that will wrap the method and allow you to use it like a property. This allows you to still easily bind it.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;All of this change was mainly to separate the code for the property from the entity itself, allowing the implementation code to be in C# or VB.NET, whereas before you could only use C# (which was fine with me, hehe).&lt;/p&gt;
&lt;p&gt;Anyway, to create the &amp;quot;PrimaryContact&amp;quot; property, there are only small changes we&amp;#39;ll need to make. First of all, right-click on the Account entity Properties folder and select &amp;quot;New Code Snippet Property&amp;quot;. You&amp;#39;ll get the following:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/Property-PrimaryContact.jpg" border="0" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;You&amp;#39;ll want to set the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Property Name&lt;/strong&gt;: PrimaryContact&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Return Type&lt;/strong&gt;: Sage.Entity.Interfaces.IContact (just like before, you&amp;#39;ll have to just type this in. It won&amp;#39;t appear in the drop-down list)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Click Add&lt;/strong&gt;. This will create the step&amp;#39;s snippet stub&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;Click Edit Code Snippet&lt;/strong&gt;. This will bring up the code window&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Now enter in the following code:&lt;br /&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;namespace&lt;/span&gt; Sage.BusinessRules.CodeSnippets
{
    &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; partial &lt;span style="COLOR:blue;"&gt;class&lt;/span&gt; AccountBusinessRules
    {
        &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; GetPrimaryContactStep1(IAccount account, out Sage.Entity.Interfaces.IContact result)
        {
            Sage.Entity.Interfaces.IContact primarycontact &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;
            &lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt; (IContact contact &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; account.Contacts)
            {
                &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (contact.IsPrimary.HasValue &amp;amp;&amp;amp; contact.IsPrimary.Value)
                {
                    primarycontact &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; contact;
                    &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;
                }
            }
            result &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; primarycontact;
        }
    }
}&lt;/pre&gt;
&lt;p&gt;You&amp;#39;ll notice that the current account reference is passed in as a parameter to the method and that you&amp;#39;ll set the out param as the return value. That is it. Build the interfaces and then you can add it to the Account Details form just like I had posted earlier (&lt;a class="" href="http://customerfx.com/pages/crmdeveloper/2008/01/08/Custom-Entity-Properties-and-Displaying-the-Primary-Contact-on-the-Account-Detail-Form.aspx"&gt;see previous post&lt;/a&gt;).&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=39178" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/New+Finds/default.aspx">New Finds</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Web/default.aspx">SalesLogix Web</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Entity+Model/default.aspx">Entity Model</category></item><item><title>SalesLogixBlog.com is now CRM Developer on the new customerfx.com</title><link>http://customerfx.com/pages/crmdeveloper/2008/04/09/saleslogixblog-com-is-now-crm-developer-on-the-new-customerfx-com.aspx</link><pubDate>Thu, 10 Apr 2008 00:22:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:39044</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=39044</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=39044</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2008/04/09/saleslogixblog-com-is-now-crm-developer-on-the-new-customerfx-com.aspx#comments</comments><description>&lt;p&gt;Over the past several years I&amp;#39;ve maintained a SalesLogix related weblog at SalesLogixBlog.com. This blog has now moved to a new URL and a new perspective. SalesLogixBlog.com can now be located on the new Customer FX 3.0 website at &lt;a href="http://customerfx.com/crmdeveloper"&gt;http://customerfx.com/crmdeveloper&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;You&amp;#39;ll still be able to expect the same sort of content on the blog. The intent of the move is mainly to align the blog with 