BITtelligent Software Logo
  • Home
  • Products
    • Infor CRM
    • Salesfusion
    • Codeless
    • Dynalink
    • ERP Link
  • Services
  • Clients
  • Blog
  • Careers
  • Team
  • About
  • Sign In

Infor CRM

November 18. 2020 0 Comments   Posted in:  Development Infor CRM SalesLogix XBar


in a prior life I was lucky to be considered a SME or subject matter expert on the development/customization of the Infor CRM product. I am/was lucky enough to have not only supported for my end customers but also worked inside on the product through the years with Sage, Swiftpage and Infor. I am lucky enough to continue my relationship with both Swiftpage (Act!) and Infor to this day and they continue to have faith in mine and my teams development skills to deliver new features to their platforms.


One of the products that I was instrumental in was the Infor XBar outlook integration. Through the years it has had additional features added including some more deep outlook integration that is outside of the core XBar implementation that is developed and maintained by a different developer I continue to be one of the only developers in the world that knows how to customize XBar.

There is nothing more that I would like to see is  Infor CRM to continue to grow and attract new customers/users/developers so I have resolved to provide how to’s in this blog to spread some knowledge and hopefully in some small part move the Infor CRM ship forward.


Mark 

App Store Commissions

November 18. 2020 0 Comments   Posted in:  Development Apple Business

To date I have not created any applications that would have needed to be posted to an App Store such as Apple, Google or Microsoft. The % to play was a great high wall to test and commoditize and application that may have limited reach. Since I am focused on business applications and CRM more specifically there is a smaller audience then would be a consumer focused application.


Well today Apple has announced that they are providing a small business rate on Applications that have less then 1 million in Sales. Given this I think I may now try to dip my toes in the mobile application pool and see if it can be a new revenue stream. Between the new amount of free time due to the Covid19 lockdowns and the reduced rates this may be the catalyst that I needed.


I will try to document my journey into the Mobile App world here. Wish me luck.

Sage SalesLogix Mobile Pick Lists (BlackBerry)

January 20. 2010 1 Comments   Posted in:  Development Sage Mobile SalesLogix

When working with Sage mobile from time to time you will find that there is missing functionality that you expected to be there but is not. One such piece of functionality involve pick lists and recently worked on a project that required ‘must exist in list’ functionality. By the way did I say how much I like using Eclipse when I have to do java development. Well I do.

Must Exist In List

MustExistInList is a property of Sage Saleslogix web and Lan client picklist. This ensures that the end user cannot enter any free form text into the pick list edit area. This property however has yet to make it up to the mobile implementation. Since the property does not exist and it is not possible to introduce new controls into the form building process I had to take a more intermediate step. The first thing to remember is that most of the controls that exist on the BlackBerry device start as a HorizontalFieldManager.

Generally the following layout for each control is followed

< Label Field > + < Seperator Field > +  < Edit Field >

however with the lookups and picklists the following layout is followed

<Label Field> + < CMPImage > + < Seperator > + < Edit Field >

Now I was not completely sure on the layout of the control, so to help me on a way I wrote a simple helper method that did nothing more then to iterate through the embedded fields on the HorizontalLayoutManager and inform me of the embedded class names.

Once I had this information in hand I built out a pick list adapter method. I should have created a full adapter to allow for future expansion however sometimes KISS should be honored especially if under the gun to deliver in short order.

Its a simple method but effective in providing the functionality.

public static void setPicklistEditable(CMPPickList field, boolean editable ) {
    HorizontalFieldManager manager =  (HorizontalFieldManager) field;
    EditField edit = (EditField)manager.getField(3);
    if (edit != null) {
        edit.setEditable(editable);
    }
}


Note that the index for the field is 3 even though there is 4 embedded controls as arrays in java are 0 based .

Customer Portal

April 22. 2009 0 Comments   Posted in:  Development SalesLogix SalesLogix Web

I am Working on a Customer Portal project and I was seeing some strange behavior. When ever I opened up a Lookup control a JavaScript  error was thrown and the resulting data was not being displayed. However after CTRL+F5 on the page the values would then show up. After discussing the problem and looking at the issues inside of Firebug to see that there was no named query available for the results to be generated. I was then pointed to the right place where the customer portal service list did not contain 2 very important entries.

So in a nutshell, ensure that in the customer portal the following 2 services are registered:

#1

Service: Sage.Platform.NamedQueries.DictionaryBasedNamedQueryCacheService, Sage.Platform

Registered As: Sage.Platform.NamedQueries.INamedQueryCacheService, Sage.Platform

#2

Service: Sage.Platform.NamedQueries.DictionaryBasedNamedQueryCacheService, Sage.Platform

Registered As: Sage.Platform.NamedQueries.INamedQueryLookupService, Sage.Platform

 

Once the entries were added all of the lookups in customer portal worked as expected.

Mark

IDataService and Utility Methods

April 1. 2009 0 Comments   Posted in:  Development SalesLogix SalesLogix Web

This morning I got into a IM discussion with Alexander Pfingstl. He works for for a BP in Germany. We were discussing the ability to handle custom address entry from the Add Contact Account screen in SalesLogix web. Since the format of German address layout is different then that of North America custom work needed to be done. Given that the current incarnation of the address control does not allow for customization it was not possible to make the changes there. Also using the Add/Edit address dialog was not possible because it works off an existing entity (account/contact) and not one that has yet to be created.

I had suggested that he just place the address details directly on the Add Contact screen and bind it directly. I have done this before and it works like a charm.

The next question that came up was how to call a business rule with out an entity. It seems that he has code that does a City lookup based on ZIP/Postal information. I am sure that we all have some form of this code around. What struck with me is that this code is not specifically entity bound and is more a utility method then a business rule. Really when you look at it from a consultant role this code should be as generalist as possible for maximum reuse.

As with most things I do, I recommended to create an external library in Visual Studio. I know, outside if AA where you may be saying that we should try to keep inside of the SalesLogix dev environment. This is were I would disagree. The goal is to create value for both the current customer, and others in the future.

In our discussions we talked about the DataService. With this service it is possible to get the underlying connection string to the SalesLogix database. You can also get a connection but I shy away from that as I like to know when it is created and destroyed so using the connection string gives me this flexibility.

So finally I opened up VS and a web portal and started to chunk out a code sample for Alexander and provided this code:

   1: public string GetCityFromZip(string zip)
   2: {
   3:     string result = string.Empty;
   4:     IDataService service = ApplicationContext.Current.Services.Get<IDataService>();
   5:     using (var connection = new OleDbConnection   (service.GetConnectionString()))
   6:     {   
   7:         connection.Open();   
   8:         using (var command = connection.CreateCommand())
   9:         {         
  10:             command.CommandText = "Select City from CityZipTable where Zip = ? "; 
  11:             command.Parameters.Add(new OleDbParameter("@Zip", zip));           
  12:             result = (string)command.ExecuteScalar();      
  13:         }           
  14:     }    
  15:     return result; 
  16: }

Now this code is specific to SalesLogix web as it uses the data service. To truly make it universal what should be done is a simple refactor to pass in the connection string instead of deriving it from the Data Service.

   1: public string GetCityFromZip(string connectionString, string zip)
   2: {   
   3:     string result = string.Empty;    
   4:     using (var connection = new OleDbConnection(connectionString))   
   5:     {      
   6:         connection.Open();       
   7:         using (var command = connection.CreateCommand())      
   8:         {         
   9:             command.CommandText = "Select City from CityZipTable where Zip = ? ";
  10:             command.Parameters.Add(new OleDbParameter("@Zip", zip));
  11:             result = (string)command.ExecuteScalar();      
  12:         }   
  13:     }   
  14:  
  15:     return result;
  16: }

 

So now this method can be use from SalesLogix or an external application. Note the use of parameterized query to ensure that we do not get a SQL injection issue. So to call it from a SalesLogix web you can just create the following code:

   1: public void OnZipChanged(object sender, EventArgs args)
   2: {   
   3:     AddressUtilities utilities = new AddressUtilities(); 
   4:     string connectionString = ((IDataService)ApplicationContext.Current.Services.Get<IDataService>).GetConnectionString();    
   5:     txtCity.Text = utilities.GetCityFromZip(connectionString, txtZipPostal.Text);
   6: }

And using it from an external application its as simple as:

   1: public void UpdateCityBasedOnZip(string zip)
   2: {   
   3:     string connectionString = "<connection string here>";   
   4:     AddressUtilities utilities = new AddressUtilities();   
   5:     txtCity.Text = utilities.GetCityFromZip(connectionString, zip);
   6: }

So there you go, a library approach.

Hope this helps.

  • ← Older
BITtelligent Software and Media, Inc.
Tel: (519) 620-7153
support@bittelligentdev.com
sales@bittelligentdev.com
380 Jamieson Parkway, Unit 5
Cambridge, Ont N3C 4N4