A Touch of the Past

I am still on the fence wether Facebook is a good or bad thing. Really I believe it is both as it has the capability of re-linking people that are what to be ‘Friends’ but it also has created a forum for centralized bullying to continue past time and geographical distances.

The other day I did connect with an old friend from middle school Mike Tyler. I have yet to speak with him, but in looking at his profile I started to see how he has turned out almost 30 years later. Mike had become an Artist, and in a way this caught me aback thinking about the 12 year representation of him. I never though of him specifically within that career choice. I went to his web site and was very impressed with the sculptures he had on display. You can see some of his work here .

Looking back on my thoughts of Mike and what he is doing now and what I would have perceived him doing made me think about the problem I have with Facebook. Its not a leveler in so much that people really can see who your are now, but they will always reflect back to who you were when they knew you. Honestly some of those times were not so great and should be left in the past.

Reflecting back on my childhood, I would hope that most people look back at their childhoods fondly, I really could not say the same. before I hit High School the years were not too kind to me. I would liken my self to ‘Screech’ from saved by the bell, pretty awkward and having a difficult time of things. Home life was not great and that reflected with who I was during those years. I think it also helped define me in so much as my determination which reflects to this day with my work ethic, and drive to learn and do better each day. High school was a bit better, but during those years I started to really build out my confidence and surprisingly got much deeper in to what would be my chosen career path. Since High school I have done quite a few things that has made my life interesting and met lots of people on the way that are rich in experiences and I am grateful to know each and every one of them. In the tradition of 25 things I will list some stuff about me that may be of interest

  1. Married for 12 years to Kaley, I proposed over the phone while on a contract in Calgary
  2. Have 3 wonderful children, Rebecca, Brianna, Christian (hope they do not get into computers)
  3. Have my own business, Wake up very tired , go to bed very tired
  4. I have trained people in technology in Australia, the UK, Arizona and Canada (one of my favorite things to do)
  5. I am not afraid of risk, I usually jump in with 2 feet and see where it takes me
  6. I rarely start something new such as a hobby, or music. Though I invest heavily in pretending I will some day do so (owned 2 pianos, cannot play, 1 drum set, lots of tools)
  7. I like to think I am handy but probably not. For me its better to pay someone to do what there good at then for me to mess it up
  8. I have 2 dogs (Teddy and Ralph). I both love my dogs and hate my dogs
  9. I love my job and the people I work with. Its hard work, but for me its quite rewarding
  10. My son is American. He was born in Bellevue, Washington while I was working at Infospace
  11. I loved living in Washington, I would go back in a heartbeat if the right offer presented it self. Also Melbourne would be great
  12. I like food way to much, and exercise too little (hence my somewhat round figure)
  13. I am a Geek, love the tech, and enjoy talking about it with peers
  14. Have to learn to rest. When I am not working, I am reading about stuff I work with. TV on, book still in the hands.
  15. Holidays can be painful. As with point 14 work seems to drive me. I guess I would be considered a work-a-holic
  16. 2 of the companies I have done work for have been sold for a combined sum approximately 75 million. The first one when said and done closed in the neighborhood of 650 million. Both were small companies and I have a direct effect in them getting sold.
  17. In my lifetime I have been a laborer, worked in a laboratory, been developer, Architect, Director (2 x) , VP and a Business owner but through most of it I would consider myself a code jockey.
  18. I love to watch movies, we have 4 televisions and currently the basement is being finished into an entertainment hub with a large movie screen
  19. I do not think I have a favorite food, however a great Steak gets me every time. Wherever I go I have to try out one of the local Steakhouses. Canada (good), US (good), AUS(not so good), UK (again not so good). When I started at Castle Bill Zarbock took me to a place in Brooklyn named Peter Luger was a excellent experience. A client once bet me $50 that I could not eat a 36 oz steak. I won but hobbled out of the restaurant. (cannot eat that way anymore)
  20. Not really a car guy. Been looking just cannot find one that makes me want to part with the $$. Though about getting one of the new Camero’s coming out in a few months but can’t even see doing that. As you can imagine solving the midlife crisis is going to be hard.
  21. I do not spend enough time with my kids. Back to working all the time. Good thing is I work out of the house most of the time which lets me see and hear them lots, just not as much quality time as I would like
  22. I have the Ontario weather, extreme heat, extreme cold, and a lot of crap in the middle. Summers seemed so much better 30 years ago. Now not so good.
  23. I own a pool table, played it half a dozen times. Exercise bike, rode it have a dozen times. Big massage chair, thousands of times. One of my first big purchases when I was in the middle of the Dot Com boom. it’s now 9 years old and still going.
  24. In the past tended to buy crap that I did not need, or ever use. No, not so much so. Started to realize the pattern and with the 12 step plan got the ‘gotta have it’ monkey off my back. Most money now goes into the business investments (like to have to good work toys)
  25. Mind is always going. I get very little sleep nowadays as I cannot turn off I also have chronic back pain and keep a bottle of Robax on my desk for those ‘Bad’ moments.




Testing for a Remote SalesLogix Client Web Site

A question was posted on the Sage newsgroups for determining if the web site is connected to either a remote or office database. I gave it some quick thought and felt the best test would be to determine the database that the site was connected to. To solve this problem I wrote the following code;


public bool IsRemote()
    bool result = false;
    Sage.Platform.Data.IDataService service = ApplicationContext.Current.Services.Get<Sage.Platform.Data.IDataService>();
    if (service != null)
        System.Data.OleDb.OleDbConnectionStringBuilder builder = new System.Data.OleDb.OleDbConnectionStringBuilder(service.GetConnectionString());
        string databaseName = (string)builder[“Initial Catalog”];

        if (“slxremote”.Equals(databaseName, StringComparison.InvariantCultureIgnoreCase))
            result = true;

    return result;




Extending the Mobile Platform

This morning I got the idea to add some UI utility classes to my mobile library. I really like ease of use API’s where their functionality is somewhat self evident based on its naming. I had been earlier looking at how to add controls to the forms that were not part of the toolkit including creating my own custom controls to be emended.  So this I expect is the first of several articles as I move forward to add more functionality to libraries. Hope it helps.

Enhancing the Platform

There comes a time when a client will ask you for something that is not part of the core platform functionality. This could be to show data in a report form or extend the UI. Digging around in the code that is provided out of the box will not provide any insight into how to accomplish the task required. This is where digging into Java and the BlackBerry SDK will provide the best results.

The scenario is as follows;

The customer likes the way the account form looks but would like to break up the view in a way to distinguish different areas of the data. For example display the address information grouped by separator lines. When completed the account main screen should look like :


Note the separator line between the account field and address field and also between the postal and division field.

Step 1 – Looking for a solution

Looking into the mobile platform there is no UI element available for a separator. So we now have to look outside for a solution. Knowing that each of the controls that are displayed on a BlackBerry form are derived from a field control (net.rim.device.api.ui.Field) it is completely possible for the creation of a custom control to provide this kind of support. However when looking into the BB SDK we can find that a SeparatorField is available that will serve the purpose nicely.

Now knowing the control that will be hosted in the screen we need to define how it should be added. This is where understanding that fields on BlackBerry are hosted with a layout manager. Each field has a method aptly named getManager that will return the layout manager where the field is sited.

So now we know how the field is hosted, and what control to use it is time to code up the solution.

Writing the code

You could write the code for this functionality in the Mobile Application Architect however this would require more effort in your part to ensure that it works the first time. Since there are no visual cues in AA compilation is the only way to determine if your code is good.

This is where we jump back out into Eclipse and work with the mobile project we completed earlier. Being a big fan of creating reusable code instead of writhing the bulk of the code in the Account detail form we will create a new extended API class.

Startup eclipse and open your ‘sage’ workspace. Locate the sage.mobile.customization.forms package in the package explorer


Using the context menu options select New->Class

Name the new class UIUtility and uncheck the ‘Include Public void main…’ checkbox. Click done and a new empty class file is opened for you.

Note that the class is placed in the sage.mobile.customizations.forms package for you.

Stubbing out the methods

Part of the design of APIs is ensuring that the exposed functionality will make sense to not only you but any of the potential consumers of the functionality. If the methods are easily understood, less documentation in the calling code will need to be written.

So in thinking about the functionality we may like the following items

Insert separator before – adds the separator line before a given field

Insert separator after – adds the separator line after a given field

Also we understand that the separator field derives from the field so we could even expose more functionality by providing insert field before and after methods.

This gives us the following signatures

InsertFieldBefore(FormCodeBehind, FieldName, Field)




Now you might be thinking why the FormCodeBehind property. Well if you dig into the mobile API any changes we would be making to the form is through the code behind class. This class also provides the control lookup functionality that we need to get access to the underlying manager.

Your stubbed out class should look like


What is interesting is the immediate feedback you get in eclipse for any errors that are occurring. If you notice the clip_image008 image – selecting will provide some hints on how to fix the found issue

The indicated issues have to do with types not being imported into the class file. By adding these 2 lines in to the class file the errors are removed;

import net.rim.device.api.ui.Field;

import sage.mobile.codebinding.FormCodeBehind;

Now to write the code. In the AddFieldBefore method add the following code. You will notice an error on the line that the Manager variable is defined;


Again click on the error symbol, and import the net.rim.device.api.ui.Manager type.

Looking at the code we start off by guarding from invalid input from the caller. Remember this is a API method and we do not know who will be using it. Accessing the code behind getControl method we will get the control that our new one should be positioned beside. If we can find the field we then get the manager. Remember the manager is what the fields are hosted on. You can think of it as an invisible panel control. Finally we find out the index of the control layed out in the manager and insert our new control at the same position bumping the aligned control ahead.

Filling out the AddFieldAfter code looks like this;


The only notable change is the calculation of the new control index to position it after the aligned control.

Now that we have our ‘Generic’ one size fits all methods we can create our separator specific ones. These methods are quite easy to implement and I will show both methods


Again note the errors and resolve them by importing the net.rim.device.api.ui.component.SeparatorField type

Moving Class back into Application Architect

Now that the class has been created and error free we want to move it back into AA. There is no fancy way to do this then create a new Java class in AA and copy and paste your code from the eclipse project into your AA class.

On the Mobile Customizations tree select the ‘Java Classes’ item and using the context menu choose ‘New’.

The Add Item dialog is displayed. Choose the ‘Base Java Class’ template. For plugin name enter UIUtility.

Replace the default text with the contents of the UIUtility class created in eclipse. Save the changes.

For the code to be compiled and accessible to the forms you will have to add the UIUtlity class to any of the targeted BlackBerry client systems.

Augmenting the Account Form

The bulk of the code required is written, and included in the client system. Compile the client system and ensure that it indeed does compile successfully.

Once you are satisfied that the CS compiles successfully open up the account form. Remember that we started out this exercise with wanting to separate the address from account and also postal from division. From this the 2 target controls that we want to separate are named ‘Address1’ and ‘Postal’.

Note: Control lookup is case sensitive so ensure that the case matches both control name and text name in the code.

In the code behind for the account we are going to add 2 new lines (one for each seperator). Add the following lines to the FormShow method.


Remember to access this new functionality you will need to import the type. The import line to add is;

import sage.mobile.customizations.forms.UIUtilities;

Save the changes, compile and deploy the client system. Start up the simulator, check for and download your customizations.

When you now open up the account detail screen you should now have the proper level of field separation.

Nice Surprise

Last night I decided to end fairly early (8:00 pm) working and sit and watch Kevin Smith. I have a part time Dev who comes into the office Tues, Thurs and Saturday each week and he is learning about SalesLogix Web. Amongst all of the training material I had I decided to order a copy of Stephen Redmond’s book so we were well armed with documentation if I was unavailable to answer a question or provide some direction. As I said, I was watching a movie, and decided to take the book with me and look through it. Surprisingly on the last page I found mention of this Blog and of myself. I felt honored to be here and am really appreciative of the kind words that Stephen put in.

Our community, I mean the SalesLogix community has so few evangelists. When we contrast that to the number of MVPs, and speakers, books and blogs that cover the Microsoft world I do not think we register as a blip. I really am thankful for the few open individuals and their accepting companies that do extend themselves out to help promote the technology that so many of us make our livelihoods off of. So Ryan, Stephen, Nick, Mike and any that I’ve not included thank you. I am hoping that 2009 more names can be added to the list.

Some thoughts

Wow, outside my office window I can see the tall trees swaying in the strong winds. Last night was one of those hard sleep nights where the sounds outside pretty much ended any hope of rest. While I was getting ready for work this morning I was mulling over some of the topics I really want to discuss and how to approach the subjects. There are times that the ideas are swirling around and its just not the right time, or the thoughts have not matured enough for it to be of any value, and I think that is where much of my ideas for discussion are, immature thought just waiting to burst out. Hopefully the thought police can keep all of those adolescent ideas in so they can gestate just long enough to service the community in the right way 🙂

I have been working on several projects, very diverse in nature from standard web, SalesLogix web, Mobile and custom development over the last little while and its quite good to look back and get some perspective of what went right and more so what went wrong. So in a nutshell here is little retrospective

  1. Mobile has case sensitivity issues, the can bite you hard if your not proactive about it. Choose a case for naming, and stick with it otherwise you will be in debugging limbo
  2. Just because your told it works does not mean it does. Make sure you review what you have to ensure that it is at the expected quality
  3. Custom BlackBerry development estimates should be appropriately padded. In the .Net world we have lots of libraries and capabilities. Customers are going to compare the functionality that existing in newer generation better development platform devices. Just make sure to level set with the customer the effort required to give the same kind of experience
  4. Portal wizard is not that great, in fact when creating a custom customer portal it actually is not at all the best way to go. The portal wizard allows for the creation of a UI or service portal. It handles a couple of setting and drops in some files into the VFS. Unfortunately the customer portal and the client portal are somewhat different beasts and you will be spending some time backtracking to get the portal to run
  5. Be good, and truthful and do the right thing. This one is for me to ensure that I keep rooted in my morals and not choose to do something just because there is revenue attached to it.

One things I still am having quite a bit of difficulty, and maybe its location or how my company is currently set up is finding a intermediate developer. I would not have thought it would have been that hard, but it has been so. I have heard from a HR company that I would need to open a official office to attract talent, or that I would have to pay 25K in a finder fee to do the so. The latter is somewhat harder for me to grasp because I would much rather take that money and put it into top notch equipment or bonus, better pay then just throw it across the fence.

When it comes to finding developers what is you method, is there some special recipe that brings in the resumes. Any insight into this open question would be much appreciated.

Oh BTW, intermediate developers if you have not heard, I am looking for someone to join my company in Cambridge, Ontario. I personally believe this is a cool opportunity to not only work in an open, and creative environment. A place that each and every day you have the power to make an impact but you also get to work with a really nice guy 😉  We work with diverse technologies and get to work with some really great customers. Have C# skills, awesome, ASP.net your the one. Want to work in Winforms, Web, Mobile, BlackBerry development or pretty well anything our customer throw at us send me your resume at mark.dykun@bittelligentdev.com , lets talk and see if things just Gel. You rig – Quad Core, 8GB, 2 X24″, 1TB HDD, your tools VS 2008, Eclipse, Refactor tools, SQL2005+ . Sound inviting and send me your resume mark.dykun@bittelligentdev.com

Sage Mobile Synchronization

It’s 9:00 am in the morning here and I have cracked open my customary Coke for the day. Yes I need that kick to get me going, hopefully I can get this monkey off my back but for now I and knee deep in my morning rituals. Among the rituals is reading the most current blogs and news to keep up with ‘”what’s new” and what I should keep my eyes on. With so much information it is sometimes hard to figure out which way is up. I think its pretty much the same when it comes with SalesLogix mobile synchronization and determining what the rules for synchronization are, and then being able to determine the best practices for an organization to enact to get the most of their mobile environment.

Over the last weeks I have been working with a Business Partner and their end customer, providing mobile customizations and support in getting the system up and running on an as needed basis. When on the phone with the end customer the discussion of how mobile synchronization works, and also how it relates to standard SalesLogix synchronization. We also discussed mobile subscriptions and how the terminology may easily be confused with SalesLogix remote subscription rules. So this post will try to break down the mobile synchronization process, hopefully in easily digestible pieces.

1. Mobile sync does not use standard SalesLogix remote synchronization

There is no direct relationship between the rules that are setup in the SalesLogix administrator remote synchronization. Mobile is a completely different animal and there is a true disconnect between these methods. Mobile synchronization does not consume TEF files or use any of the core SalesLogix sync infrastructure. In fact mobile synchronization is done based on a group query (more later) and a list of records that is already on the device.

2. Mobile sync uses standard SalesLogix security

The records that are available in the LAN client to the users are the same ones that are available to the mobile user. The same security constraints are applied to any of the queries that are executed through the sync. This includes the augmentation of the query to include user/team record reductions.

3. Only one group can be assigned for a user

In the mobile administrator a sync group is assigned for each user. This group can be any ad-hoc or dynamic group (the ones you can see in SLX LAN or Web) or the administrator can create one for you in the mobile admin. I actually rarely see the Admin created group being used in production but it is a nice feature to have. I do see that many times the group that is selected is the ‘All Accounts’ group is selected. I believe that this is not the best practice as it is possible to have tens of thousands of records to be synced which may cause some syncing pain.

4. Additional filtering is available on synced mobile items

Even though there is top level queries that determine what accounts/contacts should be synced the each table to be synced can even further be reduced by utilizing optional clauses, or for more advanced functionality “Sync Rules”. Optional clauses are used often, just look at History, or Activity in the Server2Client maps to see an example. I have not seen sync rules utilized in production as of yet and that could be due to the lack of documentation on the feature.

5. Mobile Synchronization rules are determined by the Client System

When determining the tables to be synced there are 2 map plug-ins (Server2Client and Client2Server) and any affiliated functions. Each user is assigned to a client system that determines the client functionality as well as the sync functionality. If you need special sync rules for a given user you either have to have a custom Client System or resort to sync rules (see above for lack of documentation)

6. Syncing “All Accounts” not really the best practice

When initially setting up the mobile system the focus should be on testing basic sync and ensuring that data is successfully sent to the device. If the initial sync group is “All Accounts” the sync process can be a considerable time to complete and to verify. I suggest setting up an “Mobile” ad-hoc group and add a few accounts. This way you can test the device communication to the server and ensure that the connector is running correctly with as little impact as possible.

7. Subscription comes to the rescue

Introduced in 5.0 was mobile subscription. With this feature a mobile user can choose the accounts that they want, while in the field and then sync them down to their device. With this feature you can avoid the “All Accounts”  issue completely, opting to get only the relevant records for the time.


I hope that this gives a little insight into mobile sync.