Tags

CRM & Technology Management


Sales and Marketing Advisor


Sign Up For the Newsletter

Login

Welcome to the Technology Advisors Blog!!

A short description about your blog
Aug 17
2011

Soothing Ointment for a Minor Irritation

Posted by: Greg Andorka in MyBlog

Tagged in: Tips & Tricks

Greg Andorka

Sometimes all you need is a small change to convert an irritated customer. This was the case recently when one of our clients submitted a ticket about the "Check for Duplicates" button on the Insert Contact/Account screen.

It seems that even though they filled out fields on the form and pressed the "Check for Duplicates" button, the screen is displayed but no duplicates are found. I guess the argument could be made that this is a training issue, because all you need to do is check the fields you're interested in searching on and press the button again. Therein lies the source of the irritation. The client felt that filling out the form and pressing "Check for Duplicates" should do the trick.

A little sleuthing on our part resulted in a simple change involving two lines of code, also known as 'the ointment.'

Where and how to apply the ointment:

The change is applied to the code file ContactCheckForDuplicates.ascs.cs in the Sage SalesLogix portal. At first it would seem that all you need to do is check all the boxes and you're good to go, but alas, the form doesn't search when it is first opened anyway. This issue is easily solved by adding a line to the OnPreRender method as shown in the code snippet below.

    protected override void OnPreRender(EventArgs e)
    {
        try
        {
            if (Visible && DuplicateProvider != null)
            {
                LoadMatchFilters();
                LoadSourceEntity();
                Mode.Value = "Load";
                LoadPotentialMatches();
            }
        }
        catch (Exception exp)
        {
            throw new ApplicationException(GetLocalResourceObject("LoadErrorMSG").ToString());
        }
    }

The bolded line is a setting that is used by the next line "LoadPotentialMatches()" to perform the search.

Next we have to check all the check boxes to give it something to search on. This is done with a change to the "LoadMatchFilters()" method as shown in the snippet below.

            item.Value = propertyFilter.PropertyName;
            //item.Selected = propertyFilter.Enabled;
            item.Selected = true;
            chklstFilters.Items.Add(item);

Again, the bolded line is the change to make. Be sure to comment out the line above it. 

Now granted this is not an elegant hack, but our goal is to minimize costs and apply a little soothing ointment to a minor irritation.

Jul 21
2011

SalesLogix Web and Database Views

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

Adding a database view into the SalesLogix web architecture can be a tricky process, due mostly to the fussiness of NHibernate. What follows is a step-by-step guide to help you through the process.

Problems at the end of the process can be avoided by following these rules when designing your view.

1.    The view name cannot start with the letter I.
2.    The view name and fields must be capitalized.
3.    The view fields must not have spaces in them.
4.    The view key field must be of type char(12).  You can accomplish this with a simple Cast or Convert SQL function (in MS SQL Server).

IMPORTANT: If the key field does not have a database type or char(12) you will get the error "Year, Month, and Day parameters describe an un-representable DateTime" at runtime.

Once your view is working the way you want, the next step is to enable it in DB Manager. 

1.    Open the Architect or Administrator tool and launch DB Manager.  2.    Right click on your view and select Properties.
3.    Click the “Enable” button, and click OK.
4.    Right click on the key field of your enabled view and select properties.
5.    Verify that the “Field Type” box reads “SLX Standard ID”.

I have seen situations where the view's key field is not populated in the RESYNCTABLEDEFS table. This can be easily checked with the query:

select * from ResyncTableDefs where TableName = ‘my view name’

If it is missing, then simply add it with the query:

Update ResyncTableDefs set KeyField = ‘my key field name’ where TableName = ‘my view name’

We are now ready to add our view as an entity.

The process is the same as adding any other table from the database. Note that any relationships that you create from an entity based on a database view should have the Cascade property set to "None" or "Not Applicable" since the underlying database view cannot be directly changed.

Jul 12
2011

Viewing the Outside World From Within SalesLogix

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

There are many situations where a user needs, or would like to have, access to web based information that is not stored in SalesLogix. We would like to integrate access to other information from within SalesLogix so the user sees a single, seamless application. A couple of approaches for this will be described that use techniques both dependent, and independent, or SalesLogix framework.

The first, and simplest, approach is to show external data on a tab in one of the main views. We've all seen this demonstrated a thousand times. All you need to do is all the SalesLogix "Dynamic Web Content" control to a form and populate the "Dynamic URL" property.

The "Dynamic URL" property supports a syntax that allows you to dynamically populate a query string on the URL with the current entity's properties in a codeless way. The syntax for referencing an entity's properties is ${.}. Here is an example from the Application Architect help file that displays the location of the current entity on a Google map.

http://maps.google.com/maps?q=${Address.Address1},+${Address.City},+${Address.State}+${Address.PostCode}&sll=37.0625,-95.677068&sspn=23.875,57.630033&hl=en&ie=UTF8&t=h&z=16&iwloc=addr

This works great if there is no variation in the resource or query portions of the URL.

Another approach would be to display the data in a new browser tab or window. There are a number of ways to do this, and we will describe one that uses JavaScript in the client browser to accomplish this task.

Our solution is to add a button to a quick form, and use the onClientClick event of the button to execute a piece of JavaScript to open a new window/tab. This seems straightforward enough. The only tricky part is to inject the JavaScript code onto the page in an ASP/SLX appropriate way. To do this we will add the following code to the form Load Actions.

Sage.Entity.Interfaces.<ISomeEntity> myentity = this.BindingSource.Current as Sage.Entity.Interfaces.<ISomeEntity>;

string sURL =
string.Format("http://www.mycompanywebsite.com.com/DataSite/GetMeInfo?frm={0}&id={1}", FormName, MyEntity.Id.ToString());

<MyButtonControlID>.OnClientClick = "window.open('" + sURL + "', '', 'directories=no,location=no,menubar=no,pageXOffset=0px,pageYOffset=0px,scrollbars=yes,status=no,titlebar=no,toolbar=yes');";

ClientBindingMgr.RegisterSaveButton(<MyButtonControlID>);

This approach has the advantage of showing the URL in a new browser window, and gives us the freedom to build the complete URL in code without the restriction of having a predefined URL template, as in the first example.

The disadvantage of this approach is that it still requires a round trip to the server, and the associated performance hit, just to execute the code. Ugly!

Our third and final approach is to get everything to run in the client browser and still live within the confines of ASP/SLX.

As you might suspect, there are tricks to getting this to work also. The first is to use the non-standard HTML attribute pin="pin" in the script tag in order to get ASP to leave our code on the page. Here is an example. We could have just as easily put our code in an external file, but we would still need the non-standard "pin" attribute in the script tag.

    <script pin="pin" type="text/javascript">  

    function showWin( someURL )

    {

        // put any preprocessing here

        window.open(someURL, '', 'directories=no,location=no,menubar=no,pageXOffset=0px,pageYOffset=0px,scrollbars=yes,status=no,titlebar=no,toolbar=yes');

    }

    </script>

Next, we need to use a control that will execute our JavaScript function, showWin(), directly without posting to the server first. Our solution to this depends on using a SmartPart, and placing our control on it. For instance, just add a simple anchor tag <a href=”javascript:showWin()” >Show the window</a> to the appropriate place on your page.

These three approaches give varying degrees of flexibility when linking to the outside world. Each has a place in the developers' toolbox to accommodate the variety of situations that may arise.

May 11
2011

SalesLogix Web Dashboards and Sales Processes (3 of 3)

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

Adding Dashboard Content

We are now ready to put the pieces together.  Log on to the web client and click on the Welcome navigation item.  Right click on one of the tabs, or create a new one, and select “Add Content” from the menu.  When the Add New Content dialog box appears, click the “Add” button under the “Funnel Chart” item.  Fill out the “Funnel Chart Setting” dialog as show below.



Note that the opportunity filter we created in the last step is now available as a Dimension for our funnel chart.  Add the “Boats” Sales Process to some opportunities and complete a variety of stages.  The result should look similar to the funnel chart below.



Final Thoughts

This approach allows us to build any number of Sales Processes and Filters and report on them through dashboard charts.  Furthermore, since the group content is automatically filtered on the users’ security, the chart will also be filtered by security.

May 10
2011

SalesLogix Web Dashboards and Sales Processes (2 of 3)

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

Defining Filters

Open Application Architect and in Project Explorer expand Entity Model > Packages > SalesLogix Application Entities > Opportunity > Filters.  Right click on Filters and click on “New Filter”.  Build a “Boats” filter as shown in the screen shot.  There are a number of things to be aware of here.
•    The “Type” of the filter must be “range”.
•    The filter property “Available for Analytics” must be set to TRUE.  This enables the filter to show up in the dashboard Dimension drop down list when creating a Funnel Chart.
•    The “Name” column in the range grid must match the - format from the Sales Process described above for each stage in the Sales Process.  This is what enables the Filter to report on the Sales Process.
•    The “Property” property must be “Stage”, since this is the field that the Sales Process populates as it is used.  It provides the link between the filter and the Sales Process for reporting.
•    Finally, the values in the “Display Name”, “Upper” and “Lower” columns for each row in the range grid must have the same value.

May 09
2011

SalesLogix Web Dashboards and Sales Processes (1 of 3)

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

The SalesLogix web client provides users with both Dashboards and Sales Processes straight out of the box.  However, combining the two to display the state of your sales process in meaningful ways is murky at best.  What follows then is a basic “how-to” for configuring these two features to work together.  This series of blogs, is not intended to be  a discussion on how to use these features, as each company will have its own approach to processes and reporting.
The configuration consists of three steps, defining a Sales Process, defining Filters, and bringing them together to display information in the dashboard.
This first blog will talk about defining a Sales Process. You should be comfortable working in the LAN Architect and the Application Architect tools.

Defining a Sales Process

Open Architect and go to Manage > Sales processes…
For our example we will define and report on a “Boat Process” with stages as shown in the middle pane below. 

SalesLogix Manage Sales Processes


It is important to note the Order and Stage Name columns because these 2 columns are concatenated with a dash between them as -.  This is the value stored in the Opportunity Stage column in the database as the user goes through the Sales Process and is the current stage that the user is on.  This fact will be used later when building the group filters.

Apr 27
2011

Export Groups Containing Pick List Values to a File in SalesLogix

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

Many times when building a group, some of the columns will be required to display a value from a pick list.  This is easily accomplished by setting the “Format Type” property of the column to the value “Picklist Item”.  However, if the group is to be exported to a file, e. g. Excel, you will notice that the columns displaying values from a Pick List contain the internal code for the item instead of the value in the exported file.  This is because the data retrieved for exporting to a file does not have the formatting applied to columns as the Group Manager would normally do.

The solution to this problem is to simulate what the “Picklist Item” formatting does.  This should be straight forward for an Admin user but may be confusing to an end user trying to build a group for exporting on their own.  Simply click on “create a local join” in the Query Builder.  Then, select the picklist table as the child for the columns that have the “Picklist Item” format type in the Query Builder.  The trick here is to know that your picklist column will always map to the “ItemID” column in the PickList table in the Join Editor.  Make sure that you select “Left” as the join type or you may filter out rows that do not have a pick list value.
Export Groups in SalesLogix

Click OK, and the Picklist table will now be displayed as a child of the table you created a local join to.  To get the value form Picklist table, click on the child picklist table you just added, the select “Text” from the list, as show in the screen below, and add it to your group, changing the “Caption” property as appropriate.

Your exported file will now contain the value from the picklist instead of the internal code.
Repeat this procedure for each column formatted as a “Picklist Item”.

Apr 20
2011

SalesLogix - Adding SLX Address Lists to the Outlook Addressing Tab

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

Adding Sage SalesLogix Address Lists to the Outlook Addressing tab allows users to perform contact name resolution. Contact name resolution occurs when a user types a contact name in the To, Cc, or Bcc fields in an e-mail message. Outlook then reconciles the contact name with the information in the Sage SalesLogix Address List. In addition to contact names, you can add Account and/or Opportunity Address Lists to reconcile Sage SalesLogix account, opportunity, ad-hoc groups, and user names.

Note    This section applies to Standard Outlook Integration in a Network environment. The following steps are not required if you are implementing Advanced Outlook Integration, Intellisync for SalesLogix, or Standard Outlook Integration on the Web.

To add
:
1.    In Microsoft Outlook, on the Tools menu, click Address Book.
The Address Book dialog box appears.
2.    On the Tools menu, click Options.
3.    In the Addressing dialog box, click Add.
4.    In the Add Address List dialog box, scroll to the SalesLogix Address Book listing, and select an address list (for example, Contacts).
5.    Click Add.
6.    Continue adding the appropriate Sage SalesLogix address lists, and when finished, click Close.
7.    In the Addressing dialog box, click OK.
8.    Close the Address Book dialog box.

Apr 18
2011

SalesLogix - Activating Advanced Outlook Integration

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

When Advanced Outlook Integration is activated, the following features are enabled. All other Advanced Outlook Integration features require no activation.  This information can also be found in the Sage SalesLogix Implementation Guide v7.5.
•    The Attendee Availability tab appears when a user schedules a meeting or phone call in the Sage SalesLogix Client, which automatically places the request on the users’ Sage SalesLogix and Outlook calendars.
•    When a user accepts a meeting invitation in Outlook, the meeting is automatically placed on the user’s Sage SalesLogix and Outlook calendars. Internet Only Mode is not recommended for Advanced Outlook Integration.

To Activate:
1.    On the Administrator Tools menu, click Options, and then click the Outlook tab.
2.    Select the Activate Advanced Outlook Integration check box.
After activating Advanced Outlook Integration, you can add Internet domains that you want to exclude from Send SLX functionality. When you add a domain, e-mail messages are not recorded to history for users in that domain and e-mail messages from users in the domain do not contain the “Flag for Follow up.”
3.    Click Add.
4.    In the New Domain Entry dialog box, type the domain name.
Use the format sage.com or employee@sage.com. Domain exclusion settings are case-sensitive.
5.    Click OK.
6.    Repeat steps 3-5 to add additional domains.

Additional configuration is required for Standard Outlook Integration and Intellisync for SalesLogix. Configuration steps are detailed in Chapter 6, “Installing Network Clients”,  Chapter 11, “Configuring the Web Client”, and Appendix B, “Configuring Intellisync for SalesLogix”.

Apr 11
2011

SLX v7.5.3 WEB non-existant JavaScript file

Posted by: Greg Andorka in MyBlog

Tagged in: SalesLogix

Greg Andorka

I ran across an issue in the SLX Web Client v7.5.3 where the browser is trying to load a JavaScript file that does not exist on the web site.  The problem is that the file has been misnamed in the VFS. The file is gears_init.js It should be gears-init.js

The solution is to make a copy of gears_init.js and re-name the copy to gears-init.js, then add the new file into Application Architect at Sage SalesLogix > SupportFiles > jscript > sage-platform > gears-init.js.

Do not delete the incorrect file since we don’t know how Sage will fix the problem, and its presence does not seem to cause any problems.