Spring Cleaning

When you work at a home office it is easy to fall into a rut, where daily activities that just suck up time and energy and give nothing back intrude on quality of life. I am doing a personal audit of late and have noticed for me at least, a disturbing reality that my online life has overtaken my offline world. With Blackberry in hand, Email, IM, Twitter, Facebook and LInkedin  the number of disconnected interactions has only grown over the last year.

I totally get the stay connected thing but looking at the results of the being connected through these sites, I cannot see a distinctive benefit that has arisen. Whats worse for me is reflecting back and seeing that the amount of personal growth and family time has actually gotten smaller, and the times when I am away from the computer(s) I have found it difficult, feeling that I needed to be working or connected, as I might be needed or missing something important. There are things that are truly important such as this Blog, and my work email, however I am starting to understand that Facebook and Twitter have become for me at least a destroyer of what little extra time I have. Twitter, is like being a fly on the wall, listening into someone’s conversation and if you are lucky being able to inject yourself in and get a response. Facebook, while it is nice to be connected with old friends, family, co-workers and the like in a central place, the amount of visual ‘shit’ is overwhelming. Honestly each day that I log in I see changes, I get bombarded with play this, do that, take this survey, check out your IQ … Its this kind of white noise, over the top crap that just sucks the life out of me. Facebook has become a central aggregator or everything that is bad on the net. For the good parts of the site (stay connected) there (for me) is a lot of bad. I can understand the reasoning that the fine people at Facebook are throwing the stuff at the audience since they are still determining a business model, but Yuck! Some days it feels like a boot to the head.

So for me, Twitter is gone, not going to waist anymore time on it. I rather take the time that was committed to it and read, or get off my Ass and go for a walk. I say good bye to the constant notification that someone, somewhere posted something up. I say good bye to the need to verify that indeed what was posted had no meaning to me and I say good bye to the morning ritual of trying to catch-up to hundreds of non-contextual messages.

I spoke with a friend last week, and she had noted my status’s  in Facebook had/are pretty dull (I am here, or there, gonna watch a movie, or out with the family having desert). I reflected on that and looked over the status’s of my friends and noticed that they were in line. What I noticed more, what what has become news worthy which are the mundane actions, and lifestyles that many of us lead. If you dig, and not too deep forsure what we do from day to day is little more then getting up and putting in time. Its a sad state of affairs where the highlight is going out for a coffee, or a piece of cake is the highlight of ones days. Given the fact that I rarely have anything exciting to post I have decided to not post, to also reduce my ‘Facebook’ time to 15 minutes per week for managing my relationships.

I am hoping to further reduce my ‘computer social time’ to get out of this rut I have been in, spending more time with the computers then real people.

Do you find your time being negatively effected by these technological ways of staying connected.

Mark

Dell for a week

I have had my new notebook for a week now and I have to say I am quite happy with it so far. Except for the OS issue (that was quickly resolved) its quite pleasing to work with. Having a notebook with 8gb of memory does make a world of difference on the amount of work that can be managed. An considering I am a developer that has multiple copies of VS, Application Architect, and SQL enterprise manager open its good to still have snappy performance. We will see how it goes from here but not being tethered to a desk to have a good developer experience is a definite win in my books. I have also been getting into JQuery over the last week or so and really like what I see when it comes to the ease of the framework. I think every SalesLogix web developer should have some good strong knowledge of this library.

Vista version matters

I ordered a new notebook from Dell that arrived yesterday. After getting it setup and I started to do some development work and realized that I needed Digest Authentication on the IIS server. Well it seems that with Home Premium the authentication options are not available. I decided to head over to the local office depot and get the upgrade version of Vista and so far its taken more then 2 1/2 hours  (and still going) to upgrade the OS. Remember to have the right version of Vista depending on the development you are trying to do.

IDataService and Utility Methods

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.

My Kung Fu is Strong

Ya, a goofy title, I agree.

This post is somewhat a rant and I hope that it is received well. I generally get many, many requests on how to do something on SalesLogix web platform, or coding in general. I have not really a problem with the questions that are directed as could you point me in the right direction, or what are your thoughts. I do however have a problem with the requests that come in for full working examples of functionality. The reason I have problems is that for the most part its pushing the development and and training effort on me. The fact that I may have the ability to create the solution quicker does not negate that there are real hard costs to making the solution work, generally of which the requester is working on a billing project. Creating this examples can take anywhere from an hour to many hours, I have even had request for work that would take days to provide a solution. For the most part those who also request are not supporters of the community and are only looking for a quick solution to something that is racking their brain.

This is where I remind those who request these working samples that software development is what I do. These things you request are things that I have personally had to learn and invest my time into. I am in no way compensated by Sage to support the community, there is no MVP program, or recognition system. I have to pay to be a partner, for my development software and all of the books that I read to ensure that I keep ahead of the curve. The other thing to keep in mind that I have work commitments like the rest of you to deliver code as expediently as possible and creating these samples pushes billable hours, and can encroach on the little family time left.

I have been toying with a couple of ideas, and would appreciate some feedback to what you dear reader think of the feasibility.

1. Create and distribute a monthly SalesLogix web Journal for a sum of $ per year (Good Idea, what would you be willing to pay)

2. Create a training video subscription that includes web, mobile, C#, debugging topics (Good Idea, what would you be willing to pay)

3. Developer on hand program. For those that only need a few hours per month a way to have direct access and get the coding samples you need but would pay for them

4. Fly on the Wall training. When doing an engagement having web ex meetings on specific items to have a developer watch and mentor around the most difficult parts to be delivered.

5. Architectural review and pre-engagement consulting

I really think that all 5 are advantages for any BP looking to be able to do more web business even if they do not have the core developer completely up to speed on the web development. It also allows you to tie the costs to a development and not have more bench time to finance.

Some of the other things I am trying to gauge and hopefully you can provide some feed back is around specific community needs.

1. Do you see a need for Mobile Development Book if so would you buy one and what would your expectation of price.

2. Do you see a need for more mobile training outside of what Sage provides.

3. Do you see a need for virtual events where several industry notables (Ryan Farley, Stephen Redmond, and Me ) provide special event training. Is this something you would attend?

4. What gaps do you see in tooling. documentation, training, support, and development do you see that would make your life much easier to deliver compelling solutions.

If something I provide helps you please also do send me a small email and let me know. Its always good to hear feedback.

Thanks for reading, If you have any thoughts please email me at mark.dykun@BITtelligentdev.com or give me a call at 519.260.0999. 

Handling Custom Grid Binding

Grid Binding with GetByMethod

So lately there have been questions on how do create a filtered datagrid using the Sage SalesLogix web platform. This is a valid question and the coding around it is somewhat trickier then just binding to a simple list data source. In trying to solve the problem most would go to the GetByMethod approach and find that it would not work based on the training sample. I believe that the functionality had changed between the 7.5 and 7.5.1 timeframe and really requires a bit more.

So we are going to do the method slightly different.

1. Create your business rule method as usual choosing to IList as the result out value

2.  Write your query code using projection based query. What I mean is that instead of having NHibernate return full entities we want just field values specific to the grids results.

3. Iterate through each row adding the result in to the list

The propertyPaths variable is there to define the fields in the object and their specific order. Order counts so make sure to line list to match your projections. You will be creating a ComponentView object for each row and initializing it with both the property path values and the data for the row.

The business rule itself is done. The final piece of the puzzle is the setting of the EntityType property on the datasource. Since we are not returning a specific entity we need to change this value to return Sage.Platform.ComponentModel.ComponentView instead.

Once this is your custom grid is ready to go.

Custom Filtering

I am not going to give a full sample on this one but to point to what I perceive as right direction. Many SalesLogix web developers still shy away from breaking out visual studio and hand coding a smart part. For some of the more advanced methods of handling this functionality it really is the best solution. GetByMethod is great when you want to handle specific use cases but can be somewhat inflexible due to how the method is bound and invoked in the standard smart part. More specifically starting to add filter parameters in to the mix is not an easy thing to do. Other thoughts are to code several methods and just change them up, however if your query code is to be dynamic and allow users to enter a parameter you still have the problem of passing in extra data.

This is were I would advise breaking out the method, and adding the parameters required to meet the use case. Using a custom smart part I would handle the databinding and calling of the business rule myself removing the extra code/goo that would be generated.

Once the functionality was correctly tested in VS I would remove the old smartpart and import the new one into <portal>\Support Files\SmartParts\<Entity>\ making sure that it was available for deployment.

Mix and the future of the Web?

Mix starts in less then 45 minutes. Unfortunately I was unable to attend in person but will be watching the keynote and trying to follow as close as possible to the information that comes out of this event. I am not expecting to hear much that will have an impact on the development or design decisions I make today, but rather indications of the choices I will have to face in the near future. I would really like to see Silverlight get more traction and within the space of business applications become a more robust platform. Hopefully what we will see will be real, tangible feature sets and products that we as consultants, and development companies can take hold of and enrich our customers experiences with.

if your interested in the key note it starts at 9:00am (Vegas) and you can see it at http://live.visitmix.com

Just a little rant .. Move Along

Last night I watched John Stewart’s program where Jim Cramer of CNBC was put on the hot seat. Through this program the single thought that resonated within my mind is that Financial advice should be dull, boring and pragmatic. The culture of making important long term investment decisions should not be based on ranting, or entertainment but on solid fiscal information. I have to admit that I really enjoyed the grilling, and the pointing out of what seems to be the duality of the system of them and us. For the longest time ‘we’ as in the common hard working people have been sponsors of a lifestyle and attitude that determines benefit and bonus not through real world success, but through perceived success, over inflating, and manipulating the market.

The fact that Jim could come on and try to rebuff the accusations, and find himself falling completely short with capability. Jim was called out and from what I could see, rightly so. I would hope that others would also be called out to ensure that the people who watch and believe that what they are watching is information that is the best interest of the general population. However it seems to be targeted to the select few who fill their own internal coffers. I really believe it and expect that there is not easy path to getting wealthy. Its a mix of hard work, sweat, tears and pain that allows you to get ahead. If its easy then there is something that is amiss, if extraordinary promises are made chances  its not a real tangible and sustainable situation. I honestly do not watch CNBC much, I had through the presidential race, but I am starting to find that the reporting on most of these stations are biased one way or another. Simply put most reporting as gotten to the point of requiring the element of entertainment/sensationalism due to the ongoing pressures of advertising dollars. Splashy screens and over promising tag lines to prop up viewer ship seem to be the norm. These in my opinion are a misrepresentation of truthfulness.

I am in no way a journalist nor a financial expert . I spend my days punching on a keyboard and writing code. I will not speak of my personal methods of saving/investing because quite frankly it is personal. I do want to point out however that the advice that we see on TV does not provide the deep and pragmatic thought required to plan for the future. I would love to see a separation from the financial news and the organizations they cover, to ensure that there is no vested interest in the success of the underlying organizations. How really is it possible for these cable companies to offer unbiased information when they themselves have such a vested interest in the market, and their employees as well. I am not a fan of the SCC and its methodologies as I believe that entertainment should be managed by free speech and choice but I do think that any show that wants to say they are a Financial reporting show, should be regulated and have to follow rules of disclosure, and how they advertise themselves.

These are tough times, and the last thing we need is more of the same. Lets call out our financial experts and make them accountable to providing truthful evaluations. To stop the marketing of a brand and to give real world advice that benefits everyone.

Twitter – Take 2

Ok so as a follow up to the last post, If I go to the Twitter site I can Block a follower. Cool, I just cannot see that feature on Twhirl. But at least now I can create the restraining orders 🙂

Twitter, The Sucky, Crappy, Stinky side of Micro Blogging

So Twitter is this cool conversational tool, we all get that. With micro-posts we can tell everyone who cares what we are doing at any given moment. If we so choose the momentary brain fart that is growing in our heads can be quickly deposited into a message the size of 140 characters. For uber geeks it seems like the perfect choice for long term, non regionalized discussions. When someone wants to join in the the conversation they indeed do. This I am very cool with but what I am finding, and I am sure it happens to all of the ‘Twitteratti” is those that are following seem to be less those interested in the conversation and more those wishing to muddy the waters with pure crap. Lately more and more are following me. Names like Kristal, Katie, and Kristen. Droves of female followers. Now one would think that a Geek developer would be ecstatic  with the endless stream of followers that seem to be likened unto exotic dancers in some far away place, but really the fact is that these individuals represent a single URL/Company and in my mind is nothing more then spam.

I currently use Twhirl and for the life of me cannot find a way to ‘boot’ or ‘Deny’ a follower access to follow me. Kinda like the 50 ft restraining order, it would be nice to have a hedge of protection from the commercial underbelly that seems to be bubbling up more each day.

I am also seeing a trend on Facebook as well where individuals are identifying themselves as friends. People of whom I have never met that only want to connect to solicit their wares. Case in point last night I got a friend request from an individual that is trolling for Primerica, looking for recruits to continue the legion of failing money managers here in Ontario. I do not see where someone would think I would in anyway want to expose myself, or the matter fact my friends to any of these schemes.

A call to action to the creators of Twitter, allow me the courtesy to control the list of followers. In a way this could save you some effort and band with in distributing the results because we as the community can clean out the legions of crap followers, who do not represent individuals that are genuinely interested in the conversation or what I have to say, but are there like shills to ruin the experience for all.

A call to action for the developers of Twhirl, please give me a better UI. Allow for grouping and organization of messages that come in. I do not always want to read from top to bottom. I would like to group all messages on the same screen in a hierarchal view. I would also like to remove/clear out all of the replies to my messages and not see them every day when I log in.

For me Twitter messages are conversational, I really do not need them archived and any conversation that needs to be long lived will be in the form of an email. When I press the clear button, please actually remove the messages and not just hide them from view.

For those who follow, please bear in mind that I am a software developer. When I post more then likely it will be geek in content or some wild ass brain fart that revels some current thought. I do not buy crap from companies that I do not know. I do not download shit from sites that could cause any kind of disruption to my life. Get rich schemes, get a free item … garbage does not interest me in any way. I have enough computers, technology and things I need that I will not subscribe for the **Free** gift. If there is something I want I can afford to pay for it and will happily do so to support the economy, and companies that I believe in.  So if you are following with the intent to try and get me to sign up, download, or whatever it will be a waist of your time