<?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>Ryan Farley&amp;#39;s Blog</title><link>http://customerfx.com/pages/crmdeveloper/default.aspx</link><description>Ryan Farley on .NET Development with a focus on CRM Development for SalesLogix</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP2 (Build: 20611.960)</generator><item><title>A Deeper Look at Adding Custom Fields in SalesLogix Mobile</title><link>http://customerfx.com/pages/crmdeveloper/2013/05/07/a-deeper-look-at-adding-custom-fields-in-saleslogix-mobile.aspx</link><pubDate>Tue, 07 May 2013 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46172</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=46172</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46172</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/05/07/a-deeper-look-at-adding-custom-fields-in-saleslogix-mobile.aspx#comments</comments><description>&lt;p&gt;We looked previously at &lt;a href="http://customerfx.com/pages/crmdeveloper/2013/04/09/adding-custom-fields-to-saleslogix-mobile.aspx"&gt;adding custom fields&lt;/a&gt; to the SalesLogix Mobile client. It was easy enough to do, but as I&amp;#39;ve mentioned before, one of the hardest parts about customizing the mobile product is that you have to know what to type. Let&amp;#39;s take a look at just what&amp;#39;s available when adding custom fields in an&amp;nbsp;customization module&amp;nbsp;so you&amp;#39;ll have all the knowledge you need.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Background&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When we looked at &lt;a href="http://customerfx.com/pages/crmdeveloper/2013/04/09/adding-custom-fields-to-saleslogix-mobile.aspx"&gt;adding custom fields to the mobile client&lt;/a&gt; previously, we used a &amp;quot;registerCustomization&amp;quot; function and passed in some values. We didn&amp;#39;t really discuss in that post how to know what parameter values are available to pass into this function. That can make it hard to know exactly what to type and what you can and can&amp;#39;t do there. We&amp;#39;re going to examine every part of that statement so you understand how it works, what&amp;#39;s available, and where to look to figure all this out for yourself.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The registerCustomization Function&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The registerCustomization function is implemented in the &lt;a href="https://github.com/Sage/argos-sdk/blob/master/src/Application.js" target="_blank"&gt;Application.js&lt;/a&gt; file in the Argos-SDK. Well, what you&amp;#39;re actually using in your ApplicationModule is the registerCustomization function in the &lt;a href="https://github.com/Sage/argos-sdk/blob/master/src/ApplicationModule.js" target="_blank"&gt;ApplicationModule.js&lt;/a&gt;&amp;nbsp;in the Argos-SDK, which is the base&amp;nbsp;code your own custom ApplicationModule extends, but the function there only passes the details along to registerCustomization in the Application.js, so the ApplicationModule base code doesn&amp;#39;t really do any of the work. Why is this important? Because you can look at the code in the Argos-SDK to find out everything you need to know about using this function to add custom fields. The fact that you have all the source code available to you is helpful. So use it. In a sense, it&amp;#39;s like some additional documentation (although source code doesn&amp;#39;t really count for as much as real documentation, but at least it&amp;#39;s something). Let&amp;#39;s look in the &lt;a href="https://github.com/Sage/argos-sdk/blob/master/src/Application.js" target="_blank"&gt;Application.js&lt;/a&gt; file (located in the argos-sdk\src folder)&amp;nbsp;to see what the registerCustomization function does. The most useful thing you&amp;#39;ll find there is the comment preceding the function itself. It says the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Registers a customization to a target path.&lt;/p&gt;
&lt;p&gt;A Customization Spec is a special object with the following keys:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;at&amp;quot;: &amp;quot;function(item)` - passes the current item in the list, the function should return true if this is the item being modified (or is at where you want to insert something).&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;at&amp;quot;: &amp;quot;{Number}&amp;quot; - May optionally define the index of the item instead of a function.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;type&amp;quot;: &amp;quot;{String}&amp;quot; - enum of &amp;quot;insert&amp;quot;, &amp;quot;modify&amp;quot;, &amp;quot;replace&amp;quot; or &amp;quot;remove&amp;quot; that indicates the type of customization.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;where&amp;quot;: &amp;quot;{String}&amp;quot; - enum of &amp;quot;before&amp;quot; or &amp;quot;after&amp;quot; only needed when type is &amp;quot;insert&amp;quot;.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;value&amp;quot;: &amp;quot;{Object}&amp;quot; - the entire object to create (insert or replace) or the values to overwrite (modify), not needed for remove.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;value&amp;quot;: &amp;quot;{Object[]}&amp;quot; - if inserting you may pass an array of items to create.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Note: This also accepts the legacy signature: &amp;quot;registerCustomization(path, id, spec)&amp;quot; Where the path is &amp;quot;list/tools&amp;quot; and &amp;quot;id&amp;quot; is the view id&lt;/p&gt;
&lt;p&gt;All customizations are registered to &amp;quot;this.customizations[path]&amp;quot;.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;@param {String} path The customization set such as &amp;quot;list/tools#account_list&amp;quot; or &amp;quot;detail#contact_detail&amp;quot;. First half being the type of customization and the second the view id.&lt;br /&gt;@param {Object} spec The customization specification&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, here&amp;#39;s what we know so far about what you pass to registerCustomization:&lt;/p&gt;
&lt;p&gt;It can take either 2 or&amp;nbsp;3 parameters (we can tell this by looking at the function signatures in Application.js and ApplicationModule.js, as well as the comment):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;path: A path is in the form of something like &amp;quot;edit#account_edit&amp;quot;. Alternatively, you can pass these separately as &amp;quot;edit&amp;quot;, &amp;quot;account_edit&amp;quot;.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;spec: The &amp;quot;spec&amp;quot; is the set of parameters that define the customization we&amp;#39;re adding. We&amp;#39;ll&amp;nbsp;outline these parameters next.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The Customization&amp;nbsp;Specification&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The customization specification, or &amp;quot;spec&amp;quot; is what describes the &lt;strong&gt;&lt;em&gt;WHAT YOU ARE DOING &lt;/em&gt;&lt;/strong&gt;part of the customization. &lt;em&gt;&amp;quot;I&amp;nbsp;want to add a customization here&amp;quot;&lt;/em&gt;. The spec parameter options are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;&amp;quot;at&amp;quot;&lt;/strong&gt; which describes where you want the customization. This can be an index, but usually is a function that evaluates to true when for the row you want to look for. This function is passed the current row item. As the view is built and as&amp;nbsp;each row is created, the row item is passed to this function. You can then check properties of that row, usually the row.name to see if it&amp;#39;s the one you want. So, if this function evaluates to true, then it looks at the &amp;quot;type&amp;quot; and &amp;quot;where&amp;quot; parameters to see what to do next.&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;&amp;quot;type&amp;quot;&lt;/strong&gt; which is the type of customization. This indicates what action to take when the &amp;quot;at&amp;quot; evaluates to true. So, when the &amp;quot;at&amp;quot; function finds the right row, this tells it what to do. The choices are:&lt;/div&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;insert&amp;quot;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;modify&amp;quot;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;remove&amp;quot;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;&amp;quot;where&amp;quot;&lt;/strong&gt; only applies if the &amp;quot;type&amp;quot; is an insert. If we&amp;#39;re inserting a new element, do we want it before of after the located row in the &amp;quot;at&amp;quot; param. Obviously, the choices are:&lt;/div&gt;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;before&amp;quot;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;quot;after&amp;quot;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;li&gt;
&lt;div&gt;&lt;strong&gt;&amp;quot;value&amp;quot;&lt;/strong&gt; is the parameter that contains what you&amp;#39;re customization contains. This is the actual &amp;quot;customization&amp;quot;. All the properties to set for the customization are wrapped up in this object.&amp;nbsp;Optionally, you can pass an array of values, meaning an array of customizations, you&amp;#39;re adding. This parameter is the most important part. However, this sort of looks like a black hole. How do we know what choices are available? Let&amp;#39;s look at that next.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;All in all, we&amp;#39;ll end up with something that looks like this. This sample, adds a customization to the account_detail view:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;detail&amp;#39;, &amp;#39;account_detail&amp;#39;, {
    at: function (row) { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; row.name == &amp;#39;LeadSource.Description&amp;#39;; },
    type: &amp;#39;insert&amp;#39;,
    where: &amp;#39;after&amp;#39;,
    value: {
        name: &amp;#39;NewField1&amp;#39;,
        property: &amp;#39;NewField1&amp;#39;,
        label: &amp;#39;new field 1&amp;#39;
    }
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The basic structure is:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;[&lt;span style="COLOR:blue;"&gt;set&lt;/span&gt;]&amp;#39;, &amp;#39;[view id]&amp;#39;, {
    [spec parameters], &lt;span style="COLOR:green;"&gt;// WHAT YOU ARE &lt;em&gt;&lt;strong&gt;DOING&lt;/strong&gt;&lt;/em&gt;
&lt;/span&gt;    value: {
        [value parameters] &lt;span style="COLOR:green;"&gt;// WHAT YOU ARE &lt;strong&gt;&lt;em&gt;ADDING&lt;/em&gt;&lt;/strong&gt;
&lt;/span&gt;    }
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;OK, let&amp;#39;s move on and see what choices there are for the value (or customization) object.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The Customization Object (The Values)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The customization values is the&amp;nbsp;set of properties and values that describe the &lt;strong&gt;&lt;em&gt;WHAT YOU ARE ADDING&lt;/em&gt;&lt;/strong&gt; for the customization. This is the important part. This is what you actually want added to the view. The spec above outlines the what you are doing, &amp;quot;I want to add a customization here&amp;quot;, and the values object outlines what you&amp;#39;re actually adding.&lt;/p&gt;
&lt;p&gt;So, how do we know what is available for this set of values? What are the available properties for this? Well, we have to think for a minute about &lt;em&gt;*what*&lt;/em&gt; exactly we are adding. We&amp;#39;re adding a text value, or a picklist, or a lookup, or &lt;em&gt;something&lt;/em&gt;. In short, we&amp;#39;re adding a field. It just so happens that there is a defined base &amp;quot;field&amp;quot; in the Argos-SDK (the actual object is named &amp;quot;_Field&amp;quot;). All fields start from this base field object. There&amp;#39;s also a specific field&amp;nbsp;object for each of the different field types. For example, the &amp;quot;_Field&amp;quot; object is extended by the implementation for a picklist. The reason this is important to understand is because looking at the implementation for these field types will show up what the available properties are. What we&amp;#39;re actually setting in this values object that we pass to registerCustomization is a set of the properties for this field.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s start by opening up the &lt;a href="https://github.com/Sage/argos-sdk/blob/master/src/Fields/_Field.js" target="_blank"&gt;_Field.js&lt;/a&gt; file (located in the argos-sdk\src\fields folder). This is the base type for any field. We can scroll through that and see the available properties. These are some of the properties we can set for our values object for our customization. We can see properties such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;owner&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;disabled&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;hidden&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;&amp;#39;default&amp;#39; (to set a default value&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;name&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;label&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;property (the SData property to bind to)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;type&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;validate&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;clearValue()&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;setValue()&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;and so on...&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Luckily, these properties all have comments with them that describe what each of the properties &amp;amp; functions are for. Next, we can look at the implementation of the specific field type we&amp;#39;re adding. For example, open the &lt;a href="https://github.com/Sage/argos-sdk/blob/master/src/Fields/LookupField.js" target="_blank"&gt;LookupField.js&lt;/a&gt; (located in the argos-sdk\src\fields folder). We can look through this and see even more properties we can set if the customization is adding a lookup field. There are properties such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div&gt;widgetTemplate (if we want to define a new look for the control)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;dependentErrorText&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;emptyText&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;completeText&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;cancelText&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;lookupText&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;view&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;keyProperty&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;textProperty&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;valueKeyProperty&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;valueTextProperty&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;requireSelection&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;resourceKind&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;where&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;orderBy&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;to list only some of the available properties...&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Now we&amp;#39;re getting a more complete picture of what the available choices are for our values object. Sweet.&lt;/p&gt;
&lt;p&gt;We can see even more field types (the SalesLogix specific ones) implemented in the argos-saleslogix\src\fields folder. We can see the picklist, address, name fields, etc. We can open those just the same to see what&amp;#39;s available and even better, we can override the default behavior easily as well and provide our own implementation for this. For example, a common request is how to customize the name parts dialog, or the address dialog. It couldn&amp;#39;t be easier in mobile. The template for these are located in these files and you can provide your own template for them by just setting the property with the new template (we&amp;#39;ll look at templates later on in a future article).&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Conclusion&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I guess the point I am trying to make with all of this, besides trying to outline exactly what you&amp;#39;re doing when you add registerCustomization in an ApplicationModule, is to point out that while there isn&amp;#39;t tons of documentation for the mobile platform, we can learn just about everything we need by looking at the source code. Good luck.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46172" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Argos-SDK/default.aspx">Argos-SDK</category></item><item><title>Consuming Data from External Applications in SalesLogix Mobile Customizations</title><link>http://customerfx.com/pages/crmdeveloper/2013/04/30/consuming-data-from-external-applications-in-salesLogix-mobile-customizations.aspx</link><pubDate>Tue, 30 Apr 2013 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46171</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=46171</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46171</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/04/30/consuming-data-from-external-applications-in-salesLogix-mobile-customizations.aspx#comments</comments><description>&lt;p&gt;The SalesLogix Mobile client is more customizable than you might think. It&amp;#39;s easy to assume that the new architecture isn&amp;#39;t as customizable as you might be used to with SalesLogix Web or LAN clients. However, it does sometimes take some rethinking. In this article we&amp;#39;ll look at how to add a customization that pulls in data from the Twitter API and displays on the contact detail. We&amp;#39;ll delay the loading of the data so that the contact detail will display quickly and bring in the data from Twitter when it is received.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Background&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For this customization what we&amp;#39;ll be doing is adding code to pull in a contact&amp;#39;s last tweet from the Twitter API and displaying it on the contact detail screen in SalesLogix Mobile. While there are a few different ways we could be doing this (for example, we could do this on the server using a custom code property on the entity), we&amp;#39;ll be letting the contact data load normally, and we&amp;#39;ll delay the loading of the data from Twitter until after the contact data has loaded. On the detail screen we&amp;#39;ll see the last tweet, however on the edit screen we&amp;#39;ll see a textbox allowing the user to add a contact&amp;#39;s twitter name. In my test system I&amp;nbsp;have already created a contact property called TwitterName and have redeployed my SData portal so the TwitterName property is in the contact SData feeds.&lt;/p&gt;
&lt;p&gt;What exactly do I mean by &amp;quot;delay loading&amp;quot;? What I mean is that instead of going out to Twitter and getting the last tweet while the contact detail is loading, we let the contact detail screen load normally, and then we asynchronously go get the last tweet and update the UI once it is received. Doing things this way will allow the contact screen to load quickly and not be slowed down by whatever slowness the Twitter API might be experiencing at the moment. Also, note that the point of this example isn&amp;#39;t to demonstrate how to grab data from Twitter, or the best way to do that, but to show how to go grab data from any other system using this technique. This could be used with getting something from an external support system, accounting system, or whatever.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Adding the Basic Customization&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First, what we&amp;#39;ll need to do is add the basic customization. Meaning, we&amp;#39;ll add the TwitterName property to the query used for the detail and edit screens and also add the UI control elements. If you&amp;#39;ve been following the previous posts in this series, you should already know how to do this:&lt;/p&gt;
&lt;p&gt;See &lt;a href="http://customerfx.com/pages/crmdeveloper/2013/04/09/adding-custom-fields-to-saleslogix-mobile.aspx"&gt;Adding Custom Fields to SalesLogix Mobile&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#39;s the code for adding the TwitterName to the queries for the edit and detail screens as well as the UI element for the detail and edit screens. Note, that for the UI element on the detail screen, we&amp;#39;re not actually binding the property to it. Instead we&amp;#39;re just adding a &amp;quot;loading&amp;quot; message and icon (we&amp;#39;ll have code that adds the result from the Twitter API to that element later):&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:green;"&gt;// Add TwitterName to the query for the detail view            
&lt;/span&gt;dojo.extend(Mobile.SalesLogix.Views.Contact.Detail, {
    querySelect: Mobile.SalesLogix.Views.Contact.Detail.prototype.querySelect.concat([
        &amp;#39;TwitterName&amp;#39;
    ])
});

&lt;span style="COLOR:green;"&gt;// Add TwitterName UI element (note, we&amp;#39;re only adding the &amp;quot;loading&amp;quot; message here
// The data will be loaded in later when recieved from the Twitter API
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;detail&amp;#39;, &amp;#39;contact_detail&amp;#39;, {
    at: function (row) { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; row.name == &amp;#39;CuisinePreference&amp;#39;; },
    type: &amp;#39;insert&amp;#39;,
    where: &amp;#39;after&amp;#39;,
    value: {
        name: &amp;#39;TwitterName&amp;#39;,
        label: &amp;#39;twitter&amp;#39;,
        property: &amp;#39;TwitterName&amp;#39;,
        cls: &amp;#39;content-loading&amp;#39;, &lt;span style="COLOR:green;"&gt;// add &amp;quot;loading&amp;quot; icon
&lt;/span&gt;        value: &amp;#39;loading...&amp;#39;     &lt;span style="COLOR:green;"&gt;// add &amp;quot;loading&amp;quot; message
&lt;/span&gt;    }
});

&lt;span style="COLOR:green;"&gt;// Add TwitterName to the query for the edit view
&lt;/span&gt;dojo.extend(Mobile.SalesLogix.Views.Contact.Edit, {
    querySelect: Mobile.SalesLogix.Views.Contact.Edit.prototype.querySelect.concat([
        &amp;#39;TwitterName&amp;#39;
    ])
});

&lt;span style="COLOR:green;"&gt;// Add TwitterName UI element to the edit view so the user can add a contact&amp;#39;s 
// twitter name
&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;edit&amp;#39;, &amp;#39;contact_edit&amp;#39;, {
    at: function (row) { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; row.name == &amp;#39;CuisinePreference&amp;#39;; },
    type: &amp;#39;insert&amp;#39;,
    where: &amp;#39;after&amp;#39;,
    value: {
        name: &amp;#39;TwitterName&amp;#39;,
        property: &amp;#39;TwitterName&amp;#39;,
        label: &amp;#39;twitter&amp;#39;,
        type: &amp;#39;text&amp;#39;
    }
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;For the UI element for the detail view, we&amp;#39;re not displaying the TwitterName property itself (yet). Instead we&amp;#39;re just displaying the &amp;quot;loading&amp;quot; message. We still need the TwitterName in the querySelect for the detail screen. Later, we&amp;#39;ll be adding code that gets this from the bound SData entity so we&amp;#39;ll need it to exist in the SData entity for the view. If we took at look at things right now, the screen would look like this on the detail screen:&lt;/p&gt;
&lt;p&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Mobile_LastTweet_Loading.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;When we&amp;#39;re done, this &amp;quot;loading&amp;quot; message will display until our request comes back from Twitter - at that point we&amp;#39;ll clear this loading message and replace it with the data returned. It would look like this on the edit screen:&lt;/p&gt;
&lt;p&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Mobile_LastTweet_Edit.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;What we need to do now is add some code that goes out to grab the last tweet from the Twitter API and load it into the UI element when it comes back.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Delay Loading the Last Tweet from Twitter&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To be able to pull in the last tweet into the UI element we created, we&amp;#39;ll need to extend a method in the base code for the detail screen.&amp;nbsp;To open and view the&amp;nbsp;base code for the detail screen, go to the argos-sdk\src folder and open the Detail.js file. Scrolling through that code, we&amp;#39;ll find the following method:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:green;"&gt;/**
 * Saves the SData response to `this.entry` and invokes {@link #processLayout processLayout} by passing the customized
 * layout definition. If no entry is provided, empty the screen.
 * @param {Object} entry SData response
 */&lt;/span&gt;
processEntry: function(entry) {
    &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.entry &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; entry;

    &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.entry)
    {
        &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.processLayout(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;._createCustomizedLayout(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.createLayout()), &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.entry);
    }
    &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt;
    {
        &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.&lt;span style="COLOR:blue;"&gt;set&lt;/span&gt;(&amp;#39;detailContent&amp;#39;, &amp;#39;&amp;#39;);
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;From the comment, we can understand that this method receives the bound SData entity and then loads the data&amp;nbsp;onto the screen. This will be perfect for us to use this and asynchronously load the last tweet from Twitter. We&amp;#39;re not going to edit this file directly. That wouldn&amp;#39;t be a good idea since this code is the base for all detail screens, not just the contact one. Instead, we&amp;#39;re going to extend this function in our ApplicationModule.&lt;/p&gt;
&lt;p&gt;To extend this function our code will look similar to how we extend the querySelect on the base contact view. However, instead of extending the querySelect, we&amp;#39;ll be extending the processEntry function. The most important part of this is that we pass everything back to the base code so the view can be loaded normally as well. If we neglect this part our code will execute but the rest of the code in the base Detail.js won&amp;#39;t so none of the UI elements will be added to the view. The empty function would look like this when we add it to our ApplicationModule:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;dojo.extend(Mobile.SalesLogix.Views.Contact.Detail, {
    processEntry: function(entry) {
        &lt;span style="COLOR:green;"&gt;// you MUST pass everything back to base class so it can continue
&lt;/span&gt;        &lt;span style="COLOR:green;"&gt;// loading the view
&lt;/span&gt;        Mobile.SalesLogix.Views.Contact.Detail.superclass.processEntry.apply(this, arguments);
        

        &lt;span style="COLOR:green;"&gt;// WE WILL ADD THE REST OF OUR CODE HERE
&lt;/span&gt;
    }
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Notice the line:&lt;/p&gt;&lt;pre&gt;Mobile.SalesLogix.Views.Contact.Detail.superclass.processEntry.apply(this, arguments);&lt;/pre&gt;
&lt;p&gt;This line is what passes things back to the base processEntry code, applying the arguments (meaning the SData entity) to it and allowing it to proceed normally. This line is important. &lt;/p&gt;
&lt;p&gt;Before we add the rest of the code, we&amp;#39;ll need to make some other parts of dojo available. Specifically, we&amp;#39;ll need to use &amp;quot;dojo/dom-class&amp;quot; and &amp;quot;dojo/query&amp;quot; available to us so we can find and manipulate the UI element to update the value received from Twitter. To do this, we just need to change the header or declaration of our ApplicationModule. Right now the first few lines of our Application Module looks like this (my product name is &amp;quot;Custom&amp;quot;):&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;define(&amp;#39;Mobile/Custom/ApplicationModule&amp;#39;, [
    &amp;#39;Sage/Platform/Mobile/ApplicationModule&amp;#39;
], function () {
    &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; dojo.declare(&amp;#39;Mobile.Custom.ApplicationModule&amp;#39;, Sage.Platform.Mobile.ApplicationModule, {
        loadCustomizations: function () {
            &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.inherited(arguments);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;We&amp;#39;ll use dojo&amp;#39;s AMD loading to bring in these dependencies and change those lines to look like this:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;define(&amp;#39;Mobile/Custom/ApplicationModule&amp;#39;, [
    &amp;#39;Sage/Platform/Mobile/ApplicationModule&amp;#39;,
    &amp;#39;dojo/dom-&lt;span style="COLOR:blue;"&gt;class&lt;/span&gt;&amp;#39;,
    &amp;#39;dojo/query&amp;#39;
], function (
    ApplicationModule,
    domClass,
    query
) {
    &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; dojo.declare(&amp;#39;Mobile.Custom.ApplicationModule&amp;#39;, Sage.Platform.Mobile.ApplicationModule, {
        loadCustomizations: function () {
            &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.inherited(arguments);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;I&amp;#39;ll cover more on dojo&amp;#39;s AMD loading and mixins in a future post, but for now you can read more&amp;nbsp;on the &lt;a href="http://dojotoolkit.org/blog/learn-more-about-amd" target="_blank"&gt;dojotoolkit.org blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, let&amp;#39;s add the code that does all the work of going out to the Twitter API and getting the last tweet for this contact:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;dojo.extend(Mobile.SalesLogix.Views.Contact.Detail, {
    processEntry: function(entry) {
        &lt;span style="COLOR:green;"&gt;// you MUST pass everything back to base class so it can continue
&lt;/span&gt;        &lt;span style="COLOR:green;"&gt;// loading the view
&lt;/span&gt;        Mobile.SalesLogix.Views.Contact.Detail.superclass.processEntry.apply(this, arguments);
        
        &lt;span style="COLOR:green;"&gt;// get the TwitterName property from the bound SData contact entity
&lt;/span&gt;        &lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; twitterName &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; entry[&amp;#39;TwitterName&amp;#39;];

        &lt;span style="COLOR:green;"&gt;// locate the TwitterName row
&lt;/span&gt;        &lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; rowNode &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; query(&amp;#39;[data-property=&amp;quot;TwitterName&amp;quot;]&amp;#39;, &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.domNode)[0],
            contentNode &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; rowNode &amp;amp;&amp;amp; query(&amp;#39;span&amp;#39;, rowNode)[0];

        &lt;span style="COLOR:green;"&gt;// remove the &amp;quot;loading&amp;quot; message
&lt;/span&gt;        &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (rowNode)
            domClass.remove(rowNode, &amp;#39;content-loading&amp;#39;);

        &lt;span style="COLOR:green;"&gt;// exit if the contact does not have a twitter name
&lt;/span&gt;        &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (twitterName == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;) {
            contentNode.innerHTML &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &amp;#39;&amp;#39;;
            &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;
        }
        
        &lt;span style="COLOR:green;"&gt;// now we&amp;#39;ll go get the last tweet from twitter
&lt;/span&gt;        dojo.require(&amp;quot;dojo.io.script&amp;quot;);
        dojo.ready(function() {
            dojo.io.script.&lt;span style="COLOR:blue;"&gt;get&lt;/span&gt;({
                url: &amp;#39;https://api.twitter.com/1/statuses/user_timeline/&amp;#39; + twitterName + &amp;#39;.json?count=1&amp;amp;include_rts=1&amp;#39;,
                callbackParamName: &amp;quot;callback&amp;quot;,
                load: function(data) {
                    &lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; twitterText &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &amp;quot;&amp;lt;img src=\&amp;quot;&amp;quot; &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; data[0].user.profile_image_url &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; &amp;quot;\&amp;quot; align=\&amp;quot;left\&amp;quot; style=\&amp;quot;padding-right:8px;\&amp;quot;&amp;gt;&amp;quot; &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; 
                                      data[0].text &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; &amp;quot;&amp;lt;br /&amp;gt;&amp;quot; &lt;span style="COLOR:navy;"&gt;+&lt;/span&gt; 
                                      &amp;quot;&amp;lt;a href=\&amp;quot;http://twitter.com/&amp;quot; + twitterName + &amp;quot;\&amp;quot;&amp;gt;@&amp;quot; + twitterName + &amp;quot;&amp;lt;/a&amp;gt;&amp;quot;;

                    &lt;span style="COLOR:green;"&gt;// update the node to display the data
&lt;/span&gt;                    &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (contentNode)
                        contentNode.innerHTML &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; twitterText;
                }
            });
        });
    }
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;With this code in place we&amp;#39;ll see the following on the contact detail screen (last tweet from &lt;a href="http://twitter.com/RyanFarley" target="_blank"&gt;@RyanFarley&lt;/a&gt;, and what a &amp;quot;meaningful&amp;quot; tweet it is, lol)&lt;/p&gt;
&lt;p&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Mobile_LastTweet.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Conclusion&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As I mentioned earlier, this isn&amp;#39;t an exercise to see how to best grab a tweet from Twitter, but the process we&amp;#39;ve gone through is how we could go grab any data from any system in the mobile client. We could even go back to SalesLogix using SData to grab some related data of some kind and it would be delay loaded so things stay snappy.&lt;/p&gt;
&lt;p&gt;Download the complete&amp;nbsp;&lt;a href="http://customerfx.com/blogs/crmdeveloper/ApplicationModule.js"&gt;ApplicationModule.js&lt;/a&gt; file from this article&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; &lt;img src="http://customerfx.com/aggbug.aspx?PostID=46171" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Integration/default.aspx">Integration</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/API/default.aspx">API</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Argos-SDK/default.aspx">Argos-SDK</category></item><item><title>Formatting Data in SalesLogix Mobile Customizations</title><link>http://customerfx.com/pages/crmdeveloper/2013/04/23/formatting-data-in-saleslogix-mobile-customizations.aspx</link><pubDate>Tue, 23 Apr 2013 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46169</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=46169</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46169</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/04/23/formatting-data-in-saleslogix-mobile-customizations.aspx#comments</comments><description>&lt;p&gt;When adding custom fields to SalesLogix Mobile, you&amp;#39;ll often want to do things to the value, instead of just displaying it as-is. There are many built-in formatting functions, or renderers, available in the out-of-the-box SalesLogix Mobile platform, but what if you need to do something custom? Let&amp;#39;s take a look at what built-in formatting functions there are as well as how to create you own custom formatting function on the fly.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Where/how&amp;nbsp;do you use formatting&amp;nbsp;for a custom field in mobile?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First of all, what are&amp;nbsp;formatting functions (or renderers)? Simply put,&amp;nbsp;a formatting function is a function that takes a value and changes&amp;nbsp;it so it is formatted differently than the raw data value.&amp;nbsp;A format function can do things like take a phone number, stored as 8005551212 and format it like a phone number like (800) 555-1212. A format function can take a numeric value like 6543.21 and format it like $6,543.21. They are also called renderers when you&amp;#39;re using them. If you&amp;#39;re adding a field that is a phone number, you&amp;#39;ll add a &amp;quot;renderer&amp;quot; to tell it to format the value as a phone number like this:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;detail&amp;#39;, &amp;#39;account_detail&amp;#39;, {
    at: function (row) { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; row.name == &amp;#39;Type&amp;#39;; },
    type: &amp;#39;insert&amp;#39;,
    where: &amp;#39;after&amp;#39;,
    value: {
        name: &amp;#39;SecretPhone&amp;#39;,
        property: &amp;#39;SecretPhone&amp;#39;,
        label: &amp;#39;secret phone&amp;#39;,
        &lt;strong&gt;renderer: Mobile.SalesLogix.Format.phone&lt;/strong&gt;
    }
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Built-in Formatting Options&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are a lot of built-in renderers. Some trim spaces from the value, some format the value like a hyperlink, and some are a bit more complex too. You can see the entire list of available formatting functions on the Argos SDK wiki:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Sage/argos-sdk/wiki/Built-In-Templates-%26-Formatting-Functions" target="_blank"&gt;Built-In Templates &amp;amp; Formatting Functions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can see the code for these built-in functions as well. If you noticed on the page linked above, some of the formatting functions are part of the Argos SDK, while other are implemented in the argos-saleslogix product itself (also note that they can all be referenced via Mobile.SalesLogix.Format). To see the ones implemented in argos-saleslogix, navigate in your development environment to \products\argos-saleslogix\src and look for the Format.js file. The ones implemented in the Argos SDK can be found in the Format.js file in argos-sdk\src. If you open up those files, you can see that most of the formatting functions take in a single parameter and then return a string (the formatted result). &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;How&amp;nbsp;do you create a custom formatting function?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#39;s easy enough to create formatting functions on the fly. Keeping in mind that it takes a single parameter and returns a string. If you refer back to the code in this article, the sample where you&amp;#39;ll see the renderer property set to Mobile.SalesLogix.Format.phone. Well, Mobile.SalesLogix.Format.phone is a function. It&amp;#39;s set as the value of the renderer property, but it&amp;#39;s still a function. Rather than set a predefined function for the renderer, we can just create one in-line. For example, let&amp;#39;s say we have some &amp;quot;customer code&amp;quot; stored in the Account entity and that we can launch a URL including this code to go to some other website and see tickets for that customer code. If we add this in mobile, all we have is the code, so we&amp;#39;ll use a format function to format this code value as the URL we want to launch, and the user will just see the code itself as a hyperlink. Here&amp;#39;s how we do that:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;detail&amp;#39;, &amp;#39;account_detail&amp;#39;, {
    at: function (row) { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; row.name == &amp;#39;Type&amp;#39;; },
    type: &amp;#39;insert&amp;#39;,
    where: &amp;#39;after&amp;#39;,
    value: {
        name: &amp;#39;CustomerCode&amp;#39;,
        property: &amp;#39;CustomerCode&amp;#39;,
        label: &amp;#39;customer code&amp;#39;,
        renderer: function(val) {
                    &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; &amp;#39;&amp;lt;a href=&amp;quot;http://somewebsite.com/orders?customerCode=&amp;#39; + val + &amp;#39;&amp;quot;&amp;gt;&amp;#39; + val + &amp;#39;&amp;lt;/a&amp;gt;;
                }
    }
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Not too bad, you can see all we need to worry about is taking a single parameter and returning a string. Easy. The user will see the customer code as a hyperlink and when clicked it will launch the URL.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46169" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Argos-SDK/default.aspx">Argos-SDK</category></item><item><title>Bundling and Deploying SalesLogix Mobile Customizations</title><link>http://customerfx.com/pages/crmdeveloper/2013/04/16/bundling-and-deploying-saleslogix-mobile-customizations.aspx</link><pubDate>Tue, 16 Apr 2013 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46168</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=46168</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46168</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/04/16/bundling-and-deploying-saleslogix-mobile-customizations.aspx#comments</comments><description>&lt;p&gt;Once you&amp;#39;ve started creating customizations for your SalesLogix Mobile, at some point you&amp;#39;ll want to start getting those customizations into production by deploying them or bundling them to add to your production system. This article will walk you through how to do this in both SalesLogix v8 as well as in SalesLogix v7.5.4. You&amp;#39;ll even get a video to follow along through the whole thing.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Background&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This video walks through how to add your customizations into Application Architect, bundle them, and deploy them. Take a look at the write-up following the video to see the steps specific to both SalesLogix v8 and SalesLogix v7.5.4.&lt;/p&gt;
&lt;p&gt;
&lt;object width="580" height="326"&gt;&lt;param name="movie" value="http://www.youtube.com/v/R7Avq80oz_U&amp;amp;hl=en_US&amp;amp;fs=1?rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/R7Avq80oz_U&amp;amp;hl=en_US&amp;amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="326" width="580"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;table&gt;

&lt;tr&gt;
&lt;td&gt;&lt;a title="Watch Bundling and Deploying SalesLogix Mobile Customizations on YouTube" href="http://www.youtube.com/watch?v=R7Avq80oz_U" target="_blank"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/play.png" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;font size="3"&gt;&lt;b&gt;&lt;a title="Watch Bundling and Deploying SalesLogix Mobile Customizations on YouTube" href="http://www.youtube.com/watch?v=R7Avq80oz_U" target="_blank"&gt;Watch Bundling and Deploying SalesLogix Mobile Customizations on YouTube&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#404040"&gt;&lt;i&gt;The video will open on youtube.com in a new window&lt;/i&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Steps to Add Customizations To SalesLogix v8&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These steps are for adding your customizations to Application Architect in SalesLogix v8. This also assumes you&amp;#39;ve created your customization product using the &lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx"&gt;SalesLogix Mobile Developer Toolkit&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;In Application Architect, open your SalesLogix Mobile portal&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Go to the &amp;quot;Custom Modules&amp;quot; tab&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Click the add (&amp;quot;+&amp;quot;) button&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Browse for your &amp;quot;module-info.json&amp;quot; file in your customization product (layer)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Ensure the checkbox next to you newly listed customization product is checked on the Custom Modules tab&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Save everything and deploy&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;font size="4"&gt;&lt;strong&gt;Steps to Add Customizations to SalesLogix v7.5.4 (Manual Steps)&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;These steps are the manual steps for adding your customizations to Application Architect in SalesLogix 7.5.4. These steps work in SalesLogix v8 as well, but the built-in way (outlined above) is far easier. This also assumes you&amp;#39;ve created your customization product using the &lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx"&gt;SalesLogix Mobile Developer Toolkit&lt;/a&gt;.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;In Application Architect, open your SalesLogix Mobile portal&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;In the Support Files tab, under &amp;quot;source\products&amp;quot;, add the same folder structure, along with all files, from your customization product&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Open the release.jsb2 file under &amp;quot;source\products\argos-saleslogix\build&amp;quot; folder and scroll to the bottom to locate the &amp;quot;resources&amp;quot; section&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Just ABOVE the &amp;quot;resources&amp;quot; section, there is line with a &amp;quot;],&amp;quot; - just ABOVE that, add the package from the release.jsb2 file in your customization product. In my system, my custom product was named &amp;quot;argos-custom&amp;quot; so it ended up looking like this (also, don&amp;#39;t forget the comma after the &amp;quot;}&amp;quot; above this line):&lt;br /&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Mobile_ReleaseJSB2_1.png" alt="" /&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Now, copy the resource from the release.jsb2 file in your customized product and paste as an entry in the resources section of the release.jsb2 file in the argos-saleslogix\build folder as well. Mine looked like this:&lt;br /&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Mobile_ReleaseJSB2_2.png" alt="" /&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Open the index.html file in the argos-saleslogix folder&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Under the &amp;quot;&amp;lt;!-- Modules --&amp;gt;&amp;quot; line, add the following (my custom product is called argos-custom):&lt;br /&gt;&lt;pre&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;content/javascript/argos-custom.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Now locate the configuration section in the index.html. It starts with &amp;quot;configuration = [&amp;quot; and at the end of that section add a comma and then your configuration (my customization product is named &amp;quot;custom&amp;quot; so it looked like this):&lt;br /&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Mobile_indexhtml_1.png" alt="" /&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Save everything and deploy&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;What to Include in the Bundle?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the Support Files tab of the portal, include the following:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Your custom product folder&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The modified release.jsb2 file under the argos-saleslogix\build folder&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;The modified index.html under the argos-saleslogix folder&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;All of this might seem like a lot of steps, but once you&amp;#39;ve done this once it becomes much easier. Refer back to the video as needed for the complete walkthrough.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46168" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</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/Training/default.aspx">Training</category></item><item><title>Updates to the SalesLogix Mobile Developer Toolkit</title><link>http://customerfx.com/pages/crmdeveloper/2013/04/10/updates-to-the-saleslogix-mobile-developer-toolkit.aspx</link><pubDate>Wed, 10 Apr 2013 19:37:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46182</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=46182</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46182</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/04/10/updates-to-the-saleslogix-mobile-developer-toolkit.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve released some updates to the SalesLogix Mobile Developer Toolkit. This new release adds some fixes and a few new features.&lt;/p&gt;
&lt;p&gt;Download the &lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx"&gt;SalesLogix Mobile Developer Toolkit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;New Features&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Some of the more notable new features in the SalesLogix Mobile Developer Toolkit are the following:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Support for adding the&amp;nbsp;Mobile 2.0 backwards compatibility module for SalesLogix 7.5.4&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There is now an option for including the mobile 2.0 backwards compatibility module for SalesLogix 7.5.4. This means, if you&amp;#39;re on SalesLogix 7.5.4, you can use Mobile 2.0 instead of Mobile 1.2. If you&amp;#39;re using SLX Mobile at all, going with Mobile 2.0 is by far the best route. This option will add the backwards compatibility module to your development environment for you.&lt;/p&gt;
&lt;p&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/SlxMobileToolkit-754BackCompat.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Master Index File Created in the Development Environment Root&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The SalesLogix Mobile Developer Toolkit now creates an index.html in the root of your development environment. Any new customization products that you create get added to this index file automatically.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/SlxMobileToolkit-MasterIndex.png"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/SlxMobileToolkit-MasterIndex.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now, you can navigate to the root of your development environment and see a list of all customization products in your development website. Obviously, you can click on any of these customization products and open the mobile website with that customization product loaded. Go back to the root and load some new set of customizations by clicking on a different customization product.&lt;/p&gt;
&lt;p&gt;If you already have the toolkit installed, simply opening it up will cause it to automatically upgrade to this new version.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;Download the SalesLogix Mobile Developer Toolkit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;#39;ve not yet tried out the toolkit, &lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx"&gt;download it&lt;/a&gt; and take it for a spin. Also, be sure to check out my new developer series on SalesLogix Mobile. See the &lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;series index&lt;/a&gt; for a list of articles to get started.&lt;/p&gt;
&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46182" 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+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Mobile+Developer+Toolkit/default.aspx">Mobile Developer Toolkit</category></item><item><title>Adding Custom Fields to SalesLogix Mobile</title><link>http://customerfx.com/pages/crmdeveloper/2013/04/09/adding-custom-fields-to-saleslogix-mobile.aspx</link><pubDate>Tue, 09 Apr 2013 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46167</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=46167</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46167</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/04/09/adding-custom-fields-to-saleslogix-mobile.aspx#comments</comments><description>&lt;p&gt;Time to take SalesLogix Mobile to the next level. Customization! This article will outline how to add custom fields to SalesLogix Mobile, from start to finish. You&amp;#39;ll walk through every step, from creating the custom field to viewing and editing it in SalesLogix Mobile. Best part? You&amp;#39;ll see a video that walks you through the whole process.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Background&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, you&amp;#39;ve gotten your SalesLogix Mobile development environment all set up and ready to go. Now what? Well, it&amp;#39;s time to start customizing it. In the video below we&amp;#39;ll walk through the entire process.&lt;/p&gt;
&lt;p&gt;
&lt;object width="580" height="326"&gt;&lt;param name="movie" value="http://www.youtube.com/v/1Fk1DJmdyBs&amp;amp;hl=en_US&amp;amp;fs=1?rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/1Fk1DJmdyBs&amp;amp;hl=en_US&amp;amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="326" width="580"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;table&gt;

&lt;tr&gt;
&lt;td&gt;&lt;a title="Watch Adding custom fields to SalesLogix Mobile on YouTube" href="http://www.youtube.com/watch?v=1Fk1DJmdyBs" target="_blank"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/play.png" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;font size="3"&gt;&lt;b&gt;&lt;a title="Watch Adding custom fields to SalesLogix Mobile on YouTube" href="http://www.youtube.com/watch?v=1Fk1DJmdyBs" target="_blank"&gt;Watch Adding custom fields to SalesLogix Mobile on YouTube&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#404040"&gt;&lt;i&gt;The video will open on youtube.com in a new window&lt;/i&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The Complete ApplicationModule Code&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The following is the ApplicationModule.js code used in the video.&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;define(&amp;#39;Mobile/Custom/ApplicationModule&amp;#39;, [
    &amp;#39;Sage/Platform/Mobile/ApplicationModule&amp;#39;
], function () {
    &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; dojo.declare(&amp;#39;Mobile.Custom.ApplicationModule&amp;#39;, Sage.Platform.Mobile.ApplicationModule, {
        loadCustomizations: function () {
            &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.inherited(arguments);

            &lt;span style="COLOR:green;"&gt;// Add the NewField1 property into the SData query for the detail form
&lt;/span&gt;            
            dojo.extend(Mobile.SalesLogix.Views.Account.Detail, {
                querySelect: Mobile.SalesLogix.Views.Account.Detail.prototype.querySelect.concat([
                    &amp;#39;NewField1&amp;#39;
                ])
            });

            &lt;span style="COLOR:green;"&gt;// Add the NewField1 property onto the Account Detail form
&lt;/span&gt;            &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;detail&amp;#39;, &amp;#39;account_detail&amp;#39;, {
                at: function (row) { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; row.name == &amp;#39;LeadSource.Description&amp;#39;; },
                type: &amp;#39;insert&amp;#39;,
                where: &amp;#39;after&amp;#39;,
                value: {
                    name: &amp;#39;NewField1&amp;#39;,
                    property: &amp;#39;NewField1&amp;#39;,
                    label: &amp;#39;&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; field 1&amp;#39;
                }
            });
            
            &lt;span style="COLOR:green;"&gt;// Add the NewField1 into the SData query for the edit form
&lt;/span&gt;            dojo.extend(Mobile.SalesLogix.Views.Account.Edit, {
                querySelect: Mobile.SalesLogix.Views.Account.Edit.prototype.querySelect.concat([
                    &amp;#39;NewField1&amp;#39;
                ])
            });


            &lt;span style="COLOR:green;"&gt;// Add the NewField1 property onto the Account Edit form
&lt;/span&gt;            &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.registerCustomization(&amp;#39;edit&amp;#39;, &amp;#39;account_edit&amp;#39;, {
                at: function (row) { &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; row.name == &amp;#39;LeadSource&amp;#39;; },
                type: &amp;#39;insert&amp;#39;,
                where: &amp;#39;after&amp;#39;,
                value: {
                    name: &amp;#39;NewField1&amp;#39;,
                    property: &amp;#39;NewField1&amp;#39;,
                    label: &amp;#39;&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; field 1&amp;#39;,
                    type: &amp;#39;text&amp;#39;
                }
            });


        }
    });
});&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Next time we&amp;#39;ll look at how to add this customization back into Application Architect, deploy to the production mobile site, and even how to bundle the customizations.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46167" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Training/default.aspx">Training</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Mobile+Developer+Toolkit/default.aspx">Mobile Developer Toolkit</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Argos-SDK/default.aspx">Argos-SDK</category></item><item><title>Setting up a SalesLogix Mobile Development Environment</title><link>http://customerfx.com/pages/crmdeveloper/2013/04/02/setting-up-a-saleslogix-mobile-development-environment.aspx</link><pubDate>Tue, 02 Apr 2013 15:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46163</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=46163</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46163</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/04/02/setting-up-a-saleslogix-mobile-development-environment.aspx#comments</comments><description>&lt;p&gt;One of the first steps to doing customizations for the SalesLogix Mobile product is to set up a development environment. This task can be confusing for those just starting out with mobile, but with the help of the SalesLogix Mobile Developer Toolkit this is made much simpler. Even better, this article includes a video to walk you through the process.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Background&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before you can customize the SalesLogix Mobile product, you need to be able to set up a development environment. The following video will walk you through the entire process using the &lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx"&gt;SalesLogix Mobile Developer Toolkit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
&lt;object width="580" height="326"&gt;&lt;param name="movie" value="http://www.youtube.com/v/5asBu0rbavE&amp;amp;hl=en_US&amp;amp;fs=1?rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/5asBu0rbavE&amp;amp;hl=en_US&amp;amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="326" width="580"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;table&gt;

&lt;tr&gt;
&lt;td&gt;&lt;a title="Watch Setting up a SalesLogix Mobile Development Environment on YouTube" href="http://www.youtube.com/watch?v=5asBu0rbavE" target="_blank"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/play.png" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;font size="3"&gt;&lt;b&gt;&lt;a title="Watch Setting up a SalesLogix Mobile Development Environment on YouTube" href="http://www.youtube.com/watch?v=5asBu0rbavE" target="_blank"&gt;Watch Setting up a SalesLogix Mobile Development Environment on YouTube&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#404040"&gt;&lt;i&gt;The video will open on youtube.com in a new window&lt;/i&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx"&gt;Download the SalesLogix Mobile Developer Toolkit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Stay tuned for the next video that will take you through the next steps in customizing the SalesLogix Mobile product by adding custom fields to screens. Until next time :)&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; &lt;img src="http://customerfx.com/aggbug.aspx?PostID=46163" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Training/default.aspx">Training</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Mobile+Developer+Toolkit/default.aspx">Mobile Developer Toolkit</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Argos-SDK/default.aspx">Argos-SDK</category></item><item><title>Free Tool to Retrieve SalesLogix User Names and Passwords</title><link>http://customerfx.com/pages/crmdeveloper/2013/02/25/free-tool-to-retrieve-saleslogix-user-names-and-passwords.aspx</link><pubDate>Mon, 25 Feb 2013 21:51:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:46105</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=46105</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=46105</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2013/02/25/free-tool-to-retrieve-saleslogix-user-names-and-passwords.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/th_SalesLogixUserLogins.png"&gt;&lt;/a&gt;As a business partner we work with customer SalesLogix databases often. Along with getting a database backup we need to ask the customer what their SalesLogix admin user password is, as well as any other user passwords needed for testing. I tend to think I&amp;#39;ll remember these passwords and don&amp;#39;t write them down, but then end up forgetting&amp;nbsp;them later. Step in the SalesLogix User Logins tool. This open source tool from Customer FX will retrieve all SalesLogix user login names and unencrypted passwords with a click of a button.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;The SalesLogix User Logins Tool&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The SalesLogix User Login tool will connect to a SalesLogix SQL database using the SQL sysdba account and then list all SalesLogix users and decrypt their passwords as well. You can easily export this list as well for easy saving.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/SalesLogixUserLogins.png"&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/SalesLogixUserLogins.png" target="_blank"&gt;&lt;img style="HEIGHT:466px;WIDTH:461px;" border="0" src="http://customerfx.com/blogs/crmdeveloper/th_SalesLogixUserLogins.png" width="461" height="466" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;&lt;font color="#a0a0a0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; click for larger view&lt;/font&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Source Code Available&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/CustomerFX/SalesLogixUserLogins" target="_blank"&gt;source for this tool is available on github&lt;/a&gt;. Feel free to grab the source, report any issues or give feedback. The tool does not have any other dependencies of any kind. You can just grab the source, open it in Visual Studio and run it.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/CustomerFX/SalesLogixUserLogins" target="_blank"&gt;&lt;strong&gt;View the SalesLogixUserLogins Source Repository&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;A Word of Warning&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Obviously, a tool like this makes it possible for anyone to connect to your SalesLogix database and see all the passwords, right? Well, sort of. The tool still requires the SQL sysdba account password to connect to the database in the first place. If you leave the sysdba account password the standard &amp;quot;masterkey&amp;quot; then you&amp;#39;re opening your data up to prying eyes with or without a tool like this. So, it&amp;#39;s a good idea to not leave it the standard password. Always set a secure password for the sysdba account.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Download the SalesLogix User Logins Tool&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The SalesLogix User Logins tool is a single executable that does not have any dependencies. It does not need SalesLogix to be installed. Just download the exe and run it. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;img border="0" align="absMiddle" src="http://customerfx.com/blogs/crmdeveloper/file-down.png" alt="" /&gt;&lt;a href="http://customerfx.com/files/folders/46104/download.aspx"&gt;&lt;font size="3"&gt;Download the SalesLogix User Logins Tool&lt;/font&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As always, any feedback you&amp;#39;d like to provide is welcome.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=46105" 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/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Tools/default.aspx">Tools</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Open+Source/default.aspx">Open Source</category></item><item><title>Introducing the SalesLogix Mobile Developer Toolkit</title><link>http://customerfx.com/pages/crmdeveloper/2012/11/13/introducing-the-saleslogix-mobile-developer-toolkit.aspx</link><pubDate>Tue, 13 Nov 2012 22:29:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45964</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=45964</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45964</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2012/11/13/introducing-the-saleslogix-mobile-developer-toolkit.aspx#comments</comments><description>&lt;p&gt;I am very pleased to announce a new &amp;amp; free open source tool from Customer FX named the &lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx"&gt;SalesLogix Mobile Developer Toolkit&lt;/a&gt;. This toolkit will make your life easier when working with the SalesLogix Mobile product and provide automation to some of the tedious tasks you have to complete before you actually get to start writing code. Let&amp;#39;s take a look.&lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt; 
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;The SalesLogix Mobile Developer Toolkit&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I always think a picture (video)&amp;nbsp;is worth a bazillion words, so let&amp;#39;s start with a video overview of the SalesLogix Mobile Developer Toolkit.&lt;/p&gt;
&lt;p&gt;
&lt;object width="580" height="326"&gt;&lt;param name="movie" value="http://www.youtube.com/v/pWrazFD8lds&amp;amp;hl=en_US&amp;amp;fs=1?rel=0"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/pWrazFD8lds&amp;amp;hl=en_US&amp;amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="326" width="580"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;table&gt;

&lt;tr&gt;
&lt;td&gt;&lt;a title="Watch the SalesLogix Mobile Developer Toolkit on YouTube" href="http://www.youtube.com/watch?v=pWrazFD8lds" target="_blank"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/play.png" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;font size="3"&gt;&lt;b&gt;&lt;a title="Watch the Background Tasks for SalesLogix demo on YouTube" href="http://www.youtube.com/watch?v=pWrazFD8lds" target="_blank"&gt;Watch the SalesLogix Mobile Developer Toolkit overview on YouTube&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#404040"&gt;&lt;i&gt;The video will open on youtube.com in a new window&lt;/i&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;In a nutshell, the SalesLogix Mobile Developer Toolkit provides you with the following at the moment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div&gt;Create a new mobile development environment with a couple of clicks (for either mobile 1.2 or mobile 2.0)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Create a new customization product &amp;amp; ApplicationModule for layering customizations (for either mobile 1.2 or mobile 2.0)&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Launch a mobile development environment in a small webserver so no need to use or configure IIS&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Launch a specific product (customization set) in the browser&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;View articles on SalesLogix Mobile development&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div&gt;Report bugs and feature requests for the SalesLogix Mobile Developer Toolkit&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;That&amp;#39;s where it is at now. I would love some feature requests for things that you think would make this toolkit even better. If you have a suggestion for a feature or would like to report a bug, you can do so at the github home for the SalesLogix Mobile Developer Toolkit&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/CustomerFX/SalesLogixMobileDeveloperTools/issues" target="_blank"&gt;Report bugs, feature requests, or contribute source code on github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, how can you get this free tool? Read on.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Downloading the SalesLogix Mobile Developer Toolkit&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To download the SalesLogix Mobile Developer Toolkit, visit the product page on customerfx.com.&lt;/p&gt;
&lt;table cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;img border="0" align="absMiddle" src="http://customerfx.com/blogs/crmdeveloper/file-down.png" alt="" /&gt;&amp;nbsp; &lt;/td&gt;
&lt;td&gt;&lt;font style="FONT-WEIGHT:bold;" size="3"&gt;&lt;a href="http://customerfx.com/pages/cfxproducts/2012/11/13/saleslogix-mobile-developer-toolkit.aspx" target="_blank"&gt;Get the SalesLogix Mobile Developer Toolkit&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Download it and take it for a spin. I&amp;#39;d love any feedback you might have on how to improve it. &lt;/p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-mobile-developer-series.aspx"&gt;View the SalesLogix Mobile Developer series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45964" 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/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Open+Source/default.aspx">Open Source</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Mobile+Developer+Toolkit/default.aspx">Mobile Developer Toolkit</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Argos-SDK/default.aspx">Argos-SDK</category></item><item><title>Easily Increasing the Height of the Picklist Dropdown in SalesLogix Web</title><link>http://customerfx.com/pages/crmdeveloper/2012/03/22/easily-increasing-the-height-of-the-picklist-dropdown-in-saleslogix-web.aspx</link><pubDate>Thu, 22 Mar 2012 19:07:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45524</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=45524</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45524</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2012/03/22/easily-increasing-the-height-of-the-picklist-dropdown-in-saleslogix-web.aspx#comments</comments><description>&lt;p&gt;Something that has always frustrated me when using the SalesLogix Web client was how the picklist control only shows four items in the dropdown and you have to scroll up or down to see the rest. This works fine for lists with only a few items, but for bigger lists it is a huge pain. It wasn&amp;#39;t until a coworker was asked by a customer that I gave it any thought about how to go about changing this. Luckily, it&amp;#39;s a pretty easy change to make.&lt;/p&gt;

&lt;p&gt;This change can be made for all picklist controls in the client with a simple CSS change. If you open the sage-styles.css file in Application Architect. Look in the CSS folder in the Support Files for the portal. Then just add the following:&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;.picklist-container .picklist-inner-container .picklist-items
{
    height:200px;
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;This change increases the height of the dropdown to 200 pixels. That changes the picklist dropdown from this:&lt;/p&gt;
&lt;p&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Picklist_Before.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;to this:&lt;/p&gt;
&lt;p&gt;&lt;img border="1" src="http://customerfx.com/blogs/crmdeveloper/Picklist_After.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Much better. Of course, you can play with that 200px value to get the default height to look &amp;amp; feel just right.&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45524" 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/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Customization/default.aspx">Customization</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/CSS/default.aspx">CSS</category></item><item><title>Passing Connection Information from SalesLogix Web to Another Website</title><link>http://customerfx.com/pages/crmdeveloper/2011/12/22/passing-connection-information-from-saleslogix-web-to-another-website.aspx</link><pubDate>Thu, 22 Dec 2011 17:44:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45386</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=45386</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45386</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/12/22/passing-connection-information-from-saleslogix-web-to-another-website.aspx#comments</comments><description>&lt;p&gt;When integrating another system, application, or website with SalesLogix there are many options. If you&amp;#39;re need to make connections to the SalesLogix database via the provider using user credentials you either need to prompt the user for login (again) or you can pass the connection information along to the other system.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s easy enough to get the connection information using the DataService in SalesLogix. However, you don&amp;#39;t really want to pass around a complete connection string around, especially since it will have the user&amp;#39;s username and password in it. However, you can get the user&amp;#39;s authentication token and then pass that to another system. It can use that authentication token to get all the connection values and form a valid connection string. Let&amp;#39;s take a look.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Retrieving the current user&amp;#39;s Authentication Token&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To retrieve the user&amp;#39;s authentication token, you can use the AuthenticationProvider service. &lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; authService &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; ApplicationContext.Current.Services.Get&amp;lt;IAuthenticationProvider&amp;gt;();
&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; authToken &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; authService.AuthenticationToken;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;The authentication token will look like a long string of letters and numbers. You can pass this to some other website so that website/webpage can log into SalesLogix as that same user without prompting the user for their username and password. Let&amp;#39;s look at what to do with this authentication token.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Decrypting and Using the Authentication Token&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Once the other website or webpage has the Authentication Token all you need to do is convert it back&amp;nbsp;to a stream and then read out the values from it. Then you have everything you need to form a valid connection string to the SalesLogix database as the user whose authentication token you have.&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;&lt;span style="COLOR:green;"&gt;// In this code the &amp;quot;authToken&amp;quot; variable holds the authentication token value
// passed from SalesLogix Web (see code above)
&lt;/span&gt;
&lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; (&lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; stream &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; MemoryStream(Convert.FromBase64String(authToken)))
{
    &lt;span style="COLOR:blue;"&gt;using&lt;/span&gt; (&lt;span style="COLOR:blue;"&gt;var&lt;/span&gt; reader &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; StreamReader(stream))
    {
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; UserName &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Password &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; UserId &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Database &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Alias &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Server &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; ExtendedProperties &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; Provider &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();
        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; UserType &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; reader.ReadLine();

        &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; ConnectionString &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Format(
                &lt;span&gt;&amp;quot;Provider={5};Persist Security Info=True;Initial Catalog={1};Data Source={0};User ID={3};Password=\&amp;quot;{4}\&amp;quot;;Extended Properties=\&amp;quot;{2}\&amp;quot;&amp;quot;&lt;/span&gt;, 
                Server, Database, ExtendedProperties, UserName, Password, Provider
            );
    }
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Pretty easy and the other external website or password didn&amp;#39;t need to ask the user again for credentials or store a connection string locally.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Note if passing the&amp;nbsp;Auth&amp;nbsp;Token in a URL&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you are passing this authorization token from SalesLogix to another website or webpage via a parameter in the URL, you &lt;strong&gt;must&lt;/strong&gt; encode the token otherwise any contained &amp;quot;+&amp;quot; chars will break the string (since that will be interpreted in the URL as a space).&lt;/p&gt;
&lt;p&gt;On the SalesLogix side, encode the token using something like this:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;authToken &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; System.Web.HttpUtility.&lt;strong&gt;UrlEncode&lt;/strong&gt;(authToken);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Then, on the receiving side, grab the token from the URL and then decode is using something like this:&lt;/p&gt;
&lt;table style="TABLE-LAYOUT:fixed;WIDTH:600px;" cellspacing="0" cellpadding="0"&gt;

&lt;tr&gt;
&lt;td&gt;&lt;pre&gt;authToken &lt;span style="COLOR:navy;"&gt;=&lt;/span&gt; System.Web.HttpUtility.&lt;strong&gt;UrlDecode&lt;/strong&gt;(authToken);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Then all will work fine and you can proceed to get the connection values from the token.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45386" 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/ASP.NET/default.aspx">ASP.NET</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Integration/default.aspx">Integration</category></item><item><title>Including Nested Payloads with SData for SalesLogix</title><link>http://customerfx.com/pages/crmdeveloper/2011/12/01/including-nested-payloads-with-sdata-for-saleslogix.aspx</link><pubDate>Thu, 01 Dec 2011 15:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45327</guid><dc:creator>Ryan Farley</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/rsscomments.aspx?PostID=45327</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45327</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/12/01/including-nested-payloads-with-sdata-for-saleslogix.aspx#comments</comments><description>&lt;p&gt;When you&amp;#39;re developing an application or customization using SData for SalesLogix, the&amp;nbsp;fewer trips you make to the server the better. Moving data back and forth across the wire will always be the biggest bottleneck in your code, so making use of embedded payloads will save you some trips by bringing all the data you&amp;#39;re after back in one pass.&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;What Are Nested Payloads?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we get into things, what exactly are&amp;nbsp;nested payloads? Maybe a better term might be &amp;quot;included&amp;quot; payloads. Either way, when you request an entity, or entities, via SData, some part of the entity might be missing, or incomplete. Why? Because of the way that relationships work in the entity model. For example, if you request an Account entity, the AccountManager is a relationship to the User entity. These relationship properties are not included by default in the Account entity unless you tell SData you want those too. If you include related entities, such as the AccountManager, when you get back the Account entity you&amp;#39;ll have an&amp;nbsp;nested payload inside the Account payload. So, no need to make another trip back to the server to get the AccountManager. One thing to keep in mind, including related entites will increase the size of the data coming back in the SData feed, this is why these are not included by default, so be sure only include them when you really need them.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Adding An Included Entity In An SData URL&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I think it is important to know what the SData URL looks like when doing anything with the client library. I think it helps to understand what you&amp;#39;re ultimately ending up with. It also helps to see what the data coming back looks like using your browser by using the URL. When you want to include related entities you simple add an &amp;quot;include&amp;quot; parameter to the query string. For example, consider this URL to get a specific account:&lt;/p&gt;

&lt;pre&gt;http://localhost:3333/sdata/slx/dynamic/-/accounts(&amp;#39;AA2EK0013023&amp;#39;)&lt;/pre&gt;

&lt;p&gt;Now, to include the AccountManager entity as an embedded payload, add to the URL as follows:&lt;/p&gt;

&lt;pre&gt;http://localhost:3333/sdata/slx/dynamic/-/accounts(&amp;#39;AA2EK0013023&amp;#39;&lt;strong&gt;)?Include=AccountManager&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;To include additional related entities, such as all Contact entities for the Account, add that as well:&lt;/p&gt;

&lt;pre&gt;http://localhost:3333/sdata/slx/dynamic/-/accounts(&amp;#39;AA2EK0013023&amp;#39;&lt;strong&gt;)?Include=AccountManager,Contacts&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;Now when the Account entity comes back it will include an&amp;nbsp;nested payload for the AccountManager, but also a collection of payloads for each Contact related to the Account - all in one trip to the server.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Including Related Entities Using the C# Client Library&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that you know what the URL with includes look like, let&amp;#39;s take a look at how to write the code and how to use the&amp;nbsp;nested payloads. We&amp;#39;ll use the example above to get a single&amp;nbsp;Account and include the AccountManager and all related Contacts for the Account as&amp;nbsp;nested payloads.&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.SData.Client.Atom;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.SData.Client.Core;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.SData.Client.Extensions;


&lt;span style="color:green;"&gt;//...
&lt;/span&gt;

&lt;span style="color:blue;"&gt;var&lt;/span&gt; service &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; SDataService(&lt;span&gt;&amp;quot;http://localhost:3333/sdata/slx/dynamic/-/&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;admin&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;&amp;quot;&lt;/span&gt;);

 
&lt;span style="color:blue;"&gt;var&lt;/span&gt; req &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; SDataSingleResourceRequest(service);
req.ResourceKind &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;Accounts&amp;quot;&lt;/span&gt;;
req.ResourceSelector &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;&amp;#39;AA2EK0013023&amp;#39;&amp;quot;&lt;/span&gt;;

 
&lt;span style="color:green;"&gt;// We have to include the entities we want returned as nested payloads
&lt;/span&gt;req.QueryValues.Add(&lt;span&gt;&amp;quot;include&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;Contacts,AccountManager&amp;quot;&lt;/span&gt;);

 
&lt;span style="color:green;"&gt;// We can access normal properties of the Account
&lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; accountName &lt;span style="color:navy;"&gt;=&lt;/span&gt; payload.Values[&lt;span&gt;&amp;quot;AccountName&amp;quot;&lt;/span&gt;].ToString();

 
&lt;span style="color:green;"&gt;// Now get nested payload for AccountManager
&lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; accMgrPayload &lt;span style="color:navy;"&gt;=&lt;/span&gt; (SDataPayload)payload.Values[&lt;span&gt;&amp;quot;AccountManager&amp;quot;&lt;/span&gt;];
&lt;span style="color:green;"&gt;// We can access properties in the AccountManager payload
&lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; accMgrUserName &lt;span style="color:navy;"&gt;=&lt;/span&gt; accMgrPayload.Values[&lt;span&gt;&amp;quot;UserName&amp;quot;&lt;/span&gt;].ToString();

 
&lt;span style="color:green;"&gt;// Get nested Contacts collection of payloads
&lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; contactsPayloadCollection &lt;span style="color:navy;"&gt;=&lt;/span&gt; (SDataPayloadCollection)payload.Values[&lt;span&gt;&amp;quot;Contacts&amp;quot;&lt;/span&gt;];
&lt;span style="color:green;"&gt;// And iterate through each one
&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (SDataPayload contactPayload &lt;span style="color:blue;"&gt;in&lt;/span&gt; contactsPayloadCollection)
{
    &lt;span style="color:green;"&gt;// We can access properties in this Contact payload
&lt;/span&gt;    &lt;span style="color:blue;"&gt;var&lt;/span&gt; contactLastName &lt;span style="color:navy;"&gt;=&lt;/span&gt; contactPayload.Values[&lt;span&gt;&amp;quot;LastName&amp;quot;&lt;/span&gt;].ToString();
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;The key is to just access the property in the entity and cast it to either an SDataPayload or a SDataPayloadCollection. Cool beans.&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45327" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/REST/default.aspx">REST</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SData/default.aspx">SData</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/API/default.aspx">API</category></item><item><title>Extending Sublogix Entities</title><link>http://customerfx.com/pages/crmdeveloper/2011/11/15/extending-sublogix-entities.aspx</link><pubDate>Tue, 15 Nov 2011 16:22:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45304</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=45304</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45304</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/11/15/extending-sublogix-entities.aspx#comments</comments><description>&lt;p&gt;If you&amp;#39;ve followed &lt;a href="http://customerfx.com/pages/crmdeveloper/archive/tags/Sublogix/default.aspx"&gt;my posts on Sublogix&lt;/a&gt;, or even better, given Sublogix a spin, you&amp;#39;ll know that if you&amp;#39;re doing SalesLogix development Sublogix can save you a ton of time and give you a much easier to use data access and entity model. This post will show you how to extend the Sublogix entities to give you even easier access and save even more time.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The Sublogix Entity Model&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we look at extending Sublogix entities, let&amp;#39;s take a look at the standard generated Sublogix entities. The Sublogix library has a built-in entity model for the standard out of the box SalesLogix database. There are T4 templates you can add to your project to generate the entity model based on your own custom SalesLogix database schema. Either way, you have and entity class for each table in the database. If you&amp;#39;ve used teh T4 templates, you can find a file in your project called SublogixEntityObjects.cs which contains all of these classes and you can take a look. There&amp;#39;s nothing special about these classes. The important part of these objects are the attributes they&amp;#39;re decorated with that tells Sublogix how the classes and properties&amp;nbsp;relate to the SalesLogix database tables and fields.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Extending A SubLogix Entity&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s look at a sample of extending the Account entity. Let&amp;#39;s add a property to get the related Contacts for the account. To do this, we simply need to inherit the Account entity as our base class, then add soem new custom properties.&lt;/p&gt;

&lt;p&gt;First, let&amp;#39;s create a new class, we&amp;#39;ll call it AccountExtended. Then we&amp;#39;ll have it inherit from account. At this point we have the following:&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&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.Collections.Generic;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Model;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Entities;
 &lt;br /&gt;
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; SublogixDemo.Entities
{
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; AccountExtended : Sublogix.Entities.Account
    {
    }
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;There is one crucial thing missing from this class. The attributes that normally decorate a Sublogix entity. You can see these by looking at the Account class in the SublogixEntityObjects.cs file that was generated by the T4 templates. Once we add that our class will look like this:&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&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.Collections.Generic;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Model;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Entities;
 &lt;br /&gt;
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; SublogixDemo.Entities
{
    [EntityElement(Name=&lt;span&gt;&amp;quot;ACCOUNT&amp;quot;&lt;/span&gt;, PrimaryKey=&lt;span&gt;&amp;quot;ACCOUNTID&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; AccountExtended : Sublogix.Entities.Account
    {
    }
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Now we can add whatever custom properties to the class we need. One thing to note, the base Account class has a built-in repository. So, to add the property to get the related child Contacts, we just need to add the following:&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&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.Collections.Generic;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Model;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Entities;
 &lt;br /&gt;
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; SublogixDemo.Entities
{
    [EntityElement(Name=&lt;span&gt;&amp;quot;ACCOUNT&amp;quot;&lt;/span&gt;, PrimaryKey=&lt;span&gt;&amp;quot;ACCOUNTID&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; AccountExtended : Sublogix.Entities.Account
    {
        &lt;span style="color:blue;"&gt;public&lt;/span&gt; IList&amp;lt;Contact&amp;gt; Contacts
        {
            &lt;span style="color:blue;"&gt;get&lt;/span&gt;
            {
                &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Repository.Find&amp;lt;Contact&amp;gt;(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.AccountId == &lt;span style="color:blue;"&gt;this&lt;/span&gt;.AccountId);
            }
        }
    }
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Pretty simple. Now we could just use account.Contacts to get a list of the Contacts related to the account. Often, when I do this sort of thing, I store the retrieved items locally in a private variable to avoid going back to the database to retrieve them. For example, this sample extends the OpportunityProduct entity to provide the related Product entity built-in. The difference here is that I only retrieve it once, then store the reference so next time I ask for it I don&amp;#39;t make a trip back to the database for it.&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&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; Sublogix.Model;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Entities;
 &lt;br /&gt;
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; SublogixDemo.Entities
{
    [EntityElement(Name=&lt;span&gt;&amp;quot;OPPORTUNITY_PRODUCT&amp;quot;&lt;/span&gt;, PrimaryKey=&lt;span&gt;&amp;quot;OPPPRODUCTID&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; OpportunityProductExtended : Sublogix.Entities.OpportunityProduct
    {
        &lt;span style="color:blue;"&gt;private&lt;/span&gt; Product _product;
        &lt;span style="color:blue;"&gt;public&lt;/span&gt; Product Product
        {
            &lt;span style="color:blue;"&gt;get&lt;/span&gt;
            {
                &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_product == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
                    _product &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Repository.GetById&amp;lt;Product&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.ProductId);
                &lt;span style="color:blue;"&gt;return&lt;/span&gt; _product;
            }
        }
    }
}
&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;One of the cool things about doing this is that if you&amp;#39;re binding the Sublogix entity to a datagrid, you can create properties for related items so you can easily bind as you normally would since the values from related tables are all built in. Also, it goes without saying that you can certainly do a lot more than just retrieving related entities. You could do any sort of calculations or complex things there too, of course. Here&amp;#39;s one that extends the Opportunity entity to add a calculated property to get the total price of all related opportunity products.&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&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.Linq;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; System.Linq.Expressions;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Model;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sublogix.Entities;
 &lt;br /&gt;
&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; SublogixDemo.Entities
{
    [EntityElement(Name=&lt;span&gt;&amp;quot;OPPORTUNITY&amp;quot;&lt;/span&gt;, PrimaryKey=&lt;span&gt;&amp;quot;OPPORTUNITYID&amp;quot;&lt;/span&gt;)]
    &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; OpportunityExtended : Sublogix.Entities.Opportunity
    {
        &lt;span style="color:blue;"&gt;public&lt;/span&gt; double? OpportunityProductTotal
        {
            &lt;span style="color:blue;"&gt;get&lt;/span&gt;
            {
                &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Repository.Find&amp;lt;OpportunityProduct&amp;gt;(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.OpportunityId == &lt;span style="color:blue;"&gt;this&lt;/span&gt;.OpportunityId).Sum(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.Price);
            }
        }
    }
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;The sky is the limit. If you need to add any writable properties, that is, a property with a &amp;quot;set&amp;quot; as well as a &amp;quot;get&amp;quot;, you&amp;#39;ll need to tell Sublogix to ignore that property, otherwise it will try to match that up with a SalesLogix database field with the same name. To tell Sublogix to ignore that property, simply add the EntityElement attribute with an Ignore flag.&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;[EntityElement(Ignore &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;true&lt;/span&gt;)]
&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; MyCustomProperty { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Using Extended Sublogix Entities&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To use an extended Sublogix entity, you just replace the standard entity name with your extended one.&lt;/p&gt;

&lt;p&gt;So, instead of doing this:&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; accountList &lt;span style="color:navy;"&gt;=&lt;/span&gt; repo.Find&amp;lt;Account&amp;gt;(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.AccountName.StartsWith(&amp;#39;Ab&amp;#39;));&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;You just do this to use your extended entity (Notice the change from Account to AccountExtended):&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; accountList &lt;span style="color:navy;"&gt;=&lt;/span&gt; repo.Find&amp;lt;AccountExtended&amp;gt;(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.AccountName.StartsWith(&amp;#39;Ab&amp;#39;));&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Pretty easy. Are you drinking the Sublogix koolaid yet?&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45304" 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/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/Sublogix/default.aspx">Sublogix</category></item><item><title>Creating SalesLogix .NET Extensions with the .NET Extensions Helper Library</title><link>http://customerfx.com/pages/crmdeveloper/2011/10/27/creating-saleslogix-net-extensions-with-the-net-extensions-helper-library.aspx</link><pubDate>Thu, 27 Oct 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45268</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=45268</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45268</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/10/27/creating-saleslogix-net-extensions-with-the-net-extensions-helper-library.aspx#comments</comments><description>&lt;p&gt;A couple of weeks ago I announced the &lt;a href="http://customerfx.com/pages/crmdeveloper/2011/10/13/announcing-the-open-source-saleslogix-net-extensions-helper-library.aspx"&gt;.NET Extensions Helper open source library&lt;/a&gt;. I figured it was time for a more complete walkthrough so this post will show a video of how to get the library and use it to embed a .NET UserControl on a SalesLogix account tab. Let&amp;#39;s take a look.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Demonstration of the .NET Extensions Helper Library&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In this video you&amp;#39;ll see how to get the .NET Extensions Helper library and how to use it to embed a .NET UserControl in SalesLogix. &lt;/p&gt;

&lt;iframe height="430" src="http://www.youtube.com/embed/R4a2WV03biU?rel=0" frameborder="0" width="590" allowfullscreen=""&gt;&lt;/iframe&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a title="Watch the Creating SalesLogix .NET Extensions with the .NET Extensions Helper Library video on YouTube" href="http://www.youtube.com/watch?v=R4a2WV03biU" target="_blank"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/play.png" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;font size="3"&gt;&lt;b&gt;&lt;a title="Watch the Creating SalesLogix .NET Extensions with the .NET Extensions Helper Library on YouTube" href="http://www.youtube.com/watch?v=R4a2WV03biU" target="_blank"&gt;Watch the Creating SalesLogix .NET Extensions with the .NET Extensions Helper Library on YouTube&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#404040"&gt;&lt;i&gt;The video will open on youtube.com in a new window&lt;/i&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Take It For A Whirl&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So, there will be more coming in future posts about the .NET Extensions Helper library. I&amp;#39;ll cover how to wire up callbacks to invoke VBScript methods in the SalesLogix plugin from your .NET Extension and creating dialogs as well. For now, give it a try and let me know what you think.&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45268" 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/.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/Open+Source/default.aspx">Open Source</category></item><item><title>Want to see something cool? The SalesLogix Mobile client embedded in Outlook!</title><link>http://customerfx.com/pages/crmdeveloper/2011/10/21/want-to-see-something-cool-the-saleslogix-mobile-client-embedded-in-outlook.aspx</link><pubDate>Fri, 21 Oct 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45257</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=45257</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45257</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/10/21/want-to-see-something-cool-the-saleslogix-mobile-client-embedded-in-outlook.aspx#comments</comments><description>&lt;p&gt;Imagine this. The full, awesome power of the SalesLogix Mobile client, embedded in Outlook that shows the matching contact from the context of the currently selected e-mail in Outlook. Pretty awesome thought, right? Well, it&amp;#39;s an idea that&amp;nbsp;I have&amp;nbsp;in the works, and not all that far off.&lt;/p&gt;&lt;p&gt;Take a look. Be sure to click on the image to see it full size.&lt;/p&gt;&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/SalesLogixOutlook_Screenshot.png" target="_blank"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/th_SalesLogixOutlook_Screenshot.png" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;&lt;font color="gray"&gt;(Click to view full size)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;So, what exactly are we looking at here? This is Chromium, the open source browser code behind Google Chrome, embedded in an Outlook addin. It hosts the SalesLogix Mobile client, in all it&amp;#39;s HTML5 goodness, and then attempts to set context based on the currently selected e-mail. It uses SData to locate the matching contact for the selected e-mail address and then uses the matching ContactID value to *attempt* to set that context in the embedded mobile client. I say *attempt* because there are some issues with setting context to a specific record in the mobile client in the current builds.&lt;/p&gt;&lt;p&gt;What&amp;#39;s left to get this to fully work? Well, there&amp;#39;s a lot of things. The addin does a lot of injecting Javascript into the embedded client to get things to work the way I want/need it to. I&amp;#39;d rather not have to do that,  since that is prone to possible issues, and get the mobile client to play nicely in this scenario. I have a modified version of the mobile client started that I am using for a lot of this even with the constant javascript injection in the client. It would be great to just have the mobile client work as is with this. Also, there&amp;#39;s some small &amp;quot;quirky&amp;quot; issues with embedding Chromium in Outlook that I need to get worked out. Most of the work that has gone into this so far is getting Chromium to work in an Outlook addin and play nicely embedded in Outlook. Note, this is Chromium, not Google Chrome. You don&amp;#39;t even need Google Chrome installed for this to work. Anyway, all this extra work using Chromium (which isn&amp;#39;t really built to be embeddable in other apps) wouldn&amp;#39;t be necessary if IE got it&amp;#39;s act together with&amp;nbsp;full support for&amp;nbsp;HTML5. In time it might get there which could make this solution get a whole lot closer to working in a quicker time frame.&lt;/p&gt;&lt;p&gt;It goes without saying how highly flexible this would&amp;nbsp;be. You can customize the mobile client and then your customizations would be available in Outlook as well, all in context to the currently selected e-mail.&lt;/p&gt;&lt;p&gt;As I mentioned, there is still a ton of work before this sees the light of day, but for now, I&amp;#39;m excited enough about this that I thought it was worth sharing&amp;nbsp;a sneak&amp;nbsp;peek.&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45257" width="1" height="1"&gt;</description><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SalesLogix+Mobile/default.aspx">SalesLogix Mobile</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Outlook+Integration/default.aspx">Outlook Integration</category></item><item><title>Unit Testing SalesLogix .NET Extensions and Mocking the SlxApplication Object</title><link>http://customerfx.com/pages/crmdeveloper/2011/10/18/unit-testing-saleslogix-net-extensions-and-mocking-the-slxapplication-object.aspx</link><pubDate>Tue, 18 Oct 2011 17:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45244</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=45244</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45244</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/10/18/unit-testing-saleslogix-net-extensions-and-mocking-the-slxapplication-object.aspx#comments</comments><description>&lt;p&gt;One of the many&amp;nbsp;great things about developing for the SalesLogix Windows client using .NET Extensions is that you are able to unit test your code. However, since .NET Extensions are passed references to the running instance of SalesLogix, it&amp;#39;s important to be able to mock those objects so you can test properly. Best of all, this also allows you to fully test and debug within Visual Studio without the need to have SalesLogix even running.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Background&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;I posted before about &lt;a href="http://customerfx.com/pages/crmdeveloper/2007/08/20/how-to-debug-a-saleslogix-net-extension.aspx"&gt;how to debug a .NET Extension&lt;/a&gt; by connecting to the running instance of SalesLogix and being able to set break points in your code. That&amp;#39;s great, but this also means you need to add your extension to SalesLogix, add code in SalesLogix to load the extension and so on. Being able to perform this same sort of testing inside of Visual Studio, taking SalesLogix out of the picture, let&amp;#39;s you focus completely on your .NET code and what the .NET Extension is actually doing.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Mocking the SlxApplication, BasicFunctions, and Other SalesLogix COM&amp;nbsp;Objects&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what exactly are &lt;a href="http://en.wikipedia.org/wiki/Mock_object" target="_blank"&gt;mock objects&lt;/a&gt;? There are plenty of resources online so I won&amp;#39;t get too deep into mocking in this post. In a nutshell, a mock object is a &amp;quot;fake&amp;quot; object meant to be used in place of some other object for testing. In the case of SalesLogix, your .NET Extension receives a COM reference to SlxApplication where it can get things like a connection string or use things in BasicFunctions, etc. What we are going to do is create a mock, or fake,&amp;nbsp;SlxApplication object that provides the limited functionality we&amp;#39;ll be using in our .NET Extension. Then when we test we&amp;#39;ll use that mock object instead. We will give it to our .NET Extension rather than SalesLogix passing it into our extension. To accomplish this we&amp;#39;ll use the awesome &lt;a href="http://code.google.com/p/moq/" target="_blank"&gt;Moq&lt;/a&gt; mocking library. Also, to point out, I will assume use of MSTest (even though I prefer XUnit).&lt;/p&gt;

&lt;p&gt;First create a test project and add a test class. We will create our mock objects in the class initialize and then use them in separate test methods.&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;[TestClass]
&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; ExtensionTests
{
    ISlxApplication _slxApplication;

    [ClassInitialize]
    &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; ClassInitialize(TestContext testContext)
    {
        &lt;span style="color:green;"&gt;// Create the mock SlxApplication object
&lt;/span&gt;        &lt;span style="color:blue;"&gt;var&lt;/span&gt; slxApplication &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; Mock&amp;lt;ISlxApplication&amp;gt;();
        &lt;span style="color:green;"&gt;// Set the connection string you want to use for your testing
&lt;/span&gt;        slxApplication.Setup(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.ConnectionString).Returns(TestConstants.SlxDbConnectionString);
        

        &lt;span style="color:green;"&gt;// Create the BasicFunctions mock object
&lt;/span&gt;        &lt;span style="color:blue;"&gt;var&lt;/span&gt; basicFunctions &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; Mock&amp;lt;IBasicFunctions&amp;gt;();
        &lt;span style="color:green;"&gt;// Set the userid you want to use as current user for your testing
&lt;/span&gt;        basicFunctions.Setup(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.CurrentUserID()).Returns(TestConstants.UserId);
        slxApplication.Setup(x &lt;span style="color:navy;"&gt;=&lt;/span&gt;&amp;gt; x.BasicFunctions).Returns(basicFunctions.Object);
        

        _slxApplication &lt;span style="color:navy;"&gt;=&lt;/span&gt; slxApplication.Object;
    }
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Now you have a mock SlxApplication object you can use and pass to your .NET Extensions. The way we set it up you&amp;#39;ll have the following available.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SlxApplication.ConnectionString&lt;/li&gt;

&lt;li&gt;SlxApplication.BasicFunctions.CurrentUserID()&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You could of course wire up more items if your extension used them.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Using the Mock Objects and Running Your .NET Extensions from Visual Studio&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One of the best parts of setting up these mock objects (aside from the fact that you can create unit tests that won&amp;#39;t fail that reply on a running SalesLogix) is that you can now set up a test method to run your .NET Extension and use it from Visual Studio. What I like to do is create a test method that launches the extension and pass my mock objects to it.&lt;/p&gt;

&lt;p&gt;If your .NET Extension is a form (meaning your form implements IRunnable), you can add the following test method.&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;[TestMethod]
&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; RunExtensionForm()
{
    &lt;span style="color:blue;"&gt;var&lt;/span&gt; extensionForm &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; ExtensionForm();
    extensionForm.Initialize(_slxApplication, &lt;span style="color:blue;"&gt;null&lt;/span&gt;);
    extensionForm.Run(&lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { TestConstants.AccountId });
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Then, all you have to do is select that test method and click the &amp;quot;Run tests in current context&amp;quot; button in Visual Studio and your .NET Extension form will launch and it will have been passed the SlxApplication mock object and all will proceed as normal.&lt;/p&gt;

&lt;p&gt;If your .NET Extension is a UserControl (meaning your UserControl implements IRunnable), you can add the UserControl to a test form (in the example below the form is called&amp;nbsp;ExtensionTestForm)&amp;nbsp;and then add the following test method.&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;[TestMethod]
&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; RunExtensionUserControl()
{
    &lt;span style="color:blue;"&gt;var&lt;/span&gt; extension &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; ExtensionTestForm();
    extension.Initialize(_slxApplication, &lt;span style="color:blue;"&gt;null&lt;/span&gt;);
    extension.Run(&lt;span style="color:blue;"&gt;new&lt;/span&gt;[] { TestConstants.AccountId });
    extension.ShowDialog();
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;Same as before, select the method and use the &amp;quot;Run tests in current context&amp;quot; and the test form will open with your UserControl on it and will appear as though it were embedded in SalesLogix.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Wrapping It All Up&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;When all is said and done, I love being able to unit test my applications, but I have to admit, my favorite part is being able to simply run my .NET Extensions from Visual Studio without the need to add them to the .NET Extension Manager, do a full refresh in SalesLogix, and get to the area my extension loads on a record I can test with. Doing things this way gives you complete control.&lt;/p&gt;&lt;p&gt;And yes, all of this works with &lt;a href="http://customerfx.com/pages/crmdeveloper/2011/10/13/announcing-the-open-source-saleslogix-net-extensions-helper-library.aspx"&gt;the NetExtensionsHelper library I posted about earlier&lt;/a&gt; without changes :-)&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45244" 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/.NET+Extensions/default.aspx">.NET Extensions</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/Unit+Testing/default.aspx">Unit Testing</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Mock+Objects/default.aspx">Mock Objects</category></item><item><title>Announcing the Open-Source SalesLogix .NET Extensions Helper Library</title><link>http://customerfx.com/pages/crmdeveloper/2011/10/13/announcing-the-open-source-saleslogix-net-extensions-helper-library.aspx</link><pubDate>Fri, 14 Oct 2011 00:20:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45241</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=45241</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45241</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/10/13/announcing-the-open-source-saleslogix-net-extensions-helper-library.aspx#comments</comments><description>&lt;p&gt;If you&amp;#39;re working in the SalesLogix Windows (LAN) client, why not make as most use as possible of a modern development environment, language,&amp;nbsp;and tools? The SalesLogix .NET Extensions feature in the SalesLogix Windows client is one of the best, and likely least used, features in the SalesLogix Windows client development story. A choice bewteen using an out-dated development environment and VBScript, with no possibility of using source control or a true multi-developer experience verses using Visual Studio, with source control, a modern language and framework where the sky is the limit? I&amp;#39;ll take the latter any day. Still not convinced? The .NET Extensions Helper library comes to the rescue. This new open source project from Customer FX will make embedding .NET controls in SalesLogix a breeze.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Overview &amp;amp; How To Use&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The .NET Extension Helper is a library that will do all the heavy lifting to embed controls in SalesLogix. All you do is have your UserControl inherit from the FX.SalesLogix.NetExtensionsHelper.SalesLogixControl and then use a script class in SalesLogix to load the control and set the record context.&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s consider a very simple&amp;nbsp;example of a .NET Control on an Account tab. You want to display the current account&amp;#39;s contacts in a grid on this tab. Your .NET UserControl code will look something like this:&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; partial &lt;span style="color:blue;"&gt;class&lt;/span&gt; UserControl1 : FX.SalesLogix.NetExtensionsHelper.SalesLogixControl
{
    &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; UserControl1_SalesLogixRecordChanged(&lt;span style="color:blue;"&gt;string&lt;/span&gt; RecordID)
    {
        &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(&lt;span style="color:blue;"&gt;this&lt;/span&gt;.SlxApplication.ConnectionString))
        {
            conn.Open();
            &lt;span style="color:blue;"&gt;using&lt;/span&gt; (OleDbDataAdapter da &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; OleDbDataAdapter(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.Format(&lt;span&gt;&amp;quot;select lastname as LastName, firstname as FirstName, type as Type from contact where accountid = &amp;#39;{0}&amp;#39;&amp;quot;&lt;/span&gt;, RecordID), conn))
            {
                DataTable table &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; DataTable();
                da.Fill(table);
 
                dataGridView1.DataSource &lt;span style="color:navy;"&gt;=&lt;/span&gt; table;
            }
        }
    }
}&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;So, what are we looking at here? Basically, there&amp;#39;s extra code in that example that opens an ADO.NET connection to the SalesLogix database and gets a DataSet to bind to a DataGridView, but the important parts there is that the UserControl inherits from a special base class named &amp;quot;SalesLogixControl&amp;quot; and then wires up an event called SalesLogixRecordChanged which passes in the current record&amp;#39;s ID value. Whenever the record changes in SalesLogix, this event is fired and you&amp;#39;re passed the record ID. Simple.&lt;/p&gt;

&lt;p&gt;The above is the .NET side of things. There&amp;#39;s&amp;nbsp;only two lines of code needed in SalesLogix to drive this. In the example we have above, the SalesLogix form (the actual form in SalesLogix hosting this control), would include the following code:&lt;/p&gt;

&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;pre&gt;&lt;span style="color:green;"&gt;&amp;#39;Including Script - System:ExtensionControl Class
&lt;/span&gt;option explicit

&lt;span style="color:blue;"&gt;Dim&lt;/span&gt; ext

&lt;span style="color:blue;"&gt;Sub&lt;/span&gt; AXFormOpen(Sender)
    Set ext &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; ExtensionControl
    ext.Load &amp;quot;SampleExtension&amp;quot;, &amp;quot;SampleExtension.UserControl1&amp;quot;, Form.HWND, &lt;span style="color:blue;"&gt;True&lt;/span&gt;
&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;

&lt;span style="color:blue;"&gt;Sub&lt;/span&gt; AXFormChange(Sender)
    ext.CurrentID &lt;span style="color:navy;"&gt;=&lt;/span&gt; Form.CurrentID
&lt;span style="color:blue;"&gt;End&lt;/span&gt; &lt;span style="color:blue;"&gt;Sub&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;The code above simply includes a VBScript plugin named &amp;quot;ExtensionControl Class&amp;quot;. Then, in the form&amp;#39;s Open event it creates an instance of the ExtensionControl class and then tells it which .NET Extension to load, and passes the Windows handle (HWND) of where to embed the control (in this case it passes the handle, or HWND of the form itself). The &amp;quot;True&amp;quot; at the end tells it to resize the control to fill&amp;nbsp;all available space in that area. When the record changes, it passes that into the class which fires the event in your .NET UserControl. That is it.&lt;/p&gt;

&lt;p&gt;What you&amp;#39;ll end up with is this:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/NETExtensionLibrary_ExampleGrid.png"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/NETExtensionLibrary_ExampleGrid.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are other things available as well which you can make use of, such as passing a Subroutine from your VBScript to the .NET UserControl as a callback function. I&amp;#39;ll discuss more about that later.&lt;/p&gt;

&lt;p&gt;One of the biggest benefits you&amp;#39;ll have when using this, and .NET Extensions in general, is that you&amp;#39;ll get to use Sublogix for all data access which will drastically speed up development time. I&amp;#39;ve been working with a customer where we&amp;#39;ve been building out their SalesLogix Windows client using exclusively .NET Extensions and this library with Sublogix and it&amp;#39;s actually been enjoyable to work with. I&amp;#39;ve not been this happy working in the Windows client, well, ever.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Where Can You Get It?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All code for this is on github as an open source project. You can grab the .NET assembly and associated SalesLogix bundle from there and start rolling. I&amp;#39;ll try to put together a sample video of&amp;nbsp;how to go from download to first use next week.&lt;/p&gt;

&lt;p&gt;&lt;img border="0" align="absmiddle" src="http://customerfx.com/blogs/crmdeveloper/file-down.png" alt="" /&gt; &lt;a href="https://github.com/CustomerFX/NetExtensionsHelper" target="_blank"&gt;&lt;strong&gt;&lt;font size="3"&gt;Visit the NETExtensionHelper home on github&lt;/font&gt;&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;&lt;br /&gt;Grab everything you need, the assembly, the SalesLogix bundle, and a sample project&amp;nbsp;from the &lt;a href="https://github.com/CustomerFX/NetExtensionsHelper/downloads" target="_blank"&gt;Downloads&lt;/a&gt; section.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Best Of All, It&amp;#39;s&amp;nbsp;Open Source&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As I mentioned above, this is an open source project. If you&amp;#39;re using .NET Extensions and have some good ideas to add, I&amp;#39;d love to see some contributions. Just clone the repository, make some changes and then submit a pull request.&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45241" 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/.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/Custom+Controls/default.aspx">Custom Controls</category></item><item><title>Changes in Sublogix Version 1.2</title><link>http://customerfx.com/pages/crmdeveloper/2011/08/24/changes-in-sublogix-version-1-2.aspx</link><pubDate>Wed, 24 Aug 2011 19:08:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:45129</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=45129</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=45129</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/08/24/changes-in-sublogix-version-1-2.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve pushed version 1.2 of Sublogix to NuGet. There&amp;#39;s some changes in how the custom entity templates are created by default. In previous versions of Sublogix, the custom entity templates used the display names for tables and fields in SalesLogix to create classes and properties. This caused several problems such as:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Localized/International versions of SalesLogix had many characters in the display names that would cause isseues when used as table &amp;amp; field names.&lt;/li&gt;&lt;li&gt;If a display name was changed (user&amp;#39;s see these display names when building groups and several other places) then when the entities were generated again your properties would be different and you&amp;#39;d have to change code that references the old property name.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;The new change in version 1.2 of Sublogix now uses the table &amp;amp; field names by default for the entity class names and properties. There is an option to use the display names still if you&amp;#39;d like in the entity template settings file. This means that the built in entites in Sublogix will be using table name and field names for the entities rather than the display names as it used previously. So, if you&amp;#39;re upgrading Sublogix in an existing project you&amp;#39;ll need to do a one-time remapping of code from the old property names to the new ones where the display name was different than the field or table name. But at least you&amp;#39;ll now be able to avoid changing code if someone needs to change a display name somewhere. If you&amp;#39;d like to avoid this you can either just not upgrade to 1.2 of Sublogix or upgrade and change the template settings file to continue to use display names for the entity names and properties.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="3"&gt;Some Background on Entity Templates&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Sublogix uses Visual Studio T4 templates to generate code for the entities based on what the schema includes in your SalesLogix database. Out of the box, Sublogix includes an enity model based on the standard SalesLogix blank database. You can drop the templates into Visual Studio, modify the connection properties in the template settings file and then Visual Studio will transform the templates into an actual C# code file by connecting to your SalesLogix database and analyzing the tables &amp;amp; fields and then emitting the code for those tables &amp;amp; fields. When you use Sublogix, if all you need to do is work with the standard out of the box SalesLogix tables, you don&amp;#39;t need to use the templates at all - you can just use the entity model built into Sublogix. If you need to work with anything custom, such as custom fields to out of the box tables or completely custom tables, then you can use the entity templates to generate your entity model based on your database schema. &lt;/p&gt;&lt;p&gt;Field and table names will still be pascal cased and dashes and underscores removed for the entity names &amp;amp; properties. MYFIELDNAME will end up being Myfieldname and MY_FIELD_NAME will end up being MyFieldName. There&amp;#39;s a few other special circumstances, such as if the field name is the same as the table name, for those the value &amp;quot;Name&amp;quot; will be appended to the end. For example, the ACCOUNT field on the ACCOUNT table will end up being AccountName&amp;nbsp;(you can&amp;#39;t have a property the same name as the class it&amp;#39;s in). Also, it looks for ending &amp;quot;ID&amp;quot; and makes that &amp;quot;Id&amp;quot; and the built in CREATEDATE/USER &amp;amp; MODIFYDATE/USER will be properly cased. Using the field &amp;amp; tables names don&amp;#39;t end up as pretty, but it will be easier to work with going forward and less prone to errors and code changes.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="3"&gt;Getting Sublogix&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Sublogix continues to be distributed via the NuGet packaging system only. To date it&amp;#39;s had 240 downloads from NuGet since they started tracking downloads, that number doesn&amp;#39;t include any downloads before they started keeping track of that which was several versions into NuGet. How is this working? Would a non-NuGet option be worthwhile? If I were to make the Sublogix source code publically available on github would anyone be interested in contributing? There is much work to be done in the expression trees for using Linq expressions for the Repository.Find overload (it is currently pretty limited in the kinds of expressisons it can handle). Thoughts? Feedback?&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=45129" 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/General/default.aspx">General</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Sublogix/default.aspx">Sublogix</category></item><item><title>Writing Queries for the SalesLogix SData API</title><link>http://customerfx.com/pages/crmdeveloper/2011/05/31/writing-queries-for-the-saleslogix-sdata-api.aspx</link><pubDate>Tue, 31 May 2011 17:12:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44909</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=44909</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=44909</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/05/31/writing-queries-for-the-saleslogix-sdata-api.aspx#comments</comments><description>&lt;p&gt;In this fourth post in the SalesLogix SData series, I will introduce how to write queries for SalesLogix SData and will point to a useful resource as you get started, or more comfortable with SData.&lt;/p&gt;

&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;SData Query Language&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Be sure to first take a look at my last post which covers &lt;a href="http://customerfx.com/pages/crmdeveloper/2011/05/27/retrieving-data-via-sdata-for-saleslogix.aspx"&gt;how to retrieve data via the SData API&lt;/a&gt;. The ability to read data from SalesLogix via the SData API is only useful if you know how to control it. Reading all records from a table isn&amp;#39;t exactly useful.&amp;nbsp;Knowing how to control which records you&amp;#39;re retrieving is a must. Fortunately, that is easy, but it does take some knowledge of the SData Query Language.&lt;/p&gt;

&lt;p&gt;SData uses a language refered to as SData Query Lanaguage. So, what does this mean to you, another thing to learn? Not really. The syntax for the language is simple and easily guessable. If you know how to write NHibernate queries then this won&amp;#39;t look&amp;nbsp;much different. As a matter of fact, if you know how to write SQL queries, this won&amp;#39;t really look much different.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Example Query Conditions&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before we get too deep into things, let&amp;#39;s take a look at some sample query conditions using SData. As I showed in the previous post (&lt;a href="http://customerfx.com/pages/crmdeveloper/2011/05/27/retrieving-data-via-sdata-for-saleslogix.aspx"&gt;Retrieving Data via SData&lt;/a&gt;), you can use these conditions by adding them to the QueryValues collection of the SDataResourceCollectionRequest for the &amp;quot;where&amp;quot; part of the query.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Retrieve all&amp;nbsp;records created since 5/1/2011&lt;br /&gt;&lt;strong&gt;&amp;quot;CreateDate ge @2011-01-05@&amp;quot;&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Retrieve all account records whose Name starts with the letter A through L&lt;br /&gt;&lt;strong&gt;&amp;quot;left(AccountName,1)&amp;nbsp;between &amp;#39;A&amp;#39; and &amp;#39;L&amp;#39;&amp;quot;&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Retrieve all SalesOrders whose&amp;nbsp;State on it&amp;#39;s associated BillingAddress&amp;nbsp;is &amp;#39;AZ&amp;#39;&lt;br /&gt;&lt;strong&gt;&amp;quot;BillingAddress.State eq &amp;#39;AZ&amp;#39;&amp;quot;&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Retrieve all Accounts whose name contains the word Bank&lt;br /&gt;&lt;strong&gt;&amp;quot;AccountName like &amp;#39;%bank%&amp;#39;&amp;quot;&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You&amp;#39;ll see something that looks familiar and understandable with all of those.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Query Conditions, Functions,&amp;nbsp;&amp;amp; Operators&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So what are all the possible things you can use in an SData query? Rather than list them all here, I will point to the official SData specification where it outlines the available functions and operators for SData.&lt;/p&gt;

&lt;p&gt;&lt;img border="0" align="absmiddle" src="http://customerfx.com/sitefiles/1000/forward-alt.png" alt="" /&gt; &lt;a href="http://interop.sage.com/daisy/sdata/AnatomyOfAnSDataURL/QueryLanguage.html" target="_blank"&gt;SData Query Language&amp;nbsp; on SData Core Specification&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44909" 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/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/REST/default.aspx">REST</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SData/default.aspx">SData</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/API/default.aspx">API</category></item><item><title>Retrieving Data via SData for SalesLogix</title><link>http://customerfx.com/pages/crmdeveloper/2011/05/27/retrieving-data-via-sdata-for-saleslogix.aspx</link><pubDate>Fri, 27 May 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44894</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=44894</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=44894</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/05/27/retrieving-data-via-sdata-for-saleslogix.aspx#comments</comments><description>&lt;p&gt;If you followed my last two posts, you&amp;#39;ll know some &lt;a href="http://customerfx.com/pages/crmdeveloper/2011/03/28/an-overview-of-sdata-the-saleslogix-web-enabled-api.aspx"&gt;basics of what SData is&lt;/a&gt; and &lt;a href="http://customerfx.com/pages/crmdeveloper/2011/05/17/getting-started-with-sdata-for-saleslogix-installing-the-sdata-client-library.aspx"&gt;how to get it&lt;/a&gt; to use in your projects. In this post, we will take this a step further and look at how to actually use it, starting with how to query data from SalesLogix.&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Getting a list of Contacts&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let&amp;#39;s start with a basic query. For this example, we will retrieve all contacts whose last name starts with &amp;#39;Ab&amp;#39;. Take a look at the code (with comments to walk through each part)&lt;/p&gt;


&lt;table style="width:600px;table-layout:fixed;" cellspacing="0" cellpadding="0"&gt;&lt;tr&gt;&lt;td&gt;&lt;pre&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.SData.Client.Core;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.SData.Client.Atom;
&lt;span style="color:blue;"&gt;using&lt;/span&gt; Sage.SData.Client.Extensions;
&lt;span style="color:green;"&gt;//...
&lt;/span&gt; &lt;br /&gt;
 &lt;br /&gt;
&lt;span style="color:green;"&gt;// All requests require an ISDataService which provides
// the service location and user authentication values
&lt;/span&gt;ISDataService svc &lt;span style="color:navy;"&gt;=&lt;/span&gt; 
    &lt;span style="color:blue;"&gt;new&lt;/span&gt; SDataService(&lt;span&gt;&amp;quot;http://localhost/sdata/slx/dynamic/-/&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;lee&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;&amp;quot;&lt;/span&gt;);
 &lt;br /&gt;
&lt;span style="color:green;"&gt;// Now create the request, passing in the ISDataService we created 
// above
&lt;/span&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; req &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; SDataResourceCollectionRequest(svc);
 &lt;br /&gt;
&lt;span style="color:green;"&gt;// Tell it which kind of resource we want to access, in this case 
// Contacts. Note, this needs to match the values on the SData tab
// of the entity in Application Architect
&lt;/span&gt;req.ResourceKind &lt;span style="color:navy;"&gt;=&lt;/span&gt; &lt;span&gt;&amp;quot;Contacts&amp;quot;&lt;/span&gt;;
&lt;br /&gt;
&lt;span style="color:green;"&gt;// This part is optional (without it we&amp;#39;d be getting ALL contacts). 
// This is our where clause, or condition of which contacts we want.
// In this example we want all contacts whose last name starts with
// the value &amp;#39;Ab&amp;#39;. We need to use the exact property name as defined
// in the entity (case-sensitive).
&lt;/span&gt;req.QueryValues.Add(&lt;span&gt;&amp;quot;where&amp;quot;&lt;/span&gt;, &lt;span&gt;&amp;quot;LastName like &amp;#39;Ab%&amp;#39;&amp;quot;&lt;/span&gt;);
 &lt;br /&gt;
&lt;span style="color:green;"&gt;// Now read the data (or run the query)
&lt;/span&gt;AtomFeed feed &lt;span style="color:navy;"&gt;=&lt;/span&gt; req.Read();
 &lt;br /&gt;
&lt;span style="color:green;"&gt;// We now have the results in our AtomFeed variable, which is 
// basically a list of AtomEntry objects. To get to our data, 
// we need to read the payload from each AtomEntry and then we 
// can access the values for each field from it&amp;#39;s Values 
// dictionary. In this example, we&amp;#39;ll just write a few fields 
// from each contact to the console.
&lt;/span&gt;&lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (AtomEntry entry &lt;span style="color:blue;"&gt;in&lt;/span&gt; feed.Entries)
{ 
    &lt;span style="color:green;"&gt;// Get the payload for this entity
&lt;/span&gt;    SDataPayload payload &lt;span style="color:navy;"&gt;=&lt;/span&gt; entry.GetSDataPayload();
     &lt;br /&gt;
    &lt;span style="color:green;"&gt;// Now read some values from the payload. Note, the 
&lt;/span&gt;    &lt;span style="color:green;"&gt;// property names you use here need to match the property 
&lt;/span&gt;    &lt;span style="color:green;"&gt;// names defined for the entity (these are case-sensitive).
&lt;/span&gt;    &lt;span style="color:blue;"&gt;string&lt;/span&gt; account &lt;span style="color:navy;"&gt;=&lt;/span&gt; payload.Values[&lt;span&gt;&amp;quot;AccountName&amp;quot;&lt;/span&gt;].ToString();
    &lt;span style="color:blue;"&gt;string&lt;/span&gt; contactName &lt;span style="color:navy;"&gt;=&lt;/span&gt; payload.Values[&lt;span&gt;&amp;quot;NameLF&amp;quot;&lt;/span&gt;].ToString();
    &lt;span style="color:blue;"&gt;string&lt;/span&gt; title &lt;span style="color:navy;"&gt;=&lt;/span&gt; payload.Values[&lt;span&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;].ToString();
     &lt;br /&gt;
    Console.WriteLine(&lt;span&gt;&amp;quot;{0}, {1} from {2}&amp;quot;&lt;/span&gt;, contactName, account, title);
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;


&lt;p&gt;That&amp;#39;s not too bad. You do have to access the fields by string name, which means you don&amp;#39;t get intellisense, but at least it&amp;#39;s easy code to write. There are ways to retrieve the schema for an entity which I will look at in a future post.&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44894" 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/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SData/default.aspx">SData</category></item><item><title>Getting Started with SData for SalesLogix - Installing the SData Client Library</title><link>http://customerfx.com/pages/crmdeveloper/2011/05/17/getting-started-with-sdata-for-saleslogix-installing-the-sdata-client-library.aspx</link><pubDate>Tue, 17 May 2011 16:00:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44887</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=44887</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=44887</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/05/17/getting-started-with-sdata-for-saleslogix-installing-the-sdata-client-library.aspx#comments</comments><description>&lt;p&gt;In my previous post, an &lt;a title="An Overview of SData - The SalesLogix Web Enabled API" href="http://customerfx.com/pages/crmdeveloper/2011/03/28/an-overview-of-sdata-the-saleslogix-web-enabled-api.aspx"&gt;Overview of SData&lt;/a&gt;, I outlined the working parts and anatomy of the web enabled API for SalesLogix known as SData. In this post I will show you how to take your first step with how to get the SData Client Library.&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;Getting&amp;nbsp;the SData Client Library?&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As I mentioned in my previous post, the best route to take when using SData is to use the SData Client Library. While it is possible to parse the payload XML in an SData feed, using the client library will make this a very easy task. There are a few places to get the SData Client Library, however, the best and easiest place is from the NuGet packaging system. NuGet is a packaging system that you can install as an extension in Visual Studio 2010. You can get NuGet from the Microsoft Extension Library &lt;a href="http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c" target="_blank"&gt;here&lt;/a&gt;. Once it is installed in Visual Studio, you can easily add libraries to projects - including the SData Client Library.&lt;/p&gt;

&lt;p&gt;With NuGet installed, you can right click on the References folder of your project and select &amp;quot;Add Library&amp;nbsp;Package Reference&amp;quot;&lt;/p&gt;

&lt;p&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/SData-AddReference.png" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;The NuGet dialog will open and you can search for SData and you&amp;#39;ll find the SData Client Library.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/SData-SearchReference.png" target="_blank"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/SData-SearchReference-Small.png" alt="" /&gt;&lt;br /&gt;Click for larger image&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;When you find it, click the &amp;quot;Install&amp;quot; button and it will be downloaded and added to your current project. Some of the other ways you can get the client library is direct from &lt;a href="https://github.com/SageScottsdalePlatform/SDataCSharpClientLib" target="_blank"&gt;it&amp;#39;s github repository&lt;/a&gt;. Stay tuned next time when I&amp;#39;ll show you how to use the client library and easily work with SData.&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44887" 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/SalesLogix/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SData/default.aspx">SData</category></item><item><title>An Overview of SData - The SalesLogix Web Enabled API</title><link>http://customerfx.com/pages/crmdeveloper/2011/03/28/an-overview-of-sdata-the-saleslogix-web-enabled-api.aspx</link><pubDate>Mon, 28 Mar 2011 19:56:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44714</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=44714</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=44714</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/03/28/an-overview-of-sdata-the-saleslogix-web-enabled-api.aspx#comments</comments><description>&lt;p&gt;Chances are, if you work or use SalesLogix (or any Sage product) you&amp;#39;ve heard of SData by now. SData is a basically a web enabled API for SalesLogix allowing you to interact with SalesLogix data from an external application or&amp;nbsp;website. The great thing about SData is that it is a specification that is implemented via RESTful web services. This means you&amp;#39;re not limited to using SData with a particular technology (such as exclusively via .NET). In a nutshell, SData works via sending and receiving XML payloads via a URL. Pretty simple. This article will take a high-level overview of SData as an introduction (which means there will be several more in-depth posts on the way).&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;SData Versions&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We started to see parts of SData as early as SalesLogix 7.5 and even more in 7.5.1. While these versions did work, SData wasn&amp;#39;t exactly considered fully-baked until SalesLogix 7.5.2 (and even more functionality added in 7.5.3 such as picklist support). Needless to say, there were significant changes in 7.5.2 from it&amp;#39;s earlier beta versions in 7.5.1 and prior. These changes were breaking changes, so if you&amp;#39;re on 7.5 or 7.5.1 what I will be outlining here won&amp;#39;t fit completely. The URL structure will be different and the way the payload is deilivered is quite different (but you&amp;#39;ll still get the general ideas from this article, just bear in mind you&amp;#39;ll have these changes to deal with).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The SData Server&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The SData server is deployed from the Application Architect as a web portal. However,&amp;nbsp;I do want to point out that using SData &lt;strong&gt;does &lt;u&gt;not&lt;/u&gt; mean&lt;/strong&gt; you have to be using the SalesLogix Web client. You can be an all LAN implementation and still deploy an SData portal. You only need to be on&amp;nbsp;a version that includes support for SData. The SData deployment will create an &amp;quot;sdata&amp;quot; application in the deployment location (so you will have this next to your typical &amp;quot;slxclient&amp;quot; folder if you have a&amp;nbsp;SalesLogix Web deployment). If you have a SalesLogix Web deployment then also deploying SData can be simpler since SData also uses the same entity model.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The Anatomy of an SData URL&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using SData comes down to an XML payload exchange via a URL. Knowing how these URLs are formed is important, and luckily, they are&amp;nbsp;pretty easy to understand. A sample SData URL to access a list of Accounts would look like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;http://server:port/sdata/slx/dynamic/-/Accounts&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Let&amp;#39;s break down what all those values mean:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;server &amp;amp; port:&lt;/strong&gt; These are the server address and port of your SalesLogix web deployment.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;sdata:&lt;/strong&gt; This is the deployment folder for the SData portal. As I mentioned earlier, the SData portal will reside as a folder named sdata next to your slxclient portal deployment.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;slx:&lt;/strong&gt; The application name. SData is a specification that is currently used by several Sage applications, not just SalesLogix.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;dynamic:&lt;/strong&gt; This is the contract name. I won&amp;#39;t get too deep into this now and may address this in a future post, but an SData deployment can support several integration contracts. For now, just stick with dynamic.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;-:&lt;/strong&gt; This part of the URL defines the dataset to use. Stick with the hyphen &amp;quot;-&amp;quot; which means the default dataset (or that the application only supports a single dataset).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Accounts:&lt;/strong&gt; This is a resource to access, more on this next.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;SData Resources&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;A resource is the &lt;em&gt;entity type or table&lt;/em&gt; that you wish to query (or add, modify, delete, etc). Not all entities or tables are exposed by default. You get to pick and choose which entities are exposed via SData in the Application Architect (open the entity and you&amp;#39;ll see an SData tab ewhere you can specify whether the entity is exposed or not.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;Sample SData URLs&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Here&amp;#39;s some useful sample SData URLs you can use to query SalesLogix data via your browser. This is a great way to test things. When you access one of these URLs in your browser you&amp;#39;ll be promoted for your SalesLogix login credentials. One thing to keep in mind as you use these, normal SalesLogix security applies, so you&amp;#39;ll only see records that the user you&amp;#39;re logged in with can see.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Get a list of all adapters or resources exposed by the dynamic contract&lt;br /&gt;http://server:port/sdata/slx/dynamic/-&lt;/p&gt;&lt;p&gt;Get the schema for an entity (account entity)&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/$schema(Account)&lt;br /&gt;or&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/accounts/$schema&lt;/p&gt;&lt;p&gt;Get a list of all products&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/product&lt;/p&gt;&lt;p&gt;Get first 10 products only&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/product?count=10&amp;amp;startIndex=1&lt;/p&gt;&lt;p&gt;Get a specific product by ID&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/product(&amp;#39;YDEMOA000002&amp;#39;)&lt;/p&gt;&lt;p&gt;Get child entities for an entity (contacts for account)&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/Accounts(&amp;#39;AGHEA0002669&amp;#39;)/Contacts&lt;/p&gt;&lt;p&gt;Query accounts where AccountName starts with &amp;#39;Ab&amp;#39;&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/accounts?where=AccountName like &amp;#39;Ab%&amp;#39;&lt;/p&gt;&lt;p&gt;Query accounts where AccountName equals &amp;quot;Abbott Ltd.&amp;quot;&lt;br /&gt;http://server:port/sdata/slx/dynamic/-/accounts?where=AccountName eq &amp;#39;Abbott Ltd.&amp;#39;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size="4"&gt;The SData Client Library&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you&amp;#39;re using .NET with SData, one of the more easy ways to work with it is using the SData Client Library developed by Sage. When using the SData Client Library you don&amp;#39;t necessarily need to know how to structure the SData URLs, but that certainly does help. The source&amp;nbsp;for this lirbary is &lt;a href="https://github.com/SageScottsdalePlatform/SDataCSharpClientLib" target="_blank"&gt;available on github&lt;/a&gt; as well. I will definitely have more posts on this in the future including how to use, best ways to get this library and more.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;blockquote style="margin:0px;"&gt;&lt;img src="http://customerfx.com/themes/customerfx/images/custom/light-on.png" align="absmiddle" alt="" /&gt; &lt;b&gt;&lt;a href="http://customerfx.com/pages/crmdeveloper/pages/saleslogix-sdata-series.aspx"&gt;View the SalesLogix SData series index&lt;/a&gt;&lt;/b&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44714" 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/default.aspx">SalesLogix</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/REST/default.aspx">REST</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/SData/default.aspx">SData</category></item><item><title>Errors about "getcp" in Git Extensions for SalesLogix</title><link>http://customerfx.com/pages/crmdeveloper/2011/03/15/errors-about-quot-getcp-quot-in-git-extensions-for-saleslogix.aspx</link><pubDate>Tue, 15 Mar 2011 20:40:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44664</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=44664</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=44664</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/03/15/errors-about-quot-getcp-quot-in-git-extensions-for-saleslogix.aspx#comments</comments><description>&lt;p&gt;Some of you have reported to me via &lt;a href="http://twitter.com/RyanFarley" target="_blank"&gt;Twitter&lt;/a&gt; that you&amp;#39;ve been experiencing errors mentioning &amp;quot;getcp&amp;quot; when using Git Extensions for SalesLogix.&lt;/p&gt;
&lt;p&gt;The complete error message is something like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;font color="red"&gt;Git found but version &amp;#39;getcp&amp;#39; is not recognized as an internal or external command, operable program or batch file.&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This error isn&amp;#39;t occuring for everyone, but for those experiencing this, it pretty much makes Git Extensions for SalesLogix useless and inoperable. You&amp;#39;ll be seeing the same error when using Git Extensions directly as well. This error comes from a problem with mSysGit, the Windows Git port. It comes with a command interpreter cmd file that uses the getcp.dll and it&amp;#39;s not loading it like it should.&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;font size="4"&gt;The Solution&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The fix for this is easy. Basically, we&amp;#39;ll be switching from using the Git command intepreter from the git.cmd to git.exe. Then both Git Extensions for SalesLogix &lt;em&gt;and&lt;/em&gt; Git Extensions itself will work just fine and avoid the issue. You&amp;#39;ll want to open the Git Extensions settings. You can get to this by going to the &amp;quot;Settings&amp;quot; menu in Git Extensions, or in Application Architect (with Git Extensions for SalesLogix installed) by going to the &amp;quot;Git Extensions&amp;quot; menu and selecting &amp;quot;Git Extensions Settings&amp;quot;.&lt;/p&gt;
&lt;p&gt;In the Settings dialog, on the &amp;quot;Git&amp;quot; tab you&amp;#39;ll see an entry labeled &amp;quot;Command used to run git&amp;quot; at the top. The value there will currently either show &amp;quot;git.cmd&amp;quot; by itself or the full path to git.cmd. Click the Browse button to locate the git.exe which is located in the Bin folder of the Git installation directory (under Program Files). Mine looks like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/gitsettings_command.png"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/gitsettings_command.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can close the settings and all should work now. &lt;strong&gt;&lt;em&gt;Keep in mind there&amp;#39;s no need to make this change if you&amp;#39;re not currently experiencing this problem.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44664" 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/Git/default.aspx">Git</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Git+Extensions+for+SalesLogix/default.aspx">Git Extensions for SalesLogix</category></item><item><title>SalesLogix Group Explorer Updated</title><link>http://customerfx.com/pages/crmdeveloper/2011/02/16/saleslogix-group-explorer-updated.aspx</link><pubDate>Wed, 16 Feb 2011 22:06:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44562</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=44562</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=44562</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2011/02/16/saleslogix-group-explorer-updated.aspx#comments</comments><description>&lt;p&gt;The SalesLogix Group Explorer has become a widely used tool for tracking down issues with SalesLogix groups, allowing you to see the group definition, conditions, layout, and underlying SQL for any SalesLogix&amp;nbsp;group. Best of all it&amp;#39;s a free tool. This tool has been updated to work on 64-bit computers as well as all versions of SalesLogix from version 7.2 up to the most recent version 7.5.3.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;ve not yet tried the SalesLogix Group Explorer, take a look at the screenshot below and you&amp;#39;ll find a link to the download page after the image.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/blogs/crmdeveloper/GroupExplorer-New.png"&gt;&lt;img border="0" src="http://customerfx.com/blogs/crmdeveloper/GroupExplorer-New-Small.png" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;#39;d like to download the SalesLogix Group Explorer, visit the download page here:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://customerfx.com/pages/cfxproducts/2007/01/01/saleslogix-group-explorer.aspx"&gt;&lt;font size="4"&gt;&lt;strong&gt;Download the SalesLogix Group Explorer&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44562" 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/Troubleshooting/default.aspx">Troubleshooting</category><category domain="http://customerfx.com/pages/crmdeveloper/archive/tags/Tools/default.aspx">Tools</category></item><item><title>Background Tasks for SalesLogix - A New Open Source Project from Customer FX</title><link>http://customerfx.com/pages/crmdeveloper/2010/12/06/background-tasks-for-saleslogix-a-new-open-source-project-from-customer-fx.aspx</link><pubDate>Mon, 06 Dec 2010 17:10:00 GMT</pubDate><guid isPermaLink="false">e15581aa-2787-4c59-a940-524c09f5d256:44381</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=44381</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://customerfx.com/pages/crmdeveloper/commentapi.aspx?PostID=44381</wfw:comment><comments>http://customerfx.com/pages/crmdeveloper/2010/12/06/background-tasks-for-saleslogix-a-new-open-source-project-from-customer-fx.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;d like to introduce a new open source project from Customer FX that allows you to create and run background tasks in the SalesLogix Web platform. &lt;b&gt;&lt;i&gt;Background Tasks for SalesLogix&lt;/i&gt;&lt;/b&gt; provides a framework for you to use to build custom tasks that will run on an interval and perform some action in the background while the SalesLogix Web platform is running.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;font size="4"&gt;&lt;span style="font-weight:bold;"&gt;What Does Background Tasks for SalesLogix Do?&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;Background Tasks for SalesLogix has two parts. You get both parts by simply installing a bundle. The first part installs as a service in the SalesLogix Portal and provides the engine for running tasks. You create tasks for this engine by creating a DLL that inherits from a particular base class and then add your DLL to the Bin folder of the Support Files for the portal. You wire up and configure your DLL to be loaded by editing a config file provided by the Background Tasks for SalesLogix bundle. Once a user logs into the SalesLogix portal the service starts and begins executing your task on the interval you defined for it. The second part is a administrative console screen that you view inside the portal. This console allows you to see and monitor any background tasks and pause &amp;amp; start them as needed.&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;font size="4"&gt;&lt;span style="font-weight:bold;"&gt;Background Tasks for SalesLogix Demo&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;The following video will give you the best visual picture of what Background Tasks for SalesLogix does and how to create your own custom background task.&lt;/p&gt;

&lt;p&gt;
&lt;object height="425" width="580"&gt;
&lt;param name="movie" value="http://www.youtube.com/v/APL-j1GCsYw&amp;amp;hl=en_US&amp;amp;fs=1?rel=0"&gt;
&lt;param name="allowFullScreen" value="true"&gt;
&lt;param name="allowscriptaccess" value="always"&gt;
&lt;embed src="http://www.youtube.com/v/APL-j1GCsYw&amp;amp;hl=en_US&amp;amp;fs=1?rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="425" width="580"&gt;&lt;/object&gt;
&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="http://www.youtube.com/watch?v=APL-j1GCsYw" target="_blank" title="Watch the Background Tasks for SalesLogix demo video on YouTube"&gt;&lt;img src="http://customerfx.com/blogs/crmdeveloper/play.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;&lt;font size="3"&gt;&lt;b&gt;&lt;a href="http://www.youtube.com/watch?v=APL-j1GCsYw" target="_blank" title="Watch the Background Tasks for SalesLogix demo on YouTube"&gt;Watch the Background Tasks for SalesLogix Demo on YouTube&lt;/a&gt;&lt;/b&gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#404040"&gt;&lt;i&gt;The video will open on youtube.com in a new window&lt;/i&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;


&lt;p&gt;&lt;br /&gt;&lt;font size="4"&gt;&lt;span style="font-weight:bold;"&gt;Download Background Tasks for SalesLogix&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;So, how do you get Background Tasks for SalesLogix? Visit the &lt;a href="https://github.com/CustomerFX/SalesLogixBackgroundTasks/" target="_blank"&gt;Background Tasks for SalesLogix home on Github&lt;/a&gt;. From there, you can click the Downloads button and download the SalesLogix bundle. That gives you everything you need. &lt;/p&gt;

&lt;table cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;&lt;td&gt;
&lt;img src="http://customerfx.com/blogs/crmdeveloper/file-down.png" align="absmiddle" border="0" alt="" /&gt;&amp;nbsp;
&lt;/td&gt;
&lt;td&gt;
&lt;font style="font-weight:bold;" size="3"&gt;&lt;a href="https://github.com/CustomerFX/SalesLogixBackgroundTasks" target="_blank"&gt;Visit Background Tasks for SalesLogix on github&lt;/a&gt;&lt;br /&gt;&lt;a href="https://github.com/downloads/CustomerFX/SalesLogixBackgroundTasks/Background%20Tasks%20for%20SalesLogix%20v1.0.1.zip"&gt;Download the current v1.0.1 SalesLogix bundle&lt;/a&gt;&lt;/font&gt;&lt;br /&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Download it and take it for a spin. I&amp;#39;d love any feedback you might have on how to improve it. &lt;br /&gt;&lt;/p&gt;
&lt;img src="http://customerfx.com/aggbug.aspx?PostID=44381" 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/Open+Source/default.aspx">Open Source</category></item></channel></rss>